From e18748f4de1573b97bf9491fbeed0f990fc291db Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Sun, 18 Apr 2010 14:08:52 +0200 Subject: [PATCH] Imported Upstream snapshot 3.12.0~0dev17+10268 --- .cvsignore | 2 +- .depend | 756 +- Changes | 72 +- INSTALL | 7 +- Makefile | 112 +- Makefile.nt | 68 +- README | 4 +- README.win32 | 20 +- Upgrading | 4 +- VERSION | 4 +- _tags | 12 +- asmcomp/alpha/arch.ml | 2 +- asmcomp/alpha/emit.mlp | 10 +- asmcomp/alpha/proc.ml | 10 +- asmcomp/alpha/reload.ml | 2 +- asmcomp/alpha/scheduling.ml | 2 +- asmcomp/alpha/selection.ml | 2 +- asmcomp/amd64/arch.ml | 2 +- asmcomp/amd64/emit.mlp | 6 +- asmcomp/amd64/emit_nt.mlp | 22 +- asmcomp/amd64/proc.ml | 16 +- asmcomp/amd64/proc_nt.ml | 18 +- asmcomp/amd64/reload.ml | 6 +- asmcomp/amd64/scheduling.ml | 2 +- asmcomp/amd64/selection.ml | 10 +- asmcomp/arm/arch.ml | 2 +- asmcomp/arm/emit.mlp | 224 +- asmcomp/arm/proc.ml | 122 +- asmcomp/arm/reload.ml | 2 +- asmcomp/arm/scheduling.ml | 2 +- asmcomp/arm/selection.ml | 84 +- asmcomp/asmgen.ml | 4 +- asmcomp/asmgen.mli | 2 +- asmcomp/asmlibrarian.ml | 3 +- asmcomp/asmlibrarian.mli | 2 +- asmcomp/asmlink.ml | 2 +- asmcomp/asmlink.mli | 2 +- asmcomp/asmpackager.ml | 8 +- asmcomp/asmpackager.mli | 2 +- asmcomp/clambda.ml | 2 +- asmcomp/clambda.mli | 2 +- asmcomp/closure.ml | 2 +- asmcomp/closure.mli | 3 +- asmcomp/cmm.ml | 3 +- asmcomp/cmm.mli | 3 +- asmcomp/cmmgen.ml | 38 +- asmcomp/cmmgen.mli | 4 +- asmcomp/codegen.ml | 8 +- asmcomp/codegen.mli | 2 +- asmcomp/coloring.ml | 6 +- asmcomp/coloring.mli | 2 +- asmcomp/comballoc.ml | 2 +- asmcomp/comballoc.mli | 2 +- asmcomp/compilenv.ml | 5 +- asmcomp/compilenv.mli | 4 +- asmcomp/debuginfo.ml | 2 +- asmcomp/debuginfo.mli | 1 - asmcomp/emit.mli | 2 +- asmcomp/emitaux.ml | 7 +- asmcomp/emitaux.mli | 2 +- asmcomp/hppa/arch.ml | 3 +- asmcomp/hppa/emit.mlp | 4 +- asmcomp/hppa/proc.ml | 14 +- asmcomp/hppa/reload.ml | 2 +- asmcomp/hppa/scheduling.ml | 2 +- asmcomp/hppa/selection.ml | 4 +- asmcomp/i386/arch.ml | 5 +- asmcomp/i386/emit.mlp | 6 +- asmcomp/i386/emit_nt.mlp | 10 +- asmcomp/i386/proc.ml | 2 +- asmcomp/i386/proc_nt.ml | 4 +- asmcomp/i386/reload.ml | 8 +- asmcomp/i386/scheduling.ml | 2 +- asmcomp/i386/selection.ml | 19 +- asmcomp/ia64/arch.ml | 2 +- asmcomp/ia64/emit.mlp | 20 +- asmcomp/ia64/proc.ml | 6 +- asmcomp/ia64/reload.ml | 2 +- asmcomp/ia64/scheduling.ml | 4 +- asmcomp/ia64/selection.ml | 4 +- asmcomp/interf.ml | 4 +- asmcomp/interf.mli | 2 +- asmcomp/linearize.ml | 12 +- asmcomp/linearize.mli | 5 +- asmcomp/liveness.ml | 2 +- asmcomp/liveness.mli | 2 +- asmcomp/mach.ml | 15 +- asmcomp/mach.mli | 9 +- asmcomp/mips/arch.ml | 2 +- asmcomp/mips/emit.mlp | 4 +- asmcomp/mips/proc.ml | 6 +- asmcomp/mips/reload.ml | 2 +- asmcomp/mips/scheduling.ml | 2 +- asmcomp/mips/selection.ml | 2 +- asmcomp/power/arch.ml | 3 +- asmcomp/power/emit.mlp | 8 +- asmcomp/power/proc.ml | 8 +- asmcomp/power/reload.ml | 2 +- asmcomp/power/scheduling.ml | 3 +- asmcomp/power/selection.ml | 4 +- asmcomp/printcmm.ml | 8 +- asmcomp/printcmm.mli | 2 +- asmcomp/printlinear.ml | 2 +- asmcomp/printlinear.mli | 2 +- asmcomp/printmach.ml | 4 +- asmcomp/printmach.mli | 2 +- asmcomp/proc.mli | 2 +- asmcomp/reg.ml | 10 +- asmcomp/reg.mli | 3 +- asmcomp/reload.mli | 3 +- asmcomp/reloadgen.ml | 6 +- asmcomp/reloadgen.mli | 2 +- asmcomp/schedgen.ml | 6 +- asmcomp/schedgen.mli | 2 +- asmcomp/scheduling.mli | 2 +- asmcomp/selectgen.ml | 96 +- asmcomp/selectgen.mli | 9 +- asmcomp/selection.mli | 2 +- asmcomp/sparc/arch.ml | 2 +- asmcomp/sparc/emit.mlp | 2 +- asmcomp/sparc/proc.ml | 4 +- asmcomp/sparc/reload.ml | 2 +- asmcomp/sparc/scheduling.ml | 3 +- asmcomp/sparc/selection.ml | 2 +- asmcomp/spill.ml | 7 +- asmcomp/spill.mli | 4 +- asmcomp/split.ml | 4 +- asmcomp/split.mli | 2 +- asmrun/Makefile | 2 +- asmrun/Makefile.nt | 2 +- asmrun/alpha.S | 4 +- asmrun/amd64.S | 195 +- asmrun/amd64nt.asm | 132 +- asmrun/arm.S | 224 +- asmrun/backtrace.c | 7 +- asmrun/fail.c | 2 +- asmrun/hppa.S | 4 +- asmrun/i386.S | 2 +- asmrun/i386nt.asm | 111 +- asmrun/ia64.S | 6 +- asmrun/m68k.S | 2 +- asmrun/mips.s | 2 +- asmrun/power-aix.S | 2 +- asmrun/power-elf.S | 15 +- asmrun/power-rhapsody.S | 2 +- asmrun/roots.c | 2 +- asmrun/signals_asm.c | 2 +- asmrun/signals_osdep.h | 21 +- asmrun/sparc.S | 2 +- asmrun/stack.h | 2 +- asmrun/startup.c | 2 +- boot/myocamlbuild.boot | Bin 394617 -> 402011 bytes boot/ocamlc | Bin 1045577 -> 1079505 bytes boot/ocamldep | Bin 289555 -> 303181 bytes boot/ocamllex | Bin 165768 -> 165937 bytes build/boot-c-parts-windows.sh | 2 +- build/boot-c-parts.sh | 2 +- build/boot.sh | 2 +- build/buildbot | 2 +- build/camlp4-bootstrap.sh | 2 +- build/camlp4-byte-only.sh | 17 +- build/camlp4-native-only.sh | 17 +- build/camlp4-targets.sh | 2 +- build/distclean.sh | 2 +- build/fastworld.sh | 17 +- build/install.sh | 2 +- build/mkconfig.sh | 4 +- build/mkmyocamlbuild_config.sh | 2 +- build/mkruntimedef.sh | 2 +- build/myocamlbuild.sh | 6 +- build/ocamlbuild-byte-only.sh | 17 +- build/ocamlbuild-native-only.sh | 17 +- build/ocamlbuildlib-native-only.sh | 17 +- build/otherlibs-targets.sh | 17 +- build/partial-install.sh | 2 +- build/targets.sh | 2 +- build/world.all.sh | 2 +- build/world.byte.sh | 2 +- build/world.native.sh | 2 +- build/world.sh | 17 +- bytecomp/bytegen.ml | 2 +- bytecomp/bytegen.mli | 2 +- bytecomp/bytelibrarian.ml | 5 +- bytecomp/bytelibrarian.mli | 2 +- bytecomp/bytelink.ml | 4 +- bytecomp/bytelink.mli | 2 +- bytecomp/bytepackager.ml | 2 +- bytecomp/bytepackager.mli | 2 +- bytecomp/bytesections.ml | 2 +- bytecomp/bytesections.mli | 2 +- bytecomp/cmo_format.mli | 3 +- bytecomp/dll.ml | 3 +- bytecomp/dll.mli | 3 +- bytecomp/emitcode.ml | 4 +- bytecomp/emitcode.mli | 2 +- bytecomp/instruct.ml | 2 +- bytecomp/instruct.mli | 2 +- bytecomp/lambda.ml | 4 +- bytecomp/lambda.mli | 5 +- bytecomp/matching.ml | 144 +- bytecomp/matching.mli | 2 +- bytecomp/meta.ml | 7 +- bytecomp/meta.mli | 7 +- bytecomp/printinstr.ml | 2 +- bytecomp/printinstr.mli | 2 +- bytecomp/printlambda.ml | 2 +- bytecomp/printlambda.mli | 2 +- bytecomp/runtimedef.mli | 2 +- bytecomp/simplif.ml | 12 +- bytecomp/simplif.mli | 2 +- bytecomp/switch.ml | 72 +- bytecomp/switch.mli | 2 +- bytecomp/symtable.ml | 12 +- bytecomp/symtable.mli | 2 +- bytecomp/translclass.ml | 2 +- bytecomp/translclass.mli | 2 +- bytecomp/translcore.ml | 6 +- bytecomp/translcore.mli | 2 +- bytecomp/translmod.ml | 6 +- bytecomp/translmod.mli | 4 +- bytecomp/translobj.ml | 7 +- bytecomp/translobj.mli | 2 +- bytecomp/typeopt.ml | 4 +- bytecomp/typeopt.mli | 2 +- byterun/Makefile | 2 +- byterun/Makefile.common | 2 +- byterun/Makefile.nt | 4 +- byterun/alloc.c | 2 +- byterun/alloc.h | 2 +- byterun/array.c | 4 +- byterun/backtrace.c | 3 +- byterun/backtrace.h | 2 +- byterun/callback.c | 2 +- byterun/callback.h | 2 +- byterun/compact.c | 2 +- byterun/compact.h | 2 +- byterun/compare.c | 2 +- byterun/compare.h | 2 +- byterun/compatibility.h | 2 +- byterun/config.h | 2 +- byterun/custom.c | 2 +- byterun/custom.h | 4 +- byterun/debugger.c | 14 +- byterun/debugger.h | 4 +- byterun/dynlink.c | 4 +- byterun/dynlink.h | 2 +- byterun/exec.h | 2 +- byterun/extern.c | 2 +- byterun/fail.c | 2 +- byterun/fail.h | 2 +- byterun/finalise.c | 2 +- byterun/finalise.h | 2 +- byterun/fix_code.c | 4 +- byterun/fix_code.h | 2 +- byterun/floats.c | 49 +- byterun/freelist.c | 2 +- byterun/freelist.h | 2 +- byterun/gc.h | 2 +- byterun/gc_ctrl.c | 2 +- byterun/gc_ctrl.h | 2 +- byterun/globroots.c | 8 +- byterun/globroots.h | 2 +- byterun/hash.c | 6 +- byterun/instrtrace.c | 42 +- byterun/instrtrace.h | 2 +- byterun/instruct.h | 6 +- byterun/int64_emul.h | 4 +- byterun/int64_format.h | 4 +- byterun/int64_native.h | 2 +- byterun/intern.c | 12 +- byterun/interp.c | 12 +- byterun/interp.h | 2 +- byterun/intext.h | 2 +- byterun/ints.c | 23 +- byterun/io.c | 34 +- byterun/io.h | 2 +- byterun/lexing.c | 5 +- byterun/main.c | 2 +- byterun/major_gc.c | 2 +- byterun/major_gc.h | 2 +- byterun/md5.c | 3 +- byterun/md5.h | 4 +- byterun/memory.c | 4 +- byterun/memory.h | 2 +- byterun/meta.c | 6 +- byterun/minor_gc.c | 2 +- byterun/minor_gc.h | 2 +- byterun/misc.c | 2 +- byterun/misc.h | 2 +- byterun/mlvalues.h | 2 +- byterun/obj.c | 4 +- byterun/osdeps.h | 3 +- byterun/parsing.c | 16 +- byterun/prims.h | 2 +- byterun/printexc.c | 4 +- byterun/printexc.h | 2 +- byterun/reverse.h | 2 +- byterun/roots.c | 3 +- byterun/roots.h | 2 +- byterun/signals.c | 4 +- byterun/signals.h | 2 +- byterun/signals_byt.c | 2 +- byterun/signals_machdep.h | 2 +- byterun/stacks.c | 2 +- byterun/stacks.h | 2 +- byterun/startup.c | 4 +- byterun/startup.h | 2 +- byterun/str.c | 13 +- byterun/sys.c | 2 +- byterun/sys.h | 2 +- byterun/terminfo.c | 2 +- byterun/ui.h | 2 +- byterun/unix.c | 6 +- byterun/weak.c | 2 +- byterun/weak.h | 2 +- byterun/win32.c | 22 +- camlp4/CHANGES | 8 +- camlp4/Camlp4/Camlp4Ast.partial.ml | 2 +- camlp4/Camlp4/Debug.ml | 4 +- camlp4/Camlp4/PreCast.ml | 1 - camlp4/Camlp4/Printers/Null.ml | 2 +- camlp4/Camlp4/Register.ml | 5 +- camlp4/Camlp4/Register.mli | 1 - camlp4/Camlp4/Sig.ml | 11 +- camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml | 11 +- camlp4/Camlp4/Struct/CommentFilter.ml | 2 +- camlp4/Camlp4/Struct/FreeVars.ml | 1 - camlp4/Camlp4/Struct/Grammar/Context.ml | 2 +- camlp4/Camlp4/Struct/Grammar/Insert.ml | 16 +- camlp4/Camlp4/Struct/Grammar/Parser.mli | 1 - camlp4/Camlp4/Struct/Lexer.mll | 4 +- camlp4/Camlp4/Struct/Loc.ml | 18 +- camlp4/Camlp4Bin.ml | 10 +- camlp4/Camlp4Filters/Camlp4FoldGenerator.ml | 14 +- camlp4/Camlp4Filters/Camlp4MetaGenerator.ml | 2 +- camlp4/Camlp4Parsers/Camlp4DebugParser.ml | 2 +- camlp4/Camlp4Parsers/Camlp4GrammarParser.ml | 4 +- .../Camlp4Parsers/Camlp4ListComprehension.ml | 18 +- camlp4/Camlp4Parsers/Camlp4MacroParser.ml | 20 +- camlp4/Camlp4Parsers/Camlp4OCamlParser.ml | 2 +- .../Camlp4Parsers/Camlp4OCamlRevisedParser.ml | 28 +- camlp4/Camlp4Top/Rprint.ml | 2 +- camlp4/Camlp4Top/Top.ml | 10 +- camlp4/Camlp4_config.ml | 2 +- camlp4/Makefile.ml | 7 +- camlp4/boot/Camlp4.ml | 28 +- camlp4/boot/camlp4boot.ml | 34 +- camlp4/examples/expression_closure.ml | 1 - camlp4/examples/fancy_lambda_quot_test.ml | 2 +- camlp4/examples/global_handler.ml | 1 - camlp4/examples/lambda_test.ml | 1 - camlp4/man/Makefile | 6 +- camlp4/man/camlp4.help.tpl | 1 - camlp4/test/fixtures/assert.ml | 3 + .../fixtures/backquoted_irrefutable_tuple.ml | 3 + camlp4/test/fixtures/backquoted_record.ml | 4 + camlp4/test/fixtures/backquoted_tuple.ml | 3 + camlp4/test/fixtures/big-tab1.ml | 704 + camlp4/test/fixtures/big-tab2.ml | 18282 ++++++++++++++ camlp4/test/fixtures/big-tab3.ml | 20001 +++++++++++++++ camlp4/test/fixtures/bug-4058.ml | 4 + camlp4/test/fixtures/bug-4337.ml | 1 + camlp4/test/fixtures/bug-by-vincent-balat.ml | 1 + .../fixtures/bug-camlp4o-benjamin-monate.ml | 15 + .../fixtures/bug-camlp4o-constr-arity-expr.ml | 8 + .../test/fixtures/bug-camlp4o-constr-arity.ml | 75 + camlp4/test/fixtures/bug_escaping_quot.ml | 7 + camlp4/test/fixtures/chars.ml | 1 + camlp4/test/fixtures/class_expr_quot.ml | 27 + camlp4/test/fixtures/comments.ml | 66 + camlp4/test/fixtures/comments.mli | 106 + camlp4/test/fixtures/comments2.ml | 70 + camlp4/test/fixtures/constant-parser.ml | 90 + camlp4/test/fixtures/curry-constr.ml | 3 + camlp4/test/fixtures/default_quotation.ml | 4 + .../test/fixtures/exception-with-eqn-bug.ml | 1 + camlp4/test/fixtures/external.ml | 1 + camlp4/test/fixtures/fun.ml | 7 + camlp4/test/fixtures/functor-perf.ml | 2019 ++ camlp4/test/fixtures/functor-perf2.gen.ml | 3029 +++ camlp4/test/fixtures/functor-perf2.ml | 29 + camlp4/test/fixtures/functor-perf3.ml | 50 + camlp4/test/fixtures/gen_map.ml | 8 + camlp4/test/fixtures/gram-fold.ml | 21 + camlp4/test/fixtures/gram-list.ml | 13 + camlp4/test/fixtures/gram-loc-lost.ml | 30 + camlp4/test/fixtures/gram-sub-rule.ml | 33 + camlp4/test/fixtures/gram-tree.ml | 22 + camlp4/test/fixtures/gram-tree2.ml | 22 + camlp4/test/fixtures/gram-tree3.ml | 23 + camlp4/test/fixtures/gram.ml | 2 + camlp4/test/fixtures/idents | 38 + camlp4/test/fixtures/idents1 | 499 + camlp4/test/fixtures/idents2 | 1219 + camlp4/test/fixtures/if.ml | 8 + camlp4/test/fixtures/label.ml | 1 + camlp4/test/fixtures/lambda_free.ml | 68 + camlp4/test/fixtures/loc-bug.ml | 3 + camlp4/test/fixtures/macrotest.ml | 70 + camlp4/test/fixtures/macrotest.mli | 25 + camlp4/test/fixtures/macrotest2.ml | 6 + camlp4/test/fixtures/macrotest3.ml | 11 + camlp4/test/fixtures/make_extend.ml | 1 + camlp4/test/fixtures/match.ml | 9 + camlp4/test/fixtures/match_parser.ml | 10 + camlp4/test/fixtures/meta_multi_term.ml | 16 + camlp4/test/fixtures/metalib.ml | 5 + .../test/fixtures/method_private_virtual.ml | 9 + camlp4/test/fixtures/mod.ml | 15 + camlp4/test/fixtures/mod2.ml | 8 + camlp4/test/fixtures/operators.ml | 7 + camlp4/test/fixtures/operators.mli | 1 + camlp4/test/fixtures/original_syntax.ml | 17 + camlp4/test/fixtures/outside-scope.ml | 21 + camlp4/test/fixtures/parser.ml | 61 + camlp4/test/fixtures/pp_let_in.ml | 10 + camlp4/test/fixtures/pp_let_in2.ml | 1 + camlp4/test/fixtures/pp_xml.ml | 31 + camlp4/test/fixtures/pprecordtyp.ml | 26 + camlp4/test/fixtures/pr4314.ml | 1 + camlp4/test/fixtures/pr4314gram1.ml | 36 + camlp4/test/fixtures/pr4314gram2.ml | 36 + camlp4/test/fixtures/pr4314gram3.ml | 36 + camlp4/test/fixtures/pr4314gram4.ml | 36 + camlp4/test/fixtures/pr4314gram5.ml | 38 + camlp4/test/fixtures/pr4329.ml | 50 + camlp4/test/fixtures/pr4330.ml | 57 + camlp4/test/fixtures/pr4357.ml | 16 + camlp4/test/fixtures/pr4357sample.ml | 3 + camlp4/test/fixtures/pr4357sample2.ml | 5 + camlp4/test/fixtures/pr4452.ml | 24 + camlp4/test/fixtures/private_row.ml | 27 + camlp4/test/fixtures/rec.ml | 2 + camlp4/test/fixtures/seq.ml | 1003 + camlp4/test/fixtures/seq2.ml | 3003 +++ camlp4/test/fixtures/simplify.ml | 11 + camlp4/test/fixtures/simplify_r.ml | 11 + camlp4/test/fixtures/stream-parser-bug.ml | 6 + camlp4/test/fixtures/string.ml | 1 + camlp4/test/fixtures/superfluous.ml | 12 + camlp4/test/fixtures/transform-examples.ml | 3 + camlp4/test/fixtures/try.ml | 6 + camlp4/test/fixtures/tuple_as_retval.ml | 3 + camlp4/test/fixtures/type.ml | 3 + camlp4/test/fixtures/type_decl.ml | 22 + camlp4/test/fixtures/unit.ml | 4 + camlp4/test/fixtures/use.ml | 4 + camlp4/test/fixtures/where.o.ml | 1 + camlp4/test/fixtures/where.r.ml | 1 + camlp4/unmaintained/Makefile | 20 + camlp4/unmaintained/compile/.cvsignore | 4 + camlp4/unmaintained/compile/.depend | 0 camlp4/unmaintained/compile/Makefile | 37 + camlp4/unmaintained/compile/comp_head.ml | 70 + camlp4/unmaintained/compile/comp_trail.ml | 33 + camlp4/unmaintained/compile/compile.ml | 574 + camlp4/unmaintained/compile/compile.sh | 27 + camlp4/unmaintained/etc/.cvsignore | 7 + camlp4/unmaintained/etc/.depend | 6 + camlp4/unmaintained/etc/Makefile | 62 + camlp4/unmaintained/etc/pa_fstream.ml | 163 + camlp4/unmaintained/etc/pa_ifdef.ml | 91 + camlp4/unmaintained/etc/pa_oop.ml | 155 + camlp4/unmaintained/etc/pa_ru.ml | 46 + camlp4/unmaintained/etc/parserify.ml | 305 + camlp4/unmaintained/etc/parserify.mli | 12 + camlp4/unmaintained/etc/pr_depend.ml | 321 + camlp4/unmaintained/etc/pr_extend.ml | 518 + camlp4/unmaintained/etc/pr_extfun.ml | 92 + camlp4/unmaintained/etc/pr_null.ml | 16 + camlp4/unmaintained/etc/pr_op.ml | 210 + camlp4/unmaintained/etc/pr_op_main.ml | 214 + camlp4/unmaintained/etc/pr_rp.ml | 207 + camlp4/unmaintained/etc/pr_rp_main.ml | 206 + camlp4/unmaintained/etc/q_phony.ml | 38 + camlp4/unmaintained/extfold/README | 15 + camlp4/unmaintained/extfold/pa_extfold.ml | 42 + camlp4/unmaintained/format/.depend | 0 camlp4/unmaintained/format/Makefile | 61 + camlp4/unmaintained/format/README | 15 + camlp4/unmaintained/format/pa_format.ml | 52 + camlp4/unmaintained/lefteval/.depend | 0 camlp4/unmaintained/lefteval/Makefile | 61 + camlp4/unmaintained/lefteval/README | 15 + camlp4/unmaintained/lefteval/pa_lefteval.ml | 241 + camlp4/unmaintained/lib/.cvsignore | 3 + camlp4/unmaintained/lib/.depend | 14 + camlp4/unmaintained/lib/Makefile | 52 + camlp4/unmaintained/lib/extfun.ml | 107 + camlp4/unmaintained/lib/extfun.mli | 35 + camlp4/unmaintained/lib/fstream.ml | 77 + camlp4/unmaintained/lib/fstream.mli | 60 + camlp4/unmaintained/ocamllex/Makefile | 59 + camlp4/unmaintained/ocamllex/README | 15 + camlp4/unmaintained/ocamllex/pa_ocamllex.ml | 356 + camlp4/unmaintained/ocpp/.cvsignore | 3 + camlp4/unmaintained/ocpp/.depend | 0 camlp4/unmaintained/ocpp/Makefile | 24 + camlp4/unmaintained/ocpp/ocpp.ml | 129 + camlp4/unmaintained/odyl/.cvsignore | 4 + camlp4/unmaintained/odyl/.depend | 4 + camlp4/unmaintained/odyl/Makefile | 61 + camlp4/unmaintained/odyl/odyl.ml | 57 + camlp4/unmaintained/odyl/odyl_main.mli | 13 + camlp4/unmaintained/olabl/.depend | 0 camlp4/unmaintained/olabl/Makefile | 61 + camlp4/unmaintained/olabl/README | 15 + camlp4/unmaintained/olabl/pa_olabl.ml | 2022 ++ camlp4/unmaintained/scheme/.depend | 0 camlp4/unmaintained/scheme/Makefile | 85 + camlp4/unmaintained/scheme/README | 15 + camlp4/unmaintained/scheme/pa_scheme.ml | 1093 + camlp4/unmaintained/scheme/pa_scheme.sc | 1029 + camlp4/unmaintained/scheme/pr_scheme.ml | 826 + camlp4/unmaintained/scheme/pr_schp_main.ml | 132 + camlp4/unmaintained/sml/.depend | 0 camlp4/unmaintained/sml/Makefile | 68 + camlp4/unmaintained/sml/README | 15 + camlp4/unmaintained/sml/pa_sml.ml | 952 + camlp4/unmaintained/sml/smllib.sml | 395 + config/.cvsignore | 1 - config/Makefile-templ | 6 +- config/Makefile.mingw | 4 +- config/Makefile.msvc | 4 +- config/Makefile.msvc64 | 4 +- config/auto-aux/align.c | 2 +- config/auto-aux/async_io.c | 2 +- config/auto-aux/bytecopy.c | 2 +- config/auto-aux/dblalign.c | 3 +- config/auto-aux/divmod.c | 4 +- config/auto-aux/elf.c | 2 +- config/auto-aux/endian.c | 2 +- config/auto-aux/getgroups.c | 2 +- config/auto-aux/gethostbyaddr.c | 2 +- config/auto-aux/gethostbyname.c | 2 +- config/auto-aux/ia32sse2.c | 2 +- config/auto-aux/initgroups.c | 26 + config/auto-aux/int64align.c | 3 +- config/auto-aux/longlong.c | 2 +- config/auto-aux/schar.c | 2 +- config/auto-aux/schar2.c | 2 +- config/auto-aux/setgroups.c | 28 + config/auto-aux/sighandler.c | 2 +- config/auto-aux/signals.c | 2 +- config/auto-aux/sizes.c | 2 +- config/auto-aux/stackov.c | 4 +- config/m-nt.h | 3 +- config/m-templ.h | 2 +- config/s-nt.h | 2 +- config/s-templ.h | 21 +- configure | 27 +- debugger/.depend | 198 +- debugger/Makefile | 2 +- debugger/Makefile.nt | 3 +- debugger/Makefile.shared | 4 +- debugger/breakpoints.ml | 4 +- debugger/breakpoints.mli | 2 +- debugger/checkpoints.ml | 2 +- debugger/checkpoints.mli | 2 +- debugger/command_line.ml | 18 +- debugger/command_line.mli | 2 +- debugger/debugcom.ml | 4 +- debugger/debugcom.mli | 4 +- debugger/debugger_config.ml | 4 +- debugger/debugger_config.mli | 3 +- debugger/dynlink.ml | 4 +- debugger/dynlink.mli | 6 +- debugger/envaux.ml | 4 +- debugger/envaux.mli | 2 +- debugger/eval.ml | 4 +- debugger/eval.mli | 2 +- debugger/events.ml | 2 +- debugger/events.mli | 3 +- debugger/exec.ml | 2 +- debugger/exec.mli | 2 +- debugger/frames.ml | 4 +- debugger/frames.mli | 2 +- debugger/history.ml | 2 +- debugger/history.mli | 2 +- debugger/input_handling.ml | 2 +- debugger/input_handling.mli | 2 +- debugger/int64ops.ml | 2 +- debugger/int64ops.mli | 2 +- debugger/lexer.mli | 2 +- debugger/lexer.mll | 2 +- debugger/loadprinter.ml | 8 +- debugger/loadprinter.mli | 2 +- debugger/main.ml | 6 +- debugger/parameters.ml | 2 +- debugger/parameters.mli | 2 +- debugger/parser.mly | 4 +- debugger/parser_aux.mli | 3 +- debugger/pattern_matching.ml | 4 +- debugger/pattern_matching.mli | 2 +- debugger/pos.ml | 2 +- debugger/pos.mli | 2 +- debugger/primitives.ml | 2 +- debugger/primitives.mli | 2 +- debugger/printval.ml | 3 +- debugger/printval.mli | 4 +- debugger/program_loading.ml | 2 +- debugger/program_loading.mli | 2 +- debugger/program_management.ml | 2 +- debugger/program_management.mli | 2 +- debugger/question.ml | 1 - debugger/show_information.ml | 2 +- debugger/show_information.mli | 2 +- debugger/show_source.ml | 2 +- debugger/show_source.mli | 2 +- debugger/source.ml | 2 +- debugger/source.mli | 2 +- debugger/symbols.ml | 2 +- debugger/symbols.mli | 2 +- debugger/time_travel.ml | 2 +- debugger/time_travel.mli | 2 +- debugger/trap_barrier.ml | 2 +- debugger/trap_barrier.mli | 2 +- debugger/unix_tools.ml | 2 +- debugger/unix_tools.mli | 2 +- driver/compile.ml | 2 +- driver/compile.mli | 2 +- driver/errors.ml | 2 +- driver/errors.mli | 2 +- driver/main.ml | 6 +- driver/main.mli | 2 +- driver/main_args.ml | 879 +- driver/main_args.mli | 244 +- driver/optcompile.ml | 2 +- driver/optcompile.mli | 2 +- driver/opterrors.ml | 2 +- driver/opterrors.mli | 2 +- driver/optmain.ml | 204 +- driver/optmain.mli | 2 +- driver/pparse.ml | 2 +- driver/pparse.mli | 2 +- emacs/.cvsignore | 1 - emacs/Makefile | 38 +- emacs/README | 2 +- emacs/caml-compat.el | 3 +- emacs/caml-emacs.el | 2 +- emacs/caml-font-old.el | 4 +- emacs/caml-font.el | 8 +- emacs/caml-help.el | 121 +- emacs/caml-hilit.el | 2 +- emacs/caml-types.el | 2 +- emacs/caml-xemacs.el | 2 +- emacs/caml.el | 2 +- emacs/camldebug.el | 2 +- emacs/inf-caml.el | 24 +- emacs/ocamltags.in | 4 +- lex/.depend | 64 +- lex/Makefile | 4 +- lex/Makefile.nt | 2 +- lex/compact.ml | 9 +- lex/compact.mli | 4 +- lex/cset.ml | 4 +- lex/cset.mli | 8 +- lex/lexer.mli | 2 +- lex/lexer.mll | 2 +- lex/lexgen.ml | 68 +- lex/lexgen.mli | 7 +- lex/main.ml | 11 +- lex/output.ml | 6 +- lex/output.mli | 2 +- lex/outputbis.ml | 68 +- lex/outputbis.mli | 2 +- lex/parser.mly | 2 +- lex/syntax.ml | 2 +- lex/syntax.mli | 2 +- lex/table.mli | 4 +- man/Makefile | 2 +- man/ocaml.help | 138 - man/ocaml.m | 19 +- man/ocamlc.m | 250 +- man/ocamlcp.m | 2 +- man/ocamldebug.m | 2 +- man/ocamldep.m | 2 +- man/ocamldoc.m | 2 +- man/ocamllex.m | 2 +- man/ocamlmktop.m | 2 +- man/ocamlopt.m | 100 +- man/ocamlprof.m | 2 +- man/ocamlrun.m | 3 +- man/ocamlyacc.m | 2 +- myocamlbuild.ml | 6 +- ocamlbuild/TODO | 1 - ocamlbuild/_tags | 2 +- ocamlbuild/command.ml | 14 +- ocamlbuild/command.mli | 1 + ocamlbuild/configuration.ml | 39 +- ocamlbuild/configuration.mli | 5 - ocamlbuild/display.ml | 4 +- ocamlbuild/findlib.ml | 177 + ocamlbuild/findlib.mli | 15 + ocamlbuild/flags.ml | 10 +- ocamlbuild/flags.mli | 2 +- ocamlbuild/glob.ml | 2 +- ocamlbuild/glob_lexer.mll | 6 +- ocamlbuild/hygiene.ml | 2 +- ocamlbuild/lexers.mli | 20 +- ocamlbuild/lexers.mll | 43 +- ocamlbuild/main.ml | 27 +- ocamlbuild/man/ocamlbuild.1 | 2 +- ocamlbuild/manual/.cvsignore | 6 + ocamlbuild/manual/Makefile | 15 + ocamlbuild/manual/manual.hva | 1 + ocamlbuild/manual/manual.tex | 1054 + ocamlbuild/manual/myocamlbuild.ml | 119 + ocamlbuild/manual/trace.out | 83 + ocamlbuild/misc/opentracer.ml | 2 +- ocamlbuild/my_std.ml | 6 +- ocamlbuild/my_std.mli | 8 +- ocamlbuild/my_unix.ml | 8 +- ocamlbuild/ocaml_compiler.ml | 58 +- ocamlbuild/ocaml_compiler.mli | 6 + ocamlbuild/ocaml_dependencies.ml | 2 +- ocamlbuild/ocaml_specific.ml | 114 +- ocamlbuild/ocaml_tools.ml | 33 +- ocamlbuild/ocaml_utils.ml | 7 +- ocamlbuild/ocaml_utils.mli | 3 +- ocamlbuild/ocamlbuild.mli | 1 - ocamlbuild/ocamlbuild.odocl | 2 + ocamlbuild/ocamlbuild_executor.ml | 8 +- ocamlbuild/ocamlbuild_pack.mlpack | 2 + ocamlbuild/ocamlbuild_plugin.ml | 4 + ocamlbuild/ocamlbuild_unix_plugin.ml | 3 +- ocamlbuild/options.ml | 31 +- ocamlbuild/param_tags.ml | 56 + ocamlbuild/param_tags.mli | 42 + ocamlbuild/pathname.ml | 1 - ocamlbuild/plugin.ml | 2 +- ocamlbuild/resource.ml | 68 +- ocamlbuild/rule.ml | 1 - ocamlbuild/shell.ml | 1 + ocamlbuild/signatures.mli | 101 +- ocamlbuild/slurp.ml | 2 +- ocamlbuild/solver.ml | 20 +- ocamlbuild/start.sh | 21 +- ocamlbuild/test/good-output | 1090 + ocamlbuild/test/runtest.sh | 36 + ocamlbuild/test/test1/foo.ml | 1 + ocamlbuild/test/test10/dbdi | 12 + ocamlbuild/test/test10/test.sh | 6 + ocamlbuild/test/test11/_tags | 2 + ocamlbuild/test/test11/a/aa.ml | 1 + ocamlbuild/test/test11/a/aa.mli | 1 + ocamlbuild/test/test11/b/bb.ml | 1 + ocamlbuild/test/test11/b/libb.mllib | 1 + ocamlbuild/test/test11/myocamlbuild.ml | 5 + ocamlbuild/test/test11/test.sh | 13 + ocamlbuild/test/test2/_tags | 3 + ocamlbuild/test/test2/tata.ml | 1 + ocamlbuild/test/test2/tata.mli | 2 + ocamlbuild/test/test2/test.sh | 18 + ocamlbuild/test/test2/titi.ml | 1 + ocamlbuild/test/test2/toto.ml | 5 + ocamlbuild/test/test2/tutu.ml | 2 + ocamlbuild/test/test2/tutu.mli | 3 + ocamlbuild/test/test2/tyty.mli | 1 + ocamlbuild/test/test2/vivi1.ml | 2 + ocamlbuild/test/test2/vivi2.ml | 2 + ocamlbuild/test/test2/vivi3.ml | 2 + ocamlbuild/test/test3/_tags | 1 + ocamlbuild/test/test3/a.ml | 1 + ocamlbuild/test/test3/a.mli | 1 + ocamlbuild/test/test3/b.ml | 1 + ocamlbuild/test/test3/b.mli | 1 + ocamlbuild/test/test3/c.ml | 1 + ocamlbuild/test/test3/c.mli | 1 + ocamlbuild/test/test3/d.ml | 1 + ocamlbuild/test/test3/d.mli | 1 + ocamlbuild/test/test3/e.ml | 1 + ocamlbuild/test/test3/e.mli | 1 + ocamlbuild/test/test3/f.ml | 2 + ocamlbuild/test/test3/f.mli | 1 + ocamlbuild/test/test3/proj.odocl | 1 + ocamlbuild/test/test3/test.sh | 11 + ocamlbuild/test/test4/_tags | 2 + ocamlbuild/test/test4/a/aa.ml | 1 + ocamlbuild/test/test4/a/aa.mli | 1 + ocamlbuild/test/test4/b/bb.ml | 2 + ocamlbuild/test/test4/test.sh | 11 + ocamlbuild/test/test5/_tags | 1 + ocamlbuild/test/test5/a.ml | 1 + ocamlbuild/test/test5/a.mli | 1 + ocamlbuild/test/test5/b.ml | 1 + ocamlbuild/test/test5/c.mlpack | 1 + ocamlbuild/test/test5/d.ml | 1 + ocamlbuild/test/test5/stack.ml | 1 + ocamlbuild/test/test5/test.sh | 11 + ocamlbuild/test/test6/a.ml | 1 + ocamlbuild/test/test6/a.mli | 1 + ocamlbuild/test/test6/b.ml | 1 + ocamlbuild/test/test6/b.mli | 1 + ocamlbuild/test/test6/b.mli.v1 | 1 + ocamlbuild/test/test6/b.mli.v2 | 2 + ocamlbuild/test/test6/d.ml | 2 + ocamlbuild/test/test6/d.mli | 1 + ocamlbuild/test/test6/d.mli.v1 | 2 + ocamlbuild/test/test6/d.mli.v2 | 1 + ocamlbuild/test/test6/main.ml | 1 + ocamlbuild/test/test6/main.mli | 1 + ocamlbuild/test/test6/test.sh | 26 + ocamlbuild/test/test7/_tags | 1 + ocamlbuild/test/test7/aa.ml | 1 + ocamlbuild/test/test7/bb.mli | 1 + ocamlbuild/test/test7/bb1.ml | 1 + ocamlbuild/test/test7/bb2.ml | 3 + ocamlbuild/test/test7/bb3.ml | 3 + ocamlbuild/test/test7/bbcc.mllib | 1 + ocamlbuild/test/test7/c2.ml | 1 + ocamlbuild/test/test7/c2.mli | 1 + ocamlbuild/test/test7/c3.ml | 1 + ocamlbuild/test/test7/cc.ml | 1 + ocamlbuild/test/test7/cool_plugin.ml | 1 + ocamlbuild/test/test7/main.ml | 1 + ocamlbuild/test/test7/myocamlbuild.ml | 7 + ocamlbuild/test/test7/test.sh | 18 + ocamlbuild/test/test8/a.ml | 1 + ocamlbuild/test/test8/myocamlbuild.ml | 16 + ocamlbuild/test/test8/test.sh | 11 + ocamlbuild/test/test9/dbgl | 10 + ocamlbuild/test/test9/test.sh | 6 + ocamlbuild/test/test9/testglob.ml | 134 + 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 | 11 + ocamlbuild/test/test_virtual/test.sh | 16 + ocamlbuild/tools.ml | 4 +- ocamlbuild/tools.mli | 1 - ocamldoc/.depend | 228 +- ocamldoc/Changes.txt | 4 + ocamldoc/Makefile | 2 +- ocamldoc/Makefile.nt | 10 +- ocamldoc/ocamldoc.sty | 4 +- ocamldoc/odoc.ml | 19 +- ocamldoc/odoc_analyse.ml | 6 +- ocamldoc/odoc_analyse.mli | 17 +- ocamldoc/odoc_args.ml | 2 +- ocamldoc/odoc_args.mli | 2 +- ocamldoc/odoc_ast.ml | 21 +- ocamldoc/odoc_ast.mli | 24 +- ocamldoc/odoc_class.ml | 42 +- ocamldoc/odoc_comments.ml | 2 +- ocamldoc/odoc_comments.mli | 2 +- ocamldoc/odoc_comments_global.ml | 6 +- ocamldoc/odoc_comments_global.mli | 2 +- ocamldoc/odoc_config.ml | 2 +- ocamldoc/odoc_config.mli | 2 +- ocamldoc/odoc_control.ml | 3 +- ocamldoc/odoc_cross.ml | 35 +- ocamldoc/odoc_cross.mli | 2 +- ocamldoc/odoc_dag2html.ml | 2 +- ocamldoc/odoc_dag2html.mli | 10 +- ocamldoc/odoc_dep.ml | 36 +- ocamldoc/odoc_dot.ml | 2 +- ocamldoc/odoc_env.ml | 62 +- ocamldoc/odoc_env.mli | 4 +- ocamldoc/odoc_exception.ml | 8 +- ocamldoc/odoc_global.ml | 2 +- ocamldoc/odoc_global.mli | 2 +- ocamldoc/odoc_html.ml | 94 +- ocamldoc/odoc_info.ml | 5 +- ocamldoc/odoc_info.mli | 9 +- ocamldoc/odoc_inherit.ml | 3 +- ocamldoc/odoc_latex.ml | 32 +- ocamldoc/odoc_latex_style.ml | 153 +- ocamldoc/odoc_lexer.mll | 9 +- ocamldoc/odoc_man.ml | 8 +- ocamldoc/odoc_merge.ml | 2 +- ocamldoc/odoc_merge.mli | 3 +- ocamldoc/odoc_messages.ml | 2 +- ocamldoc/odoc_misc.ml | 20 +- ocamldoc/odoc_misc.mli | 2 +- ocamldoc/odoc_module.ml | 2 +- ocamldoc/odoc_name.ml | 41 +- ocamldoc/odoc_name.mli | 3 +- ocamldoc/odoc_ocamlhtml.mll | 8 +- ocamldoc/odoc_parameter.ml | 24 +- ocamldoc/odoc_parser.mly | 22 +- ocamldoc/odoc_print.ml | 24 +- ocamldoc/odoc_print.mli | 9 +- ocamldoc/odoc_scan.ml | 42 +- ocamldoc/odoc_search.ml | 35 +- ocamldoc/odoc_search.mli | 6 +- ocamldoc/odoc_see_lexer.mll | 46 +- ocamldoc/odoc_sig.ml | 11 +- ocamldoc/odoc_sig.mli | 4 +- ocamldoc/odoc_str.ml | 68 +- ocamldoc/odoc_str.mli | 4 +- ocamldoc/odoc_test.ml | 108 +- ocamldoc/odoc_texi.ml | 32 +- ocamldoc/odoc_text.ml | 129 +- ocamldoc/odoc_text.mli | 8 +- ocamldoc/odoc_text_lexer.mll | 165 +- ocamldoc/odoc_text_parser.mly | 82 +- ocamldoc/odoc_to_text.ml | 30 +- ocamldoc/odoc_type.ml | 5 +- ocamldoc/odoc_types.ml | 5 +- ocamldoc/odoc_types.mli | 8 +- ocamldoc/odoc_value.ml | 7 +- ocamldoc/remove_DEBUG | 2 +- ocamldoc/runocamldoc | 2 +- otherlibs/Makefile | 2 +- otherlibs/Makefile.nt | 3 +- otherlibs/Makefile.shared | 2 +- otherlibs/bigarray/.depend | 6 +- otherlibs/bigarray/Makefile | 2 +- otherlibs/bigarray/Makefile.nt | 2 +- otherlibs/bigarray/bigarray.h | 2 +- otherlibs/bigarray/bigarray.ml | 2 +- otherlibs/bigarray/bigarray.mli | 2 +- otherlibs/bigarray/bigarray_stubs.c | 8 +- otherlibs/bigarray/mmap_unix.c | 31 +- otherlibs/bigarray/mmap_win32.c | 4 +- otherlibs/db/.depend | 4 +- otherlibs/dbm/.depend | 6 +- otherlibs/dbm/Makefile | 2 +- otherlibs/dbm/cldbm.c | 8 +- otherlibs/dbm/dbm.ml | 6 +- otherlibs/dbm/dbm.mli | 5 +- otherlibs/dynlink/Makefile | 4 +- otherlibs/dynlink/Makefile.nt | 2 +- otherlibs/dynlink/dynlink.ml | 10 +- otherlibs/dynlink/dynlink.mli | 6 +- otherlibs/dynlink/extract_crc.ml | 4 +- otherlibs/dynlink/natdynlink.ml | 74 +- otherlibs/graph/.depend | 12 +- otherlibs/graph/Makefile | 2 +- otherlibs/graph/color.c | 28 +- otherlibs/graph/draw.c | 2 +- otherlibs/graph/dump_img.c | 2 +- otherlibs/graph/events.c | 4 +- otherlibs/graph/fill.c | 2 +- otherlibs/graph/graphics.ml | 3 +- otherlibs/graph/graphics.mli | 10 +- otherlibs/graph/graphicsX11.ml | 7 +- otherlibs/graph/graphicsX11.mli | 5 +- otherlibs/graph/image.c | 4 +- otherlibs/graph/image.h | 2 +- otherlibs/graph/libgraph.h | 4 +- otherlibs/graph/make_img.c | 2 +- otherlibs/graph/open.c | 2 +- otherlibs/graph/point_col.c | 4 +- otherlibs/graph/sound.c | 2 +- otherlibs/graph/subwindow.c | 2 +- otherlibs/graph/text.c | 2 +- otherlibs/labltk/Makefile | 10 +- otherlibs/labltk/Makefile.nt | 4 +- otherlibs/labltk/README | 53 +- otherlibs/labltk/Widgets.src | 140 +- otherlibs/labltk/browser/.depend | 84 +- otherlibs/labltk/browser/Makefile.nt | 2 + otherlibs/labltk/browser/Makefile.shared | 5 +- otherlibs/labltk/browser/dummyUnix.mli | 2 +- otherlibs/labltk/browser/dummyWin.mli | 2 +- otherlibs/labltk/browser/editor.ml | 2 +- otherlibs/labltk/browser/editor.mli | 2 +- otherlibs/labltk/browser/fileselect.ml | 28 +- otherlibs/labltk/browser/fileselect.mli | 4 +- otherlibs/labltk/browser/jg_bind.ml | 4 +- otherlibs/labltk/browser/jg_bind.mli | 2 +- otherlibs/labltk/browser/jg_box.ml | 8 +- otherlibs/labltk/browser/jg_button.ml | 2 +- otherlibs/labltk/browser/jg_completion.ml | 6 +- otherlibs/labltk/browser/jg_completion.mli | 2 +- otherlibs/labltk/browser/jg_config.ml | 2 +- otherlibs/labltk/browser/jg_config.mli | 2 +- otherlibs/labltk/browser/jg_entry.ml | 2 +- otherlibs/labltk/browser/jg_memo.ml | 4 +- otherlibs/labltk/browser/jg_memo.mli | 2 +- otherlibs/labltk/browser/jg_menu.ml | 2 +- otherlibs/labltk/browser/jg_message.ml | 4 +- otherlibs/labltk/browser/jg_message.mli | 2 +- otherlibs/labltk/browser/jg_multibox.ml | 6 +- otherlibs/labltk/browser/jg_multibox.mli | 2 +- otherlibs/labltk/browser/jg_text.ml | 2 +- otherlibs/labltk/browser/jg_text.mli | 2 +- otherlibs/labltk/browser/jg_tk.ml | 2 +- otherlibs/labltk/browser/jg_toplevel.ml | 4 +- otherlibs/labltk/browser/lexical.ml | 2 +- otherlibs/labltk/browser/lexical.mli | 2 +- otherlibs/labltk/browser/list2.ml | 2 +- otherlibs/labltk/browser/main.ml | 2 +- otherlibs/labltk/browser/mytypes.mli | 2 +- otherlibs/labltk/browser/searchid.ml | 10 +- otherlibs/labltk/browser/searchid.mli | 2 +- otherlibs/labltk/browser/searchpos.ml | 24 +- otherlibs/labltk/browser/searchpos.mli | 3 +- otherlibs/labltk/browser/setpath.ml | 6 +- otherlibs/labltk/browser/setpath.mli | 4 +- otherlibs/labltk/browser/shell.ml | 2 +- otherlibs/labltk/browser/shell.mli | 2 +- otherlibs/labltk/browser/typecheck.ml | 3 +- otherlibs/labltk/browser/typecheck.mli | 2 +- otherlibs/labltk/browser/useunix.ml | 6 +- otherlibs/labltk/browser/useunix.mli | 2 +- otherlibs/labltk/browser/viewer.ml | 8 +- otherlibs/labltk/browser/viewer.mli | 2 +- otherlibs/labltk/browser/winmain.c | 2 + otherlibs/labltk/builtin/LICENSE | 2 +- .../labltk/builtin/builtin_FilePattern.ml | 2 +- otherlibs/labltk/builtin/builtin_GetCursor.ml | 5 +- otherlibs/labltk/builtin/builtin_bind.ml | 22 +- otherlibs/labltk/builtin/builtin_bindtags.ml | 1 - otherlibs/labltk/builtin/builtin_font.ml | 1 - otherlibs/labltk/builtin/builtinf_GetPixel.ml | 4 +- otherlibs/labltk/builtin/builtinf_bind.ml | 24 +- .../labltk/builtin/builtini_GetBitmap.ml | 4 +- .../labltk/builtin/builtini_GetCursor.ml | 4 +- otherlibs/labltk/builtin/builtini_GetPixel.ml | 4 +- .../labltk/builtin/builtini_ScrollValue.ml | 8 +- otherlibs/labltk/builtin/builtini_bind.ml | 12 +- otherlibs/labltk/builtin/builtini_font.ml | 1 - otherlibs/labltk/builtin/builtini_index.ml | 22 +- otherlibs/labltk/builtin/builtini_text.ml | 12 +- otherlibs/labltk/builtin/canvas_bind.ml | 6 +- otherlibs/labltk/builtin/canvas_bind.mli | 6 +- otherlibs/labltk/builtin/dialog.mli | 16 +- otherlibs/labltk/builtin/image.ml | 8 +- otherlibs/labltk/builtin/optionmenu.ml | 8 +- otherlibs/labltk/builtin/optionmenu.mli | 14 +- .../labltk/builtin/selection_handle_set.ml | 4 +- .../labltk/builtin/selection_handle_set.mli | 2 +- otherlibs/labltk/builtin/selection_own_set.ml | 6 +- .../labltk/builtin/selection_own_set.mli | 4 +- otherlibs/labltk/builtin/text_tag_bind.ml | 6 +- otherlibs/labltk/builtin/text_tag_bind.mli | 6 +- otherlibs/labltk/camltk/Makefile.gen | 4 +- otherlibs/labltk/compiler/.depend | 52 +- otherlibs/labltk/compiler/Makefile | 12 +- otherlibs/labltk/compiler/compile.ml | 200 +- otherlibs/labltk/compiler/intf.ml | 18 +- otherlibs/labltk/compiler/lexer.mll | 10 +- otherlibs/labltk/compiler/maincompile.ml | 82 +- otherlibs/labltk/compiler/parser.mly | 22 +- otherlibs/labltk/compiler/ppexec.ml | 10 +- otherlibs/labltk/compiler/pplex.mll | 10 +- otherlibs/labltk/compiler/ppparse.ml | 10 +- otherlibs/labltk/compiler/printer.ml | 6 +- otherlibs/labltk/compiler/tables.ml | 94 +- otherlibs/labltk/compiler/tsort.ml | 16 +- otherlibs/labltk/examples_camltk/Makefile | 8 +- otherlibs/labltk/examples_camltk/Makefile.nt | 6 +- otherlibs/labltk/examples_camltk/eyes.ml | 10 +- .../labltk/examples_camltk/helloworld.ml | 12 +- otherlibs/labltk/examples_camltk/mytext.ml | 9 +- .../labltk/examples_camltk/socketinput.ml | 1 - otherlibs/labltk/examples_camltk/tetris.ml | 121 +- otherlibs/labltk/examples_camltk/text.ml | 5 +- otherlibs/labltk/examples_camltk/winskel.ml | 20 +- otherlibs/labltk/examples_labltk/Makefile.nt | 18 +- otherlibs/labltk/examples_labltk/README | 2 +- otherlibs/labltk/examples_labltk/calc.ml | 2 +- otherlibs/labltk/examples_labltk/clock.ml | 2 +- otherlibs/labltk/examples_labltk/demo.ml | 51 +- otherlibs/labltk/examples_labltk/eyes.ml | 17 +- otherlibs/labltk/examples_labltk/hello.ml | 6 +- otherlibs/labltk/examples_labltk/lang.ml | 6 +- otherlibs/labltk/examples_labltk/taquin.ml | 10 +- otherlibs/labltk/examples_labltk/tetris.ml | 144 +- otherlibs/labltk/frx/.depend | 76 +- otherlibs/labltk/frx/Makefile | 2 +- otherlibs/labltk/frx/frx_color.ml | 2 +- otherlibs/labltk/frx/frx_ctext.ml | 6 +- otherlibs/labltk/frx/frx_ctext.mli | 2 - otherlibs/labltk/frx/frx_dialog.ml | 26 +- otherlibs/labltk/frx/frx_dialog.mli | 4 +- otherlibs/labltk/frx/frx_entry.ml | 6 +- otherlibs/labltk/frx/frx_fileinput.ml | 3 +- otherlibs/labltk/frx/frx_fillbox.ml | 8 +- otherlibs/labltk/frx/frx_fit.ml | 12 +- otherlibs/labltk/frx/frx_focus.ml | 4 +- otherlibs/labltk/frx/frx_font.ml | 9 +- otherlibs/labltk/frx/frx_font.mli | 2 +- otherlibs/labltk/frx/frx_lbutton.ml | 2 +- otherlibs/labltk/frx/frx_lbutton.mli | 1 - otherlibs/labltk/frx/frx_listbox.ml | 22 +- otherlibs/labltk/frx/frx_mem.ml | 2 +- otherlibs/labltk/frx/frx_misc.ml | 8 +- otherlibs/labltk/frx/frx_req.ml | 32 +- otherlibs/labltk/frx/frx_req.mli | 2 +- otherlibs/labltk/frx/frx_synth.ml | 20 +- otherlibs/labltk/frx/frx_text.ml | 59 +- otherlibs/labltk/frx/frx_widget.ml | 3 +- otherlibs/labltk/jpf/Makefile | 20 +- otherlibs/labltk/jpf/balloon.ml | 16 +- otherlibs/labltk/jpf/balloon.mli | 2 +- otherlibs/labltk/jpf/balloontest.ml | 3 +- otherlibs/labltk/jpf/fileselect.ml | 86 +- otherlibs/labltk/jpf/fileselect.mli | 8 +- otherlibs/labltk/jpf/jpf_font.ml | 36 +- otherlibs/labltk/jpf/jpf_font.mli | 4 +- otherlibs/labltk/jpf/shell.ml | 13 +- otherlibs/labltk/jpf/shell.mli | 1 - otherlibs/labltk/labltk/Makefile.gen | 4 +- otherlibs/labltk/lib/Makefile | 14 +- otherlibs/labltk/support/.depend | 50 +- otherlibs/labltk/support/camltk.h | 8 +- otherlibs/labltk/support/camltkwrap.ml | 8 +- otherlibs/labltk/support/camltkwrap.mli | 116 +- otherlibs/labltk/support/cltkCaml.c | 2 +- otherlibs/labltk/support/cltkDMain.c | 4 +- otherlibs/labltk/support/cltkEval.c | 10 +- otherlibs/labltk/support/cltkEvent.c | 3 +- otherlibs/labltk/support/cltkFile.c | 8 +- otherlibs/labltk/support/cltkMain.c | 10 +- otherlibs/labltk/support/cltkMisc.c | 8 +- otherlibs/labltk/support/cltkTimer.c | 7 +- otherlibs/labltk/support/cltkUtf.c | 2 +- otherlibs/labltk/support/cltkVar.c | 12 +- otherlibs/labltk/support/cltkWait.c | 12 +- otherlibs/labltk/support/fileevent.ml | 7 +- otherlibs/labltk/support/fileevent.mli | 2 +- otherlibs/labltk/support/protocol.ml | 43 +- otherlibs/labltk/support/protocol.mli | 14 +- otherlibs/labltk/support/rawwidget.ml | 10 +- otherlibs/labltk/support/rawwidget.mli | 4 +- otherlibs/labltk/support/slave.ml | 4 +- otherlibs/labltk/support/support.ml | 8 +- otherlibs/labltk/support/support.mli | 2 +- otherlibs/labltk/support/textvariable.ml | 21 +- otherlibs/labltk/support/textvariable.mli | 4 +- otherlibs/labltk/support/timer.ml | 3 +- otherlibs/labltk/support/timer.mli | 2 +- otherlibs/labltk/support/tkthread.ml | 2 +- otherlibs/labltk/support/tkthread.mli | 4 +- otherlibs/labltk/support/tkwait.ml | 9 +- otherlibs/labltk/support/widget.ml | 2 +- otherlibs/labltk/support/widget.mli | 4 +- otherlibs/labltk/tkanim/.cvsignore | 4 - otherlibs/labltk/tkanim/.depend | 2 - otherlibs/labltk/tkanim/Makefile | 71 - otherlibs/labltk/tkanim/Makefile.nt | 1 - otherlibs/labltk/tkanim/README | 5 - otherlibs/labltk/tkanim/cltkaniminit.c | 28 - otherlibs/labltk/tkanim/gifanimtest.ml | 71 - otherlibs/labltk/tkanim/libtkanim.clib | 1 - otherlibs/labltk/tkanim/mmm.anim.gif | Bin 18501 -> 0 bytes otherlibs/labltk/tkanim/tkAnimGIF.c | 914 - otherlibs/labltk/tkanim/tkAppInit.c | 141 - otherlibs/labltk/tkanim/tkanim.ml | 230 - otherlibs/labltk/tkanim/tkanim.mli | 95 - otherlibs/num/.depend | 42 +- otherlibs/num/.depend.nt | 68 +- otherlibs/num/Makefile | 3 +- otherlibs/num/Makefile.nt | 2 +- otherlibs/num/README | 6 +- otherlibs/num/arith_flags.ml | 3 +- otherlibs/num/arith_flags.mli | 2 +- otherlibs/num/arith_status.ml | 14 +- otherlibs/num/arith_status.mli | 5 +- otherlibs/num/big_int.ml | 183 +- otherlibs/num/big_int.mli | 34 +- otherlibs/num/bng.c | 10 +- otherlibs/num/bng.h | 7 +- otherlibs/num/bng_alpha.c | 3 +- otherlibs/num/bng_amd64.c | 3 +- otherlibs/num/bng_digit.c | 3 +- otherlibs/num/bng_ia32.c | 5 +- otherlibs/num/bng_mips.c | 3 +- otherlibs/num/bng_ppc.c | 2 +- otherlibs/num/bng_sparc.c | 2 +- otherlibs/num/int_misc.ml | 2 +- otherlibs/num/int_misc.mli | 2 +- otherlibs/num/nat.h | 3 +- otherlibs/num/nat.ml | 178 +- otherlibs/num/nat.mli | 4 +- otherlibs/num/nat_stubs.c | 8 +- otherlibs/num/num.ml | 7 +- otherlibs/num/num.mli | 9 +- otherlibs/num/ratio.ml | 184 +- otherlibs/num/ratio.mli | 3 +- otherlibs/num/test/.depend | 10 - otherlibs/num/test/Makefile | 76 - otherlibs/num/test/Makefile.nt | 61 - otherlibs/str/.depend | 6 +- otherlibs/str/Makefile | 7 +- otherlibs/str/Makefile.nt | 7 +- otherlibs/str/str.ml | 20 +- otherlibs/str/str.mli | 37 +- otherlibs/str/strstubs.c | 11 +- otherlibs/systhreads/.depend | 38 +- otherlibs/systhreads/Makefile | 10 +- otherlibs/systhreads/Makefile.nt | 2 +- otherlibs/systhreads/condition.ml | 2 +- otherlibs/systhreads/condition.mli | 6 +- otherlibs/systhreads/event.ml | 4 +- otherlibs/systhreads/event.mli | 15 +- otherlibs/systhreads/mutex.ml | 2 +- otherlibs/systhreads/mutex.mli | 3 +- otherlibs/systhreads/posix.c | 9 +- otherlibs/systhreads/thread.mli | 5 +- otherlibs/systhreads/threadUnix.ml | 2 +- otherlibs/systhreads/threadUnix.mli | 2 +- otherlibs/systhreads/thread_posix.ml | 4 +- otherlibs/systhreads/thread_win32.ml | 5 +- otherlibs/systhreads/win32.c | 2 +- otherlibs/threads/.depend | 48 +- otherlibs/threads/Makefile | 2 +- otherlibs/threads/condition.ml | 3 +- otherlibs/threads/condition.mli | 6 +- otherlibs/threads/event.ml | 4 +- otherlibs/threads/event.mli | 15 +- otherlibs/threads/marshal.ml | 4 +- otherlibs/threads/mutex.ml | 3 +- otherlibs/threads/mutex.mli | 3 +- otherlibs/threads/pervasives.ml | 16 +- otherlibs/threads/scheduler.c | 2 +- otherlibs/threads/thread.ml | 6 +- otherlibs/threads/thread.mli | 7 +- otherlibs/threads/threadUnix.ml | 2 +- otherlibs/threads/threadUnix.mli | 2 +- otherlibs/threads/unix.ml | 23 +- otherlibs/unix/.depend | 35 +- otherlibs/unix/Makefile | 10 +- otherlibs/unix/accept.c | 4 +- otherlibs/unix/access.c | 2 +- otherlibs/unix/addrofstr.c | 4 +- otherlibs/unix/alarm.c | 2 +- otherlibs/unix/bind.c | 6 +- otherlibs/unix/chdir.c | 2 +- otherlibs/unix/chmod.c | 2 +- otherlibs/unix/chown.c | 2 +- otherlibs/unix/chroot.c | 2 +- otherlibs/unix/close.c | 2 +- otherlibs/unix/closedir.c | 2 +- otherlibs/unix/connect.c | 4 +- otherlibs/unix/cst2constr.c | 2 +- otherlibs/unix/cst2constr.h | 2 +- otherlibs/unix/cstringv.c | 4 +- otherlibs/unix/dup.c | 2 +- otherlibs/unix/dup2.c | 2 +- otherlibs/unix/envir.c | 2 +- otherlibs/unix/errmsg.c | 2 +- otherlibs/unix/execv.c | 3 +- otherlibs/unix/execve.c | 3 +- otherlibs/unix/execvp.c | 3 +- otherlibs/unix/exit.c | 4 +- otherlibs/unix/fchmod.c | 4 +- otherlibs/unix/fchown.c | 4 +- otherlibs/unix/fcntl.c | 2 +- otherlibs/unix/fork.c | 3 +- otherlibs/unix/ftruncate.c | 2 +- otherlibs/unix/getaddrinfo.c | 2 +- otherlibs/unix/getcwd.c | 2 +- otherlibs/unix/getegid.c | 2 +- otherlibs/unix/geteuid.c | 2 +- otherlibs/unix/getgid.c | 2 +- otherlibs/unix/getgr.c | 2 +- otherlibs/unix/getgroups.c | 2 +- otherlibs/unix/gethost.c | 6 +- otherlibs/unix/gethostname.c | 2 +- otherlibs/unix/getlogin.c | 2 +- otherlibs/unix/getnameinfo.c | 4 +- otherlibs/unix/getpeername.c | 4 +- otherlibs/unix/getpid.c | 2 +- otherlibs/unix/getppid.c | 2 +- otherlibs/unix/getproto.c | 4 +- otherlibs/unix/getpw.c | 2 +- otherlibs/unix/getserv.c | 4 +- otherlibs/unix/getsockname.c | 4 +- otherlibs/unix/gettimeofday.c | 2 +- otherlibs/unix/getuid.c | 2 +- otherlibs/unix/gmtime.c | 2 +- otherlibs/unix/initgroups.c | 43 + otherlibs/unix/isatty.c | 2 +- otherlibs/unix/itimer.c | 4 +- otherlibs/unix/kill.c | 2 +- otherlibs/unix/libunix.clib | 8 +- otherlibs/unix/link.c | 2 +- otherlibs/unix/listen.c | 2 +- otherlibs/unix/lockf.c | 2 +- otherlibs/unix/lseek.c | 14 +- otherlibs/unix/mkdir.c | 2 +- otherlibs/unix/mkfifo.c | 2 +- otherlibs/unix/nice.c | 2 +- otherlibs/unix/open.c | 4 +- otherlibs/unix/opendir.c | 2 +- otherlibs/unix/pipe.c | 2 +- otherlibs/unix/putenv.c | 2 +- otherlibs/unix/read.c | 2 +- otherlibs/unix/readdir.c | 2 +- otherlibs/unix/readlink.c | 2 +- otherlibs/unix/rename.c | 2 +- otherlibs/unix/rewinddir.c | 2 +- otherlibs/unix/rmdir.c | 2 +- otherlibs/unix/select.c | 4 +- otherlibs/unix/sendrecv.c | 2 +- otherlibs/unix/setgid.c | 2 +- otherlibs/unix/setgroups.c | 53 + otherlibs/unix/setsid.c | 2 +- otherlibs/unix/setuid.c | 2 +- otherlibs/unix/shutdown.c | 2 +- otherlibs/unix/signals.c | 2 +- otherlibs/unix/sleep.c | 2 +- otherlibs/unix/socket.c | 2 +- otherlibs/unix/socketaddr.c | 2 +- otherlibs/unix/socketaddr.h | 2 +- otherlibs/unix/socketpair.c | 2 +- otherlibs/unix/sockopt.c | 8 +- otherlibs/unix/stat.c | 3 +- otherlibs/unix/strofaddr.c | 2 +- otherlibs/unix/symlink.c | 2 +- otherlibs/unix/termios.c | 5 +- otherlibs/unix/time.c | 2 +- otherlibs/unix/times.c | 2 +- otherlibs/unix/truncate.c | 2 +- otherlibs/unix/umask.c | 2 +- otherlibs/unix/unix.ml | 15 +- otherlibs/unix/unix.mli | 12 +- otherlibs/unix/unixLabels.ml | 2 +- otherlibs/unix/unixLabels.mli | 2 +- otherlibs/unix/unixsupport.c | 5 +- otherlibs/unix/unixsupport.h | 2 +- otherlibs/unix/unlink.c | 2 +- otherlibs/unix/utimes.c | 2 +- otherlibs/unix/wait.c | 2 +- otherlibs/unix/write.c | 5 +- otherlibs/win32graph/Makefile.nt | 2 +- otherlibs/win32graph/dib.c | 3 +- otherlibs/win32graph/draw.c | 30 +- otherlibs/win32graph/events.c | 2 +- otherlibs/win32graph/libgraph.h | 2 +- otherlibs/win32graph/open.c | 14 +- otherlibs/win32unix/.depend | 10 +- otherlibs/win32unix/Makefile.nt | 2 +- otherlibs/win32unix/accept.c | 7 +- otherlibs/win32unix/bind.c | 4 +- otherlibs/win32unix/channels.c | 6 +- otherlibs/win32unix/close.c | 2 +- otherlibs/win32unix/close_on.c | 2 +- otherlibs/win32unix/connect.c | 2 +- otherlibs/win32unix/createprocess.c | 2 +- otherlibs/win32unix/dup.c | 3 +- otherlibs/win32unix/dup2.c | 2 +- otherlibs/win32unix/errmsg.c | 7 +- otherlibs/win32unix/getpeername.c | 2 +- otherlibs/win32unix/getpid.c | 2 +- otherlibs/win32unix/getsockname.c | 2 +- otherlibs/win32unix/gettimeofday.c | 4 +- otherlibs/win32unix/link.c | 16 +- otherlibs/win32unix/listen.c | 2 +- otherlibs/win32unix/lockf.c | 16 +- otherlibs/win32unix/lseek.c | 6 +- otherlibs/win32unix/mkdir.c | 2 +- otherlibs/win32unix/nonblock.c | 2 +- otherlibs/win32unix/open.c | 2 +- otherlibs/win32unix/pipe.c | 2 +- otherlibs/win32unix/read.c | 2 +- otherlibs/win32unix/rename.c | 8 +- otherlibs/win32unix/select.c | 101 +- otherlibs/win32unix/sendrecv.c | 2 +- otherlibs/win32unix/shutdown.c | 2 +- otherlibs/win32unix/sleep.c | 2 +- otherlibs/win32unix/socket.c | 6 +- otherlibs/win32unix/socketaddr.h | 2 +- otherlibs/win32unix/sockopt.c | 2 +- otherlibs/win32unix/stat.c | 2 +- otherlibs/win32unix/system.c | 5 +- otherlibs/win32unix/unix.ml | 16 +- otherlibs/win32unix/unixsupport.c | 2 +- otherlibs/win32unix/unixsupport.h | 2 +- otherlibs/win32unix/windbug.c | 23 +- otherlibs/win32unix/windbug.h | 22 +- otherlibs/win32unix/windir.c | 3 +- otherlibs/win32unix/winlist.c | 2 +- otherlibs/win32unix/winlist.h | 2 +- otherlibs/win32unix/winwait.c | 2 +- otherlibs/win32unix/winworker.c | 102 +- otherlibs/win32unix/winworker.h | 14 +- otherlibs/win32unix/write.c | 2 +- parsing/asttypes.mli | 6 +- parsing/lexer.mli | 2 +- parsing/lexer.mll | 42 +- parsing/linenum.mli | 2 +- parsing/linenum.mll | 4 +- parsing/location.ml | 2 +- parsing/location.mli | 2 +- parsing/longident.ml | 7 +- parsing/longident.mli | 3 +- parsing/parse.ml | 4 +- parsing/parse.mli | 3 +- parsing/parser.mly | 159 +- parsing/parsetree.mli | 26 +- parsing/printast.ml | 62 +- parsing/printast.mli | 2 +- parsing/syntaxerr.ml | 6 +- parsing/syntaxerr.mli | 3 +- stdlib/.depend | 274 +- stdlib/Compflags | 2 +- stdlib/Makefile | 20 +- stdlib/Makefile.nt | 3 +- stdlib/Makefile.shared | 4 +- stdlib/StdlibModules | 2 +- stdlib/arg.ml | 2 +- stdlib/arg.mli | 2 +- stdlib/array.ml | 2 +- stdlib/array.mli | 2 +- stdlib/arrayLabels.ml | 2 +- stdlib/arrayLabels.mli | 2 +- stdlib/buffer.ml | 4 +- stdlib/buffer.mli | 2 +- stdlib/callback.ml | 2 +- stdlib/callback.mli | 2 +- stdlib/camlinternalLazy.ml | 2 +- stdlib/camlinternalLazy.mli | 2 +- stdlib/camlinternalMod.ml | 2 +- stdlib/camlinternalMod.mli | 2 +- stdlib/camlinternalOO.ml | 2 +- stdlib/camlinternalOO.mli | 2 +- stdlib/char.ml | 2 +- stdlib/char.mli | 2 +- stdlib/complex.ml | 2 +- stdlib/complex.mli | 2 +- stdlib/digest.ml | 2 +- stdlib/digest.mli | 2 +- stdlib/filename.ml | 2 +- stdlib/filename.mli | 2 +- stdlib/format.ml | 27 +- stdlib/format.mli | 53 +- stdlib/gc.ml | 2 +- stdlib/gc.mli | 2 +- stdlib/genlex.ml | 2 +- stdlib/genlex.mli | 2 +- stdlib/hashtbl.ml | 2 +- stdlib/hashtbl.mli | 2 +- stdlib/header.c | 4 +- stdlib/headernt.c | 2 +- stdlib/int32.ml | 2 +- stdlib/int32.mli | 2 +- stdlib/int64.ml | 2 +- stdlib/int64.mli | 2 +- stdlib/lazy.ml | 2 +- stdlib/lazy.mli | 2 +- stdlib/lexing.ml | 2 +- stdlib/lexing.mli | 2 +- stdlib/list.ml | 2 +- stdlib/list.mli | 2 +- stdlib/listLabels.ml | 2 +- stdlib/listLabels.mli | 2 +- stdlib/map.ml | 2 +- stdlib/map.mli | 2 +- stdlib/marshal.ml | 2 +- stdlib/marshal.mli | 2 +- stdlib/moreLabels.ml | 2 +- stdlib/moreLabels.mli | 2 +- stdlib/nativeint.ml | 2 +- stdlib/nativeint.mli | 2 +- stdlib/obj.ml | 4 +- stdlib/obj.mli | 4 +- stdlib/oo.ml | 2 +- stdlib/oo.mli | 2 +- stdlib/parsing.ml | 2 +- stdlib/parsing.mli | 2 +- stdlib/pervasives.ml | 4 +- stdlib/pervasives.mli | 72 +- stdlib/printexc.ml | 4 +- stdlib/printexc.mli | 2 +- stdlib/printf.ml | 45 +- stdlib/printf.mli | 2 +- stdlib/queue.ml | 2 +- stdlib/queue.mli | 2 +- stdlib/random.ml | 77 +- stdlib/random.mli | 2 +- stdlib/scanf.ml | 148 +- stdlib/scanf.mli | 187 +- stdlib/set.ml | 2 +- stdlib/set.mli | 2 +- stdlib/sort.ml | 2 +- stdlib/sort.mli | 2 +- stdlib/stack.ml | 2 +- stdlib/stack.mli | 2 +- stdlib/stdLabels.ml | 2 +- stdlib/stdLabels.mli | 2 +- stdlib/std_exit.ml | 2 +- stdlib/stdlib.mllib | 2 +- stdlib/stream.ml | 2 +- stdlib/stream.mli | 2 +- stdlib/string.ml | 2 +- stdlib/string.mli | 2 +- stdlib/stringLabels.ml | 2 +- stdlib/stringLabels.mli | 2 +- stdlib/sys.mli | 2 +- stdlib/sys.mlp | 2 +- stdlib/weak.ml | 2 +- stdlib/weak.mli | 4 +- test/.cvsignore | 2 + test/.depend | 28 + {otherlibs/num/test => test}/test_bng.c | 0 testlabl/.cvsignore | 1 + testlabl/coerce.diffs | 93 + testlabl/dirs_multimatch | 1 + testlabl/dirs_poly | 1 + testlabl/els.ml | 92 + testlabl/fixedtypes.ml | 77 + testlabl/marshal_objects.diffs | 800 + testlabl/multimatch.diffs | 1418 ++ testlabl/multimatch.ml | 158 + testlabl/newlabels.ps | 1458 ++ testlabl/objvariant.diffs | 354 + testlabl/objvariant.ml | 42 + testlabl/printers.ml | 11 + testlabl/sigsubst.ml | 33 + testlabl/tests.ml | 22 + testlabl/valvirt.diffs | 2349 ++ testlabl/varunion.ml | 435 + testsuite/.svnignore | 9 + testsuite/Makefile | 59 + testsuite/interactive/lib-gc/Makefile | 10 + testsuite/interactive/lib-gc/alloc.ml | 51 + testsuite/interactive/lib-gc/alloc.result | 544 + testsuite/interactive/lib-graph-2/Makefile | 7 + .../interactive/lib-graph-2/graph_test.ml | 288 + .../lib-graph-2/graph_test.reference | 0 testsuite/interactive/lib-graph-3/Makefile | 7 + testsuite/interactive/lib-graph-3/sorts.ml | 228 + .../interactive/lib-graph-3/sorts.reference | 0 testsuite/interactive/lib-graph/Makefile | 7 + .../interactive/lib-graph/graph_example.ml | 131 + .../lib-graph/graph_example.reference | 0 testsuite/interactive/lib-signals/Makefile | 10 + testsuite/interactive/lib-signals/signals.ml | 32 + testsuite/lib/Makefile | 7 + testsuite/lib/testing.ml | 96 + testsuite/lib/testing.mli | 34 + testsuite/makefiles/Makefile.common | 66 + testsuite/makefiles/Makefile.okbad | 19 + testsuite/makefiles/Makefile.one | 36 + testsuite/makefiles/Makefile.several | 51 + testsuite/makefiles/Makefile.toplevel | 16 + testsuite/tests/asmcomp/Makefile | 144 + testsuite/tests/asmcomp/alpha.S | 62 + testsuite/tests/asmcomp/amd64.S | 63 + testsuite/tests/asmcomp/arith.cmm | 222 + testsuite/tests/asmcomp/arm.S | 40 + testsuite/tests/asmcomp/checkbound.cmm | 21 + testsuite/tests/asmcomp/fib.cmm | 19 + testsuite/tests/asmcomp/hppa.S | 162 + testsuite/tests/asmcomp/i386.S | 56 + testsuite/tests/asmcomp/i386nt.asm | 67 + testsuite/tests/asmcomp/ia64.S | 118 + testsuite/tests/asmcomp/integr.cmm | 30 + testsuite/tests/asmcomp/lexcmm.mli | 24 + testsuite/tests/asmcomp/lexcmm.mll | 228 + testsuite/tests/asmcomp/m68k.S | 59 + testsuite/tests/asmcomp/main.c | 127 + testsuite/tests/asmcomp/main.ml | 60 + testsuite/tests/asmcomp/mainarith.c | 307 + testsuite/tests/asmcomp/mips.s | 71 + testsuite/tests/asmcomp/parsecmm.mly | 327 + testsuite/tests/asmcomp/parsecmmaux.ml | 40 + testsuite/tests/asmcomp/parsecmmaux.mli | 26 + testsuite/tests/asmcomp/power-aix.S | 152 + testsuite/tests/asmcomp/power-elf.S | 131 + testsuite/tests/asmcomp/power-rhapsody.S | 129 + testsuite/tests/asmcomp/quicksort.cmm | 43 + testsuite/tests/asmcomp/quicksort2.cmm | 49 + testsuite/tests/asmcomp/soli.cmm | 109 + testsuite/tests/asmcomp/sparc.S | 41 + testsuite/tests/asmcomp/tagged-fib.cmm | 19 + testsuite/tests/asmcomp/tagged-integr.cmm | 45 + testsuite/tests/asmcomp/tagged-quicksort.cmm | 46 + testsuite/tests/asmcomp/tagged-tak.cmm | 23 + testsuite/tests/asmcomp/tak.cmm | 23 + testsuite/tests/backtrace/Makefile | 16 + .../tests/backtrace/backtrace..reference | 2 + .../tests/backtrace/backtrace.a.reference | 1 + .../tests/backtrace/backtrace.b.reference | 11 + .../tests/backtrace/backtrace.c.reference | 3 + .../tests/backtrace/backtrace.d.reference | 9 + testsuite/tests/backtrace/backtrace.ml | 17 + .../tests/backtrace/backtrace2..reference | 27 + .../tests/backtrace/backtrace2.a.reference | 27 + .../tests/backtrace/backtrace2.b.reference | 27 + .../tests/backtrace/backtrace2.c.reference | 27 + .../tests/backtrace/backtrace2.d.reference | 27 + testsuite/tests/backtrace/backtrace2.ml | 28 + testsuite/tests/basic-float/Makefile | 5 + testsuite/tests/basic-float/float_record.ml | 7 + testsuite/tests/basic-float/float_record.mli | 6 + testsuite/tests/basic-float/tfloat_record.ml | 5 + .../tests/basic-float/tfloat_record.reference | 1 + testsuite/tests/basic-io-2/Makefile | 6 + testsuite/tests/basic-io-2/io.ml | 103 + testsuite/tests/basic-io-2/io.reference | 24 + testsuite/tests/basic-io/Makefile | 6 + testsuite/tests/basic-io/wc.ml | 54 + testsuite/tests/basic-io/wc.reference | 1 + testsuite/tests/basic-manyargs/Makefile | 6 + testsuite/tests/basic-manyargs/manyargs.ml | 42 + .../tests/basic-manyargs/manyargs.reference | 65 + testsuite/tests/basic-manyargs/manyargsprim.c | 25 + testsuite/tests/basic-more/Makefile | 4 + testsuite/tests/basic-more/bounds.ml | 28 + testsuite/tests/basic-more/bounds.reference | 9 + testsuite/tests/basic-more/morematch.ml | 1170 + .../tests/basic-more/morematch.reference | 2 + testsuite/tests/basic-more/tbuffer.ml | 27 + testsuite/tests/basic-more/tbuffer.reference | 2 + testsuite/tests/basic-more/testrandom.ml | 13 + .../tests/basic-more/testrandom.reference | 4 + testsuite/tests/basic-more/tformat.ml | 33 + testsuite/tests/basic-more/tformat.reference | 2 + testsuite/tests/basic-more/tprintf.ml | 72 + testsuite/tests/basic-more/tprintf.reference | 2 + testsuite/tests/basic-multdef/Makefile | 5 + testsuite/tests/basic-multdef/multdef.ml | 2 + testsuite/tests/basic-multdef/multdef.mli | 3 + testsuite/tests/basic-multdef/usemultdef.ml | 1 + .../tests/basic-multdef/usemultdef.reference | 1 + testsuite/tests/basic-private/Makefile | 5 + testsuite/tests/basic-private/length.ml | 16 + testsuite/tests/basic-private/length.mli | 13 + testsuite/tests/basic-private/tlength.ml | 23 + .../tests/basic-private/tlength.reference | 0 testsuite/tests/basic/Makefile | 2 + testsuite/tests/basic/arrays.ml | 86 + testsuite/tests/basic/arrays.reference | 0 testsuite/tests/basic/bigints.ml | 12 + testsuite/tests/basic/bigints.reference | 10 + testsuite/tests/basic/boxedints.ml | 577 + testsuite/tests/basic/boxedints.reference | 118 + testsuite/tests/basic/equality.ml | 80 + testsuite/tests/basic/equality.reference | 43 + testsuite/tests/basic/float.ml | 1 + testsuite/tests/basic/float.reference | 1 + testsuite/tests/basic/includestruct.ml | 92 + testsuite/tests/basic/includestruct.reference | 15 + testsuite/tests/basic/patmatch.ml | 79 + testsuite/tests/basic/patmatch.reference | 68 + testsuite/tests/basic/recvalues.ml | 38 + testsuite/tests/basic/recvalues.reference | 5 + testsuite/tests/basic/sets.ml | 39 + testsuite/tests/basic/sets.reference | 25 + testsuite/tests/basic/tailcalls.ml | 28 + testsuite/tests/basic/tailcalls.reference | 5 + testsuite/tests/callback/Makefile | 27 + testsuite/tests/callback/callbackprim.c | 54 + testsuite/tests/callback/reference | 8 + testsuite/tests/callback/tcallback.ml | 68 + testsuite/tests/embedded/Makefile | 18 + testsuite/tests/embedded/cmcaml.ml | 16 + testsuite/tests/embedded/cmmain.c | 22 + testsuite/tests/embedded/cmstub.c | 17 + testsuite/tests/embedded/program.reference | 4 + testsuite/tests/gc-roots/Makefile | 7 + testsuite/tests/gc-roots/globroots.ml | 80 + testsuite/tests/gc-roots/globroots.reference | 4 + testsuite/tests/gc-roots/globrootsprim.c | 56 + testsuite/tests/lib-bigarray-2/Makefile | 6 + testsuite/tests/lib-bigarray-2/bigarrf.f | 27 + testsuite/tests/lib-bigarray-2/bigarrfml.ml | 63 + .../tests/lib-bigarray-2/bigarrfml.reference | 27 + testsuite/tests/lib-bigarray-2/bigarrfstub.c | 60 + testsuite/tests/lib-bigarray/Makefile | 4 + testsuite/tests/lib-bigarray/bigarrays.ml | 775 + .../tests/lib-bigarray/bigarrays.reference | 61 + testsuite/tests/lib-bigarray/fftba.ml | 197 + testsuite/tests/lib-bigarray/fftba.reference | 13 + testsuite/tests/lib-digest/Makefile | 6 + testsuite/tests/lib-digest/md5.ml | 221 + testsuite/tests/lib-digest/md5.reference | 1 + .../tests/lib-dynlink-bytecode/.svnignore | 6 + testsuite/tests/lib-dynlink-bytecode/Makefile | 36 + .../lib-dynlink-bytecode/custom.reference | 5 + testsuite/tests/lib-dynlink-bytecode/main.ml | 17 + .../tests/lib-dynlink-bytecode/main.reference | 7 + testsuite/tests/lib-dynlink-bytecode/plug1.ml | 4 + testsuite/tests/lib-dynlink-bytecode/plug2.ml | 4 + .../lib-dynlink-bytecode/static.reference | 5 + testsuite/tests/lib-dynlink-bytecode/stub1.c | 11 + testsuite/tests/lib-dynlink-bytecode/stub2.c | 13 + testsuite/tests/lib-dynlink-csharp/Makefile | 58 + .../lib-dynlink-csharp/bytecode.reference | 7 + testsuite/tests/lib-dynlink-csharp/entry.c | 13 + testsuite/tests/lib-dynlink-csharp/main.cs | 11 + testsuite/tests/lib-dynlink-csharp/main.ml | 23 + .../tests/lib-dynlink-csharp/native.reference | 7 + testsuite/tests/lib-dynlink-csharp/plugin.ml | 4 + testsuite/tests/lib-dynlink-native/.svnignore | 5 + testsuite/tests/lib-dynlink-native/Makefile | 70 + testsuite/tests/lib-dynlink-native/a.ml | 5 + testsuite/tests/lib-dynlink-native/api.ml | 18 + testsuite/tests/lib-dynlink-native/b.ml | 5 + testsuite/tests/lib-dynlink-native/bug.ml | 2 + testsuite/tests/lib-dynlink-native/c.ml | 4 + .../tests/lib-dynlink-native/factorial.c | 18 + testsuite/tests/lib-dynlink-native/main.ml | 20 + .../tests/lib-dynlink-native/pack_client.ml | 2 + testsuite/tests/lib-dynlink-native/packed1.ml | 6 + .../lib-dynlink-native/packed1_client.ml | 3 + testsuite/tests/lib-dynlink-native/plugin.ml | 10 + testsuite/tests/lib-dynlink-native/plugin.mli | 1 + testsuite/tests/lib-dynlink-native/plugin2.ml | 8 + testsuite/tests/lib-dynlink-native/plugin4.ml | 5 + .../tests/lib-dynlink-native/plugin_ext.ml | 5 + .../lib-dynlink-native/plugin_high_arity.ml | 6 + .../tests/lib-dynlink-native/plugin_ref.ml | 11 + .../tests/lib-dynlink-native/plugin_simple.ml | 3 + .../tests/lib-dynlink-native/plugin_thread.ml | 21 + testsuite/tests/lib-dynlink-native/reference | 17 + testsuite/tests/lib-dynlink-native/sub/api.ml | 3 + .../tests/lib-dynlink-native/sub/api.mli | 1 + .../tests/lib-dynlink-native/sub/plugin.ml | 7 + .../tests/lib-dynlink-native/sub/plugin3.ml | 3 + testsuite/tests/lib-marshal/Makefile | 6 + testsuite/tests/lib-marshal/intext.ml | 459 + testsuite/tests/lib-marshal/intext.reference | 149 + testsuite/tests/lib-marshal/intextaux.c | 13 + testsuite/tests/lib-num-2/Makefile | 5 + .../tests/lib-num-2}/pi_big_int.ml | 0 .../tests/lib-num-2/pi_big_int.reference | 100 + .../tests/lib-num-2}/pi_num.ml | 0 testsuite/tests/lib-num-2/pi_num.reference | 100 + testsuite/tests/lib-num/Makefile | 7 + .../tests/lib-num}/end_test.ml | 0 testsuite/tests/lib-num/end_test.reference | 162 + .../test => testsuite/tests/lib-num}/test.ml | 23 +- .../tests/lib-num}/test_big_ints.ml | 130 +- .../tests/lib-num}/test_io.ml | 0 .../tests/lib-num}/test_nats.ml | 2 +- .../tests/lib-num}/test_nums.ml | 1 - .../tests/lib-num}/test_ratios.ml | 1 - testsuite/tests/lib-scanf-2/Makefile | 21 + testsuite/tests/lib-scanf-2/reference | 2 + testsuite/tests/lib-scanf-2/tscanf2_io.ml | 19 + testsuite/tests/lib-scanf-2/tscanf2_master.ml | 51 + testsuite/tests/lib-scanf-2/tscanf2_slave.ml | 28 + testsuite/tests/lib-scanf/Makefile | 7 + testsuite/tests/lib-scanf/tscanf.ml | 1434 ++ testsuite/tests/lib-scanf/tscanf.reference | 2 + testsuite/tests/lib-scanf/tscanf_data | 1 + testsuite/tests/lib-str/Makefile | 4 + testsuite/tests/lib-str/t01.ml | 1005 + testsuite/tests/lib-str/t01.reference | 104 + testsuite/tests/lib-systhreads/Makefile | 5 + testsuite/tests/lib-systhreads/testfork.ml | 32 + .../tests/lib-systhreads/testfork.reference | 6 + testsuite/tests/lib-threads/.cvsignore | 1 + testsuite/tests/lib-threads/Makefile | 5 + testsuite/tests/lib-threads/close.ml | 15 + testsuite/tests/lib-threads/close.reference | 2 + testsuite/tests/lib-threads/sieve.ml | 33 + testsuite/tests/lib-threads/sieve.reference | 168 + testsuite/tests/lib-threads/test1.checker | 1 + testsuite/tests/lib-threads/test1.ml | 63 + testsuite/tests/lib-threads/test1.reference | 20002 ++++++++++++++++ testsuite/tests/lib-threads/test2.checker | 1 + testsuite/tests/lib-threads/test2.ml | 15 + testsuite/tests/lib-threads/test3.checker | 1 + testsuite/tests/lib-threads/test3.ml | 8 + testsuite/tests/lib-threads/test3.runner | 4 + testsuite/tests/lib-threads/test4.checker | 1 + testsuite/tests/lib-threads/test4.data | 3 + testsuite/tests/lib-threads/test4.ml | 20 + testsuite/tests/lib-threads/test4.reference | 4 + testsuite/tests/lib-threads/test4.runner | 1 + testsuite/tests/lib-threads/test5.checker | 1 + testsuite/tests/lib-threads/test5.ml | 19 + testsuite/tests/lib-threads/test5.reference | 4 + testsuite/tests/lib-threads/test5.runner | 4 + testsuite/tests/lib-threads/test6.checker | 1 + testsuite/tests/lib-threads/test6.ml | 15 + testsuite/tests/lib-threads/test6.reference | 2 + testsuite/tests/lib-threads/test6.runner | 4 + testsuite/tests/lib-threads/test7.checker | 1 + testsuite/tests/lib-threads/test7.ml | 26 + testsuite/tests/lib-threads/test7.runner | 4 + testsuite/tests/lib-threads/test8.ml | 44 + testsuite/tests/lib-threads/test8.reference | 3 + testsuite/tests/lib-threads/test9.ml | 26 + testsuite/tests/lib-threads/test9.reference | 2 + testsuite/tests/lib-threads/testA.checker | 1 + testsuite/tests/lib-threads/testA.ml | 26 + testsuite/tests/lib-threads/testA.reference | 5 + testsuite/tests/lib-threads/testexit.checker | 1 + testsuite/tests/lib-threads/testexit.ml | 21 + .../tests/lib-threads/testexit.reference | 27 + testsuite/tests/lib-threads/testio.ml | 120 + testsuite/tests/lib-threads/testio.reference | 24 + testsuite/tests/lib-threads/testsieve.ml | 42 + .../tests/lib-threads/testsieve.reference | 100 + .../tests/lib-threads/testsignal.checker | 1 + testsuite/tests/lib-threads/testsignal.ml | 13 + testsuite/tests/lib-threads/testsignal.runner | 4 + .../tests/lib-threads/testsignal2.checker | 1 + testsuite/tests/lib-threads/testsignal2.ml | 11 + .../tests/lib-threads/testsignal2.runner | 6 + testsuite/tests/lib-threads/testsocket.ml | 34 + .../tests/lib-threads/testsocket.reference | 3 + testsuite/tests/lib-threads/token1.ml | 36 + testsuite/tests/lib-threads/token1.reference | 0 testsuite/tests/lib-threads/token2.ml | 36 + testsuite/tests/lib-threads/token2.reference | 0 testsuite/tests/lib-threads/torture.data | 3 + testsuite/tests/lib-threads/torture.ml | 45 + testsuite/tests/lib-threads/torture.reference | 4 + testsuite/tests/lib-threads/torture.runner | 1 + testsuite/tests/misc-kb/Makefile | 6 + testsuite/tests/misc-kb/equations.ml | 115 + testsuite/tests/misc-kb/equations.mli | 32 + testsuite/tests/misc-kb/kb.ml | 188 + testsuite/tests/misc-kb/kb.mli | 29 + testsuite/tests/misc-kb/kbmain.ml | 82 + testsuite/tests/misc-kb/kbmain.reference | 5460 +++++ testsuite/tests/misc-kb/orderings.ml | 99 + testsuite/tests/misc-kb/orderings.mli | 31 + testsuite/tests/misc-kb/terms.ml | 137 + testsuite/tests/misc-kb/terms.mli | 31 + testsuite/tests/misc-unsafe/Makefile | 3 + testsuite/tests/misc-unsafe/almabench.ml | 324 + .../tests/misc-unsafe/almabench.reference | 8 + testsuite/tests/misc-unsafe/fft.ml | 189 + testsuite/tests/misc-unsafe/fft.reference | 16 + testsuite/tests/misc-unsafe/quicksort.ml | 92 + .../tests/misc-unsafe/quicksort.reference | 2 + testsuite/tests/misc-unsafe/soli.ml | 111 + testsuite/tests/misc-unsafe/soli.reference | 50 + testsuite/tests/misc/Makefile | 2 + testsuite/tests/misc/bdd.ml | 231 + testsuite/tests/misc/bdd.reference | 1 + testsuite/tests/misc/boyer.ml | 911 + testsuite/tests/misc/boyer.reference | 1 + testsuite/tests/misc/fib.ml | 24 + testsuite/tests/misc/fib.reference | 1 + testsuite/tests/misc/hamming.ml | 105 + testsuite/tests/misc/hamming.reference | 100 + testsuite/tests/misc/nucleic.ml | 3238 +++ testsuite/tests/misc/nucleic.reference | 1 + testsuite/tests/misc/sieve.ml | 56 + testsuite/tests/misc/sieve.reference | 1 + testsuite/tests/misc/sorts.ml | 4479 ++++ testsuite/tests/misc/sorts.reference | 198 + testsuite/tests/misc/takc.ml | 23 + testsuite/tests/misc/takc.reference | 1 + testsuite/tests/misc/taku.ml | 22 + testsuite/tests/misc/taku.reference | 1 + testsuite/tests/misc/weaktest.ml | 73 + testsuite/tests/misc/weaktest.reference | 1 + testsuite/tests/runtime-errors/Makefile | 25 + .../stackoverflow.bytecode.reference | 5 + .../tests/runtime-errors/stackoverflow.ml | 15 + .../stackoverflow.native.reference | 65 + .../syserror.bytecode.reference | 1 + testsuite/tests/runtime-errors/syserror.ml | 1 + .../runtime-errors/syserror.native.reference | 1 + testsuite/tests/tool-lexyacc/.svnignore | 6 + testsuite/tests/tool-lexyacc/Makefile | 9 + testsuite/tests/tool-lexyacc/gram_aux.ml | 47 + testsuite/tests/tool-lexyacc/grammar.mly | 114 + testsuite/tests/tool-lexyacc/input | 133 + testsuite/tests/tool-lexyacc/input.ml | 312 + testsuite/tests/tool-lexyacc/lexgen.ml | 266 + testsuite/tests/tool-lexyacc/main.ml | 119 + testsuite/tests/tool-lexyacc/main.reference | 313 + testsuite/tests/tool-lexyacc/output.ml | 169 + testsuite/tests/tool-lexyacc/scan_aux.ml | 60 + testsuite/tests/tool-lexyacc/scanner.mll | 132 + testsuite/tests/tool-lexyacc/syntax.ml | 40 + testsuite/tests/tool-ocaml/Makefile | 16 + testsuite/tests/tool-ocaml/lib.ml | 46 + testsuite/tests/tool-ocaml/t000.ml | 7 + testsuite/tests/tool-ocaml/t010-const0.ml | 8 + testsuite/tests/tool-ocaml/t010-const1.ml | 8 + testsuite/tests/tool-ocaml/t010-const2.ml | 8 + testsuite/tests/tool-ocaml/t010-const3.ml | 8 + testsuite/tests/tool-ocaml/t011-constint.ml | 8 + testsuite/tests/tool-ocaml/t020.ml | 10 + testsuite/tests/tool-ocaml/t021-pushconst1.ml | 10 + testsuite/tests/tool-ocaml/t021-pushconst2.ml | 10 + testsuite/tests/tool-ocaml/t021-pushconst3.ml | 10 + .../tests/tool-ocaml/t022-pushconstint.ml | 10 + testsuite/tests/tool-ocaml/t040-makeblock1.ml | 13 + testsuite/tests/tool-ocaml/t040-makeblock2.ml | 15 + testsuite/tests/tool-ocaml/t040-makeblock3.ml | 17 + testsuite/tests/tool-ocaml/t041-makeblock.ml | 19 + testsuite/tests/tool-ocaml/t050-getglobal.ml | 8 + .../tests/tool-ocaml/t050-pushgetglobal.ml | 10 + .../tests/tool-ocaml/t051-getglobalfield.ml | 13 + .../tool-ocaml/t051-pushgetglobalfield.ml | 15 + testsuite/tests/tool-ocaml/t060-raise.ml | 15 + testsuite/tests/tool-ocaml/t070-branch.ml | 20 + testsuite/tests/tool-ocaml/t070-branchif.ml | 20 + .../tests/tool-ocaml/t070-branchifnot.ml | 18 + testsuite/tests/tool-ocaml/t071-boolnot.ml | 19 + testsuite/tests/tool-ocaml/t080-eq.ml | 21 + testsuite/tests/tool-ocaml/t080-geint.ml | 21 + testsuite/tests/tool-ocaml/t080-gtint.ml | 20 + testsuite/tests/tool-ocaml/t080-leint.ml | 21 + testsuite/tests/tool-ocaml/t080-ltint.ml | 20 + testsuite/tests/tool-ocaml/t080-neq.ml | 20 + testsuite/tests/tool-ocaml/t090-acc0.ml | 25 + testsuite/tests/tool-ocaml/t090-acc1.ml | 27 + testsuite/tests/tool-ocaml/t090-acc2.ml | 29 + testsuite/tests/tool-ocaml/t090-acc3.ml | 31 + testsuite/tests/tool-ocaml/t090-acc4.ml | 33 + testsuite/tests/tool-ocaml/t090-acc5.ml | 35 + testsuite/tests/tool-ocaml/t090-acc6.ml | 37 + testsuite/tests/tool-ocaml/t090-acc7.ml | 39 + testsuite/tests/tool-ocaml/t091-acc.ml | 41 + testsuite/tests/tool-ocaml/t092-pushacc.ml | 38 + testsuite/tests/tool-ocaml/t092-pushacc0.ml | 22 + testsuite/tests/tool-ocaml/t092-pushacc1.ml | 24 + testsuite/tests/tool-ocaml/t092-pushacc2.ml | 26 + testsuite/tests/tool-ocaml/t092-pushacc3.ml | 28 + testsuite/tests/tool-ocaml/t092-pushacc4.ml | 30 + testsuite/tests/tool-ocaml/t092-pushacc5.ml | 32 + testsuite/tests/tool-ocaml/t092-pushacc6.ml | 34 + testsuite/tests/tool-ocaml/t092-pushacc7.ml | 36 + testsuite/tests/tool-ocaml/t093-pushacc.ml | 38 + testsuite/tests/tool-ocaml/t100-pushtrap.ml | 21 + testsuite/tests/tool-ocaml/t101-poptrap.ml | 21 + testsuite/tests/tool-ocaml/t110-addint.ml | 26 + testsuite/tests/tool-ocaml/t110-andint.ml | 22 + testsuite/tests/tool-ocaml/t110-asrint-1.ml | 22 + testsuite/tests/tool-ocaml/t110-asrint-2.ml | 22 + testsuite/tests/tool-ocaml/t110-divint-1.ml | 22 + testsuite/tests/tool-ocaml/t110-divint-2.ml | 22 + testsuite/tests/tool-ocaml/t110-divint-3.ml | 33 + testsuite/tests/tool-ocaml/t110-lslint.ml | 22 + testsuite/tests/tool-ocaml/t110-lsrint.ml | 22 + testsuite/tests/tool-ocaml/t110-modint-1.ml | 22 + testsuite/tests/tool-ocaml/t110-modint-2.ml | 34 + testsuite/tests/tool-ocaml/t110-mulint.ml | 22 + testsuite/tests/tool-ocaml/t110-negint.ml | 25 + testsuite/tests/tool-ocaml/t110-offsetint.ml | 21 + testsuite/tests/tool-ocaml/t110-orint.ml | 22 + testsuite/tests/tool-ocaml/t110-subint.ml | 26 + testsuite/tests/tool-ocaml/t110-xorint.ml | 22 + .../tests/tool-ocaml/t120-getstringchar.ml | 22 + .../tests/tool-ocaml/t121-setstringchar.ml | 31 + .../tests/tool-ocaml/t130-getvectitem.ml | 24 + testsuite/tests/tool-ocaml/t130-vectlength.ml | 23 + .../tests/tool-ocaml/t131-setvectitem.ml | 33 + testsuite/tests/tool-ocaml/t140-switch-1.ml | 32 + testsuite/tests/tool-ocaml/t140-switch-2.ml | 32 + testsuite/tests/tool-ocaml/t140-switch-3.ml | 31 + testsuite/tests/tool-ocaml/t140-switch-4.ml | 31 + testsuite/tests/tool-ocaml/t141-switch-5.ml | 38 + testsuite/tests/tool-ocaml/t141-switch-6.ml | 38 + testsuite/tests/tool-ocaml/t141-switch-7.ml | 37 + testsuite/tests/tool-ocaml/t142-switch-8.ml | 34 + testsuite/tests/tool-ocaml/t142-switch-9.ml | 34 + testsuite/tests/tool-ocaml/t142-switch-A.ml | 34 + testsuite/tests/tool-ocaml/t150-push-1.ml | 24 + testsuite/tests/tool-ocaml/t150-push-2.ml | 39 + testsuite/tests/tool-ocaml/t160-closure.ml | 19 + testsuite/tests/tool-ocaml/t161-apply1.ml | 42 + testsuite/tests/tool-ocaml/t162-return.ml | 21 + testsuite/tests/tool-ocaml/t163.ml | 23 + testsuite/tests/tool-ocaml/t164-apply2.ml | 24 + testsuite/tests/tool-ocaml/t164-apply3.ml | 25 + testsuite/tests/tool-ocaml/t165-apply.ml | 28 + testsuite/tests/tool-ocaml/t170-envacc2.ml | 37 + testsuite/tests/tool-ocaml/t170-envacc3.ml | 42 + testsuite/tests/tool-ocaml/t170-envacc4.ml | 47 + testsuite/tests/tool-ocaml/t171-envacc.ml | 52 + .../tests/tool-ocaml/t172-pushenvacc1.ml | 34 + .../tests/tool-ocaml/t172-pushenvacc2.ml | 37 + .../tests/tool-ocaml/t172-pushenvacc3.ml | 42 + .../tests/tool-ocaml/t172-pushenvacc4.ml | 47 + testsuite/tests/tool-ocaml/t173-pushenvacc.ml | 52 + testsuite/tests/tool-ocaml/t180-appterm1.ml | 35 + testsuite/tests/tool-ocaml/t180-appterm2.ml | 38 + testsuite/tests/tool-ocaml/t180-appterm3.ml | 39 + testsuite/tests/tool-ocaml/t181-appterm.ml | 40 + .../tests/tool-ocaml/t190-makefloatblock-1.ml | 17 + .../tests/tool-ocaml/t190-makefloatblock-2.ml | 18 + .../tests/tool-ocaml/t190-makefloatblock-3.ml | 19 + testsuite/tests/tool-ocaml/t191-vectlength.ml | 26 + .../tests/tool-ocaml/t192-getfloatfield-1.ml | 23 + .../tests/tool-ocaml/t192-getfloatfield-2.ml | 23 + .../tests/tool-ocaml/t193-setfloatfield-1.ml | 36 + .../tests/tool-ocaml/t193-setfloatfield-2.ml | 36 + testsuite/tests/tool-ocaml/t200-getfield0.ml | 25 + testsuite/tests/tool-ocaml/t200-getfield1.ml | 26 + testsuite/tests/tool-ocaml/t200-getfield2.ml | 27 + testsuite/tests/tool-ocaml/t200-getfield3.ml | 28 + testsuite/tests/tool-ocaml/t201-getfield.ml | 29 + testsuite/tests/tool-ocaml/t210-setfield0.ml | 36 + testsuite/tests/tool-ocaml/t210-setfield1.ml | 38 + testsuite/tests/tool-ocaml/t210-setfield2.ml | 40 + testsuite/tests/tool-ocaml/t210-setfield3.ml | 42 + testsuite/tests/tool-ocaml/t211-setfield.ml | 44 + testsuite/tests/tool-ocaml/t220-assign.ml | 27 + .../tests/tool-ocaml/t230-check_signals.ml | 28 + testsuite/tests/tool-ocaml/t240-c_call1.ml | 21 + testsuite/tests/tool-ocaml/t240-c_call2.ml | 22 + testsuite/tests/tool-ocaml/t240-c_call3.ml | 23 + testsuite/tests/tool-ocaml/t240-c_call4.ml | 32 + testsuite/tests/tool-ocaml/t240-c_call5.ml | 33 + .../tests/tool-ocaml/t250-closurerec-1.ml | 19 + .../tests/tool-ocaml/t250-closurerec-2.ml | 29 + .../tool-ocaml/t251-pushoffsetclosure0.ml | 39 + .../tool-ocaml/t251-pushoffsetclosure2.ml | 34 + .../tool-ocaml/t251-pushoffsetclosurem2.ml | 34 + .../tool-ocaml/t252-pushoffsetclosure.ml | 38 + .../tests/tool-ocaml/t253-offsetclosure0.ml | 34 + .../tests/tool-ocaml/t253-offsetclosure2.ml | 34 + .../tests/tool-ocaml/t253-offsetclosurem2.ml | 34 + .../tests/tool-ocaml/t254-offsetclosure.ml | 37 + testsuite/tests/tool-ocaml/t260-offsetref.ml | 31 + .../tests/tool-ocaml/t270-push_retaddr.ml | 36 + testsuite/tests/tool-ocaml/t300-getmethod.ml | 5885 +++++ testsuite/tests/tool-ocaml/t301-object.ml | 29 + testsuite/tests/tool-ocaml/t310-alloc-1.ml | 1587 ++ testsuite/tests/tool-ocaml/t310-alloc-2.ml | 2313 ++ testsuite/tests/tool-ocaml/t320-gc-1.ml | 1589 ++ testsuite/tests/tool-ocaml/t320-gc-2.ml | 1589 ++ testsuite/tests/tool-ocaml/t320-gc-3.ml | 1589 ++ testsuite/tests/tool-ocaml/t330-compact-1.ml | 15 + testsuite/tests/tool-ocaml/t330-compact-2.ml | 755 + testsuite/tests/tool-ocaml/t330-compact-3.ml | 1589 ++ testsuite/tests/tool-ocaml/t330-compact-4.ml | 1589 ++ testsuite/tests/tool-ocaml/t340-weak.ml | 2551 ++ testsuite/tests/tool-ocaml/t350-heapcheck.ml | 2554 ++ testsuite/tests/tool-ocaml/t360-stacks-1.ml | 43 + testsuite/tests/tool-ocaml/t360-stacks-2.ml | 54 + testsuite/tests/tool-ocamldoc/Makefile | 14 + testsuite/tests/tool-ocamldoc/odoc_test.ml | 112 + testsuite/tests/tool-ocamldoc/t01.ml | 19 + testsuite/tests/tool-ocamldoc/t01.reference | 33 + testsuite/tests/typing-fstclassmod/Makefile | 6 + .../tests/typing-fstclassmod/fstclassmod.ml | 142 + .../typing-fstclassmod/fstclassmod.reference | 6 + testsuite/tests/typing-labels/Makefile | 2 + testsuite/tests/typing-labels/mixin.ml | 157 + testsuite/tests/typing-labels/mixin.reference | 3 + testsuite/tests/typing-labels/mixin2.ml | 190 + .../tests/typing-labels/mixin2.reference | 3 + testsuite/tests/typing-labels/mixin3.ml | 184 + .../tests/typing-labels/mixin3.reference | 3 + testsuite/tests/typing-objects-bugs/Makefile | 2 + .../tests/typing-objects-bugs/pr3968_bad.ml | 21 + .../tests/typing-objects-bugs/pr4018_bad.ml | 46 + .../tests/typing-objects-bugs/pr4435_bad.ml | 11 + .../tests/typing-objects-bugs/pr4766_ok.ml | 10 + .../tests/typing-objects-bugs/woodyatt_ok.ml | 14 + .../typing-objects-bugs/yamagata021012_ok.ml | 193 + testsuite/tests/typing-objects/Exemples.ml | 333 + .../typing-objects/Exemples.ml.reference | 480 + testsuite/tests/typing-objects/Makefile | 3 + testsuite/tests/typing-objects/Tests.ml | 304 + .../tests/typing-objects/Tests.ml.reference | 386 + testsuite/tests/typing-poly/Makefile | 3 + testsuite/tests/typing-poly/poly.ml | 614 + .../typing-poly/poly.ml.principal.reference | 590 + testsuite/tests/typing-poly/poly.ml.reference | 574 + .../tests/typing-polyvariants-bugs-2/Makefile | 7 + .../typing-polyvariants-bugs-2/pr3918a.mli | 1 + .../typing-polyvariants-bugs-2/pr3918b.mli | 1 + .../typing-polyvariants-bugs-2/pr3918c.ml | 10 + .../tests/typing-polyvariants-bugs/Makefile | 2 + .../typing-polyvariants-bugs/pr4775_ok.ml | 11 + .../typing-polyvariants-bugs/pr4933_ok.ml | 15 + .../privrowsabate_ok.ml | 53 + testsuite/tests/typing-private/Makefile | 3 + testsuite/tests/typing-private/private.ml | 89 + .../tests/typing-private/private.ml.reference | 88 + testsuite/tests/typing-recmod/Makefile | 2 + testsuite/tests/typing-recmod/t01bad.ml | 2 + testsuite/tests/typing-recmod/t02bad.ml | 4 + testsuite/tests/typing-recmod/t03ok.ml | 3 + testsuite/tests/typing-recmod/t04bad.ml | 2 + testsuite/tests/typing-recmod/t05bad.ml | 3 + testsuite/tests/typing-recmod/t06ok.ml | 3 + testsuite/tests/typing-recmod/t07bad.ml | 3 + testsuite/tests/typing-recmod/t08bad.ml | 5 + testsuite/tests/typing-recmod/t09bad.ml | 5 + testsuite/tests/typing-recmod/t10ok.ml | 5 + testsuite/tests/typing-recmod/t11bad.ml | 5 + testsuite/tests/typing-recmod/t12bad.ml | 13 + testsuite/tests/typing-recmod/t13ok.ml | 5 + testsuite/tests/typing-recmod/t14bad.ml | 17 + testsuite/tests/typing-recmod/t15bad.ml | 3 + testsuite/tests/typing-recmod/t16ok.ml | 31 + testsuite/tests/typing-recmod/t17ok.ml | 42 + testsuite/tests/typing-recmod/t18ok.ml | 26 + testsuite/tests/typing-recmod/t19ok.ml | 13 + testsuite/tests/typing-recmod/t20ok.ml | 30 + testsuite/tests/typing-recmod/t21ok.ml | 27 + testsuite/tests/typing-recmod/t22ok.ml | 511 + testsuite/tests/typing-recmod/t22ok.mli | 134 + testsuite/tests/typing-typeparam/Makefile | 6 + testsuite/tests/typing-typeparam/newtype.ml | 27 + .../tests/typing-typeparam/newtype.reference | 5 + testsuite/tests/warnings/Makefile | 14 + testsuite/tests/warnings/w01.ml | 44 + testsuite/tests/warnings/w01.reference | 15 + tools/.depend | 76 +- tools/Characters | 2 +- tools/DoMake | 4 +- tools/MakeDepend | 2 +- tools/Makefile | 2 +- tools/Makefile.nt | 2 +- tools/Makefile.shared | 36 +- tools/addlabels.ml | 27 +- tools/checkstack.c | 5 +- tools/cleanup-header | 2 - tools/cvt_emit.mll | 2 +- tools/depend.ml | 31 +- tools/depend.mli | 2 +- tools/dumpapprox.ml | 5 +- tools/dumpobj.ml | 2 +- tools/keywords.r | 121 - tools/lexer299.mll | 6 +- tools/lexer301.mll | 6 +- tools/make-package-macosx | 2 +- tools/objinfo.ml | 5 +- tools/ocaml-objcopy-macosx | 2 +- tools/ocaml299to3.ml | 2 +- tools/ocamlcp.ml | 6 +- tools/ocamldep.ml | 16 +- tools/ocamlmklib.mlp | 60 +- tools/ocamlmktop.ml | 2 +- tools/ocamlmktop.tpl | 2 +- tools/ocamlprof.ml | 15 +- tools/primreq.ml | 2 +- tools/profiling.ml | 3 +- tools/profiling.mli | 2 +- tools/scrapelabels.ml | 4 +- toplevel/expunge.ml | 2 +- toplevel/genprintval.ml | 4 +- toplevel/genprintval.mli | 2 +- toplevel/opttopdirs.ml | 35 +- toplevel/opttopdirs.mli | 2 +- toplevel/opttoploop.ml | 4 +- toplevel/opttoploop.mli | 2 +- toplevel/opttopmain.ml | 111 +- toplevel/opttopmain.mli | 2 +- toplevel/opttopstart.ml | 2 +- toplevel/topdirs.ml | 8 +- toplevel/topdirs.mli | 2 +- toplevel/toploop.ml | 6 +- toplevel/toploop.mli | 2 +- toplevel/topmain.ml | 80 +- toplevel/topmain.mli | 2 +- toplevel/topstart.ml | 2 +- toplevel/trace.ml | 2 +- toplevel/trace.mli | 4 +- typing/annot.mli | 2 +- typing/btype.ml | 21 +- typing/btype.mli | 2 +- typing/ctype.ml | 131 +- typing/ctype.mli | 2 +- typing/datarepr.ml | 7 +- typing/datarepr.mli | 4 +- typing/env.ml | 30 +- typing/env.mli | 2 +- typing/ident.ml | 4 +- typing/ident.mli | 4 +- typing/includeclass.ml | 7 +- typing/includeclass.mli | 2 +- typing/includecore.ml | 38 +- typing/includecore.mli | 2 +- typing/includemod.ml | 8 +- typing/includemod.mli | 2 +- typing/mtype.ml | 31 +- typing/mtype.mli | 2 +- typing/oprint.ml | 12 +- typing/oprint.mli | 2 +- typing/outcometree.mli | 4 +- typing/parmatch.ml | 86 +- typing/parmatch.mli | 2 +- typing/path.ml | 3 +- typing/path.mli | 2 +- typing/predef.ml | 4 +- typing/predef.mli | 2 +- typing/primitive.ml | 2 +- typing/primitive.mli | 2 +- typing/printtyp.ml | 9 +- typing/printtyp.mli | 2 +- typing/stypes.ml | 2 +- typing/stypes.mli | 2 +- typing/subst.ml | 22 +- typing/subst.mli | 4 +- typing/typeclass.ml | 133 +- typing/typeclass.mli | 3 +- typing/typecore.ml | 527 +- typing/typecore.mli | 10 +- typing/typedecl.ml | 4 +- typing/typedecl.mli | 4 +- typing/typedtree.ml | 4 +- typing/typedtree.mli | 5 +- typing/typemod.ml | 180 +- typing/typemod.mli | 4 +- typing/types.ml | 6 +- typing/types.mli | 12 +- typing/typetexp.ml | 56 +- typing/typetexp.mli | 8 +- typing/unused_var.ml | 14 +- typing/unused_var.mli | 2 +- utils/ccomp.ml | 4 +- utils/ccomp.mli | 2 +- utils/clflags.ml | 5 +- utils/clflags.mli | 4 +- utils/config.mlbuild | 8 +- utils/config.mli | 6 +- utils/config.mlp | 8 +- utils/consistbl.ml | 2 +- utils/consistbl.mli | 2 +- utils/misc.ml | 2 +- utils/misc.mli | 4 +- utils/tbl.ml | 2 +- utils/tbl.mli | 4 +- utils/terminfo.ml | 2 +- utils/terminfo.mli | 2 +- utils/warnings.ml | 306 +- utils/warnings.mli | 62 +- win32caml/Makefile | 2 +- win32caml/inria.h | 2 +- win32caml/libgraph.h | 2 +- win32caml/menu.c | 2 +- win32caml/ocaml.c | 2 +- win32caml/startocaml.c | 2 +- yacc/Makefile | 2 +- yacc/Makefile.nt | 2 +- yacc/closure.c | 2 +- yacc/defs.h | 3 +- yacc/error.c | 2 +- yacc/lalr.c | 4 +- yacc/lr0.c | 2 +- yacc/main.c | 54 +- yacc/mkpar.c | 7 +- yacc/output.c | 4 +- yacc/reader.c | 2 +- yacc/skeleton.c | 2 +- yacc/symtab.c | 2 +- yacc/verbose.c | 3 +- yacc/warshall.c | 2 +- 2232 files changed, 171330 insertions(+), 9935 deletions(-) delete mode 100644 camlp4/man/camlp4.help.tpl create mode 100644 camlp4/test/fixtures/assert.ml create mode 100644 camlp4/test/fixtures/backquoted_irrefutable_tuple.ml create mode 100644 camlp4/test/fixtures/backquoted_record.ml create mode 100644 camlp4/test/fixtures/backquoted_tuple.ml create mode 100644 camlp4/test/fixtures/big-tab1.ml create mode 100644 camlp4/test/fixtures/big-tab2.ml create mode 100644 camlp4/test/fixtures/big-tab3.ml create mode 100644 camlp4/test/fixtures/bug-4058.ml create mode 100644 camlp4/test/fixtures/bug-4337.ml create mode 100644 camlp4/test/fixtures/bug-by-vincent-balat.ml create mode 100644 camlp4/test/fixtures/bug-camlp4o-benjamin-monate.ml create mode 100644 camlp4/test/fixtures/bug-camlp4o-constr-arity-expr.ml create mode 100644 camlp4/test/fixtures/bug-camlp4o-constr-arity.ml create mode 100644 camlp4/test/fixtures/bug_escaping_quot.ml create mode 100644 camlp4/test/fixtures/chars.ml create mode 100644 camlp4/test/fixtures/class_expr_quot.ml create mode 100644 camlp4/test/fixtures/comments.ml create mode 100644 camlp4/test/fixtures/comments.mli create mode 100644 camlp4/test/fixtures/comments2.ml create mode 100644 camlp4/test/fixtures/constant-parser.ml create mode 100644 camlp4/test/fixtures/curry-constr.ml create mode 100644 camlp4/test/fixtures/default_quotation.ml create mode 100644 camlp4/test/fixtures/exception-with-eqn-bug.ml create mode 100644 camlp4/test/fixtures/external.ml create mode 100644 camlp4/test/fixtures/fun.ml create mode 100644 camlp4/test/fixtures/functor-perf.ml create mode 100644 camlp4/test/fixtures/functor-perf2.gen.ml create mode 100644 camlp4/test/fixtures/functor-perf2.ml create mode 100644 camlp4/test/fixtures/functor-perf3.ml create mode 100644 camlp4/test/fixtures/gen_map.ml create mode 100644 camlp4/test/fixtures/gram-fold.ml create mode 100644 camlp4/test/fixtures/gram-list.ml create mode 100644 camlp4/test/fixtures/gram-loc-lost.ml create mode 100644 camlp4/test/fixtures/gram-sub-rule.ml create mode 100644 camlp4/test/fixtures/gram-tree.ml create mode 100644 camlp4/test/fixtures/gram-tree2.ml create mode 100644 camlp4/test/fixtures/gram-tree3.ml create mode 100644 camlp4/test/fixtures/gram.ml create mode 100644 camlp4/test/fixtures/idents create mode 100644 camlp4/test/fixtures/idents1 create mode 100644 camlp4/test/fixtures/idents2 create mode 100644 camlp4/test/fixtures/if.ml create mode 100644 camlp4/test/fixtures/label.ml create mode 100644 camlp4/test/fixtures/lambda_free.ml create mode 100644 camlp4/test/fixtures/loc-bug.ml create mode 100644 camlp4/test/fixtures/macrotest.ml create mode 100644 camlp4/test/fixtures/macrotest.mli create mode 100644 camlp4/test/fixtures/macrotest2.ml create mode 100644 camlp4/test/fixtures/macrotest3.ml create mode 100644 camlp4/test/fixtures/make_extend.ml create mode 100644 camlp4/test/fixtures/match.ml create mode 100644 camlp4/test/fixtures/match_parser.ml create mode 100644 camlp4/test/fixtures/meta_multi_term.ml create mode 100644 camlp4/test/fixtures/metalib.ml create mode 100644 camlp4/test/fixtures/method_private_virtual.ml create mode 100644 camlp4/test/fixtures/mod.ml create mode 100644 camlp4/test/fixtures/mod2.ml create mode 100644 camlp4/test/fixtures/operators.ml create mode 100644 camlp4/test/fixtures/operators.mli create mode 100644 camlp4/test/fixtures/original_syntax.ml create mode 100644 camlp4/test/fixtures/outside-scope.ml create mode 100644 camlp4/test/fixtures/parser.ml create mode 100644 camlp4/test/fixtures/pp_let_in.ml create mode 100644 camlp4/test/fixtures/pp_let_in2.ml create mode 100644 camlp4/test/fixtures/pp_xml.ml create mode 100644 camlp4/test/fixtures/pprecordtyp.ml create mode 100644 camlp4/test/fixtures/pr4314.ml create mode 100644 camlp4/test/fixtures/pr4314gram1.ml create mode 100644 camlp4/test/fixtures/pr4314gram2.ml create mode 100644 camlp4/test/fixtures/pr4314gram3.ml create mode 100644 camlp4/test/fixtures/pr4314gram4.ml create mode 100644 camlp4/test/fixtures/pr4314gram5.ml create mode 100644 camlp4/test/fixtures/pr4329.ml create mode 100644 camlp4/test/fixtures/pr4330.ml create mode 100644 camlp4/test/fixtures/pr4357.ml create mode 100644 camlp4/test/fixtures/pr4357sample.ml create mode 100644 camlp4/test/fixtures/pr4357sample2.ml create mode 100644 camlp4/test/fixtures/pr4452.ml create mode 100644 camlp4/test/fixtures/private_row.ml create mode 100644 camlp4/test/fixtures/rec.ml create mode 100644 camlp4/test/fixtures/seq.ml create mode 100644 camlp4/test/fixtures/seq2.ml create mode 100644 camlp4/test/fixtures/simplify.ml create mode 100644 camlp4/test/fixtures/simplify_r.ml create mode 100644 camlp4/test/fixtures/stream-parser-bug.ml create mode 100644 camlp4/test/fixtures/string.ml create mode 100644 camlp4/test/fixtures/superfluous.ml create mode 100644 camlp4/test/fixtures/transform-examples.ml create mode 100644 camlp4/test/fixtures/try.ml create mode 100644 camlp4/test/fixtures/tuple_as_retval.ml create mode 100644 camlp4/test/fixtures/type.ml create mode 100644 camlp4/test/fixtures/type_decl.ml create mode 100644 camlp4/test/fixtures/unit.ml create mode 100644 camlp4/test/fixtures/use.ml create mode 100644 camlp4/test/fixtures/where.o.ml create mode 100644 camlp4/test/fixtures/where.r.ml create mode 100644 camlp4/unmaintained/Makefile create mode 100644 camlp4/unmaintained/compile/.cvsignore create mode 100644 camlp4/unmaintained/compile/.depend create mode 100644 camlp4/unmaintained/compile/Makefile create mode 100644 camlp4/unmaintained/compile/comp_head.ml create mode 100644 camlp4/unmaintained/compile/comp_trail.ml create mode 100644 camlp4/unmaintained/compile/compile.ml create mode 100755 camlp4/unmaintained/compile/compile.sh create mode 100644 camlp4/unmaintained/etc/.cvsignore create mode 100644 camlp4/unmaintained/etc/.depend create mode 100644 camlp4/unmaintained/etc/Makefile create mode 100644 camlp4/unmaintained/etc/pa_fstream.ml create mode 100644 camlp4/unmaintained/etc/pa_ifdef.ml create mode 100644 camlp4/unmaintained/etc/pa_oop.ml create mode 100644 camlp4/unmaintained/etc/pa_ru.ml create mode 100644 camlp4/unmaintained/etc/parserify.ml create mode 100644 camlp4/unmaintained/etc/parserify.mli create mode 100644 camlp4/unmaintained/etc/pr_depend.ml create mode 100644 camlp4/unmaintained/etc/pr_extend.ml create mode 100644 camlp4/unmaintained/etc/pr_extfun.ml create mode 100644 camlp4/unmaintained/etc/pr_null.ml create mode 100644 camlp4/unmaintained/etc/pr_op.ml create mode 100644 camlp4/unmaintained/etc/pr_op_main.ml create mode 100644 camlp4/unmaintained/etc/pr_rp.ml create mode 100644 camlp4/unmaintained/etc/pr_rp_main.ml create mode 100644 camlp4/unmaintained/etc/q_phony.ml create mode 100644 camlp4/unmaintained/extfold/README create mode 100644 camlp4/unmaintained/extfold/pa_extfold.ml create mode 100644 camlp4/unmaintained/format/.depend create mode 100644 camlp4/unmaintained/format/Makefile create mode 100644 camlp4/unmaintained/format/README create mode 100644 camlp4/unmaintained/format/pa_format.ml create mode 100644 camlp4/unmaintained/lefteval/.depend create mode 100644 camlp4/unmaintained/lefteval/Makefile create mode 100644 camlp4/unmaintained/lefteval/README create mode 100644 camlp4/unmaintained/lefteval/pa_lefteval.ml create mode 100644 camlp4/unmaintained/lib/.cvsignore create mode 100644 camlp4/unmaintained/lib/.depend create mode 100644 camlp4/unmaintained/lib/Makefile create mode 100644 camlp4/unmaintained/lib/extfun.ml create mode 100644 camlp4/unmaintained/lib/extfun.mli create mode 100644 camlp4/unmaintained/lib/fstream.ml create mode 100644 camlp4/unmaintained/lib/fstream.mli create mode 100644 camlp4/unmaintained/ocamllex/Makefile create mode 100644 camlp4/unmaintained/ocamllex/README create mode 100644 camlp4/unmaintained/ocamllex/pa_ocamllex.ml create mode 100644 camlp4/unmaintained/ocpp/.cvsignore create mode 100644 camlp4/unmaintained/ocpp/.depend create mode 100644 camlp4/unmaintained/ocpp/Makefile create mode 100644 camlp4/unmaintained/ocpp/ocpp.ml create mode 100644 camlp4/unmaintained/odyl/.cvsignore create mode 100644 camlp4/unmaintained/odyl/.depend create mode 100644 camlp4/unmaintained/odyl/Makefile create mode 100644 camlp4/unmaintained/odyl/odyl.ml create mode 100644 camlp4/unmaintained/odyl/odyl_main.mli create mode 100644 camlp4/unmaintained/olabl/.depend create mode 100644 camlp4/unmaintained/olabl/Makefile create mode 100644 camlp4/unmaintained/olabl/README create mode 100644 camlp4/unmaintained/olabl/pa_olabl.ml create mode 100644 camlp4/unmaintained/scheme/.depend create mode 100644 camlp4/unmaintained/scheme/Makefile create mode 100644 camlp4/unmaintained/scheme/README create mode 100644 camlp4/unmaintained/scheme/pa_scheme.ml create mode 100644 camlp4/unmaintained/scheme/pa_scheme.sc create mode 100644 camlp4/unmaintained/scheme/pr_scheme.ml create mode 100644 camlp4/unmaintained/scheme/pr_schp_main.ml create mode 100644 camlp4/unmaintained/sml/.depend create mode 100644 camlp4/unmaintained/sml/Makefile create mode 100644 camlp4/unmaintained/sml/README create mode 100644 camlp4/unmaintained/sml/pa_sml.ml create mode 100644 camlp4/unmaintained/sml/smllib.sml create mode 100644 config/auto-aux/initgroups.c create mode 100644 config/auto-aux/setgroups.c delete mode 100644 man/ocaml.help create mode 100644 ocamlbuild/findlib.ml create mode 100644 ocamlbuild/findlib.mli create mode 100644 ocamlbuild/manual/.cvsignore create mode 100644 ocamlbuild/manual/Makefile create mode 100644 ocamlbuild/manual/manual.hva create mode 100644 ocamlbuild/manual/manual.tex create mode 100644 ocamlbuild/manual/myocamlbuild.ml create mode 100644 ocamlbuild/manual/trace.out create mode 100644 ocamlbuild/param_tags.ml create mode 100644 ocamlbuild/param_tags.mli 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 100644 ocamlbuild/test/test_virtual/test.sh delete mode 100644 otherlibs/labltk/tkanim/.cvsignore delete mode 100644 otherlibs/labltk/tkanim/.depend delete mode 100644 otherlibs/labltk/tkanim/Makefile delete mode 100644 otherlibs/labltk/tkanim/Makefile.nt delete mode 100644 otherlibs/labltk/tkanim/README delete mode 100644 otherlibs/labltk/tkanim/cltkaniminit.c delete mode 100644 otherlibs/labltk/tkanim/gifanimtest.ml delete mode 100644 otherlibs/labltk/tkanim/libtkanim.clib delete mode 100644 otherlibs/labltk/tkanim/mmm.anim.gif delete mode 100644 otherlibs/labltk/tkanim/tkAnimGIF.c delete mode 100644 otherlibs/labltk/tkanim/tkAppInit.c delete mode 100644 otherlibs/labltk/tkanim/tkanim.ml delete mode 100644 otherlibs/labltk/tkanim/tkanim.mli delete mode 100644 otherlibs/num/test/.depend delete mode 100644 otherlibs/num/test/Makefile delete mode 100644 otherlibs/num/test/Makefile.nt create mode 100644 otherlibs/unix/initgroups.c create mode 100644 otherlibs/unix/setgroups.c create mode 100644 test/.cvsignore create mode 100644 test/.depend rename {otherlibs/num/test => test}/test_bng.c (100%) create mode 100644 testlabl/.cvsignore create mode 100644 testlabl/coerce.diffs create mode 100644 testlabl/dirs_multimatch create mode 100644 testlabl/dirs_poly create mode 100644 testlabl/els.ml create mode 100644 testlabl/fixedtypes.ml create mode 100644 testlabl/marshal_objects.diffs create mode 100644 testlabl/multimatch.diffs create mode 100644 testlabl/multimatch.ml create mode 100644 testlabl/newlabels.ps create mode 100644 testlabl/objvariant.diffs create mode 100644 testlabl/objvariant.ml create mode 100644 testlabl/printers.ml create mode 100644 testlabl/sigsubst.ml create mode 100644 testlabl/tests.ml create mode 100644 testlabl/valvirt.diffs create mode 100644 testlabl/varunion.ml create mode 100644 testsuite/.svnignore create mode 100644 testsuite/Makefile create mode 100644 testsuite/interactive/lib-gc/Makefile create mode 100644 testsuite/interactive/lib-gc/alloc.ml create mode 100644 testsuite/interactive/lib-gc/alloc.result create mode 100644 testsuite/interactive/lib-graph-2/Makefile create mode 100644 testsuite/interactive/lib-graph-2/graph_test.ml create mode 100644 testsuite/interactive/lib-graph-2/graph_test.reference create mode 100644 testsuite/interactive/lib-graph-3/Makefile create mode 100644 testsuite/interactive/lib-graph-3/sorts.ml create mode 100644 testsuite/interactive/lib-graph-3/sorts.reference create mode 100644 testsuite/interactive/lib-graph/Makefile create mode 100644 testsuite/interactive/lib-graph/graph_example.ml create mode 100644 testsuite/interactive/lib-graph/graph_example.reference create mode 100644 testsuite/interactive/lib-signals/Makefile create mode 100644 testsuite/interactive/lib-signals/signals.ml create mode 100644 testsuite/lib/Makefile create mode 100644 testsuite/lib/testing.ml create mode 100644 testsuite/lib/testing.mli create mode 100644 testsuite/makefiles/Makefile.common create mode 100644 testsuite/makefiles/Makefile.okbad create mode 100644 testsuite/makefiles/Makefile.one create mode 100644 testsuite/makefiles/Makefile.several create mode 100644 testsuite/makefiles/Makefile.toplevel create mode 100644 testsuite/tests/asmcomp/Makefile create mode 100644 testsuite/tests/asmcomp/alpha.S create mode 100644 testsuite/tests/asmcomp/amd64.S create mode 100644 testsuite/tests/asmcomp/arith.cmm create mode 100644 testsuite/tests/asmcomp/arm.S create mode 100644 testsuite/tests/asmcomp/checkbound.cmm create mode 100644 testsuite/tests/asmcomp/fib.cmm create mode 100644 testsuite/tests/asmcomp/hppa.S create mode 100644 testsuite/tests/asmcomp/i386.S create mode 100644 testsuite/tests/asmcomp/i386nt.asm create mode 100644 testsuite/tests/asmcomp/ia64.S create mode 100644 testsuite/tests/asmcomp/integr.cmm create mode 100644 testsuite/tests/asmcomp/lexcmm.mli create mode 100644 testsuite/tests/asmcomp/lexcmm.mll create mode 100644 testsuite/tests/asmcomp/m68k.S create mode 100644 testsuite/tests/asmcomp/main.c create mode 100644 testsuite/tests/asmcomp/main.ml create mode 100644 testsuite/tests/asmcomp/mainarith.c create mode 100644 testsuite/tests/asmcomp/mips.s create mode 100644 testsuite/tests/asmcomp/parsecmm.mly create mode 100644 testsuite/tests/asmcomp/parsecmmaux.ml create mode 100644 testsuite/tests/asmcomp/parsecmmaux.mli create mode 100644 testsuite/tests/asmcomp/power-aix.S create mode 100644 testsuite/tests/asmcomp/power-elf.S create mode 100644 testsuite/tests/asmcomp/power-rhapsody.S create mode 100644 testsuite/tests/asmcomp/quicksort.cmm create mode 100644 testsuite/tests/asmcomp/quicksort2.cmm create mode 100644 testsuite/tests/asmcomp/soli.cmm create mode 100644 testsuite/tests/asmcomp/sparc.S create mode 100644 testsuite/tests/asmcomp/tagged-fib.cmm create mode 100644 testsuite/tests/asmcomp/tagged-integr.cmm create mode 100644 testsuite/tests/asmcomp/tagged-quicksort.cmm create mode 100644 testsuite/tests/asmcomp/tagged-tak.cmm create mode 100644 testsuite/tests/asmcomp/tak.cmm create mode 100644 testsuite/tests/backtrace/Makefile create mode 100644 testsuite/tests/backtrace/backtrace..reference create mode 100644 testsuite/tests/backtrace/backtrace.a.reference create mode 100644 testsuite/tests/backtrace/backtrace.b.reference create mode 100644 testsuite/tests/backtrace/backtrace.c.reference create mode 100644 testsuite/tests/backtrace/backtrace.d.reference create mode 100644 testsuite/tests/backtrace/backtrace.ml create mode 100644 testsuite/tests/backtrace/backtrace2..reference create mode 100644 testsuite/tests/backtrace/backtrace2.a.reference create mode 100644 testsuite/tests/backtrace/backtrace2.b.reference create mode 100644 testsuite/tests/backtrace/backtrace2.c.reference create mode 100644 testsuite/tests/backtrace/backtrace2.d.reference create mode 100644 testsuite/tests/backtrace/backtrace2.ml create mode 100644 testsuite/tests/basic-float/Makefile create mode 100644 testsuite/tests/basic-float/float_record.ml create mode 100644 testsuite/tests/basic-float/float_record.mli create mode 100644 testsuite/tests/basic-float/tfloat_record.ml create mode 100644 testsuite/tests/basic-float/tfloat_record.reference create mode 100644 testsuite/tests/basic-io-2/Makefile create mode 100644 testsuite/tests/basic-io-2/io.ml create mode 100644 testsuite/tests/basic-io-2/io.reference create mode 100644 testsuite/tests/basic-io/Makefile create mode 100644 testsuite/tests/basic-io/wc.ml create mode 100644 testsuite/tests/basic-io/wc.reference create mode 100644 testsuite/tests/basic-manyargs/Makefile create mode 100644 testsuite/tests/basic-manyargs/manyargs.ml create mode 100644 testsuite/tests/basic-manyargs/manyargs.reference create mode 100644 testsuite/tests/basic-manyargs/manyargsprim.c create mode 100644 testsuite/tests/basic-more/Makefile create mode 100644 testsuite/tests/basic-more/bounds.ml create mode 100644 testsuite/tests/basic-more/bounds.reference create mode 100644 testsuite/tests/basic-more/morematch.ml create mode 100644 testsuite/tests/basic-more/morematch.reference create mode 100644 testsuite/tests/basic-more/tbuffer.ml create mode 100644 testsuite/tests/basic-more/tbuffer.reference create mode 100644 testsuite/tests/basic-more/testrandom.ml create mode 100644 testsuite/tests/basic-more/testrandom.reference create mode 100644 testsuite/tests/basic-more/tformat.ml create mode 100644 testsuite/tests/basic-more/tformat.reference create mode 100644 testsuite/tests/basic-more/tprintf.ml create mode 100644 testsuite/tests/basic-more/tprintf.reference create mode 100644 testsuite/tests/basic-multdef/Makefile create mode 100644 testsuite/tests/basic-multdef/multdef.ml create mode 100644 testsuite/tests/basic-multdef/multdef.mli create mode 100644 testsuite/tests/basic-multdef/usemultdef.ml create mode 100644 testsuite/tests/basic-multdef/usemultdef.reference create mode 100644 testsuite/tests/basic-private/Makefile create mode 100644 testsuite/tests/basic-private/length.ml create mode 100644 testsuite/tests/basic-private/length.mli create mode 100644 testsuite/tests/basic-private/tlength.ml create mode 100644 testsuite/tests/basic-private/tlength.reference create mode 100644 testsuite/tests/basic/Makefile create mode 100644 testsuite/tests/basic/arrays.ml create mode 100644 testsuite/tests/basic/arrays.reference create mode 100644 testsuite/tests/basic/bigints.ml create mode 100644 testsuite/tests/basic/bigints.reference create mode 100644 testsuite/tests/basic/boxedints.ml create mode 100644 testsuite/tests/basic/boxedints.reference create mode 100644 testsuite/tests/basic/equality.ml create mode 100644 testsuite/tests/basic/equality.reference create mode 100644 testsuite/tests/basic/float.ml create mode 100644 testsuite/tests/basic/float.reference create mode 100644 testsuite/tests/basic/includestruct.ml create mode 100644 testsuite/tests/basic/includestruct.reference create mode 100644 testsuite/tests/basic/patmatch.ml create mode 100644 testsuite/tests/basic/patmatch.reference create mode 100644 testsuite/tests/basic/recvalues.ml create mode 100644 testsuite/tests/basic/recvalues.reference create mode 100644 testsuite/tests/basic/sets.ml create mode 100644 testsuite/tests/basic/sets.reference create mode 100644 testsuite/tests/basic/tailcalls.ml create mode 100644 testsuite/tests/basic/tailcalls.reference create mode 100644 testsuite/tests/callback/Makefile create mode 100644 testsuite/tests/callback/callbackprim.c create mode 100644 testsuite/tests/callback/reference create mode 100644 testsuite/tests/callback/tcallback.ml create mode 100644 testsuite/tests/embedded/Makefile create mode 100644 testsuite/tests/embedded/cmcaml.ml create mode 100644 testsuite/tests/embedded/cmmain.c create mode 100644 testsuite/tests/embedded/cmstub.c create mode 100644 testsuite/tests/embedded/program.reference create mode 100644 testsuite/tests/gc-roots/Makefile create mode 100644 testsuite/tests/gc-roots/globroots.ml create mode 100644 testsuite/tests/gc-roots/globroots.reference create mode 100644 testsuite/tests/gc-roots/globrootsprim.c create mode 100644 testsuite/tests/lib-bigarray-2/Makefile create mode 100644 testsuite/tests/lib-bigarray-2/bigarrf.f create mode 100644 testsuite/tests/lib-bigarray-2/bigarrfml.ml create mode 100644 testsuite/tests/lib-bigarray-2/bigarrfml.reference create mode 100644 testsuite/tests/lib-bigarray-2/bigarrfstub.c create mode 100644 testsuite/tests/lib-bigarray/Makefile create mode 100644 testsuite/tests/lib-bigarray/bigarrays.ml create mode 100644 testsuite/tests/lib-bigarray/bigarrays.reference create mode 100644 testsuite/tests/lib-bigarray/fftba.ml create mode 100644 testsuite/tests/lib-bigarray/fftba.reference create mode 100644 testsuite/tests/lib-digest/Makefile create mode 100644 testsuite/tests/lib-digest/md5.ml create mode 100644 testsuite/tests/lib-digest/md5.reference create mode 100644 testsuite/tests/lib-dynlink-bytecode/.svnignore create mode 100644 testsuite/tests/lib-dynlink-bytecode/Makefile create mode 100644 testsuite/tests/lib-dynlink-bytecode/custom.reference create mode 100644 testsuite/tests/lib-dynlink-bytecode/main.ml create mode 100644 testsuite/tests/lib-dynlink-bytecode/main.reference create mode 100644 testsuite/tests/lib-dynlink-bytecode/plug1.ml create mode 100644 testsuite/tests/lib-dynlink-bytecode/plug2.ml create mode 100644 testsuite/tests/lib-dynlink-bytecode/static.reference create mode 100644 testsuite/tests/lib-dynlink-bytecode/stub1.c create mode 100644 testsuite/tests/lib-dynlink-bytecode/stub2.c create mode 100644 testsuite/tests/lib-dynlink-csharp/Makefile create mode 100644 testsuite/tests/lib-dynlink-csharp/bytecode.reference create mode 100755 testsuite/tests/lib-dynlink-csharp/entry.c create mode 100755 testsuite/tests/lib-dynlink-csharp/main.cs create mode 100755 testsuite/tests/lib-dynlink-csharp/main.ml create mode 100644 testsuite/tests/lib-dynlink-csharp/native.reference create mode 100755 testsuite/tests/lib-dynlink-csharp/plugin.ml create mode 100644 testsuite/tests/lib-dynlink-native/.svnignore create mode 100644 testsuite/tests/lib-dynlink-native/Makefile create mode 100755 testsuite/tests/lib-dynlink-native/a.ml create mode 100644 testsuite/tests/lib-dynlink-native/api.ml create mode 100755 testsuite/tests/lib-dynlink-native/b.ml create mode 100644 testsuite/tests/lib-dynlink-native/bug.ml create mode 100755 testsuite/tests/lib-dynlink-native/c.ml create mode 100644 testsuite/tests/lib-dynlink-native/factorial.c create mode 100644 testsuite/tests/lib-dynlink-native/main.ml create mode 100644 testsuite/tests/lib-dynlink-native/pack_client.ml create mode 100644 testsuite/tests/lib-dynlink-native/packed1.ml create mode 100644 testsuite/tests/lib-dynlink-native/packed1_client.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin.mli create mode 100644 testsuite/tests/lib-dynlink-native/plugin2.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin4.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin_ext.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin_high_arity.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin_ref.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin_simple.ml create mode 100644 testsuite/tests/lib-dynlink-native/plugin_thread.ml create mode 100644 testsuite/tests/lib-dynlink-native/reference create mode 100644 testsuite/tests/lib-dynlink-native/sub/api.ml create mode 100644 testsuite/tests/lib-dynlink-native/sub/api.mli create mode 100644 testsuite/tests/lib-dynlink-native/sub/plugin.ml create mode 100644 testsuite/tests/lib-dynlink-native/sub/plugin3.ml create mode 100644 testsuite/tests/lib-marshal/Makefile create mode 100644 testsuite/tests/lib-marshal/intext.ml create mode 100644 testsuite/tests/lib-marshal/intext.reference create mode 100644 testsuite/tests/lib-marshal/intextaux.c create mode 100644 testsuite/tests/lib-num-2/Makefile rename {otherlibs/num/test => testsuite/tests/lib-num-2}/pi_big_int.ml (100%) create mode 100644 testsuite/tests/lib-num-2/pi_big_int.reference rename {otherlibs/num/test => testsuite/tests/lib-num-2}/pi_num.ml (100%) create mode 100644 testsuite/tests/lib-num-2/pi_num.reference create mode 100644 testsuite/tests/lib-num/Makefile rename {otherlibs/num/test => testsuite/tests/lib-num}/end_test.ml (100%) create mode 100644 testsuite/tests/lib-num/end_test.reference rename {otherlibs/num/test => testsuite/tests/lib-num}/test.ml (75%) rename {otherlibs/num/test => testsuite/tests/lib-num}/test_big_ints.ml (86%) rename {otherlibs/num/test => testsuite/tests/lib-num}/test_io.ml (100%) rename {otherlibs/num/test => testsuite/tests/lib-num}/test_nats.ml (98%) rename {otherlibs/num/test => testsuite/tests/lib-num}/test_nums.ml (99%) rename {otherlibs/num/test => testsuite/tests/lib-num}/test_ratios.ml (99%) create mode 100644 testsuite/tests/lib-scanf-2/Makefile create mode 100644 testsuite/tests/lib-scanf-2/reference create mode 100644 testsuite/tests/lib-scanf-2/tscanf2_io.ml create mode 100644 testsuite/tests/lib-scanf-2/tscanf2_master.ml create mode 100644 testsuite/tests/lib-scanf-2/tscanf2_slave.ml create mode 100644 testsuite/tests/lib-scanf/Makefile create mode 100644 testsuite/tests/lib-scanf/tscanf.ml create mode 100644 testsuite/tests/lib-scanf/tscanf.reference create mode 100644 testsuite/tests/lib-scanf/tscanf_data create mode 100644 testsuite/tests/lib-str/Makefile create mode 100644 testsuite/tests/lib-str/t01.ml create mode 100644 testsuite/tests/lib-str/t01.reference create mode 100644 testsuite/tests/lib-systhreads/Makefile create mode 100644 testsuite/tests/lib-systhreads/testfork.ml create mode 100644 testsuite/tests/lib-systhreads/testfork.reference create mode 100644 testsuite/tests/lib-threads/.cvsignore create mode 100644 testsuite/tests/lib-threads/Makefile create mode 100644 testsuite/tests/lib-threads/close.ml create mode 100644 testsuite/tests/lib-threads/close.reference create mode 100644 testsuite/tests/lib-threads/sieve.ml create mode 100644 testsuite/tests/lib-threads/sieve.reference create mode 100644 testsuite/tests/lib-threads/test1.checker create mode 100644 testsuite/tests/lib-threads/test1.ml create mode 100644 testsuite/tests/lib-threads/test1.reference create mode 100644 testsuite/tests/lib-threads/test2.checker create mode 100644 testsuite/tests/lib-threads/test2.ml create mode 100644 testsuite/tests/lib-threads/test3.checker create mode 100644 testsuite/tests/lib-threads/test3.ml create mode 100644 testsuite/tests/lib-threads/test3.runner create mode 100644 testsuite/tests/lib-threads/test4.checker create mode 100644 testsuite/tests/lib-threads/test4.data create mode 100644 testsuite/tests/lib-threads/test4.ml create mode 100644 testsuite/tests/lib-threads/test4.reference create mode 100644 testsuite/tests/lib-threads/test4.runner create mode 100644 testsuite/tests/lib-threads/test5.checker create mode 100644 testsuite/tests/lib-threads/test5.ml create mode 100644 testsuite/tests/lib-threads/test5.reference create mode 100644 testsuite/tests/lib-threads/test5.runner create mode 100644 testsuite/tests/lib-threads/test6.checker create mode 100644 testsuite/tests/lib-threads/test6.ml create mode 100644 testsuite/tests/lib-threads/test6.reference create mode 100644 testsuite/tests/lib-threads/test6.runner create mode 100644 testsuite/tests/lib-threads/test7.checker create mode 100644 testsuite/tests/lib-threads/test7.ml create mode 100644 testsuite/tests/lib-threads/test7.runner create mode 100644 testsuite/tests/lib-threads/test8.ml create mode 100644 testsuite/tests/lib-threads/test8.reference create mode 100644 testsuite/tests/lib-threads/test9.ml create mode 100644 testsuite/tests/lib-threads/test9.reference create mode 100644 testsuite/tests/lib-threads/testA.checker create mode 100644 testsuite/tests/lib-threads/testA.ml create mode 100644 testsuite/tests/lib-threads/testA.reference create mode 100644 testsuite/tests/lib-threads/testexit.checker create mode 100644 testsuite/tests/lib-threads/testexit.ml create mode 100644 testsuite/tests/lib-threads/testexit.reference create mode 100644 testsuite/tests/lib-threads/testio.ml create mode 100644 testsuite/tests/lib-threads/testio.reference create mode 100644 testsuite/tests/lib-threads/testsieve.ml create mode 100644 testsuite/tests/lib-threads/testsieve.reference create mode 100644 testsuite/tests/lib-threads/testsignal.checker create mode 100644 testsuite/tests/lib-threads/testsignal.ml create mode 100644 testsuite/tests/lib-threads/testsignal.runner create mode 100644 testsuite/tests/lib-threads/testsignal2.checker create mode 100644 testsuite/tests/lib-threads/testsignal2.ml create mode 100644 testsuite/tests/lib-threads/testsignal2.runner create mode 100644 testsuite/tests/lib-threads/testsocket.ml create mode 100644 testsuite/tests/lib-threads/testsocket.reference create mode 100644 testsuite/tests/lib-threads/token1.ml create mode 100644 testsuite/tests/lib-threads/token1.reference create mode 100644 testsuite/tests/lib-threads/token2.ml create mode 100644 testsuite/tests/lib-threads/token2.reference create mode 100644 testsuite/tests/lib-threads/torture.data create mode 100644 testsuite/tests/lib-threads/torture.ml create mode 100644 testsuite/tests/lib-threads/torture.reference create mode 100644 testsuite/tests/lib-threads/torture.runner create mode 100644 testsuite/tests/misc-kb/Makefile create mode 100644 testsuite/tests/misc-kb/equations.ml create mode 100644 testsuite/tests/misc-kb/equations.mli create mode 100644 testsuite/tests/misc-kb/kb.ml create mode 100644 testsuite/tests/misc-kb/kb.mli create mode 100644 testsuite/tests/misc-kb/kbmain.ml create mode 100644 testsuite/tests/misc-kb/kbmain.reference create mode 100644 testsuite/tests/misc-kb/orderings.ml create mode 100644 testsuite/tests/misc-kb/orderings.mli create mode 100644 testsuite/tests/misc-kb/terms.ml create mode 100644 testsuite/tests/misc-kb/terms.mli create mode 100644 testsuite/tests/misc-unsafe/Makefile create mode 100644 testsuite/tests/misc-unsafe/almabench.ml create mode 100644 testsuite/tests/misc-unsafe/almabench.reference create mode 100644 testsuite/tests/misc-unsafe/fft.ml create mode 100644 testsuite/tests/misc-unsafe/fft.reference create mode 100644 testsuite/tests/misc-unsafe/quicksort.ml create mode 100644 testsuite/tests/misc-unsafe/quicksort.reference create mode 100644 testsuite/tests/misc-unsafe/soli.ml create mode 100644 testsuite/tests/misc-unsafe/soli.reference create mode 100644 testsuite/tests/misc/Makefile create mode 100644 testsuite/tests/misc/bdd.ml create mode 100644 testsuite/tests/misc/bdd.reference create mode 100644 testsuite/tests/misc/boyer.ml create mode 100644 testsuite/tests/misc/boyer.reference create mode 100644 testsuite/tests/misc/fib.ml create mode 100644 testsuite/tests/misc/fib.reference create mode 100644 testsuite/tests/misc/hamming.ml create mode 100644 testsuite/tests/misc/hamming.reference create mode 100644 testsuite/tests/misc/nucleic.ml create mode 100644 testsuite/tests/misc/nucleic.reference create mode 100644 testsuite/tests/misc/sieve.ml create mode 100644 testsuite/tests/misc/sieve.reference create mode 100644 testsuite/tests/misc/sorts.ml create mode 100644 testsuite/tests/misc/sorts.reference create mode 100644 testsuite/tests/misc/takc.ml create mode 100644 testsuite/tests/misc/takc.reference create mode 100644 testsuite/tests/misc/taku.ml create mode 100644 testsuite/tests/misc/taku.reference create mode 100644 testsuite/tests/misc/weaktest.ml create mode 100644 testsuite/tests/misc/weaktest.reference create mode 100644 testsuite/tests/runtime-errors/Makefile create mode 100644 testsuite/tests/runtime-errors/stackoverflow.bytecode.reference create mode 100644 testsuite/tests/runtime-errors/stackoverflow.ml create mode 100644 testsuite/tests/runtime-errors/stackoverflow.native.reference create mode 100644 testsuite/tests/runtime-errors/syserror.bytecode.reference create mode 100644 testsuite/tests/runtime-errors/syserror.ml create mode 100644 testsuite/tests/runtime-errors/syserror.native.reference create mode 100644 testsuite/tests/tool-lexyacc/.svnignore create mode 100644 testsuite/tests/tool-lexyacc/Makefile create mode 100644 testsuite/tests/tool-lexyacc/gram_aux.ml create mode 100644 testsuite/tests/tool-lexyacc/grammar.mly create mode 100644 testsuite/tests/tool-lexyacc/input create mode 100644 testsuite/tests/tool-lexyacc/input.ml create mode 100644 testsuite/tests/tool-lexyacc/lexgen.ml create mode 100644 testsuite/tests/tool-lexyacc/main.ml create mode 100644 testsuite/tests/tool-lexyacc/main.reference create mode 100644 testsuite/tests/tool-lexyacc/output.ml create mode 100644 testsuite/tests/tool-lexyacc/scan_aux.ml create mode 100644 testsuite/tests/tool-lexyacc/scanner.mll create mode 100644 testsuite/tests/tool-lexyacc/syntax.ml create mode 100644 testsuite/tests/tool-ocaml/Makefile create mode 100644 testsuite/tests/tool-ocaml/lib.ml create mode 100644 testsuite/tests/tool-ocaml/t000.ml create mode 100644 testsuite/tests/tool-ocaml/t010-const0.ml create mode 100644 testsuite/tests/tool-ocaml/t010-const1.ml create mode 100644 testsuite/tests/tool-ocaml/t010-const2.ml create mode 100644 testsuite/tests/tool-ocaml/t010-const3.ml create mode 100644 testsuite/tests/tool-ocaml/t011-constint.ml create mode 100644 testsuite/tests/tool-ocaml/t020.ml create mode 100644 testsuite/tests/tool-ocaml/t021-pushconst1.ml create mode 100644 testsuite/tests/tool-ocaml/t021-pushconst2.ml create mode 100644 testsuite/tests/tool-ocaml/t021-pushconst3.ml create mode 100644 testsuite/tests/tool-ocaml/t022-pushconstint.ml create mode 100644 testsuite/tests/tool-ocaml/t040-makeblock1.ml create mode 100644 testsuite/tests/tool-ocaml/t040-makeblock2.ml create mode 100644 testsuite/tests/tool-ocaml/t040-makeblock3.ml create mode 100644 testsuite/tests/tool-ocaml/t041-makeblock.ml create mode 100644 testsuite/tests/tool-ocaml/t050-getglobal.ml create mode 100644 testsuite/tests/tool-ocaml/t050-pushgetglobal.ml create mode 100644 testsuite/tests/tool-ocaml/t051-getglobalfield.ml create mode 100644 testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml create mode 100644 testsuite/tests/tool-ocaml/t060-raise.ml create mode 100644 testsuite/tests/tool-ocaml/t070-branch.ml create mode 100644 testsuite/tests/tool-ocaml/t070-branchif.ml create mode 100644 testsuite/tests/tool-ocaml/t070-branchifnot.ml create mode 100644 testsuite/tests/tool-ocaml/t071-boolnot.ml create mode 100644 testsuite/tests/tool-ocaml/t080-eq.ml create mode 100644 testsuite/tests/tool-ocaml/t080-geint.ml create mode 100644 testsuite/tests/tool-ocaml/t080-gtint.ml create mode 100644 testsuite/tests/tool-ocaml/t080-leint.ml create mode 100644 testsuite/tests/tool-ocaml/t080-ltint.ml create mode 100644 testsuite/tests/tool-ocaml/t080-neq.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc0.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc1.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc2.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc3.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc4.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc5.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc6.ml create mode 100644 testsuite/tests/tool-ocaml/t090-acc7.ml create mode 100644 testsuite/tests/tool-ocaml/t091-acc.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc0.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc1.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc2.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc3.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc4.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc5.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc6.ml create mode 100644 testsuite/tests/tool-ocaml/t092-pushacc7.ml create mode 100644 testsuite/tests/tool-ocaml/t093-pushacc.ml create mode 100644 testsuite/tests/tool-ocaml/t100-pushtrap.ml create mode 100644 testsuite/tests/tool-ocaml/t101-poptrap.ml create mode 100644 testsuite/tests/tool-ocaml/t110-addint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-andint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-asrint-1.ml create mode 100644 testsuite/tests/tool-ocaml/t110-asrint-2.ml create mode 100644 testsuite/tests/tool-ocaml/t110-divint-1.ml create mode 100644 testsuite/tests/tool-ocaml/t110-divint-2.ml create mode 100644 testsuite/tests/tool-ocaml/t110-divint-3.ml create mode 100644 testsuite/tests/tool-ocaml/t110-lslint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-lsrint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-modint-1.ml create mode 100644 testsuite/tests/tool-ocaml/t110-modint-2.ml create mode 100644 testsuite/tests/tool-ocaml/t110-mulint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-negint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-offsetint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-orint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-subint.ml create mode 100644 testsuite/tests/tool-ocaml/t110-xorint.ml create mode 100644 testsuite/tests/tool-ocaml/t120-getstringchar.ml create mode 100644 testsuite/tests/tool-ocaml/t121-setstringchar.ml create mode 100644 testsuite/tests/tool-ocaml/t130-getvectitem.ml create mode 100644 testsuite/tests/tool-ocaml/t130-vectlength.ml create mode 100644 testsuite/tests/tool-ocaml/t131-setvectitem.ml create mode 100644 testsuite/tests/tool-ocaml/t140-switch-1.ml create mode 100644 testsuite/tests/tool-ocaml/t140-switch-2.ml create mode 100644 testsuite/tests/tool-ocaml/t140-switch-3.ml create mode 100644 testsuite/tests/tool-ocaml/t140-switch-4.ml create mode 100644 testsuite/tests/tool-ocaml/t141-switch-5.ml create mode 100644 testsuite/tests/tool-ocaml/t141-switch-6.ml create mode 100644 testsuite/tests/tool-ocaml/t141-switch-7.ml create mode 100644 testsuite/tests/tool-ocaml/t142-switch-8.ml create mode 100644 testsuite/tests/tool-ocaml/t142-switch-9.ml create mode 100644 testsuite/tests/tool-ocaml/t142-switch-A.ml create mode 100644 testsuite/tests/tool-ocaml/t150-push-1.ml create mode 100644 testsuite/tests/tool-ocaml/t150-push-2.ml create mode 100644 testsuite/tests/tool-ocaml/t160-closure.ml create mode 100644 testsuite/tests/tool-ocaml/t161-apply1.ml create mode 100644 testsuite/tests/tool-ocaml/t162-return.ml create mode 100644 testsuite/tests/tool-ocaml/t163.ml create mode 100644 testsuite/tests/tool-ocaml/t164-apply2.ml create mode 100644 testsuite/tests/tool-ocaml/t164-apply3.ml create mode 100644 testsuite/tests/tool-ocaml/t165-apply.ml create mode 100644 testsuite/tests/tool-ocaml/t170-envacc2.ml create mode 100644 testsuite/tests/tool-ocaml/t170-envacc3.ml create mode 100644 testsuite/tests/tool-ocaml/t170-envacc4.ml create mode 100644 testsuite/tests/tool-ocaml/t171-envacc.ml create mode 100644 testsuite/tests/tool-ocaml/t172-pushenvacc1.ml create mode 100644 testsuite/tests/tool-ocaml/t172-pushenvacc2.ml create mode 100644 testsuite/tests/tool-ocaml/t172-pushenvacc3.ml create mode 100644 testsuite/tests/tool-ocaml/t172-pushenvacc4.ml create mode 100644 testsuite/tests/tool-ocaml/t173-pushenvacc.ml create mode 100644 testsuite/tests/tool-ocaml/t180-appterm1.ml create mode 100644 testsuite/tests/tool-ocaml/t180-appterm2.ml create mode 100644 testsuite/tests/tool-ocaml/t180-appterm3.ml create mode 100644 testsuite/tests/tool-ocaml/t181-appterm.ml create mode 100644 testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml create mode 100644 testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml create mode 100644 testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml create mode 100644 testsuite/tests/tool-ocaml/t191-vectlength.ml create mode 100644 testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml create mode 100644 testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml create mode 100644 testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml create mode 100644 testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml create mode 100644 testsuite/tests/tool-ocaml/t200-getfield0.ml create mode 100644 testsuite/tests/tool-ocaml/t200-getfield1.ml create mode 100644 testsuite/tests/tool-ocaml/t200-getfield2.ml create mode 100644 testsuite/tests/tool-ocaml/t200-getfield3.ml create mode 100644 testsuite/tests/tool-ocaml/t201-getfield.ml create mode 100644 testsuite/tests/tool-ocaml/t210-setfield0.ml create mode 100644 testsuite/tests/tool-ocaml/t210-setfield1.ml create mode 100644 testsuite/tests/tool-ocaml/t210-setfield2.ml create mode 100644 testsuite/tests/tool-ocaml/t210-setfield3.ml create mode 100644 testsuite/tests/tool-ocaml/t211-setfield.ml create mode 100644 testsuite/tests/tool-ocaml/t220-assign.ml create mode 100644 testsuite/tests/tool-ocaml/t230-check_signals.ml create mode 100644 testsuite/tests/tool-ocaml/t240-c_call1.ml create mode 100644 testsuite/tests/tool-ocaml/t240-c_call2.ml create mode 100644 testsuite/tests/tool-ocaml/t240-c_call3.ml create mode 100644 testsuite/tests/tool-ocaml/t240-c_call4.ml create mode 100644 testsuite/tests/tool-ocaml/t240-c_call5.ml create mode 100644 testsuite/tests/tool-ocaml/t250-closurerec-1.ml create mode 100644 testsuite/tests/tool-ocaml/t250-closurerec-2.ml create mode 100644 testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml create mode 100644 testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml create mode 100644 testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml create mode 100644 testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml create mode 100644 testsuite/tests/tool-ocaml/t253-offsetclosure0.ml create mode 100644 testsuite/tests/tool-ocaml/t253-offsetclosure2.ml create mode 100644 testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml create mode 100644 testsuite/tests/tool-ocaml/t254-offsetclosure.ml create mode 100644 testsuite/tests/tool-ocaml/t260-offsetref.ml create mode 100644 testsuite/tests/tool-ocaml/t270-push_retaddr.ml create mode 100644 testsuite/tests/tool-ocaml/t300-getmethod.ml create mode 100644 testsuite/tests/tool-ocaml/t301-object.ml create mode 100644 testsuite/tests/tool-ocaml/t310-alloc-1.ml create mode 100644 testsuite/tests/tool-ocaml/t310-alloc-2.ml create mode 100644 testsuite/tests/tool-ocaml/t320-gc-1.ml create mode 100644 testsuite/tests/tool-ocaml/t320-gc-2.ml create mode 100644 testsuite/tests/tool-ocaml/t320-gc-3.ml create mode 100644 testsuite/tests/tool-ocaml/t330-compact-1.ml create mode 100644 testsuite/tests/tool-ocaml/t330-compact-2.ml create mode 100644 testsuite/tests/tool-ocaml/t330-compact-3.ml create mode 100644 testsuite/tests/tool-ocaml/t330-compact-4.ml create mode 100644 testsuite/tests/tool-ocaml/t340-weak.ml create mode 100644 testsuite/tests/tool-ocaml/t350-heapcheck.ml create mode 100644 testsuite/tests/tool-ocaml/t360-stacks-1.ml create mode 100644 testsuite/tests/tool-ocaml/t360-stacks-2.ml create mode 100644 testsuite/tests/tool-ocamldoc/Makefile create mode 100644 testsuite/tests/tool-ocamldoc/odoc_test.ml create mode 100644 testsuite/tests/tool-ocamldoc/t01.ml create mode 100644 testsuite/tests/tool-ocamldoc/t01.reference create mode 100644 testsuite/tests/typing-fstclassmod/Makefile create mode 100644 testsuite/tests/typing-fstclassmod/fstclassmod.ml create mode 100644 testsuite/tests/typing-fstclassmod/fstclassmod.reference create mode 100644 testsuite/tests/typing-labels/Makefile create mode 100644 testsuite/tests/typing-labels/mixin.ml create mode 100644 testsuite/tests/typing-labels/mixin.reference create mode 100644 testsuite/tests/typing-labels/mixin2.ml create mode 100644 testsuite/tests/typing-labels/mixin2.reference create mode 100644 testsuite/tests/typing-labels/mixin3.ml create mode 100644 testsuite/tests/typing-labels/mixin3.reference create mode 100644 testsuite/tests/typing-objects-bugs/Makefile create mode 100644 testsuite/tests/typing-objects-bugs/pr3968_bad.ml create mode 100644 testsuite/tests/typing-objects-bugs/pr4018_bad.ml create mode 100644 testsuite/tests/typing-objects-bugs/pr4435_bad.ml create mode 100644 testsuite/tests/typing-objects-bugs/pr4766_ok.ml create mode 100644 testsuite/tests/typing-objects-bugs/woodyatt_ok.ml create mode 100644 testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml create mode 100644 testsuite/tests/typing-objects/Exemples.ml create mode 100644 testsuite/tests/typing-objects/Exemples.ml.reference create mode 100644 testsuite/tests/typing-objects/Makefile create mode 100644 testsuite/tests/typing-objects/Tests.ml create mode 100644 testsuite/tests/typing-objects/Tests.ml.reference create mode 100644 testsuite/tests/typing-poly/Makefile create mode 100644 testsuite/tests/typing-poly/poly.ml create mode 100644 testsuite/tests/typing-poly/poly.ml.principal.reference create mode 100644 testsuite/tests/typing-poly/poly.ml.reference create mode 100644 testsuite/tests/typing-polyvariants-bugs-2/Makefile create mode 100644 testsuite/tests/typing-polyvariants-bugs-2/pr3918a.mli create mode 100644 testsuite/tests/typing-polyvariants-bugs-2/pr3918b.mli create mode 100644 testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml create mode 100644 testsuite/tests/typing-polyvariants-bugs/Makefile create mode 100644 testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml create mode 100644 testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml create mode 100644 testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml create mode 100644 testsuite/tests/typing-private/Makefile create mode 100644 testsuite/tests/typing-private/private.ml create mode 100644 testsuite/tests/typing-private/private.ml.reference create mode 100644 testsuite/tests/typing-recmod/Makefile create mode 100644 testsuite/tests/typing-recmod/t01bad.ml create mode 100644 testsuite/tests/typing-recmod/t02bad.ml create mode 100644 testsuite/tests/typing-recmod/t03ok.ml create mode 100644 testsuite/tests/typing-recmod/t04bad.ml create mode 100644 testsuite/tests/typing-recmod/t05bad.ml create mode 100644 testsuite/tests/typing-recmod/t06ok.ml create mode 100644 testsuite/tests/typing-recmod/t07bad.ml create mode 100644 testsuite/tests/typing-recmod/t08bad.ml create mode 100644 testsuite/tests/typing-recmod/t09bad.ml create mode 100644 testsuite/tests/typing-recmod/t10ok.ml create mode 100644 testsuite/tests/typing-recmod/t11bad.ml create mode 100644 testsuite/tests/typing-recmod/t12bad.ml create mode 100644 testsuite/tests/typing-recmod/t13ok.ml create mode 100644 testsuite/tests/typing-recmod/t14bad.ml create mode 100644 testsuite/tests/typing-recmod/t15bad.ml create mode 100644 testsuite/tests/typing-recmod/t16ok.ml create mode 100644 testsuite/tests/typing-recmod/t17ok.ml create mode 100644 testsuite/tests/typing-recmod/t18ok.ml create mode 100644 testsuite/tests/typing-recmod/t19ok.ml create mode 100644 testsuite/tests/typing-recmod/t20ok.ml create mode 100644 testsuite/tests/typing-recmod/t21ok.ml create mode 100644 testsuite/tests/typing-recmod/t22ok.ml create mode 100644 testsuite/tests/typing-recmod/t22ok.mli create mode 100644 testsuite/tests/typing-typeparam/Makefile create mode 100644 testsuite/tests/typing-typeparam/newtype.ml create mode 100644 testsuite/tests/typing-typeparam/newtype.reference create mode 100644 testsuite/tests/warnings/Makefile create mode 100644 testsuite/tests/warnings/w01.ml create mode 100644 testsuite/tests/warnings/w01.reference delete mode 100644 tools/keywords.r diff --git a/.cvsignore b/.cvsignore index 76ae30ef..e90edd4b 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,4 +1,3 @@ -.cvsignore .depend configure ocamlc @@ -17,3 +16,4 @@ _boot_log2 _build _log myocamlbuild_config.ml +ocamlnat diff --git a/.depend b/.depend index b52df953..daf84360 100644 --- a/.depend +++ b/.depend @@ -1,510 +1,512 @@ -utils/ccomp.cmi: -utils/clflags.cmi: -utils/config.cmi: -utils/consistbl.cmi: -utils/misc.cmi: -utils/tbl.cmi: -utils/terminfo.cmi: -utils/warnings.cmi: +utils/ccomp.cmi: +utils/clflags.cmi: +utils/config.cmi: +utils/consistbl.cmi: +utils/misc.cmi: +utils/tbl.cmi: +utils/terminfo.cmi: +utils/warnings.cmi: utils/ccomp.cmo: utils/misc.cmi utils/config.cmi utils/clflags.cmi \ - utils/ccomp.cmi + utils/ccomp.cmi utils/ccomp.cmx: utils/misc.cmx utils/config.cmx utils/clflags.cmx \ - utils/ccomp.cmi -utils/clflags.cmo: utils/config.cmi utils/clflags.cmi -utils/clflags.cmx: utils/config.cmx utils/clflags.cmi -utils/config.cmo: utils/config.cmi -utils/config.cmx: utils/config.cmi -utils/consistbl.cmo: utils/consistbl.cmi -utils/consistbl.cmx: utils/consistbl.cmi -utils/misc.cmo: utils/misc.cmi -utils/misc.cmx: utils/misc.cmi -utils/tbl.cmo: utils/tbl.cmi -utils/tbl.cmx: utils/tbl.cmi -utils/terminfo.cmo: utils/terminfo.cmi -utils/terminfo.cmx: utils/terminfo.cmi -utils/warnings.cmo: utils/warnings.cmi -utils/warnings.cmx: utils/warnings.cmi -parsing/asttypes.cmi: -parsing/lexer.cmi: parsing/parser.cmi parsing/location.cmi -parsing/linenum.cmi: -parsing/location.cmi: utils/warnings.cmi -parsing/longident.cmi: -parsing/parse.cmi: parsing/parsetree.cmi -parsing/parser.cmi: parsing/parsetree.cmi + utils/ccomp.cmi +utils/clflags.cmo: utils/config.cmi utils/clflags.cmi +utils/clflags.cmx: utils/config.cmx utils/clflags.cmi +utils/config.cmo: utils/config.cmi +utils/config.cmx: utils/config.cmi +utils/consistbl.cmo: utils/consistbl.cmi +utils/consistbl.cmx: utils/consistbl.cmi +utils/misc.cmo: utils/misc.cmi +utils/misc.cmx: utils/misc.cmi +utils/tbl.cmo: utils/tbl.cmi +utils/tbl.cmx: utils/tbl.cmi +utils/terminfo.cmo: utils/terminfo.cmi +utils/terminfo.cmx: utils/terminfo.cmi +utils/warnings.cmo: utils/warnings.cmi +utils/warnings.cmx: utils/warnings.cmi +parsing/asttypes.cmi: +parsing/lexer.cmi: parsing/parser.cmi parsing/location.cmi +parsing/linenum.cmi: +parsing/location.cmi: utils/warnings.cmi +parsing/longident.cmi: +parsing/parse.cmi: parsing/parsetree.cmi +parsing/parser.cmi: parsing/parsetree.cmi parsing/parsetree.cmi: parsing/longident.cmi parsing/location.cmi \ - parsing/asttypes.cmi -parsing/printast.cmi: parsing/parsetree.cmi -parsing/syntaxerr.cmi: parsing/location.cmi + parsing/asttypes.cmi +parsing/printast.cmi: parsing/parsetree.cmi +parsing/syntaxerr.cmi: parsing/location.cmi parsing/lexer.cmo: utils/warnings.cmi parsing/parser.cmi utils/misc.cmi \ - parsing/location.cmi parsing/lexer.cmi + parsing/location.cmi parsing/lexer.cmi parsing/lexer.cmx: utils/warnings.cmx parsing/parser.cmx utils/misc.cmx \ - parsing/location.cmx parsing/lexer.cmi -parsing/linenum.cmo: utils/misc.cmi parsing/linenum.cmi -parsing/linenum.cmx: utils/misc.cmx parsing/linenum.cmi + parsing/location.cmx parsing/lexer.cmi +parsing/linenum.cmo: utils/misc.cmi parsing/linenum.cmi +parsing/linenum.cmx: utils/misc.cmx parsing/linenum.cmi parsing/location.cmo: utils/warnings.cmi utils/terminfo.cmi \ - parsing/linenum.cmi parsing/location.cmi + parsing/linenum.cmi parsing/location.cmi parsing/location.cmx: utils/warnings.cmx utils/terminfo.cmx \ - parsing/linenum.cmx parsing/location.cmi -parsing/longident.cmo: utils/misc.cmi parsing/longident.cmi -parsing/longident.cmx: utils/misc.cmx parsing/longident.cmi + parsing/linenum.cmx parsing/location.cmi +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/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/parse.cmi parsing/parser.cmo: parsing/syntaxerr.cmi parsing/parsetree.cmi \ parsing/longident.cmi parsing/location.cmi utils/clflags.cmi \ - parsing/asttypes.cmi parsing/parser.cmi + parsing/asttypes.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/parser.cmi + parsing/asttypes.cmi parsing/parser.cmi parsing/printast.cmo: parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi parsing/printast.cmi + parsing/location.cmi parsing/asttypes.cmi parsing/printast.cmi parsing/printast.cmx: parsing/parsetree.cmi parsing/longident.cmx \ - parsing/location.cmx parsing/asttypes.cmi parsing/printast.cmi -parsing/syntaxerr.cmo: parsing/location.cmi parsing/syntaxerr.cmi -parsing/syntaxerr.cmx: parsing/location.cmx parsing/syntaxerr.cmi -typing/annot.cmi: parsing/location.cmi -typing/btype.cmi: typing/types.cmi typing/path.cmi parsing/asttypes.cmi + parsing/location.cmx parsing/asttypes.cmi parsing/printast.cmi +parsing/syntaxerr.cmo: parsing/location.cmi parsing/syntaxerr.cmi +parsing/syntaxerr.cmx: parsing/location.cmx parsing/syntaxerr.cmi +typing/annot.cmi: parsing/location.cmi +typing/btype.cmi: typing/types.cmi typing/path.cmi parsing/asttypes.cmi typing/ctype.cmi: typing/types.cmi typing/path.cmi typing/ident.cmi \ - typing/env.cmi parsing/asttypes.cmi -typing/datarepr.cmi: typing/types.cmi typing/path.cmi parsing/asttypes.cmi + typing/env.cmi parsing/asttypes.cmi +typing/datarepr.cmi: typing/types.cmi typing/path.cmi parsing/asttypes.cmi typing/env.cmi: typing/types.cmi typing/path.cmi parsing/longident.cmi \ - typing/ident.cmi utils/consistbl.cmi typing/annot.cmi -typing/ident.cmi: + typing/ident.cmi utils/consistbl.cmi typing/annot.cmi +typing/ident.cmi: typing/includeclass.cmi: typing/types.cmi typing/typedtree.cmi typing/env.cmi \ - typing/ctype.cmi + typing/ctype.cmi typing/includecore.cmi: typing/types.cmi typing/typedtree.cmi \ - typing/ident.cmi typing/env.cmi + typing/ident.cmi typing/env.cmi typing/includemod.cmi: typing/types.cmi typing/typedtree.cmi typing/path.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi + typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/mtype.cmi: typing/types.cmi typing/path.cmi typing/ident.cmi \ - typing/env.cmi -typing/oprint.cmi: typing/outcometree.cmi -typing/outcometree.cmi: parsing/asttypes.cmi + typing/env.cmi +typing/oprint.cmi: typing/outcometree.cmi +typing/outcometree.cmi: parsing/asttypes.cmi typing/parmatch.cmi: typing/types.cmi typing/typedtree.cmi \ - parsing/location.cmi typing/env.cmi -typing/path.cmi: typing/ident.cmi -typing/predef.cmi: typing/types.cmi typing/path.cmi typing/ident.cmi -typing/primitive.cmi: + parsing/location.cmi typing/env.cmi +typing/path.cmi: typing/ident.cmi +typing/predef.cmi: typing/types.cmi typing/path.cmi typing/ident.cmi +typing/primitive.cmi: typing/printtyp.cmi: typing/types.cmi typing/path.cmi typing/outcometree.cmi \ - parsing/longident.cmi typing/ident.cmi -typing/stypes.cmi: typing/typedtree.cmi parsing/location.cmi typing/annot.cmi -typing/subst.cmi: typing/types.cmi typing/path.cmi typing/ident.cmi + parsing/longident.cmi typing/ident.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 typing/typeclass.cmi: typing/types.cmi typing/typedtree.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi parsing/asttypes.cmi + typing/ident.cmi typing/env.cmi typing/ctype.cmi parsing/asttypes.cmi typing/typecore.cmi: typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi + typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi typing/typedecl.cmi: typing/types.cmi typing/path.cmi parsing/parsetree.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ - typing/env.cmi + typing/env.cmi typing/typedtree.cmi: typing/types.cmi typing/primitive.cmi typing/path.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi + parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/typemod.cmi: typing/types.cmi typing/typedtree.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/includemod.cmi typing/ident.cmi typing/env.cmi + typing/includemod.cmi typing/ident.cmi typing/env.cmi typing/types.cmi: typing/primitive.cmi typing/path.cmi typing/ident.cmi \ - parsing/asttypes.cmi + parsing/asttypes.cmi typing/typetexp.cmi: typing/types.cmi typing/path.cmi parsing/parsetree.cmi \ - parsing/longident.cmi parsing/location.cmi typing/env.cmi -typing/unused_var.cmi: parsing/parsetree.cmi + parsing/longident.cmi parsing/location.cmi typing/env.cmi +typing/unused_var.cmi: parsing/parsetree.cmi typing/btype.cmo: typing/types.cmi typing/path.cmi utils/misc.cmi \ - typing/btype.cmi + typing/btype.cmi typing/btype.cmx: typing/types.cmx typing/path.cmx utils/misc.cmx \ - typing/btype.cmi + typing/btype.cmi typing/ctype.cmo: typing/types.cmi typing/subst.cmi typing/path.cmi \ utils/misc.cmi parsing/longident.cmi typing/ident.cmi typing/env.cmi \ - utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi typing/ctype.cmi + utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi typing/ctype.cmi typing/ctype.cmx: typing/types.cmx typing/subst.cmx typing/path.cmx \ utils/misc.cmx parsing/longident.cmx typing/ident.cmx typing/env.cmx \ - utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi typing/ctype.cmi + utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi typing/ctype.cmi typing/datarepr.cmo: typing/types.cmi typing/predef.cmi utils/misc.cmi \ - parsing/asttypes.cmi typing/datarepr.cmi + parsing/asttypes.cmi typing/datarepr.cmi typing/datarepr.cmx: typing/types.cmx typing/predef.cmx utils/misc.cmx \ - parsing/asttypes.cmi typing/datarepr.cmi + parsing/asttypes.cmi typing/datarepr.cmi typing/env.cmo: typing/types.cmi utils/tbl.cmi typing/subst.cmi \ typing/predef.cmi typing/path.cmi utils/misc.cmi parsing/longident.cmi \ typing/ident.cmi typing/datarepr.cmi utils/consistbl.cmi utils/config.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi typing/annot.cmi \ - typing/env.cmi + typing/env.cmi typing/env.cmx: typing/types.cmx utils/tbl.cmx typing/subst.cmx \ typing/predef.cmx typing/path.cmx utils/misc.cmx parsing/longident.cmx \ typing/ident.cmx typing/datarepr.cmx utils/consistbl.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi typing/annot.cmi \ - typing/env.cmi -typing/ident.cmo: typing/ident.cmi -typing/ident.cmx: typing/ident.cmi + typing/env.cmi +typing/ident.cmo: typing/ident.cmi +typing/ident.cmx: typing/ident.cmi typing/includeclass.cmo: typing/types.cmi typing/printtyp.cmi \ - typing/ctype.cmi typing/includeclass.cmi + typing/ctype.cmi typing/includeclass.cmi typing/includeclass.cmx: typing/types.cmx typing/printtyp.cmx \ - typing/ctype.cmx typing/includeclass.cmi + typing/ctype.cmx typing/includeclass.cmi typing/includecore.cmo: typing/types.cmi typing/typedtree.cmi \ typing/predef.cmi typing/path.cmi utils/misc.cmi typing/ctype.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/includecore.cmi + typing/btype.cmi parsing/asttypes.cmi typing/includecore.cmi typing/includecore.cmx: typing/types.cmx typing/typedtree.cmx \ typing/predef.cmx typing/path.cmx utils/misc.cmx typing/ctype.cmx \ - typing/btype.cmx parsing/asttypes.cmi typing/includecore.cmi + typing/btype.cmx parsing/asttypes.cmi typing/includecore.cmi typing/includemod.cmo: typing/types.cmi typing/typedtree.cmi utils/tbl.cmi \ typing/subst.cmi typing/printtyp.cmi typing/path.cmi typing/mtype.cmi \ utils/misc.cmi typing/includecore.cmi typing/includeclass.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/includemod.cmi + typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/includemod.cmi typing/includemod.cmx: typing/types.cmx typing/typedtree.cmx utils/tbl.cmx \ typing/subst.cmx typing/printtyp.cmx typing/path.cmx typing/mtype.cmx \ utils/misc.cmx typing/includecore.cmx typing/includeclass.cmx \ - typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/includemod.cmi + typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/includemod.cmi typing/mtype.cmo: typing/types.cmi typing/subst.cmi typing/path.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/btype.cmi \ - parsing/asttypes.cmi typing/mtype.cmi + typing/ident.cmi typing/env.cmi typing/ctype.cmi utils/clflags.cmi \ + typing/btype.cmi parsing/asttypes.cmi typing/mtype.cmi typing/mtype.cmx: typing/types.cmx typing/subst.cmx typing/path.cmx \ - typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/btype.cmx \ - parsing/asttypes.cmi typing/mtype.cmi + typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/clflags.cmx \ + typing/btype.cmx parsing/asttypes.cmi typing/mtype.cmi typing/oprint.cmo: typing/outcometree.cmi parsing/asttypes.cmi \ - typing/oprint.cmi + typing/oprint.cmi typing/oprint.cmx: typing/outcometree.cmi parsing/asttypes.cmi \ - typing/oprint.cmi + typing/oprint.cmi typing/parmatch.cmo: utils/warnings.cmi typing/types.cmi typing/typedtree.cmi \ typing/subst.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ parsing/location.cmi typing/ident.cmi typing/env.cmi typing/datarepr.cmi \ typing/ctype.cmi typing/btype.cmi parsing/asttypes.cmi \ - typing/parmatch.cmi + typing/parmatch.cmi typing/parmatch.cmx: utils/warnings.cmx typing/types.cmx typing/typedtree.cmx \ typing/subst.cmx typing/predef.cmx typing/path.cmx utils/misc.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/datarepr.cmx \ typing/ctype.cmx typing/btype.cmx parsing/asttypes.cmi \ - typing/parmatch.cmi -typing/path.cmo: typing/ident.cmi typing/path.cmi -typing/path.cmx: typing/ident.cmx typing/path.cmi + typing/parmatch.cmi +typing/path.cmo: typing/ident.cmi typing/path.cmi +typing/path.cmx: typing/ident.cmx typing/path.cmi typing/predef.cmo: typing/types.cmi typing/path.cmi typing/ident.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/predef.cmi + typing/btype.cmi parsing/asttypes.cmi typing/predef.cmi typing/predef.cmx: typing/types.cmx typing/path.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/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/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 typing/ident.cmi typing/env.cmi typing/ctype.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - typing/printtyp.cmi + typing/printtyp.cmi typing/printtyp.cmx: typing/types.cmx typing/primitive.cmx 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/ctype.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - typing/printtyp.cmi + typing/printtyp.cmi typing/stypes.cmo: typing/typedtree.cmi typing/printtyp.cmi \ - parsing/location.cmi utils/clflags.cmi typing/annot.cmi typing/stypes.cmi + parsing/location.cmi utils/clflags.cmi typing/annot.cmi typing/stypes.cmi typing/stypes.cmx: typing/typedtree.cmx typing/printtyp.cmx \ - parsing/location.cmx utils/clflags.cmx typing/annot.cmi typing/stypes.cmi + parsing/location.cmx utils/clflags.cmx typing/annot.cmi typing/stypes.cmi typing/subst.cmo: typing/types.cmi utils/tbl.cmi typing/path.cmi \ - utils/misc.cmi typing/ident.cmi typing/btype.cmi typing/subst.cmi + utils/misc.cmi typing/ident.cmi typing/btype.cmi typing/subst.cmi typing/subst.cmx: typing/types.cmx utils/tbl.cmx typing/path.cmx \ - utils/misc.cmx typing/ident.cmx typing/btype.cmx typing/subst.cmi + utils/misc.cmx typing/ident.cmx typing/btype.cmx typing/subst.cmi typing/typeclass.cmo: utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/typedecl.cmi typing/typecore.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 utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/typeclass.cmi + typing/btype.cmi parsing/asttypes.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 \ 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 utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi typing/typeclass.cmi + typing/btype.cmx parsing/asttypes.cmi typing/typeclass.cmi typing/typecore.cmo: utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ - typing/typedtree.cmi typing/stypes.cmi typing/printtyp.cmi \ - typing/primitive.cmi typing/predef.cmi typing/path.cmi \ - parsing/parsetree.cmi typing/parmatch.cmi utils/misc.cmi \ + typing/typedtree.cmi typing/subst.cmi typing/stypes.cmi \ + typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ + typing/path.cmi parsing/parsetree.cmi typing/parmatch.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ typing/env.cmi typing/ctype.cmi utils/clflags.cmi typing/btype.cmi \ - parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi + parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi typing/typecore.cmx: utils/warnings.cmx typing/typetexp.cmx typing/types.cmx \ - typing/typedtree.cmx typing/stypes.cmx typing/printtyp.cmx \ - typing/primitive.cmx typing/predef.cmx typing/path.cmx \ - parsing/parsetree.cmi typing/parmatch.cmx utils/misc.cmx \ + typing/typedtree.cmx typing/subst.cmx typing/stypes.cmx \ + typing/printtyp.cmx typing/primitive.cmx typing/predef.cmx \ + typing/path.cmx parsing/parsetree.cmi typing/parmatch.cmx utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx utils/clflags.cmx typing/btype.cmx \ - parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi + parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi typing/typedecl.cmo: typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/subst.cmi typing/printtyp.cmi \ typing/primitive.cmi typing/predef.cmi typing/path.cmi \ parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi typing/includecore.cmi typing/ident.cmi \ typing/env.cmi typing/ctype.cmi utils/config.cmi utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/typedecl.cmi + typing/btype.cmi parsing/asttypes.cmi typing/typedecl.cmi typing/typedecl.cmx: typing/typetexp.cmx typing/types.cmx \ typing/typedtree.cmx typing/subst.cmx typing/printtyp.cmx \ typing/primitive.cmx typing/predef.cmx typing/path.cmx \ parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ parsing/location.cmx typing/includecore.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx utils/config.cmx utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi typing/typedecl.cmi + typing/btype.cmx parsing/asttypes.cmi typing/typedecl.cmi typing/typedtree.cmo: typing/types.cmi typing/primitive.cmi typing/path.cmi \ utils/misc.cmi parsing/location.cmi typing/ident.cmi typing/env.cmi \ - parsing/asttypes.cmi typing/typedtree.cmi + parsing/asttypes.cmi typing/typedtree.cmi typing/typedtree.cmx: typing/types.cmx typing/primitive.cmx typing/path.cmx \ utils/misc.cmx parsing/location.cmx typing/ident.cmx typing/env.cmx \ - parsing/asttypes.cmi typing/typedtree.cmi -typing/typemod.cmo: typing/types.cmi typing/typedtree.cmi typing/typedecl.cmi \ - typing/typecore.cmi typing/typeclass.cmi typing/subst.cmi \ - typing/stypes.cmi typing/printtyp.cmi typing/path.cmi \ + parsing/asttypes.cmi typing/typedtree.cmi +typing/typemod.cmo: typing/typetexp.cmi typing/types.cmi typing/typedtree.cmi \ + typing/typedecl.cmi typing/typecore.cmi typing/typeclass.cmi \ + typing/subst.cmi typing/stypes.cmi typing/printtyp.cmi typing/path.cmi \ parsing/parsetree.cmi typing/mtype.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/includemod.cmi \ typing/ident.cmi typing/env.cmi typing/ctype.cmi utils/config.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi typing/annot.cmi \ - typing/typemod.cmi -typing/typemod.cmx: typing/types.cmx typing/typedtree.cmx typing/typedecl.cmx \ - typing/typecore.cmx typing/typeclass.cmx typing/subst.cmx \ - typing/stypes.cmx typing/printtyp.cmx typing/path.cmx \ + typing/typemod.cmi +typing/typemod.cmx: typing/typetexp.cmx typing/types.cmx typing/typedtree.cmx \ + typing/typedecl.cmx typing/typecore.cmx typing/typeclass.cmx \ + typing/subst.cmx typing/stypes.cmx typing/printtyp.cmx typing/path.cmx \ parsing/parsetree.cmi typing/mtype.cmx utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx typing/includemod.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi typing/annot.cmi \ - typing/typemod.cmi + typing/typemod.cmi typing/types.cmo: typing/primitive.cmi typing/path.cmi utils/misc.cmi \ - typing/ident.cmi parsing/asttypes.cmi typing/types.cmi + typing/ident.cmi parsing/asttypes.cmi typing/types.cmi typing/types.cmx: typing/primitive.cmx typing/path.cmx utils/misc.cmx \ - typing/ident.cmx parsing/asttypes.cmi typing/types.cmi + typing/ident.cmx parsing/asttypes.cmi typing/types.cmi typing/typetexp.cmo: utils/warnings.cmi typing/types.cmi utils/tbl.cmi \ typing/printtyp.cmi typing/path.cmi parsing/parsetree.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/env.cmi \ - typing/ctype.cmi utils/clflags.cmi typing/btype.cmi typing/typetexp.cmi + typing/ctype.cmi utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ + typing/typetexp.cmi typing/typetexp.cmx: utils/warnings.cmx typing/types.cmx utils/tbl.cmx \ typing/printtyp.cmx typing/path.cmx parsing/parsetree.cmi utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx typing/env.cmx \ - typing/ctype.cmx utils/clflags.cmx typing/btype.cmx typing/typetexp.cmi + typing/ctype.cmx utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ + typing/typetexp.cmi typing/unused_var.cmo: utils/warnings.cmi parsing/parsetree.cmi \ parsing/longident.cmi parsing/location.cmi parsing/asttypes.cmi \ - typing/unused_var.cmi + typing/unused_var.cmi typing/unused_var.cmx: utils/warnings.cmx parsing/parsetree.cmi \ parsing/longident.cmx parsing/location.cmx parsing/asttypes.cmi \ - typing/unused_var.cmi -bytecomp/bytegen.cmi: bytecomp/lambda.cmi bytecomp/instruct.cmi -bytecomp/bytelibrarian.cmi: -bytecomp/bytelink.cmi: bytecomp/symtable.cmi bytecomp/cmo_format.cmi -bytecomp/bytepackager.cmi: typing/ident.cmi -bytecomp/bytesections.cmi: -bytecomp/cmo_format.cmi: bytecomp/lambda.cmi typing/ident.cmi -bytecomp/dll.cmi: -bytecomp/emitcode.cmi: bytecomp/instruct.cmi bytecomp/cmo_format.cmi + typing/unused_var.cmi +bytecomp/bytegen.cmi: bytecomp/lambda.cmi bytecomp/instruct.cmi +bytecomp/bytelibrarian.cmi: +bytecomp/bytelink.cmi: bytecomp/symtable.cmi bytecomp/cmo_format.cmi +bytecomp/bytepackager.cmi: typing/ident.cmi +bytecomp/bytesections.cmi: +bytecomp/cmo_format.cmi: bytecomp/lambda.cmi typing/ident.cmi +bytecomp/dll.cmi: +bytecomp/emitcode.cmi: bytecomp/instruct.cmi bytecomp/cmo_format.cmi bytecomp/instruct.cmi: typing/types.cmi typing/subst.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi + bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/lambda.cmi: typing/types.cmi typing/primitive.cmi typing/path.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi + parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi bytecomp/matching.cmi: typing/typedtree.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi -bytecomp/meta.cmi: -bytecomp/printinstr.cmi: bytecomp/instruct.cmi -bytecomp/printlambda.cmi: bytecomp/lambda.cmi -bytecomp/runtimedef.cmi: -bytecomp/simplif.cmi: bytecomp/lambda.cmi -bytecomp/switch.cmi: -bytecomp/symtable.cmi: typing/ident.cmi bytecomp/cmo_format.cmi + bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi +bytecomp/meta.cmi: +bytecomp/printinstr.cmi: bytecomp/instruct.cmi +bytecomp/printlambda.cmi: bytecomp/lambda.cmi +bytecomp/runtimedef.cmi: +bytecomp/simplif.cmi: bytecomp/lambda.cmi +bytecomp/switch.cmi: +bytecomp/symtable.cmi: typing/ident.cmi bytecomp/cmo_format.cmi bytecomp/translclass.cmi: typing/typedtree.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi + bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi bytecomp/translcore.cmi: typing/types.cmi typing/typedtree.cmi \ typing/primitive.cmi typing/path.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi + bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi bytecomp/translmod.cmi: typing/typedtree.cmi typing/primitive.cmi \ - parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi -bytecomp/translobj.cmi: bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi + parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi +bytecomp/translobj.cmi: bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/typeopt.cmi: typing/typedtree.cmi typing/path.cmi \ - bytecomp/lambda.cmi + bytecomp/lambda.cmi bytecomp/bytegen.cmo: typing/types.cmi bytecomp/switch.cmi typing/subst.cmi \ typing/stypes.cmi typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi \ bytecomp/instruct.cmi typing/ident.cmi utils/config.cmi \ - parsing/asttypes.cmi typing/annot.cmi bytecomp/bytegen.cmi + parsing/asttypes.cmi typing/annot.cmi bytecomp/bytegen.cmi bytecomp/bytegen.cmx: typing/types.cmx bytecomp/switch.cmx typing/subst.cmx \ typing/stypes.cmx typing/primitive.cmx utils/misc.cmx bytecomp/lambda.cmx \ bytecomp/instruct.cmx typing/ident.cmx utils/config.cmx \ - parsing/asttypes.cmi typing/annot.cmi bytecomp/bytegen.cmi + parsing/asttypes.cmi typing/annot.cmi bytecomp/bytegen.cmi bytecomp/bytelibrarian.cmo: utils/misc.cmi utils/config.cmi \ bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytelink.cmi \ - bytecomp/bytelibrarian.cmi + bytecomp/bytelibrarian.cmi bytecomp/bytelibrarian.cmx: utils/misc.cmx utils/config.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytelink.cmx \ - bytecomp/bytelibrarian.cmi + bytecomp/bytelibrarian.cmi bytecomp/bytelink.cmo: bytecomp/symtable.cmi bytecomp/opcodes.cmo \ utils/misc.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.cmi bytecomp/bytelink.cmx: bytecomp/symtable.cmx bytecomp/opcodes.cmx \ utils/misc.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/bytelink.cmi bytecomp/bytepackager.cmo: typing/typemod.cmi bytecomp/translmod.cmi \ typing/subst.cmi typing/path.cmi utils/misc.cmi bytecomp/instruct.cmi \ typing/ident.cmi typing/env.cmi bytecomp/emitcode.cmi utils/config.cmi \ bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytelink.cmi \ - bytecomp/bytegen.cmi bytecomp/bytepackager.cmi + bytecomp/bytegen.cmi bytecomp/bytepackager.cmi bytecomp/bytepackager.cmx: typing/typemod.cmx bytecomp/translmod.cmx \ typing/subst.cmx typing/path.cmx utils/misc.cmx bytecomp/instruct.cmx \ typing/ident.cmx typing/env.cmx bytecomp/emitcode.cmx utils/config.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytelink.cmx \ - bytecomp/bytegen.cmx bytecomp/bytepackager.cmi -bytecomp/bytesections.cmo: utils/config.cmi bytecomp/bytesections.cmi -bytecomp/bytesections.cmx: utils/config.cmx bytecomp/bytesections.cmi -bytecomp/dll.cmo: utils/misc.cmi utils/config.cmi bytecomp/dll.cmi -bytecomp/dll.cmx: utils/misc.cmx utils/config.cmx bytecomp/dll.cmi + bytecomp/bytegen.cmx bytecomp/bytepackager.cmi +bytecomp/bytesections.cmo: utils/config.cmi bytecomp/bytesections.cmi +bytecomp/bytesections.cmx: utils/config.cmx bytecomp/bytesections.cmi +bytecomp/dll.cmo: utils/misc.cmi utils/config.cmi bytecomp/dll.cmi +bytecomp/dll.cmx: utils/misc.cmx utils/config.cmx bytecomp/dll.cmi bytecomp/emitcode.cmo: bytecomp/translmod.cmi typing/primitive.cmi \ bytecomp/opcodes.cmo utils/misc.cmi bytecomp/meta.cmi bytecomp/lambda.cmi \ bytecomp/instruct.cmi typing/env.cmi utils/config.cmi \ bytecomp/cmo_format.cmi utils/clflags.cmi typing/btype.cmi \ - parsing/asttypes.cmi bytecomp/emitcode.cmi + parsing/asttypes.cmi bytecomp/emitcode.cmi bytecomp/emitcode.cmx: bytecomp/translmod.cmx typing/primitive.cmx \ bytecomp/opcodes.cmx utils/misc.cmx bytecomp/meta.cmx bytecomp/lambda.cmx \ bytecomp/instruct.cmx typing/env.cmx utils/config.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx typing/btype.cmx \ - parsing/asttypes.cmi bytecomp/emitcode.cmi + parsing/asttypes.cmi bytecomp/emitcode.cmi bytecomp/instruct.cmo: typing/types.cmi typing/subst.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/instruct.cmi + bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/instruct.cmi bytecomp/instruct.cmx: typing/types.cmx typing/subst.cmx parsing/location.cmx \ - bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx bytecomp/instruct.cmi + bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx bytecomp/instruct.cmi bytecomp/lambda.cmo: typing/types.cmi typing/primitive.cmi typing/path.cmi \ utils/misc.cmi parsing/location.cmi typing/ident.cmi typing/env.cmi \ - parsing/asttypes.cmi bytecomp/lambda.cmi + parsing/asttypes.cmi bytecomp/lambda.cmi bytecomp/lambda.cmx: typing/types.cmx typing/primitive.cmx typing/path.cmx \ utils/misc.cmx parsing/location.cmx typing/ident.cmx typing/env.cmx \ - parsing/asttypes.cmi bytecomp/lambda.cmi + parsing/asttypes.cmi bytecomp/lambda.cmi bytecomp/matching.cmo: typing/types.cmi bytecomp/typeopt.cmi \ typing/typedtree.cmi bytecomp/switch.cmi bytecomp/printlambda.cmi \ typing/primitive.cmi typing/predef.cmi typing/path.cmi \ typing/parmatch.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - bytecomp/matching.cmi + bytecomp/matching.cmi bytecomp/matching.cmx: typing/types.cmx bytecomp/typeopt.cmx \ typing/typedtree.cmx bytecomp/switch.cmx bytecomp/printlambda.cmx \ typing/primitive.cmx typing/predef.cmx typing/path.cmx \ typing/parmatch.cmx utils/misc.cmx parsing/longident.cmx \ parsing/location.cmx bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - bytecomp/matching.cmi -bytecomp/meta.cmo: bytecomp/meta.cmi -bytecomp/meta.cmx: bytecomp/meta.cmi -bytecomp/opcodes.cmo: -bytecomp/opcodes.cmx: + bytecomp/matching.cmi +bytecomp/meta.cmo: bytecomp/meta.cmi +bytecomp/meta.cmx: bytecomp/meta.cmi +bytecomp/opcodes.cmo: +bytecomp/opcodes.cmx: bytecomp/printinstr.cmo: bytecomp/printlambda.cmi parsing/location.cmi \ bytecomp/lambda.cmi bytecomp/instruct.cmi typing/ident.cmi \ - bytecomp/printinstr.cmi + bytecomp/printinstr.cmi bytecomp/printinstr.cmx: bytecomp/printlambda.cmx parsing/location.cmx \ bytecomp/lambda.cmx bytecomp/instruct.cmx typing/ident.cmx \ - bytecomp/printinstr.cmi + bytecomp/printinstr.cmi bytecomp/printlambda.cmo: typing/types.cmi typing/primitive.cmi \ parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi \ - parsing/asttypes.cmi bytecomp/printlambda.cmi + parsing/asttypes.cmi bytecomp/printlambda.cmi bytecomp/printlambda.cmx: typing/types.cmx typing/primitive.cmx \ parsing/location.cmx bytecomp/lambda.cmx typing/ident.cmx \ - parsing/asttypes.cmi bytecomp/printlambda.cmi -bytecomp/runtimedef.cmo: bytecomp/runtimedef.cmi -bytecomp/runtimedef.cmx: bytecomp/runtimedef.cmi + parsing/asttypes.cmi bytecomp/printlambda.cmi +bytecomp/runtimedef.cmo: bytecomp/runtimedef.cmi +bytecomp/runtimedef.cmx: bytecomp/runtimedef.cmi bytecomp/simplif.cmo: bytecomp/lambda.cmi typing/ident.cmi utils/clflags.cmi \ - parsing/asttypes.cmi bytecomp/simplif.cmi + parsing/asttypes.cmi bytecomp/simplif.cmi bytecomp/simplif.cmx: bytecomp/lambda.cmx typing/ident.cmx utils/clflags.cmx \ - parsing/asttypes.cmi bytecomp/simplif.cmi -bytecomp/switch.cmo: bytecomp/switch.cmi -bytecomp/switch.cmx: bytecomp/switch.cmi + parsing/asttypes.cmi bytecomp/simplif.cmi +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 bytecomp/lambda.cmi \ typing/ident.cmi bytecomp/dll.cmi bytecomp/cmo_format.cmi \ utils/clflags.cmi bytecomp/bytesections.cmi parsing/asttypes.cmi \ - bytecomp/symtable.cmi + bytecomp/symtable.cmi bytecomp/symtable.cmx: utils/tbl.cmx bytecomp/runtimedef.cmx \ typing/predef.cmx utils/misc.cmx bytecomp/meta.cmx bytecomp/lambda.cmx \ typing/ident.cmx bytecomp/dll.cmx bytecomp/cmo_format.cmi \ utils/clflags.cmx bytecomp/bytesections.cmx parsing/asttypes.cmi \ - bytecomp/symtable.cmi + bytecomp/symtable.cmi bytecomp/translclass.cmo: typing/types.cmi bytecomp/typeopt.cmi \ typing/typedtree.cmi bytecomp/translobj.cmi bytecomp/translcore.cmi \ typing/path.cmi utils/misc.cmi bytecomp/matching.cmi parsing/location.cmi \ bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi bytecomp/translclass.cmi + typing/btype.cmi parsing/asttypes.cmi bytecomp/translclass.cmi bytecomp/translclass.cmx: typing/types.cmx bytecomp/typeopt.cmx \ typing/typedtree.cmx bytecomp/translobj.cmx bytecomp/translcore.cmx \ typing/path.cmx utils/misc.cmx bytecomp/matching.cmx parsing/location.cmx \ bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi bytecomp/translclass.cmi + typing/btype.cmx parsing/asttypes.cmi bytecomp/translclass.cmi bytecomp/translcore.cmo: typing/types.cmi bytecomp/typeopt.cmi \ typing/typedtree.cmi bytecomp/translobj.cmi typing/primitive.cmi \ typing/predef.cmi typing/path.cmi typing/parmatch.cmi utils/misc.cmi \ bytecomp/matching.cmi parsing/location.cmi bytecomp/lambda.cmi \ typing/ident.cmi typing/env.cmi utils/config.cmi utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi bytecomp/translcore.cmi + typing/btype.cmi parsing/asttypes.cmi bytecomp/translcore.cmi bytecomp/translcore.cmx: typing/types.cmx bytecomp/typeopt.cmx \ typing/typedtree.cmx bytecomp/translobj.cmx typing/primitive.cmx \ typing/predef.cmx typing/path.cmx typing/parmatch.cmx utils/misc.cmx \ bytecomp/matching.cmx parsing/location.cmx bytecomp/lambda.cmx \ typing/ident.cmx typing/env.cmx utils/config.cmx utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi bytecomp/translcore.cmi + typing/btype.cmx parsing/asttypes.cmi bytecomp/translcore.cmi bytecomp/translmod.cmo: typing/types.cmi typing/typedtree.cmi \ bytecomp/translobj.cmi bytecomp/translcore.cmi bytecomp/translclass.cmi \ typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ typing/path.cmi typing/mtype.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi \ - typing/ctype.cmi parsing/asttypes.cmi bytecomp/translmod.cmi + typing/ctype.cmi parsing/asttypes.cmi bytecomp/translmod.cmi bytecomp/translmod.cmx: typing/types.cmx typing/typedtree.cmx \ bytecomp/translobj.cmx bytecomp/translcore.cmx bytecomp/translclass.cmx \ typing/printtyp.cmx typing/primitive.cmx typing/predef.cmx \ typing/path.cmx typing/mtype.cmx utils/misc.cmx parsing/longident.cmx \ parsing/location.cmx bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx \ - typing/ctype.cmx parsing/asttypes.cmi bytecomp/translmod.cmi + typing/ctype.cmx parsing/asttypes.cmi bytecomp/translmod.cmi bytecomp/translobj.cmo: typing/primitive.cmi utils/misc.cmi \ parsing/longident.cmi bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - bytecomp/translobj.cmi + bytecomp/translobj.cmi bytecomp/translobj.cmx: typing/primitive.cmx utils/misc.cmx \ parsing/longident.cmx bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - bytecomp/translobj.cmi + bytecomp/translobj.cmi bytecomp/typeopt.cmo: typing/types.cmi typing/typedtree.cmi \ typing/primitive.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ - parsing/asttypes.cmi bytecomp/typeopt.cmi + parsing/asttypes.cmi bytecomp/typeopt.cmi bytecomp/typeopt.cmx: typing/types.cmx typing/typedtree.cmx \ typing/primitive.cmx typing/predef.cmx typing/path.cmx utils/misc.cmx \ bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ - parsing/asttypes.cmi bytecomp/typeopt.cmi -asmcomp/asmgen.cmi: bytecomp/lambda.cmi asmcomp/cmm.cmi -asmcomp/asmlibrarian.cmi: -asmcomp/asmlink.cmi: asmcomp/compilenv.cmi -asmcomp/asmpackager.cmi: + parsing/asttypes.cmi bytecomp/typeopt.cmi +asmcomp/asmgen.cmi: bytecomp/lambda.cmi asmcomp/cmm.cmi +asmcomp/asmlibrarian.cmi: +asmcomp/asmlink.cmi: asmcomp/compilenv.cmi +asmcomp/asmpackager.cmi: asmcomp/clambda.cmi: bytecomp/lambda.cmi typing/ident.cmi \ - asmcomp/debuginfo.cmi parsing/asttypes.cmi -asmcomp/closure.cmi: bytecomp/lambda.cmi asmcomp/clambda.cmi -asmcomp/cmm.cmi: typing/ident.cmi asmcomp/debuginfo.cmi -asmcomp/cmmgen.cmi: asmcomp/compilenv.cmi asmcomp/cmm.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/clambda.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/interf.cmi: asmcomp/mach.cmi -asmcomp/linearize.cmi: asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/debuginfo.cmi -asmcomp/liveness.cmi: asmcomp/mach.cmi + asmcomp/debuginfo.cmi parsing/asttypes.cmi +asmcomp/closure.cmi: bytecomp/lambda.cmi asmcomp/clambda.cmi +asmcomp/cmm.cmi: typing/ident.cmi asmcomp/debuginfo.cmi +asmcomp/cmmgen.cmi: asmcomp/compilenv.cmi asmcomp/cmm.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/clambda.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/interf.cmi: asmcomp/mach.cmi +asmcomp/linearize.cmi: asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/debuginfo.cmi +asmcomp/liveness.cmi: asmcomp/mach.cmi asmcomp/mach.cmi: asmcomp/reg.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/arch.cmo -asmcomp/printcmm.cmi: asmcomp/cmm.cmi -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: asmcomp/cmm.cmi -asmcomp/reload.cmi: asmcomp/mach.cmi -asmcomp/reloadgen.cmi: asmcomp/reg.cmi asmcomp/mach.cmi -asmcomp/schedgen.cmi: asmcomp/mach.cmi asmcomp/linearize.cmi -asmcomp/scheduling.cmi: asmcomp/linearize.cmi + asmcomp/arch.cmo +asmcomp/printcmm.cmi: asmcomp/cmm.cmi +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: asmcomp/cmm.cmi +asmcomp/reload.cmi: asmcomp/mach.cmi +asmcomp/reloadgen.cmi: asmcomp/reg.cmi asmcomp/mach.cmi +asmcomp/schedgen.cmi: asmcomp/mach.cmi asmcomp/linearize.cmi +asmcomp/scheduling.cmi: asmcomp/linearize.cmi asmcomp/selectgen.cmi: utils/tbl.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ - typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/arch.cmo -asmcomp/selection.cmi: asmcomp/mach.cmi asmcomp/cmm.cmi -asmcomp/spill.cmi: asmcomp/mach.cmi -asmcomp/split.cmi: asmcomp/mach.cmi -asmcomp/arch.cmo: utils/misc.cmi utils/config.cmi -asmcomp/arch.cmx: utils/misc.cmx utils/config.cmx + typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/arch.cmo +asmcomp/selection.cmi: asmcomp/mach.cmi asmcomp/cmm.cmi +asmcomp/spill.cmi: asmcomp/mach.cmi +asmcomp/split.cmi: asmcomp/mach.cmi +asmcomp/arch.cmo: +asmcomp/arch.cmx: asmcomp/asmgen.cmo: bytecomp/translmod.cmi asmcomp/split.cmi \ asmcomp/spill.cmi asmcomp/selection.cmi asmcomp/scheduling.cmi \ asmcomp/reload.cmi asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/printmach.cmi \ @@ -513,7 +515,7 @@ asmcomp/asmgen.cmo: bytecomp/translmod.cmi asmcomp/split.cmi \ asmcomp/linearize.cmi asmcomp/interf.cmi asmcomp/emitaux.cmi \ asmcomp/emit.cmi utils/config.cmi asmcomp/compilenv.cmi \ asmcomp/comballoc.cmi asmcomp/coloring.cmi asmcomp/cmmgen.cmi \ - asmcomp/cmm.cmi asmcomp/closure.cmi utils/clflags.cmi asmcomp/asmgen.cmi + asmcomp/cmm.cmi asmcomp/closure.cmi utils/clflags.cmi asmcomp/asmgen.cmi asmcomp/asmgen.cmx: bytecomp/translmod.cmx asmcomp/split.cmx \ asmcomp/spill.cmx asmcomp/selection.cmx asmcomp/scheduling.cmx \ asmcomp/reload.cmx asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/printmach.cmx \ @@ -522,235 +524,233 @@ asmcomp/asmgen.cmx: bytecomp/translmod.cmx asmcomp/split.cmx \ asmcomp/linearize.cmx asmcomp/interf.cmx asmcomp/emitaux.cmx \ asmcomp/emit.cmx utils/config.cmx asmcomp/compilenv.cmx \ asmcomp/comballoc.cmx asmcomp/coloring.cmx asmcomp/cmmgen.cmx \ - asmcomp/cmm.cmx asmcomp/closure.cmx utils/clflags.cmx asmcomp/asmgen.cmi + asmcomp/cmm.cmx asmcomp/closure.cmx utils/clflags.cmx asmcomp/asmgen.cmi asmcomp/asmlibrarian.cmo: utils/misc.cmi utils/config.cmi \ asmcomp/compilenv.cmi utils/clflags.cmi asmcomp/clambda.cmi \ - utils/ccomp.cmi asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi + utils/ccomp.cmi asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi asmcomp/asmlibrarian.cmx: utils/misc.cmx utils/config.cmx \ asmcomp/compilenv.cmx utils/clflags.cmx asmcomp/clambda.cmx \ - utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmi + utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmi asmcomp/asmlink.cmo: bytecomp/runtimedef.cmi asmcomp/proc.cmi utils/misc.cmi \ parsing/location.cmi asmcomp/emitaux.cmi asmcomp/emit.cmi \ utils/consistbl.cmi utils/config.cmi asmcomp/compilenv.cmi \ asmcomp/cmmgen.cmi utils/clflags.cmi utils/ccomp.cmi asmcomp/asmgen.cmi \ - asmcomp/asmlink.cmi + asmcomp/asmlink.cmi asmcomp/asmlink.cmx: bytecomp/runtimedef.cmx asmcomp/proc.cmx utils/misc.cmx \ parsing/location.cmx asmcomp/emitaux.cmx asmcomp/emit.cmx \ utils/consistbl.cmx utils/config.cmx asmcomp/compilenv.cmx \ asmcomp/cmmgen.cmx utils/clflags.cmx utils/ccomp.cmx asmcomp/asmgen.cmx \ - asmcomp/asmlink.cmi + asmcomp/asmlink.cmi asmcomp/asmpackager.cmo: typing/typemod.cmi bytecomp/translmod.cmi \ utils/misc.cmi parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi \ typing/env.cmi utils/config.cmi asmcomp/compilenv.cmi utils/clflags.cmi \ asmcomp/clambda.cmi utils/ccomp.cmi asmcomp/asmlink.cmi \ - asmcomp/asmgen.cmi asmcomp/asmpackager.cmi + asmcomp/asmgen.cmi asmcomp/asmpackager.cmi asmcomp/asmpackager.cmx: typing/typemod.cmx bytecomp/translmod.cmx \ utils/misc.cmx parsing/location.cmx bytecomp/lambda.cmx typing/ident.cmx \ typing/env.cmx utils/config.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ asmcomp/clambda.cmx utils/ccomp.cmx asmcomp/asmlink.cmx \ - asmcomp/asmgen.cmx asmcomp/asmpackager.cmi + asmcomp/asmgen.cmx asmcomp/asmpackager.cmi asmcomp/clambda.cmo: bytecomp/lambda.cmi typing/ident.cmi \ - asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/clambda.cmi + asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/clambda.cmi asmcomp/clambda.cmx: bytecomp/lambda.cmx typing/ident.cmx \ - asmcomp/debuginfo.cmx parsing/asttypes.cmi asmcomp/clambda.cmi + asmcomp/debuginfo.cmx parsing/asttypes.cmi asmcomp/clambda.cmi asmcomp/closure.cmo: utils/tbl.cmi bytecomp/switch.cmi typing/primitive.cmi \ utils/misc.cmi bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ asmcomp/compilenv.cmi utils/clflags.cmi asmcomp/clambda.cmi \ - parsing/asttypes.cmi asmcomp/closure.cmi + parsing/asttypes.cmi asmcomp/closure.cmi asmcomp/closure.cmx: utils/tbl.cmx bytecomp/switch.cmx typing/primitive.cmx \ utils/misc.cmx bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ asmcomp/compilenv.cmx utils/clflags.cmx asmcomp/clambda.cmx \ - parsing/asttypes.cmi asmcomp/closure.cmi + parsing/asttypes.cmi asmcomp/closure.cmi asmcomp/cmm.cmo: typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/arch.cmo \ - asmcomp/cmm.cmi + asmcomp/cmm.cmi asmcomp/cmm.cmx: typing/ident.cmx asmcomp/debuginfo.cmx asmcomp/arch.cmx \ - asmcomp/cmm.cmi + asmcomp/cmm.cmi asmcomp/cmmgen.cmo: typing/types.cmi bytecomp/switch.cmi asmcomp/proc.cmi \ typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi utils/config.cmi asmcomp/compilenv.cmi \ asmcomp/cmm.cmi utils/clflags.cmi asmcomp/clambda.cmi \ - parsing/asttypes.cmi asmcomp/arch.cmo asmcomp/cmmgen.cmi + parsing/asttypes.cmi asmcomp/arch.cmo asmcomp/cmmgen.cmi asmcomp/cmmgen.cmx: typing/types.cmx bytecomp/switch.cmx asmcomp/proc.cmx \ typing/primitive.cmx utils/misc.cmx bytecomp/lambda.cmx typing/ident.cmx \ asmcomp/debuginfo.cmx utils/config.cmx asmcomp/compilenv.cmx \ asmcomp/cmm.cmx utils/clflags.cmx asmcomp/clambda.cmx \ - parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/cmmgen.cmi + parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/cmmgen.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 \ asmcomp/interf.cmi asmcomp/emit.cmi asmcomp/coloring.cmi asmcomp/cmm.cmi \ - asmcomp/codegen.cmi + asmcomp/codegen.cmi asmcomp/codegen.cmx: asmcomp/split.cmx asmcomp/spill.cmx asmcomp/reload.cmx \ asmcomp/reg.cmx asmcomp/printmach.cmx asmcomp/printlinear.cmx \ asmcomp/printcmm.cmx asmcomp/liveness.cmx asmcomp/linearize.cmx \ asmcomp/interf.cmx asmcomp/emit.cmx asmcomp/coloring.cmx asmcomp/cmm.cmx \ - asmcomp/codegen.cmi -asmcomp/coloring.cmo: asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/coloring.cmi -asmcomp/coloring.cmx: asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/coloring.cmi + asmcomp/codegen.cmi +asmcomp/coloring.cmo: asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/coloring.cmi +asmcomp/coloring.cmx: asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/coloring.cmi asmcomp/comballoc.cmo: asmcomp/reg.cmi asmcomp/mach.cmi utils/config.cmi \ - asmcomp/comballoc.cmi + asmcomp/comballoc.cmi asmcomp/comballoc.cmx: asmcomp/reg.cmx asmcomp/mach.cmx utils/config.cmx \ - asmcomp/comballoc.cmi + asmcomp/comballoc.cmi asmcomp/compilenv.cmo: utils/misc.cmi typing/ident.cmi typing/env.cmi \ - utils/config.cmi asmcomp/clambda.cmi asmcomp/compilenv.cmi + utils/config.cmi asmcomp/clambda.cmi asmcomp/compilenv.cmi asmcomp/compilenv.cmx: utils/misc.cmx typing/ident.cmx typing/env.cmx \ - utils/config.cmx asmcomp/clambda.cmx asmcomp/compilenv.cmi + utils/config.cmx asmcomp/clambda.cmx asmcomp/compilenv.cmi asmcomp/debuginfo.cmo: parsing/location.cmi bytecomp/lambda.cmi \ - asmcomp/debuginfo.cmi + asmcomp/debuginfo.cmi asmcomp/debuginfo.cmx: parsing/location.cmx bytecomp/lambda.cmx \ - asmcomp/debuginfo.cmi + asmcomp/debuginfo.cmi asmcomp/emit.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ - asmcomp/mach.cmi parsing/location.cmi asmcomp/linearize.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/mach.cmi asmcomp/linearize.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/emit.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ - asmcomp/mach.cmx parsing/location.cmx asmcomp/linearize.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/mach.cmx asmcomp/linearize.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/reg.cmi asmcomp/linearize.cmi \ asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ - asmcomp/emitaux.cmi + asmcomp/emitaux.cmi asmcomp/emitaux.cmx: asmcomp/reg.cmx asmcomp/linearize.cmx \ asmcomp/debuginfo.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ - asmcomp/emitaux.cmi + asmcomp/emitaux.cmi asmcomp/interf.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ - asmcomp/mach.cmi asmcomp/interf.cmi + asmcomp/mach.cmi asmcomp/interf.cmi asmcomp/interf.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ - asmcomp/mach.cmx asmcomp/interf.cmi + asmcomp/mach.cmx asmcomp/interf.cmi asmcomp/linearize.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/linearize.cmi + asmcomp/linearize.cmi asmcomp/linearize.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ asmcomp/mach.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx \ - asmcomp/linearize.cmi + asmcomp/linearize.cmi asmcomp/liveness.cmo: asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/printmach.cmi \ - utils/misc.cmi asmcomp/mach.cmi asmcomp/liveness.cmi + utils/misc.cmi asmcomp/mach.cmi asmcomp/liveness.cmi asmcomp/liveness.cmx: asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/printmach.cmx \ - utils/misc.cmx asmcomp/mach.cmx asmcomp/liveness.cmi + utils/misc.cmx asmcomp/mach.cmx asmcomp/liveness.cmi asmcomp/mach.cmo: asmcomp/reg.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/arch.cmo asmcomp/mach.cmi + asmcomp/arch.cmo asmcomp/mach.cmi asmcomp/mach.cmx: asmcomp/reg.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx \ - asmcomp/arch.cmx asmcomp/mach.cmi + asmcomp/arch.cmx asmcomp/mach.cmi asmcomp/printcmm.cmo: typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/printcmm.cmi + asmcomp/printcmm.cmi asmcomp/printcmm.cmx: typing/ident.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx \ - asmcomp/printcmm.cmi + asmcomp/printcmm.cmi asmcomp/printlinear.cmo: asmcomp/printmach.cmi asmcomp/mach.cmi \ - asmcomp/linearize.cmi asmcomp/debuginfo.cmi asmcomp/printlinear.cmi + asmcomp/linearize.cmi asmcomp/debuginfo.cmi asmcomp/printlinear.cmi asmcomp/printlinear.cmx: asmcomp/printmach.cmx asmcomp/mach.cmx \ - asmcomp/linearize.cmx asmcomp/debuginfo.cmx asmcomp/printlinear.cmi + asmcomp/linearize.cmx asmcomp/debuginfo.cmx asmcomp/printlinear.cmi asmcomp/printmach.cmo: asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/printcmm.cmi \ asmcomp/mach.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ - asmcomp/printmach.cmi + asmcomp/printmach.cmi asmcomp/printmach.cmx: asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/printcmm.cmx \ asmcomp/mach.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ - asmcomp/printmach.cmi + asmcomp/printmach.cmi asmcomp/proc.cmo: asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ - utils/config.cmi asmcomp/cmm.cmi utils/clflags.cmi utils/ccomp.cmi \ - asmcomp/arch.cmo asmcomp/proc.cmi + utils/config.cmi asmcomp/cmm.cmi utils/ccomp.cmi asmcomp/arch.cmo \ + asmcomp/proc.cmi asmcomp/proc.cmx: asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ - utils/config.cmx asmcomp/cmm.cmx utils/clflags.cmx utils/ccomp.cmx \ - asmcomp/arch.cmx asmcomp/proc.cmi -asmcomp/reg.cmo: asmcomp/cmm.cmi asmcomp/reg.cmi -asmcomp/reg.cmx: asmcomp/cmm.cmx asmcomp/reg.cmi + utils/config.cmx asmcomp/cmm.cmx utils/ccomp.cmx asmcomp/arch.cmx \ + asmcomp/proc.cmi +asmcomp/reg.cmo: asmcomp/cmm.cmi asmcomp/reg.cmi +asmcomp/reg.cmx: asmcomp/cmm.cmx asmcomp/reg.cmi asmcomp/reload.cmo: asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ - asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/reload.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 asmcomp/arch.cmx asmcomp/reload.cmi + 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.cmi asmcomp/reloadgen.cmx: asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ - asmcomp/reloadgen.cmi + asmcomp/reloadgen.cmi asmcomp/schedgen.cmo: asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ - asmcomp/schedgen.cmi + asmcomp/schedgen.cmi asmcomp/schedgen.cmx: asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/linearize.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ - asmcomp/schedgen.cmi -asmcomp/scheduling.cmo: asmcomp/schedgen.cmi asmcomp/scheduling.cmi -asmcomp/scheduling.cmx: asmcomp/schedgen.cmx asmcomp/scheduling.cmi + asmcomp/schedgen.cmi +asmcomp/scheduling.cmo: asmcomp/schedgen.cmi asmcomp/scheduling.cmi +asmcomp/scheduling.cmx: asmcomp/schedgen.cmx asmcomp/scheduling.cmi asmcomp/selectgen.cmo: utils/tbl.cmi asmcomp/reg.cmi asmcomp/proc.cmi \ utils/misc.cmi asmcomp/mach.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ - asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/selectgen.cmi + asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/selectgen.cmi asmcomp/selectgen.cmx: utils/tbl.cmx asmcomp/reg.cmx asmcomp/proc.cmx \ utils/misc.cmx asmcomp/mach.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ - asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/selectgen.cmi + asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/selectgen.cmi asmcomp/selection.cmo: asmcomp/selectgen.cmi asmcomp/reg.cmi asmcomp/proc.cmi \ utils/misc.cmi asmcomp/mach.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/arch.cmo asmcomp/selection.cmi + utils/clflags.cmi asmcomp/arch.cmo asmcomp/selection.cmi asmcomp/selection.cmx: asmcomp/selectgen.cmx asmcomp/reg.cmx asmcomp/proc.cmx \ utils/misc.cmx asmcomp/mach.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx \ - asmcomp/arch.cmx asmcomp/selection.cmi + utils/clflags.cmx asmcomp/arch.cmx asmcomp/selection.cmi asmcomp/spill.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ - asmcomp/mach.cmi asmcomp/spill.cmi + asmcomp/mach.cmi asmcomp/spill.cmi asmcomp/spill.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ - asmcomp/mach.cmx asmcomp/spill.cmi + asmcomp/mach.cmx asmcomp/spill.cmi asmcomp/split.cmo: asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ - asmcomp/split.cmi + asmcomp/split.cmi asmcomp/split.cmx: asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ - asmcomp/split.cmi -driver/compile.cmi: typing/env.cmi -driver/errors.cmi: -driver/main.cmi: -driver/main_args.cmi: -driver/optcompile.cmi: typing/env.cmi -driver/opterrors.cmi: -driver/optmain.cmi: -driver/pparse.cmi: + asmcomp/split.cmi +driver/compile.cmi: typing/env.cmi +driver/errors.cmi: +driver/main.cmi: +driver/main_args.cmi: +driver/optcompile.cmi: typing/env.cmi +driver/opterrors.cmi: +driver/optmain.cmi: +driver/pparse.cmi: driver/compile.cmo: utils/warnings.cmi typing/unused_var.cmi \ typing/typemod.cmi typing/typedtree.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyp.cmi \ bytecomp/printlambda.cmi bytecomp/printinstr.cmi parsing/printast.cmi \ driver/pparse.cmi parsing/parse.cmi utils/misc.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi bytecomp/emitcode.cmi utils/config.cmi \ - utils/clflags.cmi utils/ccomp.cmi bytecomp/bytegen.cmi driver/compile.cmi + utils/clflags.cmi utils/ccomp.cmi bytecomp/bytegen.cmi driver/compile.cmi driver/compile.cmx: utils/warnings.cmx typing/unused_var.cmx \ typing/typemod.cmx typing/typedtree.cmx bytecomp/translmod.cmx \ typing/stypes.cmx bytecomp/simplif.cmx typing/printtyp.cmx \ bytecomp/printlambda.cmx bytecomp/printinstr.cmx parsing/printast.cmx \ driver/pparse.cmx parsing/parse.cmx utils/misc.cmx parsing/location.cmx \ typing/ident.cmx typing/env.cmx bytecomp/emitcode.cmx utils/config.cmx \ - utils/clflags.cmx utils/ccomp.cmx bytecomp/bytegen.cmx driver/compile.cmi + utils/clflags.cmx utils/ccomp.cmx bytecomp/bytegen.cmx driver/compile.cmi driver/errors.cmo: utils/warnings.cmi typing/typetexp.cmi typing/typemod.cmi \ typing/typedecl.cmi typing/typecore.cmi typing/typeclass.cmi \ bytecomp/translmod.cmi bytecomp/translcore.cmi bytecomp/translclass.cmi \ parsing/syntaxerr.cmi bytecomp/symtable.cmi driver/pparse.cmi \ parsing/location.cmi parsing/lexer.cmi typing/includemod.cmi \ typing/env.cmi typing/ctype.cmi bytecomp/bytepackager.cmi \ - bytecomp/bytelink.cmi bytecomp/bytelibrarian.cmi driver/errors.cmi + bytecomp/bytelink.cmi bytecomp/bytelibrarian.cmi driver/errors.cmi driver/errors.cmx: utils/warnings.cmx typing/typetexp.cmx typing/typemod.cmx \ typing/typedecl.cmx typing/typecore.cmx typing/typeclass.cmx \ bytecomp/translmod.cmx bytecomp/translcore.cmx bytecomp/translclass.cmx \ parsing/syntaxerr.cmx bytecomp/symtable.cmx driver/pparse.cmx \ parsing/location.cmx parsing/lexer.cmx typing/includemod.cmx \ typing/env.cmx typing/ctype.cmx bytecomp/bytepackager.cmx \ - bytecomp/bytelink.cmx bytecomp/bytelibrarian.cmx driver/errors.cmi + bytecomp/bytelink.cmx bytecomp/bytelibrarian.cmx driver/errors.cmi driver/main.cmo: utils/warnings.cmi utils/misc.cmi driver/main_args.cmi \ driver/errors.cmi utils/config.cmi driver/compile.cmi utils/clflags.cmi \ bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ - bytecomp/bytelibrarian.cmi driver/main.cmi + bytecomp/bytelibrarian.cmi driver/main.cmi driver/main.cmx: utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ driver/errors.cmx utils/config.cmx driver/compile.cmx utils/clflags.cmx \ bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ - bytecomp/bytelibrarian.cmx driver/main.cmi -driver/main_args.cmo: driver/main_args.cmi -driver/main_args.cmx: driver/main_args.cmi + bytecomp/bytelibrarian.cmx driver/main.cmi +driver/main_args.cmo: driver/main_args.cmi +driver/main_args.cmx: driver/main_args.cmi driver/optcompile.cmo: utils/warnings.cmi typing/unused_var.cmi \ typing/typemod.cmi typing/typedtree.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyp.cmi \ bytecomp/printlambda.cmi parsing/printast.cmi driver/pparse.cmi \ parsing/parse.cmi utils/misc.cmi parsing/location.cmi typing/ident.cmi \ typing/env.cmi utils/config.cmi asmcomp/compilenv.cmi utils/clflags.cmi \ - utils/ccomp.cmi asmcomp/asmgen.cmi driver/optcompile.cmi + utils/ccomp.cmi asmcomp/asmgen.cmi driver/optcompile.cmi driver/optcompile.cmx: utils/warnings.cmx typing/unused_var.cmx \ typing/typemod.cmx typing/typedtree.cmx bytecomp/translmod.cmx \ typing/stypes.cmx bytecomp/simplif.cmx typing/printtyp.cmx \ bytecomp/printlambda.cmx parsing/printast.cmx driver/pparse.cmx \ parsing/parse.cmx utils/misc.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx utils/config.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ - utils/ccomp.cmx asmcomp/asmgen.cmx driver/optcompile.cmi + utils/ccomp.cmx asmcomp/asmgen.cmx driver/optcompile.cmi driver/opterrors.cmo: utils/warnings.cmi typing/typetexp.cmi \ typing/typemod.cmi typing/typedecl.cmi typing/typecore.cmi \ typing/typeclass.cmi bytecomp/translmod.cmi bytecomp/translcore.cmi \ @@ -758,7 +758,7 @@ driver/opterrors.cmo: utils/warnings.cmi typing/typetexp.cmi \ parsing/location.cmi parsing/lexer.cmi typing/includemod.cmi \ typing/env.cmi typing/ctype.cmi asmcomp/compilenv.cmi \ asmcomp/asmpackager.cmi asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi \ - asmcomp/asmgen.cmi driver/opterrors.cmi + asmcomp/asmgen.cmi driver/opterrors.cmi driver/opterrors.cmx: utils/warnings.cmx typing/typetexp.cmx \ typing/typemod.cmx typing/typedecl.cmx typing/typecore.cmx \ typing/typeclass.cmx bytecomp/translmod.cmx bytecomp/translcore.cmx \ @@ -766,57 +766,57 @@ driver/opterrors.cmx: utils/warnings.cmx typing/typetexp.cmx \ parsing/location.cmx parsing/lexer.cmx typing/includemod.cmx \ typing/env.cmx typing/ctype.cmx asmcomp/compilenv.cmx \ asmcomp/asmpackager.cmx asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmx \ - asmcomp/asmgen.cmx driver/opterrors.cmi + asmcomp/asmgen.cmx driver/opterrors.cmi driver/optmain.cmo: utils/warnings.cmi asmcomp/printmach.cmi \ driver/opterrors.cmi driver/optcompile.cmi utils/misc.cmi \ - utils/config.cmi utils/clflags.cmi asmcomp/asmpackager.cmi \ - asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi asmcomp/arch.cmo \ - driver/optmain.cmi + driver/main_args.cmi utils/config.cmi utils/clflags.cmi \ + asmcomp/asmpackager.cmi asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi \ + asmcomp/arch.cmo driver/optmain.cmi driver/optmain.cmx: utils/warnings.cmx asmcomp/printmach.cmx \ driver/opterrors.cmx driver/optcompile.cmx utils/misc.cmx \ - utils/config.cmx utils/clflags.cmx asmcomp/asmpackager.cmx \ - asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmx asmcomp/arch.cmx \ - driver/optmain.cmi + driver/main_args.cmx utils/config.cmx utils/clflags.cmx \ + asmcomp/asmpackager.cmx asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmx \ + asmcomp/arch.cmx driver/optmain.cmi driver/pparse.cmo: utils/misc.cmi parsing/location.cmi utils/clflags.cmi \ - utils/ccomp.cmi driver/pparse.cmi + utils/ccomp.cmi driver/pparse.cmi driver/pparse.cmx: utils/misc.cmx parsing/location.cmx utils/clflags.cmx \ - utils/ccomp.cmx driver/pparse.cmi + utils/ccomp.cmx driver/pparse.cmi toplevel/genprintval.cmi: typing/types.cmi typing/path.cmi \ - typing/outcometree.cmi typing/env.cmi -toplevel/opttopdirs.cmi: parsing/longident.cmi + typing/outcometree.cmi typing/env.cmi +toplevel/opttopdirs.cmi: parsing/longident.cmi toplevel/opttoploop.cmi: utils/warnings.cmi typing/types.cmi typing/path.cmi \ parsing/parsetree.cmi typing/outcometree.cmi parsing/longident.cmi \ - parsing/location.cmi typing/env.cmi -toplevel/opttopmain.cmi: -toplevel/topdirs.cmi: parsing/longident.cmi + parsing/location.cmi typing/env.cmi +toplevel/opttopmain.cmi: +toplevel/topdirs.cmi: parsing/longident.cmi toplevel/toploop.cmi: utils/warnings.cmi typing/types.cmi typing/path.cmi \ parsing/parsetree.cmi typing/outcometree.cmi parsing/longident.cmi \ - parsing/location.cmi typing/env.cmi -toplevel/topmain.cmi: + parsing/location.cmi typing/env.cmi +toplevel/topmain.cmi: toplevel/trace.cmi: typing/types.cmi typing/path.cmi parsing/longident.cmi \ - typing/env.cmi + typing/env.cmi toplevel/expunge.cmo: bytecomp/symtable.cmi bytecomp/runtimedef.cmi \ - utils/misc.cmi typing/ident.cmi bytecomp/bytesections.cmi + utils/misc.cmi typing/ident.cmi bytecomp/bytesections.cmi toplevel/expunge.cmx: bytecomp/symtable.cmx bytecomp/runtimedef.cmx \ - utils/misc.cmx typing/ident.cmx bytecomp/bytesections.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/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/ctype.cmx typing/btype.cmx toplevel/genprintval.cmi toplevel/opttopdirs.cmo: utils/warnings.cmi typing/types.cmi \ typing/printtyp.cmi typing/path.cmi toplevel/opttoploop.cmi \ utils/misc.cmi parsing/longident.cmi typing/ident.cmi typing/env.cmi \ typing/ctype.cmi utils/config.cmi utils/clflags.cmi asmcomp/asmlink.cmi \ - toplevel/opttopdirs.cmi + toplevel/opttopdirs.cmi toplevel/opttopdirs.cmx: utils/warnings.cmx typing/types.cmx \ typing/printtyp.cmx typing/path.cmx toplevel/opttoploop.cmx \ utils/misc.cmx parsing/longident.cmx typing/ident.cmx typing/env.cmx \ typing/ctype.cmx utils/config.cmx utils/clflags.cmx asmcomp/asmlink.cmx \ - toplevel/opttopdirs.cmi + toplevel/opttopdirs.cmi toplevel/opttoploop.cmo: utils/warnings.cmi typing/unused_var.cmi \ typing/types.cmi typing/typemod.cmi typing/typedtree.cmi \ typing/typecore.cmi bytecomp/translmod.cmi bytecomp/simplif.cmi \ @@ -827,7 +827,7 @@ toplevel/opttoploop.cmo: utils/warnings.cmi typing/unused_var.cmi \ parsing/location.cmi parsing/lexer.cmi bytecomp/lambda.cmi \ typing/ident.cmi toplevel/genprintval.cmi typing/env.cmi utils/config.cmi \ asmcomp/compilenv.cmi utils/clflags.cmi typing/btype.cmi \ - asmcomp/asmlink.cmi asmcomp/asmgen.cmi toplevel/opttoploop.cmi + asmcomp/asmlink.cmi asmcomp/asmgen.cmi toplevel/opttoploop.cmi toplevel/opttoploop.cmx: utils/warnings.cmx typing/unused_var.cmx \ typing/types.cmx typing/typemod.cmx typing/typedtree.cmx \ typing/typecore.cmx bytecomp/translmod.cmx bytecomp/simplif.cmx \ @@ -838,29 +838,29 @@ toplevel/opttoploop.cmx: utils/warnings.cmx typing/unused_var.cmx \ parsing/location.cmx parsing/lexer.cmx bytecomp/lambda.cmx \ typing/ident.cmx toplevel/genprintval.cmx typing/env.cmx utils/config.cmx \ asmcomp/compilenv.cmx utils/clflags.cmx typing/btype.cmx \ - asmcomp/asmlink.cmx asmcomp/asmgen.cmx toplevel/opttoploop.cmi + asmcomp/asmlink.cmx asmcomp/asmgen.cmx toplevel/opttoploop.cmi toplevel/opttopmain.cmo: utils/warnings.cmi asmcomp/printmach.cmi \ toplevel/opttoploop.cmi toplevel/opttopdirs.cmi driver/opterrors.cmi \ - utils/misc.cmi utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo \ - toplevel/opttopmain.cmi + utils/misc.cmi driver/main_args.cmi utils/config.cmi utils/clflags.cmi \ + toplevel/opttopmain.cmi toplevel/opttopmain.cmx: utils/warnings.cmx asmcomp/printmach.cmx \ toplevel/opttoploop.cmx toplevel/opttopdirs.cmx driver/opterrors.cmx \ - utils/misc.cmx utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx \ - toplevel/opttopmain.cmi -toplevel/opttopstart.cmo: toplevel/opttopmain.cmi -toplevel/opttopstart.cmx: toplevel/opttopmain.cmx + utils/misc.cmx driver/main_args.cmx utils/config.cmx utils/clflags.cmx \ + toplevel/opttopmain.cmi +toplevel/opttopstart.cmo: toplevel/opttopmain.cmi +toplevel/opttopstart.cmx: toplevel/opttopmain.cmx toplevel/topdirs.cmo: utils/warnings.cmi typing/types.cmi toplevel/trace.cmi \ toplevel/toploop.cmi bytecomp/symtable.cmi typing/printtyp.cmi \ typing/path.cmi bytecomp/opcodes.cmo utils/misc.cmi bytecomp/meta.cmi \ parsing/longident.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 toplevel/topdirs.cmi + bytecomp/cmo_format.cmi utils/clflags.cmi toplevel/topdirs.cmi toplevel/topdirs.cmx: utils/warnings.cmx typing/types.cmx toplevel/trace.cmx \ toplevel/toploop.cmx bytecomp/symtable.cmx typing/printtyp.cmx \ typing/path.cmx bytecomp/opcodes.cmx utils/misc.cmx bytecomp/meta.cmx \ parsing/longident.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 toplevel/topdirs.cmi + bytecomp/cmo_format.cmi utils/clflags.cmx toplevel/topdirs.cmi toplevel/toploop.cmo: utils/warnings.cmi typing/unused_var.cmi \ typing/types.cmi typing/typemod.cmi typing/typedtree.cmi \ typing/typecore.cmi bytecomp/translmod.cmi bytecomp/symtable.cmi \ @@ -872,7 +872,7 @@ toplevel/toploop.cmo: utils/warnings.cmi typing/unused_var.cmi \ typing/ident.cmi toplevel/genprintval.cmi driver/errors.cmi \ typing/env.cmi bytecomp/emitcode.cmi bytecomp/dll.cmi utils/consistbl.cmi \ utils/config.cmi driver/compile.cmi utils/clflags.cmi \ - bytecomp/bytegen.cmi typing/btype.cmi toplevel/toploop.cmi + bytecomp/bytegen.cmi typing/btype.cmi toplevel/toploop.cmi toplevel/toploop.cmx: utils/warnings.cmx typing/unused_var.cmx \ typing/types.cmx typing/typemod.cmx typing/typedtree.cmx \ typing/typecore.cmx bytecomp/translmod.cmx bytecomp/symtable.cmx \ @@ -884,18 +884,18 @@ toplevel/toploop.cmx: utils/warnings.cmx typing/unused_var.cmx \ typing/ident.cmx toplevel/genprintval.cmx driver/errors.cmx \ typing/env.cmx bytecomp/emitcode.cmx bytecomp/dll.cmx utils/consistbl.cmx \ utils/config.cmx driver/compile.cmx utils/clflags.cmx \ - bytecomp/bytegen.cmx typing/btype.cmx toplevel/toploop.cmi + bytecomp/bytegen.cmx typing/btype.cmx toplevel/toploop.cmi toplevel/topmain.cmo: utils/warnings.cmi toplevel/toploop.cmi \ - toplevel/topdirs.cmi utils/misc.cmi driver/errors.cmi utils/config.cmi \ - utils/clflags.cmi toplevel/topmain.cmi + toplevel/topdirs.cmi utils/misc.cmi driver/main_args.cmi \ + driver/errors.cmi utils/config.cmi utils/clflags.cmi toplevel/topmain.cmi toplevel/topmain.cmx: utils/warnings.cmx toplevel/toploop.cmx \ - toplevel/topdirs.cmx utils/misc.cmx driver/errors.cmx utils/config.cmx \ - utils/clflags.cmx toplevel/topmain.cmi -toplevel/topstart.cmo: toplevel/topmain.cmi -toplevel/topstart.cmx: toplevel/topmain.cmx + toplevel/topdirs.cmx utils/misc.cmx driver/main_args.cmx \ + driver/errors.cmx utils/config.cmx utils/clflags.cmx toplevel/topmain.cmi +toplevel/topstart.cmo: toplevel/topmain.cmi +toplevel/topstart.cmx: toplevel/topmain.cmx toplevel/trace.cmo: typing/types.cmi toplevel/toploop.cmi typing/printtyp.cmi \ typing/predef.cmi typing/path.cmi utils/misc.cmi bytecomp/meta.cmi \ - parsing/longident.cmi typing/ctype.cmi toplevel/trace.cmi + parsing/longident.cmi typing/ctype.cmi toplevel/trace.cmi toplevel/trace.cmx: typing/types.cmx toplevel/toploop.cmx typing/printtyp.cmx \ typing/predef.cmx typing/path.cmx utils/misc.cmx bytecomp/meta.cmx \ - parsing/longident.cmx typing/ctype.cmx toplevel/trace.cmi + parsing/longident.cmx typing/ctype.cmx toplevel/trace.cmi diff --git a/Changes b/Changes index 7e81eeeb..76381b29 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,67 @@ +Objective Caml 3.12.0: +---------------------- + +(Changes that can break existing programs are marked with a "*" ) + +Language features: +- Shorthand notation for records: in expressions and patterns, + { lbl } stands for { lbl = lbl } and { M.lbl } for { M.lbl = lbl } +- Record patterns of the form { lbl = pat; _ } to mark that not all + labels are listed, purposefully. (See new warning below.) +- Explicit naming of a generic type; in an expression + "fun ... (type t) ... -> e", the type t is considered abstract in its + scope (the arguments that follow it and the body of the function), + and then replaced by a fresh type variable. In particular, the type + t can be used in contexts where a type variable is not allowed + (e.g. for defining an exception in a local module). +- Explicit polymorphic types and polymorphic recursion. In let + definitions, one can write an explicit polymorphic type just + immediately the function name; the polymorphism will be enforced, + and recursive calls may use the polymorphism. + The syntax is the same as for polymorphic methods: + "let [rec] : 'a1 ... 'an. = ..." +- First-class packages modules. + New kind of type expression, for packaged modules: (module PT). + New kind of expression, to pack a module as a first-class value: + (module MODEXPR : PT). + New kind of module expression, to unpack a first-class value as a module: + (val EXPR : PT). + PT is a package type of the form "S" or + "S with type t1 = ... and ... and type tn = ..." (S refers to a module type). +- Local opening of modules in a subexpression. + Syntax: "let open M in e", or "M.(e)" + +Compilers and toplevel: +- New warning (activated by the warning code 'R') to signal + record patterns without "; _" where some labels of the record type + are not listed in the pattern. +- Better error report in case of unbound qualified identifier: if the module + is unbound this error is reported in the first place. +- Added option '-strict-sequence' to force left hand part of sequence to have + type unit. +- Added option '-no-app-funct' to turn applicative functors off. + This option can help working around mysterious type incompatibilities + caused by the incomplete comparison of applicative paths F(X).t. + +Standard library: +- Format: new function ikfprintf analoguous to ifprintf with a continuation + argument. +* PR#4210, #4245: stricter range checking in string->integer conversion + functions (int_of_string, Int32.of_string, Int64.of_string, + Nativeint.of_string). The decimal string corresponding to + max_int + 1 is no longer accepted. +- Format: to prevent confusion when mixing Format printing functions and + direct low level output, values Format.stdout and Format.stderr have been + added. +- Scanf: to prevent confusion when mixing Scanf scanning functions and direct + low level input, value Scanf.stdin has been added. + +Bug Fixes: +- PR#4775: compiler crash on crazy types (temporary fix) +- PR#5004: problem in Buffer.add_channel with very large lengths. +- PR#5008: on AMD64/MSVC port, rare float corruption during GC. +- PR#5018: wrong exception raised by Dynlink.loadfile. + Objective Caml 3.11.2: ---------------------- @@ -128,7 +192,7 @@ Compilers: are tail calls. - All compiler error messages now include a file name and location, for better interaction with Emacs' compilation mode. -- Optimized compilation of "lazy e" when the argument "e" is +- Optimized compilation of "lazy e" when the argument "e" is already evaluated. - Optimized compilation of equality tests with a variant constant constructor. - The -dllib options recorded in libraries are no longer ignored when @@ -181,7 +245,7 @@ Other libraries: - Dynlink: on some platforms, the Dynlink library is now available in native code. The boolean Dynlink.is_native allows the program to know whether it has been compiled in bytecode or in native code. -- Bigarrays: added "unsafe_get" and "unsafe_set" +- Bigarrays: added "unsafe_get" and "unsafe_set" (non-bound-checking versions of "get" and "set"). - Bigarrays: removed limitation "array dimension < 2^31". - Labltk: added support for TK 8.5. @@ -212,7 +276,7 @@ Bug fixes: out-of-heap pointers. - PR#3915: updated most man pages. - PR#4261: type-checking of recursive modules -- PR#4308: better stack backtraces for "spontaneous" exceptions such as +- PR#4308: better stack backtraces for "spontaneous" exceptions such as Stack_overflow, Out_of_memory, etc. - PR#4338: Str.global_substitute, Str.global_replace and the Str.*split* functions are now tail-recursive. @@ -2493,4 +2557,4 @@ Caml Special Light 1.06: * First public release. -$Id: Changes 9536 2010-01-20 11:44:20Z doligez $ +$Id$ diff --git a/INSTALL b/INSTALL index ad24f4af..0f1ed533 100644 --- a/INSTALL +++ b/INSTALL @@ -78,7 +78,7 @@ The "configure" script accepts the following options: LablTk. "-tkdefs" helps to find the headers, and "-tklibs" the C libraries. "-tklibs" may contain either only -L/path and -Wl,... flags, in which case the library names are determined - automatically, or the actual libraries, which are used as given. + automatically, or the actual libraries, which are used as given. Example: for a Japanese tcl/tk whose headers are in specific directories and libraries in /usr/local/lib, you can use ./configure -tklibs "-L/usr/local/lib -ltk8.0jp -ltcl8.0jp" @@ -136,6 +136,11 @@ Examples: On a Linux x86/64 bits host, to build a 32-bit version of OCaml: ./configure -cc "gcc -m32" -as "as --32" -aspp "gcc -m32 -c" + 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): + ./configure -cc "gcc -fPIC" -aspp "gcc -c -fPIC" + For Sun Solaris with the "acc" compiler: ./configure -cc "acc -fast" -libs "-lucb" diff --git a/Makefile b/Makefile index 80c68242..cc96068f 100644 --- a/Makefile +++ b/Makefile @@ -10,15 +10,15 @@ # # ######################################################################### -# $Id: Makefile 9480 2009-12-18 23:04:13Z doligez $ +# $Id$ # The main Makefile include config/Makefile include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=boot/ocamlrun boot/ocamlc -strict-sequence -nostdlib -I boot +CAMLOPT=boot/ocamlrun ./ocamlopt -strict-sequence -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-warn-error A $(INCLUDES) LINKFLAGS= @@ -32,7 +32,7 @@ SHELL=/bin/sh MKDIR=mkdir -p INCLUDES=-I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver \ - -I toplevel + -I toplevel UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/clflags.cmo utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo \ @@ -87,10 +87,10 @@ DRIVER=driver/pparse.cmo driver/errors.cmo driver/compile.cmo \ driver/main_args.cmo driver/main.cmo OPTDRIVER= driver/pparse.cmo driver/opterrors.cmo driver/optcompile.cmo \ - driver/optmain.cmo + driver/main_args.cmo driver/optmain.cmo TOPLEVEL=driver/pparse.cmo driver/errors.cmo driver/compile.cmo \ - toplevel/genprintval.cmo toplevel/toploop.cmo \ + driver/main_args.cmo toplevel/genprintval.cmo toplevel/toploop.cmo \ toplevel/trace.cmo toplevel/topdirs.cmo toplevel/topmain.cmo TOPLEVELLIB=toplevel/toplevellib.cma @@ -104,6 +104,7 @@ TOPOBJS=$(TOPLEVELLIB) $(TOPLEVELSTART) NATTOPOBJS=$(OPTUTILS) $(PARSING) $(TYPING) $(COMP) $(ASMCOMP) \ driver/pparse.cmo driver/opterrors.cmo driver/optcompile.cmo \ + driver/main_args.cmo \ toplevel/genprintval.cmo toplevel/opttoploop.cmo toplevel/opttopdirs.cmo \ toplevel/opttopmain.cmo toplevel/opttopstart.cmo @@ -192,9 +193,9 @@ coldstart: cd stdlib; $(MAKE) COMPILER=../boot/ocamlc all cd stdlib; cp $(LIBFILES) ../boot if test -f boot/libcamlrun.a; then :; else \ - ln -s ../byterun/libcamlrun.a boot/libcamlrun.a; fi + 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 stdlib/caml; fi # Build the core system: the minimum needed to make depend and bootstrap core: coldstart ocamlc ocamllex ocamlyacc ocamltools library @@ -240,7 +241,7 @@ compare: @if cmp boot/ocamlc ocamlc && cmp boot/ocamllex lex/ocamllex \ && cmp boot/ocamldep tools/ocamldep; \ then echo "Fixpoint reached, bootstrap succeeded."; \ - else echo "Fixpoint not reached, try one more bootstrapping cycle."; \ + else echo "Fixpoint not reached, try one more bootstrapping cycle."; \ fi # Remove old bootstrap compilers @@ -262,9 +263,9 @@ opt: # Native-code versions of the tools opt.opt: checkstack runtime core ocaml opt-core ocamlc.opt otherlibraries \ - ocamlbuild.byte camlp4out $(DEBUGGER) ocamldoc ocamlopt.opt \ - otherlibrariesopt \ - ocamllex.opt ocamltoolsopt.opt ocamlbuild.native camlp4opt ocamldoc.opt + ocamlbuild.byte camlp4out $(DEBUGGER) ocamldoc ocamlopt.opt \ + otherlibrariesopt \ + ocamllex.opt ocamltoolsopt.opt ocamlbuild.native camlp4opt ocamldoc.opt # Installation install: @@ -274,8 +275,8 @@ install: if test -d $(MANDIR)/man$(MANEXT); then : ; \ else $(MKDIR) $(MANDIR)/man$(MANEXT); fi cd $(LIBDIR); rm -f dllbigarray.so dlllabltk.so dllnums.so \ - dllthreads.so dllunix.so dllgraphics.so dllmldbm.so dllstr.so \ - dlltkanim.so + dllthreads.so dllunix.so dllgraphics.so dllmldbm.so dllstr.so \ + dlltkanim.so cd byterun; $(MAKE) install cp ocamlc $(BINDIR)/ocamlc$(EXE) cp ocaml $(BINDIR)/ocaml$(EXE) @@ -289,10 +290,10 @@ install: cp toplevel/toploop.cmi toplevel/topdirs.cmi toplevel/topmain.cmi \ $(LIBDIR) cd tools; $(MAKE) install - -$(MAKE) -C man install + -cd man; $(MAKE) install for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) install) || exit $$?; \ - done + (cd otherlibs/$$i; $(MAKE) install) || exit $$?; \ + done cd ocamldoc; $(MAKE) install if test -f ocamlopt; then $(MAKE) installopt; else :; fi if test -f debugger/ocamldebug; then (cd debugger; $(MAKE) install); \ @@ -355,7 +356,7 @@ partialclean:: # The native toplevel -ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) +ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) $(CAMLOPT) $(LINKFLAGS) otherlibs/dynlink/dynlink.cmxa -o ocamlnat \ $(NATTOPOBJS:.cmo=.cmx) -linkall @@ -369,28 +370,28 @@ otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml utils/config.ml: utils/config.mlp config/Makefile @rm -f utils/config.ml sed -e 's|%%LIBDIR%%|$(LIBDIR)|' \ - -e 's|%%BYTERUN%%|$(BINDIR)/ocamlrun|' \ - -e 's|%%CCOMPTYPE%%|cc|' \ - -e 's|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS)|' \ - -e 's|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|' \ - -e 's|%%PACKLD%%|$(PACKLD)|' \ - -e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \ - -e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \ - -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \ - -e 's|%%CC_PROFILE%%|$(CC_PROFILE)|' \ - -e 's|%%ARCH%%|$(ARCH)|' \ - -e 's|%%MODEL%%|$(MODEL)|' \ - -e 's|%%SYSTEM%%|$(SYSTEM)|' \ - -e 's|%%EXT_OBJ%%|.o|' \ - -e 's|%%EXT_ASM%%|.s|' \ - -e 's|%%EXT_LIB%%|.a|' \ - -e 's|%%EXT_DLL%%|.so|' \ - -e 's|%%SYSTHREAD_SUPPORT%%|$(SYSTHREAD_SUPPORT)|' \ - -e 's|%%ASM%%|$(ASM)|' \ - -e 's|%%MKDLL%%|$(MKDLL)|' \ - -e 's|%%MKEXE%%|$(MKEXE)|' \ - -e 's|%%MKMAINDLL%%|$(MKMAINDLL)|' \ - utils/config.mlp > utils/config.ml + -e 's|%%BYTERUN%%|$(BINDIR)/ocamlrun|' \ + -e 's|%%CCOMPTYPE%%|cc|' \ + -e 's|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS)|' \ + -e 's|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|' \ + -e 's|%%PACKLD%%|$(PACKLD)|' \ + -e 's|%%BYTECCLIBS%%|$(BYTECCLIBS)|' \ + -e 's|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|' \ + -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \ + -e 's|%%CC_PROFILE%%|$(CC_PROFILE)|' \ + -e 's|%%ARCH%%|$(ARCH)|' \ + -e 's|%%MODEL%%|$(MODEL)|' \ + -e 's|%%SYSTEM%%|$(SYSTEM)|' \ + -e 's|%%EXT_OBJ%%|.o|' \ + -e 's|%%EXT_ASM%%|.s|' \ + -e 's|%%EXT_LIB%%|.a|' \ + -e 's|%%EXT_DLL%%|.so|' \ + -e 's|%%SYSTHREAD_SUPPORT%%|$(SYSTHREAD_SUPPORT)|' \ + -e 's|%%ASM%%|$(ASM)|' \ + -e 's|%%MKDLL%%|$(MKDLL)|' \ + -e 's|%%MKEXE%%|$(MKEXE)|' \ + -e 's|%%MKMAINDLL%%|$(MKMAINDLL)|' \ + utils/config.mlp > utils/config.ml @chmod -w utils/config.ml partialclean:: @@ -433,8 +434,8 @@ beforedepend:: parsing/linenum.ml ocamlc.opt: $(COMPOBJS:.cmo=.cmx) cd asmrun; $(MAKE) meta.o dynlink.o $(CAMLOPT) $(LINKFLAGS) -ccopt "$(BYTECCLINKOPTS)" -o ocamlc.opt \ - $(COMPOBJS:.cmo=.cmx) \ - asmrun/meta.o asmrun/dynlink.o -cclib "$(BYTECCLIBS)" + $(COMPOBJS:.cmo=.cmx) \ + asmrun/meta.o asmrun/dynlink.o -cclib "$(BYTECCLIBS)" @sed -e 's|@compiler@|$$topdir/ocamlc.opt|' \ driver/ocamlcomp.sh.in > ocamlcomp.sh @chmod +x ocamlcomp.sh @@ -459,7 +460,7 @@ $(OPTOBJS:.cmo=.cmx): ocamlopt bytecomp/opcodes.ml: byterun/instruct.h sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/instruct.h | \ - awk -f tools/make-opcodes > bytecomp/opcodes.ml + awk -f tools/make-opcodes > bytecomp/opcodes.ml partialclean:: rm -f bytecomp/opcodes.ml @@ -475,9 +476,9 @@ bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h (echo 'let builtin_exceptions = [|'; \ sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ sed -e '$$s/;$$//'; \ - echo '|]'; \ - echo 'let builtin_primitives = [|'; \ - sed -e 's/.*/ "&";/' -e '$$s/;$$//' byterun/primitives; \ + echo '|]'; \ + echo 'let builtin_primitives = [|'; \ + sed -e 's/.*/ "&";/' -e '$$s/;$$//' byterun/primitives; \ echo '|]') > bytecomp/runtimedef.ml partialclean:: @@ -531,7 +532,7 @@ beforedepend:: asmcomp/scheduling.ml asmcomp/emit.ml: asmcomp/$(ARCH)/emit.mlp tools/cvt_emit $(CAMLRUN) tools/cvt_emit < asmcomp/$(ARCH)/emit.mlp > asmcomp/emit.ml \ - || { rm -f asmcomp/emit.ml; exit 2; } + || { rm -f asmcomp/emit.ml; exit 2; } partialclean:: rm -f asmcomp/emit.ml @@ -555,7 +556,7 @@ partialclean:: runtime: cd byterun; $(MAKE) all if test -f stdlib/libcamlrun.a; then :; else \ - ln -s ../byterun/libcamlrun.a stdlib/libcamlrun.a; fi + ln -s ../byterun/libcamlrun.a stdlib/libcamlrun.a; fi clean:: cd byterun; $(MAKE) clean @@ -649,18 +650,18 @@ alldepend:: otherlibraries: ocamltools for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) RUNTIME=$(RUNTIME) all) || exit $$?; \ - done + (cd otherlibs/$$i; $(MAKE) RUNTIME=$(RUNTIME) all) || exit $$?; \ + done otherlibrariesopt: for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) allopt) || exit $$?; \ - done + (cd otherlibs/$$i; $(MAKE) allopt) || exit $$?; \ + done partialclean:: for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) partialclean); \ - done + (cd otherlibs/$$i; $(MAKE) partialclean); \ + done clean:: for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) clean); done @@ -702,9 +703,6 @@ ocamlbuild-mixed-boot: ocamlc otherlibraries partialclean:: rm -rf _build - if test -d test; then \ - (cd test; $(MAKE) clean); \ - fi # Check that the stack limit is reasonable. diff --git a/Makefile.nt b/Makefile.nt index a157fbf1..62de9eea 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt 9127 2008-11-10 16:13:20Z ertai $ +# $Id$ # The main Makefile @@ -29,7 +29,7 @@ DEPFLAGS=$(INCLUDES) CAMLRUN=byterun/ocamlrun INCLUDES=-I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver \ - -I toplevel + -I toplevel UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/clflags.cmo utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo \ @@ -295,7 +295,7 @@ partialclean:: # The native toplevel -ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) +ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) $(CAMLOPT) $(LINKFLAGS) otherlibs/dynlink/dynlink.cmxa -o ocamlnat $(NATTOPOBJS:.cmo=.cmx) -linkall toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa @@ -309,31 +309,31 @@ otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml utils/config.ml: utils/config.mlp config/Makefile @rm -f utils/config.ml sed -e "s|%%LIBDIR%%|$(LIBDIR)|" \ - -e "s|%%BYTERUN%%|ocamlrun|" \ - -e 's|%%CCOMPTYPE%%|$(CCOMPTYPE)|' \ - -e "s|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS)|" \ - -e "s|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|" \ - -e "s|%%PARTIALLD%%|$(PARTIALLD)|" \ - -e "s|%%PACKLD%%|$(PACKLD)|" \ - -e "s|%%BYTECCLIBS%%|$(BYTECCLIBS)|" \ - -e "s|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|" \ - -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \ - -e 's|%%BINUTILS_NM%%|$(BINUTILS_NM)|' \ - -e 's|%%BINUTILS_OBJCOPY%%|$(BINUTILS_OBJCOPY)|' \ - -e "s|%%ARCH%%|$(ARCH)|" \ - -e "s|%%MODEL%%|$(MODEL)|" \ - -e "s|%%SYSTEM%%|$(SYSTEM)|" \ - -e "s|%%EXT_OBJ%%|.$(O)|" \ - -e "s|%%EXT_ASM%%|.$(S)|" \ - -e "s|%%EXT_LIB%%|.$(A)|" \ - -e "s|%%EXT_DLL%%|.dll|" \ - -e "s|%%SYSTHREAD_SUPPORT%%|true|" \ - -e 's|%%ASM%%|$(ASM)|' \ - -e 's|%%MKDLL%%|$(MKDLL)|' \ - -e 's|%%MKEXE%%|$(MKEXE)|' \ - -e 's|%%MKMAINDLL%%|$(MKMAINDLL)|' \ - -e 's|%%CC_PROFILE%%||' \ - utils/config.mlp > utils/config.ml + -e "s|%%BYTERUN%%|ocamlrun|" \ + -e 's|%%CCOMPTYPE%%|$(CCOMPTYPE)|' \ + -e "s|%%BYTECC%%|$(BYTECC) $(BYTECCCOMPOPTS)|" \ + -e "s|%%NATIVECC%%|$(NATIVECC) $(NATIVECCCOMPOPTS)|" \ + -e "s|%%PARTIALLD%%|$(PARTIALLD)|" \ + -e "s|%%PACKLD%%|$(PACKLD)|" \ + -e "s|%%BYTECCLIBS%%|$(BYTECCLIBS)|" \ + -e "s|%%NATIVECCLIBS%%|$(NATIVECCLIBS)|" \ + -e 's|%%RANLIBCMD%%|$(RANLIBCMD)|' \ + -e 's|%%BINUTILS_NM%%|$(BINUTILS_NM)|' \ + -e 's|%%BINUTILS_OBJCOPY%%|$(BINUTILS_OBJCOPY)|' \ + -e "s|%%ARCH%%|$(ARCH)|" \ + -e "s|%%MODEL%%|$(MODEL)|" \ + -e "s|%%SYSTEM%%|$(SYSTEM)|" \ + -e "s|%%EXT_OBJ%%|.$(O)|" \ + -e "s|%%EXT_ASM%%|.$(S)|" \ + -e "s|%%EXT_LIB%%|.$(A)|" \ + -e "s|%%EXT_DLL%%|.dll|" \ + -e "s|%%SYSTHREAD_SUPPORT%%|true|" \ + -e 's|%%ASM%%|$(ASM)|' \ + -e 's|%%MKDLL%%|$(MKDLL)|' \ + -e 's|%%MKEXE%%|$(MKEXE)|' \ + -e 's|%%MKMAINDLL%%|$(MKMAINDLL)|' \ + -e 's|%%CC_PROFILE%%||' \ + utils/config.mlp > utils/config.ml @chmod -w utils/config.ml partialclean:: @@ -394,7 +394,7 @@ $(OPTOBJS:.cmo=.cmx): ocamlopt bytecomp/opcodes.ml: byterun/instruct.h sed -n -e "/^enum/p" -e "s|,||g" -e "/^ /p" byterun/instruct.h | \ - gawk -f tools/make-opcodes > bytecomp/opcodes.ml + gawk -f tools/make-opcodes > bytecomp/opcodes.ml partialclean:: rm -f bytecomp/opcodes.ml @@ -410,9 +410,9 @@ bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h (echo 'let builtin_exceptions = [|'; \ sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ sed -e '$$s/;$$//'; \ - echo '|]'; \ - echo 'let builtin_primitives = [|'; \ - sed -e 's/.*/ "&";/' -e '$$s/;$$//' byterun/primitives; \ + echo '|]'; \ + echo 'let builtin_primitives = [|'; \ + sed -e 's/.*/ "&";/' -e '$$s/;$$//' byterun/primitives; \ echo '|]') > bytecomp/runtimedef.ml partialclean:: @@ -561,9 +561,9 @@ alldepend:: # OCamldoc -ocamldoc.byte: +ocamldoc.byte: cd ocamldoc ; $(MAKEREC) all -ocamldoc.opt: +ocamldoc.opt: cd ocamldoc ; $(MAKEREC) opt.opt partialclean:: cd ocamldoc ; $(MAKEREC) clean diff --git a/README b/README index 5252ab87..c0670ea6 100644 --- a/README +++ b/README @@ -84,7 +84,7 @@ All files marked "Copyright INRIA" in this distribution are copyright INSTALLATION: -See the file INSTALL for installation instructions on Unix, Linux and +See the file INSTALL for installation instructions on Unix, Linux and MacOS X machines. For MS Windows, see README.win32. DOCUMENTATION: @@ -135,4 +135,4 @@ You can also contact the implementors directly at caml@inria.fr. ---- -$Id: README 9146 2008-12-02 17:11:22Z xleroy $ +$Id$ diff --git a/README.win32 b/README.win32 index bb6b31d9..9479e113 100644 --- a/README.win32 +++ b/README.win32 @@ -6,7 +6,7 @@ There are no less than four ports of Objective Caml for MS Windows available: - a native Win32 port, built with the Cygwin/MinGW development tools; - 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 + - a native Win64 port (64-bit Windows), built with the Microsoft development tools. Here is a summary of the main differences between these ports: @@ -95,7 +95,7 @@ THIRD-PARTY SOFTWARE: 2005 can download MASM version 8 from http://www.microsoft.com/downloads/details.aspx?FamilyID=7A1C9DA0-0510-44A2-B042-7EF370530C64&displaylang=en To obtain MASM version 6.11, see - http://users.easystreet.com/jkirwan/new/pctools.html. + http://users.easystreet.com/jkirwan/new/pctools.html. [4] TCL/TK version 8.5. Windows binaries are available as part of the ActiveTCL distribution at http://www.activestate.com/products/ActiveTcl/ @@ -152,7 +152,7 @@ performance of bytecode programs is about 2/3 of that obtained under Unix/GCC or Cygwin or Mingw on similar hardware. * Libraries available in this port: "num", "str", "threads", "graphics", -"labltk", and large parts of "unix". +"labltk", and large parts of "unix". * The replay debugger is partially supported (no reverse execution). @@ -178,7 +178,7 @@ The base bytecode system (ocamlc, ocaml, ocamllex, ocamlyacc, ...) runs without any additional tools. The native-code compiler (ocamlopt), as well as static linking of -Caml bytecode with C code (ocamlc -custom), require +Caml bytecode with C code (ocamlc -custom), require the Cygwin development tools, available at http://www.cygwin.com/ and the flexdll tool, available at @@ -191,7 +191,7 @@ Do *not* install the Mingw/MSYS development tools from www.mingw.org: these are not compatible with this Caml port (@responsefile not recognized on the command line). -The LablTk GUI requires Tcl/Tk 8.5. Windows binaries are available +The LablTk GUI requires Tcl/Tk 8.5. Windows binaries are available as part of the ActiveTCL distribution at http://www.activestate.com/products/ActiveTcl/ @@ -216,7 +216,7 @@ RECOMPILATION FROM THE SOURCES: You will need the following software components to perform the recompilation: - Windows NT, 2000, XP, or Vista. - Cygwin: http://sourceware.cygnus.com/cygwin/ - Install at least the following packages: binutils, diffutils, + Install at least the following packages: binutils, diffutils, gcc-core, gcc-mingw-core, make, mingw-runtime, ncurses, w32-api. - TCL/TK version 8.5 (see above). - The flexdll tool (see above). @@ -238,7 +238,7 @@ Normally, the only variables that need to be changed are PREFIX where to install everything TK_ROOT where TCL/TK was installed -Finally, use "make -f Makefile.nt" to build the system, e.g. +Finally, use "make -f Makefile.nt" to build the system, e.g. make -f Makefile.nt world make -f Makefile.nt bootstrap @@ -250,7 +250,7 @@ Finally, use "make -f Makefile.nt" to build the system, e.g. NOTES: * Libraries available in this port: "num", "str", "threads", "graphics", - "labltk", and large parts of "unix". + "labltk", and large parts of "unix". * The replay debugger is partially supported (no reverse execution). @@ -357,7 +357,7 @@ compiler for AMD64 instead of the Platform SDK compiler, replace the line by EXTRALIBS= -Finally, use "make -f Makefile.nt" to build the system, e.g. +Finally, use "make -f Makefile.nt" to build the system, e.g. make -f Makefile.nt world make -f Makefile.nt bootstrap @@ -369,7 +369,7 @@ Finally, use "make -f Makefile.nt" to build the system, e.g. NOTES: * Libraries available in this port: "num", "str", "threads", "graphics", - and large parts of "unix". + and large parts of "unix". * The replay debugger is partially supported (no reverse execution). diff --git a/Upgrading b/Upgrading index 10fdd47c..808413ed 100644 --- a/Upgrading +++ b/Upgrading @@ -97,7 +97,7 @@ A8: The new default mode is more flexible than the original commuting interface must also be present in the implementation. The addlabels tool can help you to do that. Suppose that you have mymod.ml and mymod.mli, where mymod.mli adds some labels. Then - doing + doing $CAMLLIB/addlabels mymod.ml will insert labels from the interface inside the implementation. It also takes care of inserting them in recursive calls, as @@ -106,4 +106,4 @@ A8: The new default mode is more flexible than the original commuting If you used labels from standard libraries, you will also have problems with them. You can proceed as described in A6. Since you used classic mode, you do not need to bother about changed - argument order. \ No newline at end of file + argument order. diff --git a/VERSION b/VERSION index 04797e62..9d186bd0 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ -3.11.2 +3.12.0+dev17 (2010-01-20) # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli -# $Id: VERSION 9537 2010-01-20 12:19:26Z doligez $ +# $Id$ diff --git a/_tags b/_tags index bb10f436..8e702f5c 100644 --- a/_tags +++ b/_tags @@ -19,7 +19,7 @@ true: use_stdlib # The stdlib neither requires the stdlib nor debug information : -use_stdlib, -debug -<**/*.ml*>: warn_Alez +<**/*.ml*>: warn_Alerz "toplevel/topstart.byte": linkall @@ -28,18 +28,18 @@ true: use_stdlib : include_unix, include_str, include_dynlink : use_unix, use_str, use_dynlink -: camlp4boot, -warn_Alez, warn_Ale +: camlp4boot, -warn_Alerz, warn_Aler : -camlp4boot -"camlp4/Camlp4_import.ml": -warn_Ale - or or "camlp4/Camlp4/Struct/Lexer.ml": -camlp4boot, -warn_Ale, warn_a +"camlp4/Camlp4_import.ml": -warn_Aler + or or "camlp4/Camlp4/Struct/Lexer.ml": -camlp4boot, -warn_Aler, warn_a or : use_dynlink -"camlp4/Camlp4/Printers/OCaml.ml" or "camlp4/Camlp4/Printers/OCamlr.ml": warn_Alezv +"camlp4/Camlp4/Printers/OCaml.ml" or "camlp4/Camlp4/Printers/OCamlr.ml": warn_Alerzv : include_unix "camlp4/Camlp4/Struct/DynLoader.ml" or "camlp4/boot/Camlp4.ml": include_dynlink : include_toplevel : -debug -: -warn_Alez, include_unix +: -warn_Alerz, include_unix <**/pervasives.ml> or <**/pervasives.mli> or <**/camlinternalOO.mli>: nopervasives <**/camlinternalOO*.cmx>: inline(0) diff --git a/asmcomp/alpha/arch.ml b/asmcomp/alpha/arch.ml index 773397c1..52d1f11b 100644 --- a/asmcomp/alpha/arch.ml +++ b/asmcomp/alpha/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 5304 2002-11-29 15:03:37Z xleroy $ *) +(* $Id$ *) (* Specific operations for the Alpha processor *) diff --git a/asmcomp/alpha/emit.mlp b/asmcomp/alpha/emit.mlp index aa6003ac..6857da04 100644 --- a/asmcomp/alpha/emit.mlp +++ b/asmcomp/alpha/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9314 2009-07-15 12:14:39Z xleroy $ *) +(* $Id$ *) module LabelSet = Set.Make(struct type t = Linearize.label let compare = compare end) @@ -129,7 +129,7 @@ let emit_label lbl = emit_string "$"; emit_int lbl let emit_Llabel fallthrough lbl = - if (not fallthrough) then begin + if (not fallthrough) then begin emit_string " .align 4\n" end ; emit_label lbl @@ -195,7 +195,7 @@ let int_reg_number = [| 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 16; 17; 18; 19; 20; 21; 22 |] - + let float_reg_number = [| 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 29; 30 @@ -358,7 +358,7 @@ let emit_instr fallthrough i = Lend -> () | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in - if src.loc <> dst.loc then begin + if src.loc <> dst.loc then begin match (src.loc, dst.loc) with (Reg rs, Reg rd) -> if src.typ = Float then @@ -381,7 +381,7 @@ let emit_instr fallthrough i = | Lop(Iconst_int n) -> if n = 0n then ` clr {emit_reg i.res.(0)}\n` - else if digital_asm || + else if digital_asm || (n >= Nativeint.of_int (-0x80000000) && n <= Nativeint.of_int 0x7FFFFFFF) then ` ldiq {emit_reg i.res.(0)}, {emit_nativeint n}\n` diff --git a/asmcomp/alpha/proc.ml b/asmcomp/alpha/proc.ml index 9d894358..93c2422f 100644 --- a/asmcomp/alpha/proc.ml +++ b/asmcomp/alpha/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the Alpha processor *) @@ -49,7 +49,7 @@ let int_reg_name = [| (* 8-12 *) "$8"; "$9"; "$10"; "$11"; "$12"; (* 13-19 *) "$16"; "$17"; "$18"; "$19"; "$20"; "$21"; "$22" |] - + let float_reg_name = [| (* 100-107 *) "$f0"; "$f1"; "$f2"; "$f3"; "$f4"; "$f5"; "$f6"; "$f7"; (* 108-115 *) "$f8"; "$f9"; "$f10"; "$f11"; "$f12"; "$f13"; "$f14"; "$f15"; @@ -208,9 +208,9 @@ let contains_calls = ref false let assemble_file infile outfile = let as_cmd = if digital_asm && !Clflags.gprofile - then Config.as ^ " -pg" - else Config.as in - Ccomp.command (as_cmd ^ " -o " ^ + then Config.asm ^ " -pg" + else Config.asm in + Ccomp.command (as_cmd ^ " -o " ^ Filename.quote outfile ^ " " ^ Filename.quote infile) open Clflags;; diff --git a/asmcomp/alpha/reload.ml b/asmcomp/alpha/reload.ml index e95a9909..53f7b183 100644 --- a/asmcomp/alpha/reload.ml +++ b/asmcomp/alpha/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Reloading for the Alpha *) diff --git a/asmcomp/alpha/scheduling.ml b/asmcomp/alpha/scheduling.ml index 3f6ca8af..f59c26ed 100644 --- a/asmcomp/alpha/scheduling.ml +++ b/asmcomp/alpha/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) open Arch open Mach diff --git a/asmcomp/alpha/selection.ml b/asmcomp/alpha/selection.ml index 22a0ab45..6bea0f19 100644 --- a/asmcomp/alpha/selection.ml +++ b/asmcomp/alpha/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 3593 2001-07-24 08:01:25Z xleroy $ *) +(* $Id$ *) (* Instruction selection for the Alpha processor *) diff --git a/asmcomp/amd64/arch.ml b/asmcomp/amd64/arch.ml index fe52e54d..3e8f4b11 100644 --- a/asmcomp/amd64/arch.ml +++ b/asmcomp/amd64/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 7784 2007-01-01 13:07:35Z xleroy $ *) +(* $Id$ *) (* Machine-specific command-line options *) diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 4a3f8448..b1f886da 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9475 2009-12-16 10:04:38Z xleroy $ *) +(* $Id$ *) (* Emission of x86-64 (AMD 64) assembly code *) @@ -60,7 +60,7 @@ let slot_offset loc cl = (* Symbols *) let emit_symbol s = - if macosx then emit_string "_"; + if macosx then emit_string "_"; Emitaux.emit_symbol '$' s let emit_call s = @@ -80,7 +80,6 @@ let load_symbol_addr s = then `leaq {emit_symbol s}(%rip)` else `movq ${emit_symbol s}` - (* Output a label *) let emit_label lbl = @@ -792,4 +791,3 @@ let end_assembly() = if Config.system = "linux" then (* Mark stack as non-executable, PR#4564 *) ` .section .note.GNU-stack,\"\",%progbits\n` - diff --git a/asmcomp/amd64/emit_nt.mlp b/asmcomp/amd64/emit_nt.mlp index d1a06e6a..23c5b34e 100644 --- a/asmcomp/amd64/emit_nt.mlp +++ b/asmcomp/amd64/emit_nt.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit_nt.mlp 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Emission of x86-64 (AMD 64) assembly code, MASM syntax *) @@ -39,10 +39,10 @@ let frame_required () = let frame_size () = (* includes return address *) if frame_required() then begin - let sz = + let sz = (!stack_offset + 8 * (num_stack_slots.(0) + num_stack_slots.(1)) + 8) in Misc.align sz 16 - end else + end else !stack_offset + 8 let slot_offset loc cl = @@ -63,7 +63,7 @@ let emit_int32 n = emit_printf "0%lxh" n let emit_symbol s = Emitaux.emit_symbol '$' s -(* Record symbols used and defined - at the end generate extern for those +(* Record symbols used and defined - at the end generate extern for those used but not defined *) let symbols_defined = ref StringSet.empty @@ -84,11 +84,11 @@ let emit_label lbl = let emit_align n = ` ALIGN {emit_int n}\n` - + let emit_Llabel fallthrough lbl = if not fallthrough && !fastcode_flag then emit_align 4; emit_label lbl - + (* Output a pseudo-register *) let emit_reg = function @@ -106,13 +106,13 @@ let emit_reg = function (* Output a reference to the lower 8, 16 or 32 bits of a register *) let reg_low_8_name = - [| "al"; "bl"; "dil"; "sil"; "dl"; "cl"; "r8b"; "r9b"; + [| "al"; "bl"; "dil"; "sil"; "dl"; "cl"; "r8b"; "r9b"; "r10b"; "r11b"; "bpl"; "r12b"; "r13b" |] let reg_low_16_name = - [| "ax"; "bx"; "di"; "si"; "dx"; "cx"; "r8w"; "r9w"; + [| "ax"; "bx"; "di"; "si"; "dx"; "cx"; "r8w"; "r9w"; "r10w"; "r11w"; "bp"; "r12w"; "r13w" |] let reg_low_32_name = - [| "eax"; "ebx"; "edi"; "esi"; "edx"; "ecx"; "r8d"; "r9d"; + [| "eax"; "ebx"; "edi"; "esi"; "edx"; "ecx"; "r8d"; "r9d"; "r10d"; "r11d"; "ebp"; "r12d"; "r13d" |] let emit_subreg tbl pref r = @@ -253,7 +253,7 @@ let name_for_cond_branch = function | Iunsigned Ceq -> "e" | Iunsigned Cne -> "ne" | Iunsigned Cle -> "be" | Iunsigned Cgt -> "a" | Iunsigned Clt -> "b" | Iunsigned Cge -> "ae" - + (* Output an = 0 or <> 0 test. *) let output_test_zero arg = @@ -544,7 +544,7 @@ let emit_instr fallthrough i = ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; let b = name_for_cond_branch cmp in ` j{emit_string b} {emit_label lbl}\n` - | Iinttest_imm((Isigned Ceq | Isigned Cne | + | Iinttest_imm((Isigned Ceq | Isigned Cne | Iunsigned Ceq | Iunsigned Cne) as cmp, 0) -> output_test_zero i.arg.(0); let b = name_for_cond_branch cmp in diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index 35f938e4..4ba0d5c3 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 9342 2009-09-18 13:49:21Z xleroy $ *) +(* $Id$ *) (* Description of the AMD64 processor *) @@ -31,24 +31,24 @@ open Mach rcx 5 r8 6 r9 7 - r10 8 - r11 9 + r10 8 + r11 9 rbp 10 - r12 11 - r13 12 + r12 11 + r13 12 r14 trap pointer r15 allocation pointer - + xmm0 - xmm15 100 - 115 xmm0 - xmm9: Caml function arguments xmm0 - xmm7: C function arguments xmm0: Caml and C function results *) let int_reg_name = - [| "%rax"; "%rbx"; "%rdi"; "%rsi"; "%rdx"; "%rcx"; "%r8"; "%r9"; + [| "%rax"; "%rbx"; "%rdi"; "%rsi"; "%rdx"; "%rcx"; "%r8"; "%r9"; "%r10"; "%r11"; "%rbp"; "%r12"; "%r13" |] let float_reg_name = - [| "%xmm0"; "%xmm1"; "%xmm2"; "%xmm3"; "%xmm4"; "%xmm5"; "%xmm6"; "%xmm7"; + [| "%xmm0"; "%xmm1"; "%xmm2"; "%xmm3"; "%xmm4"; "%xmm5"; "%xmm6"; "%xmm7"; "%xmm8"; "%xmm9"; "%xmm10"; "%xmm11"; "%xmm12"; "%xmm13"; "%xmm14"; "%xmm15" |] diff --git a/asmcomp/amd64/proc_nt.ml b/asmcomp/amd64/proc_nt.ml index 3379b167..5c90e4f5 100644 --- a/asmcomp/amd64/proc_nt.ml +++ b/asmcomp/amd64/proc_nt.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc_nt.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the AMD64 processor with Win64 conventions *) @@ -31,25 +31,25 @@ open Mach rcx 5 r8 6 r9 7 - r10 8 - r11 9 + r10 8 + r11 9 rbp 10 - r12 11 - r13 12 + r12 11 + r13 12 r14 trap pointer r15 allocation pointer - + xmm0 - xmm15 100 - 115 xmm0 - xmm9: Caml function arguments xmm0 - xmm3: C function arguments xmm0: Caml and C function results xmm6-xmm15 are preserved by C *) let int_reg_name = - [| "rax"; "rbx"; "rdi"; "rsi"; "rdx"; "rcx"; "r8"; "r9"; + [| "rax"; "rbx"; "rdi"; "rsi"; "rdx"; "rcx"; "r8"; "r9"; "r10"; "r11"; "rbp"; "r12"; "r13" |] let float_reg_name = - [| "xmm0"; "xmm1"; "xmm2"; "xmm3"; "xmm4"; "xmm5"; "xmm6"; "xmm7"; + [| "xmm0"; "xmm1"; "xmm2"; "xmm3"; "xmm4"; "xmm5"; "xmm6"; "xmm7"; "xmm8"; "xmm9"; "xmm10"; "xmm11"; "xmm12"; "xmm13"; "xmm14"; "xmm15" |] let num_register_classes = 2 @@ -229,5 +229,5 @@ let contains_calls = ref false let assemble_file infile outfile = Ccomp.command (Config.asm ^ - Filename.quote outfile ^ " " ^ + Filename.quote outfile ^ " " ^ Filename.quote infile ^ "> NUL") diff --git a/asmcomp/amd64/reload.ml b/asmcomp/amd64/reload.ml index 2f742b90..50b962f8 100644 --- a/asmcomp/amd64/reload.ml +++ b/asmcomp/amd64/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) open Cmm open Arch @@ -62,7 +62,7 @@ class reload = object (self) inherit Reloadgen.reload_generic as super -method reload_operation op arg res = +method! reload_operation op arg res = match op with Iintop(Iadd|Isub|Iand|Ior|Ixor|Icomp _|Icheckbound) -> (* One of the two arguments can reside in the stack, but not both *) @@ -99,7 +99,7 @@ method reload_operation op arg res = | _ -> (* Other operations: all args and results in registers *) super#reload_operation op arg res -method reload_test tst arg = +method! reload_test tst arg = match tst with Iinttest cmp -> (* One of the two arguments can reside on stack *) diff --git a/asmcomp/amd64/scheduling.ml b/asmcomp/amd64/scheduling.ml index aeecf9e3..faf0353e 100644 --- a/asmcomp/amd64/scheduling.ml +++ b/asmcomp/amd64/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 5634 2003-06-30 08:28:48Z xleroy $ *) +(* $Id$ *) open Schedgen (* to create a dependency *) diff --git a/asmcomp/amd64/selection.ml b/asmcomp/amd64/selection.ml index 143f7eba..4921e511 100644 --- a/asmcomp/amd64/selection.ml +++ b/asmcomp/amd64/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 9114 2008-10-29 14:32:01Z xleroy $ *) +(* $Id$ *) (* Instruction selection for the AMD64 *) @@ -138,7 +138,7 @@ method select_addressing exp = | Ascaledadd(e1, e2, scale) -> (Iindexed2scaled(scale, d), Ctuple[e1; e2]) -method select_store addr exp = +method! select_store addr exp = match exp with Cconst_int n when self#is_immediate n -> (Ispecific(Istore_int(Nativeint.of_int n, addr)), Ctuple []) @@ -153,7 +153,7 @@ method select_store addr exp = | _ -> super#select_store addr exp -method select_operation op args = +method! select_operation op args = match op with (* Recognize the LEA instruction *) Caddi | Cadda | Csubi | Csuba -> @@ -217,7 +217,7 @@ method select_floatarith commutative regular_op mem_op args = (* Deal with register constraints *) -method insert_op_debug op dbg rs rd = +method! insert_op_debug op dbg rs rd = try let (rsrc, rdst) = pseudoregs_for_operation op rs rd in self#insert_moves rs rsrc; @@ -227,7 +227,7 @@ method insert_op_debug op dbg rs rd = with Use_default -> super#insert_op_debug op dbg rs rd -method insert_op op rs rd = +method! insert_op op rs rd = self#insert_op_debug op Debuginfo.none rs rd end diff --git a/asmcomp/arm/arch.ml b/asmcomp/arm/arch.ml index 998fa4bb..aafb094b 100644 --- a/asmcomp/arm/arch.ml +++ b/asmcomp/arm/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 5304 2002-11-29 15:03:37Z xleroy $ *) +(* $Id$ *) (* Specific operations for the ARM processor *) diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index 0f5255ad..307d097d 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9314 2009-07-15 12:14:39Z xleroy $ *) +(* $Id$ *) (* Emission of ARM assembly code *) @@ -42,39 +42,31 @@ let emit_symbol s = let emit_reg r = match r.loc with - Reg r -> emit_string (register_name r) + | Reg r -> emit_string (register_name r) | _ -> fatal_error "Emit_arm.emit_reg" -(* Output the next register after the given pseudo-register *) - -let emit_next_reg r = - match r.loc with - Reg r -> emit_string (register_name(r + 1)) - | _ -> fatal_error "Emit_arm.emit_next_reg" - (* Layout of the stack frame *) let stack_offset = ref 0 let frame_size () = - !stack_offset + - 4 * num_stack_slots.(0) + 8 * num_stack_slots.(1) + - (if !contains_calls then 4 else 0) + let sz = + !stack_offset + + 4 * num_stack_slots.(0) + + (if !contains_calls then 4 else 0) + in Misc.align sz 8 let slot_offset loc cl = match loc with Incoming n -> frame_size() + n - | Local n -> - if cl = 0 - then !stack_offset + num_stack_slots.(1) * 8 + n * 4 - else !stack_offset + n * 8 + | Local n -> !stack_offset + n * 4 | Outgoing n -> n (* Output a stack reference *) let emit_stack r = match r.loc with - Stack s -> + | Stack s -> let ofs = slot_offset s (register_class r) in `[sp, #{emit_int ofs}]` | _ -> fatal_error "Emit_arm.emit_stack" @@ -158,17 +150,6 @@ let name_for_shift_int_operation = function | Ishiftsub -> "sub" | Ishiftsubrev -> "rsb" -let name_for_float_operation = function - Inegf -> "mnfd" - | Iabsf -> "absd" - | Iaddf -> "adfd" - | Isubf -> "sufd" - | Imulf -> "mufd" - | Idivf -> "dvfd" - | Ifloatofint -> "fltd" - | Iintoffloat -> "fixz" - | _ -> assert false - (* Recognize immediate operands *) (* Immediate operands are 8-bit immediate values, zero-extended, and rotated @@ -203,16 +184,23 @@ let decompose_intconst n fn = done; !ninstr -(* Emit a non-immediate integer constant *) - -let emit_complex_intconst r n = - let first = ref true in - decompose_intconst n - (fun bits -> - if !first - then ` mov {emit_reg r}, #{emit_nativeint bits} @ {emit_nativeint n}\n` - else ` add {emit_reg r}, {emit_reg r}, #{emit_nativeint bits}\n`; - first := false) +(* Load an integer constant into a register *) + +let emit_intconst r n = + let nr = Nativeint.lognot n in + if is_immediate n then begin + ` mov {emit_reg r}, #{emit_nativeint n}\n`; 1 + end else if is_immediate nr then begin + ` mvn {emit_reg r}, #{emit_nativeint nr}\n`; 1 + end else begin + let first = ref true in + decompose_intconst n + (fun bits -> + if !first + then ` mov {emit_reg r}, #{emit_nativeint bits} @ {emit_nativeint n}\n` + else ` add {emit_reg r}, {emit_reg r}, #{emit_nativeint bits}\n`; + first := false) + end (* Adjust sp (up or down) by the given byte amount *) @@ -222,13 +210,6 @@ let emit_stack_adjustment instr n = (fun bits -> ` {emit_string instr} sp, sp, #{emit_nativeint bits}\n`) -(* Adjust alloc_ptr down by the given byte amount *) - -let emit_alloc_decrement n = - decompose_intconst (Nativeint.of_int n) - (fun bits -> - ` sub alloc_ptr, alloc_ptr, #{emit_nativeint bits}\n`) - (* Name of current function *) let function_name = ref "" (* Entry point for tail recursive calls *) @@ -239,8 +220,6 @@ let symbol_constants = (Hashtbl.create 11 : (string, int) Hashtbl.t) let float_constants = (Hashtbl.create 11 : (string, int) Hashtbl.t) (* Total space (in word) occupied by pending literals *) let num_literals = ref 0 -(* True if we've at least one pending float literal *) -let pending_float = ref false (* Label a symbol or float constant *) let label_constant tbl s size = @@ -265,8 +244,7 @@ let emit_constants () = float_constants; Hashtbl.clear symbol_constants; Hashtbl.clear float_constants; - num_literals := 0; - pending_float := false + num_literals := 0 (* Output the assembly code for an instruction *) @@ -279,55 +257,44 @@ let emit_instr i = match (src, dst) with {loc = Reg rs; typ = Int|Addr}, {loc = Reg rd; typ = Int|Addr} -> ` mov {emit_reg dst}, {emit_reg src}\n`; 1 - | {loc = Reg rs; typ = Float}, {loc = Reg rd; typ = Float} -> - ` mvfd {emit_reg dst}, {emit_reg src}\n`; 1 - | {loc = Reg rs; typ = Float}, {loc = Reg rd; typ = Int|Addr} -> - ` stfd {emit_reg src}, [sp, #-8]!\n`; - ` ldmfd sp!, \{{emit_reg dst}, {emit_next_reg dst}}\n`; 2 | {loc = Reg rs; typ = Int|Addr}, {loc = Stack sd} -> ` str {emit_reg src}, {emit_stack dst}\n`; 1 - | {loc = Reg rs; typ = Float}, {loc = Stack sd} -> - ` stfd {emit_reg src}, {emit_stack dst}\n`; 1 | {loc = Stack ss; typ = Int|Addr}, {loc = Reg rd} -> ` ldr {emit_reg dst}, {emit_stack src}\n`; 1 - | {loc = Stack ss; typ = Float}, {loc = Reg rd} -> - ` ldfd {emit_reg dst}, {emit_stack src}\n`; 1 | _ -> assert false end | Lop(Iconst_int n) -> - let r = i.res.(0) in - let nr = Nativeint.lognot n in - if is_immediate n then begin - ` mov {emit_reg r}, #{emit_nativeint n}\n`; 1 - end else if is_immediate nr then begin - ` mvn {emit_reg r}, #{emit_nativeint nr}\n`; 1 - end else - emit_complex_intconst r n + emit_intconst i.res.(0) n | Lop(Iconst_float s) -> - begin match Int64.bits_of_float (float_of_string s) with - | 0x0000_0000_0000_0000L -> (* +0.0 *) - ` mvfd {emit_reg i.res.(0)}, #0.0\n` - | _ -> + let bits = Int64.bits_of_float (float_of_string s) in + let high_bits = Int64.to_nativeint (Int64.shift_right_logical bits 32) + and low_bits = Int64.to_nativeint bits in + if is_immediate low_bits && is_immediate high_bits then begin + ` mov {emit_reg i.res.(0)}, #{emit_nativeint low_bits} @ {emit_string s}\n`; + ` mov {emit_reg i.res.(1)}, #{emit_nativeint high_bits}\n`; + 2 + end else begin let lbl = label_constant float_constants s 2 in - pending_float := true; - ` ldfd {emit_reg i.res.(0)}, {emit_label lbl} @ {emit_string s}\n` - end; - 1 + ` ldr {emit_reg i.res.(0)}, {emit_label lbl} @ {emit_string s}\n`; + ` ldr {emit_reg i.res.(1)}, {emit_label lbl} + 4\n`; + 2 + end | Lop(Iconst_symbol s) -> let lbl = label_constant symbol_constants s 1 in ` ldr {emit_reg i.res.(0)}, {emit_label lbl} @ {emit_symbol s}\n`; 1 | Lop(Icall_ind) -> ` mov lr, pc\n`; - `{record_frame i.live} mov pc, {emit_reg i.arg.(0)}\n`; 2 + `{record_frame i.live} bx {emit_reg i.arg.(0)}\n`; 2 | Lop(Icall_imm s) -> `{record_frame i.live} bl {emit_symbol s}\n`; 1 | Lop(Itailcall_ind) -> let n = frame_size() in if !contains_calls then ` ldr lr, [sp, #{emit_int (n-4)}]\n`; - ignore (emit_stack_adjustment "add" n); - ` mov pc, {emit_reg i.arg.(0)}\n`; 3 + let ninstr = emit_stack_adjustment "add" n in + ` bx {emit_reg i.arg.(0)}\n`; + 2 + ninstr | Lop(Itailcall_imm s) -> if s = !function_name then begin ` b {emit_label !tailrec_entry_point}\n`; 1 @@ -335,28 +302,35 @@ let emit_instr i = let n = frame_size() in if !contains_calls then ` ldr lr, [sp, #{emit_int (n-4)}]\n`; - ignore (emit_stack_adjustment "add" n); - ` b {emit_symbol s}\n`; 3 + let ninstr = emit_stack_adjustment "add" n in + ` b {emit_symbol s}\n`; + 2 + ninstr end | Lop(Iextcall(s, alloc)) -> if alloc then begin let lbl = label_constant symbol_constants s 1 in - ` ldr r10, {emit_label lbl} @ {emit_symbol s}\n`; - `{record_frame i.live} bl caml_c_call\n`; 2 + ` ldr r12, {emit_label lbl} @ {emit_symbol s}\n`; + `{record_frame i.live} bl caml_c_call\n`; 2 end else begin ` bl {emit_symbol s}\n`; 1 end | Lop(Istackoffset n) -> + assert (n mod 8 = 0); let ninstr = if n >= 0 then emit_stack_adjustment "sub" n else emit_stack_adjustment "add" (-n) in stack_offset := !stack_offset + n; ninstr - | Lop(Iload(Single, addr)) -> - let r = i.res.(0) in - ` ldfs {emit_reg r}, {emit_addressing addr i.arg 0}\n`; - ` mvfd {emit_reg r}, {emit_reg r}\n`; + | Lop(Iload((Double | Double_u), addr)) -> + let addr' = offset_addressing addr 4 in + if i.res.(0).loc <> i.arg.(0).loc then begin + ` ldr {emit_reg i.res.(0)}, {emit_addressing addr i.arg 0}\n`; + ` ldr {emit_reg i.res.(1)}, {emit_addressing addr' i.arg 0}\n` + end else begin + ` ldr {emit_reg i.res.(1)}, {emit_addressing addr' i.arg 0}\n`; + ` ldr {emit_reg i.res.(0)}, {emit_addressing addr i.arg 0}\n` + end; 2 | Lop(Iload(size, addr)) -> let r = i.res.(0) in @@ -366,14 +340,13 @@ let emit_instr i = | Byte_signed -> "ldrsb" | Sixteen_unsigned -> "ldrh" | Sixteen_signed -> "ldrsh" - | Double | Double_u -> "ldfd" - | _ (* Word | Thirtytwo_signed | Thirtytwo_unsigned *) -> "ldr" in + | _ (* 32-bit quantities *) -> "ldr" in ` {emit_string instr} {emit_reg r}, {emit_addressing addr i.arg 0}\n`; 1 - | Lop(Istore(Single, addr)) -> - let r = i.arg.(0) in - ` mvfs f7, {emit_reg r}\n`; - ` stfs f7, {emit_addressing addr i.arg 1}\n`; + | Lop(Istore((Double | Double_u), addr)) -> + let addr' = offset_addressing addr 4 in + ` str {emit_reg i.arg.(0)}, {emit_addressing addr i.arg 2}\n`; + ` str {emit_reg i.arg.(1)}, {emit_addressing addr' i.arg 2}\n`; 2 | Lop(Istore(size, addr)) -> let r = i.arg.(0) in @@ -381,31 +354,25 @@ let emit_instr i = match size with Byte_unsigned | Byte_signed -> "strb" | Sixteen_unsigned | Sixteen_signed -> "strh" - | Double | Double_u -> "stfd" - | _ (* Word | Thirtytwo_signed | Thirtytwo_unsigned *) -> "str" in + | _ (* 32-bit quantities *) -> "str" in ` {emit_string instr} {emit_reg r}, {emit_addressing addr i.arg 1}\n`; 1 | Lop(Ialloc n) -> if !fastcode_flag then begin - ` ldr r10, [alloc_limit, #0]\n`; - let ni = emit_alloc_decrement n in - ` cmp alloc_ptr, r10\n`; - `{record_frame i.live} blcc caml_call_gc\n`; + let ni = emit_intconst (phys_reg 8 (*r12*)) (Nativeint.of_int n) in + ` sub alloc_ptr, alloc_ptr, r12\n`; + ` cmp alloc_ptr, alloc_limit\n`; + `{record_frame i.live} blcc caml_call_gc\n`; ` add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; 4 + ni end else if n = 8 || n = 12 || n = 16 then begin - `{record_frame i.live} bl caml_alloc{emit_int ((n-4)/4)}\n`; - ` add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; 2 + `{record_frame i.live} bl caml_alloc{emit_int ((n-4)/4)}\n`; + ` add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; 2 end else begin - let nn = Nativeint.of_int n in - let ni = - if is_immediate nn then begin - ` mov r10, #{emit_int n}\n`; 1 - end else - emit_complex_intconst (phys_reg 8 (*r10*)) nn in - `{record_frame i.live} bl caml_allocN\n`; - ` add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; - 2 + ni + let ni = emit_intconst (phys_reg 8 (*r12*)) (Nativeint.of_int n) in + `{record_frame i.live} bl caml_allocN\n`; + ` add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; + 2 + ni end | Lop(Iintop(Ilsl | Ilsr | Iasr as op)) -> let shift = name_for_shift_operation op in @@ -458,12 +425,12 @@ let emit_instr i = | Lop(Iintop_imm(op, n)) -> let instr = name_for_int_operation op in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n`; 1 - | Lop(Inegf | Iabsf | Ifloatofint | Iintoffloat as op) -> - let instr = name_for_float_operation op in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n`; 1 - | Lop(Iaddf | Isubf | Imulf | Idivf as op) -> - let instr = name_for_float_operation op in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; 1 + | Lop(Inegf) -> (* argument and result in (r0, r1) *) + ` eor r1, r1, #0x80000000\n`; 1 + | Lop(Iabsf) -> (* argument and result in (r0, r1) *) + ` bic r1, r1, #0x80000000\n`; 1 + | Lop(Ifloatofint | Iintoffloat | Iaddf | Isubf | Imulf | Idivf) -> + assert false | Lop(Ispecific(Ishiftarith(op, shift))) -> let instr = name_for_shift_int_operation op in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}`; @@ -480,9 +447,9 @@ let emit_instr i = let n = frame_size() in ` ldr lr, [sp, #{emit_int(n-4)}]\n`; 1 | Lreturn -> - let n = frame_size() in - ignore(emit_stack_adjustment "add" n); - ` mov pc, lr\n`; 2 + let ninstr = emit_stack_adjustment "add" (frame_size()) in + ` bx lr\n`; + ninstr + 1 | Llabel lbl -> `{emit_label lbl}:\n`; 0 | Lbranch lbl -> @@ -498,20 +465,13 @@ let emit_instr i = | Iinttest cmp -> ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; let comp = name_for_comparison cmp in - ` b{emit_string comp} {emit_label lbl}\n` + ` b{emit_string comp} {emit_label lbl}\n` | Iinttest_imm(cmp, n) -> ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; let comp = name_for_comparison cmp in - ` b{emit_string comp} {emit_label lbl}\n` + ` b{emit_string comp} {emit_label lbl}\n` | Ifloattest(cmp, neg) -> - begin match cmp with - Ceq | Cne -> - ` cmf {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` - | _ -> - ` cmfe {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` - end; - let comp = name_for_float_comparison cmp neg in - ` b{emit_string comp} {emit_label lbl}\n` + assert false | Ioddtest -> ` tst {emit_reg i.arg.(0)}, #1\n`; ` bne {emit_label lbl}\n` @@ -569,8 +529,8 @@ let rec emit_all ninstr i = if i.desc = Lend then () else begin let n = emit_instr i in let ninstr' = ninstr + n in - let limit = (if !pending_float then 127 else 511) - !num_literals in - if ninstr' >= limit - 32 && no_fallthrough i.desc then begin + let limit = 511 - !num_literals in + if ninstr' >= limit - 64 && no_fallthrough i.desc then begin emit_constants(); emit_all 0 i.next end else @@ -594,7 +554,7 @@ let fundecl fundecl = Hashtbl.clear symbol_constants; Hashtbl.clear float_constants; ` .text\n`; - ` .align 0\n`; + ` .align 2\n`; ` .global {emit_symbol fundecl.fun_name}\n`; `{emit_symbol fundecl.fun_name}:\n`; let n = frame_size() in @@ -635,7 +595,7 @@ let emit_item = function | Clabel_address lbl -> ` .word {emit_label (10000 + lbl)}\n` | Cstring s -> - emit_string_directive " .ascii " s + emit_string_directive " .ascii " s | Cskip n -> if n > 0 then ` .space {emit_int n}\n` | Calign n -> @@ -650,7 +610,7 @@ let data l = let begin_assembly() = `trap_ptr .req r11\n`; `alloc_ptr .req r8\n`; - `alloc_limit .req r9\n`; + `alloc_limit .req r10\n`; let lbl_begin = Compilenv.make_symbol (Some "data_begin") in ` .data\n`; ` .global {emit_symbol lbl_begin}\n`; diff --git a/asmcomp/arm/proc.ml b/asmcomp/arm/proc.ml index ae0f4c12..06b085b4 100644 --- a/asmcomp/arm/proc.ml +++ b/asmcomp/arm/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the ARM processor *) @@ -27,73 +27,57 @@ let word_addressed = false (* Registers available for register allocation *) (* Register map: - r0 - r7 general purpose (r4 - r7 preserved by C) - r8 allocation pointer (preserved by C) - r9 allocation limit (preserved by C) - r10 general purpose - r11 trap pointer (preserved by C) - r12 general purpose + r0 - r3 general purpose (not preserved by C) + r4 - r7 general purpose (preserved) + r8 allocation pointer (preserved) + r9 platform register, usually reserved + r10 allocation limit (preserved) + r11 trap pointer (preserved) + r12 general purpose (not preserved by C) r13 stack pointer r14 return address r15 program counter - - f0 - f6 general purpose (f4 - f6 preserved by C) - f7 temporary *) let int_reg_name = [| - "r0"; "r1"; "r2"; "r3"; "r4"; "r5"; "r6"; "r7"; "r10"; "r12" -|] - -let float_reg_name = [| - "f0"; "f1"; "f2"; "f3"; "f4"; "f5"; "f6" + "r0"; "r1"; "r2"; "r3"; "r4"; "r5"; "r6"; "r7"; "r12" |] -let num_register_classes = 2 +let num_register_classes = 1 -let register_class r = - match r.typ with - Int -> 0 - | Addr -> 0 - | Float -> 1 +let register_class r = assert (r.typ <> Float); 0 -let num_available_registers = [| 10; 7 |] +let num_available_registers = [| 9 |] -let first_available_register = [| 0; 100 |] +let first_available_register = [| 0 |] -let register_name r = - if r < 100 then int_reg_name.(r) else float_reg_name.(r - 100) +let register_name r = int_reg_name.(r) let rotate_registers = true (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.create 10 Reg.dummy in - for i = 0 to 9 do v.(i) <- Reg.at_location Int (Reg i) done; + let v = Array.create 9 Reg.dummy in + for i = 0 to 8 do v.(i) <- Reg.at_location Int (Reg i) done; v -let hard_float_reg = - let v = Array.create 7 Reg.dummy in - for i = 0 to 6 do v.(i) <- Reg.at_location Float (Reg(100 + i)) done; - v - -let all_phys_regs = - Array.append hard_int_reg hard_float_reg +let all_phys_regs = hard_int_reg -let phys_reg n = - if n < 100 then hard_int_reg.(n) else hard_float_reg.(n - 100) +let phys_reg n = all_phys_regs.(n) let stack_slot slot ty = + assert (ty <> Float); Reg.at_location ty (Stack slot) (* Calling conventions *) -let calling_conventions first_int last_int first_float last_float - make_stack arg = +(* XXX float types have already been expanded into pairs of integers. + So we cannot align these floats. See if that causes a problem. *) + +let calling_conventions first_int last_int make_stack arg = let loc = Array.create (Array.length arg) Reg.dummy in let int = ref first_int in - let float = ref first_float in let ofs = ref 0 in for i = 0 to Array.length arg - 1 do match arg.(i).typ with @@ -106,69 +90,37 @@ let calling_conventions first_int last_int first_float last_float ofs := !ofs + size_int end | Float -> - if !float <= last_float then begin - loc.(i) <- phys_reg !float; - incr float - end else begin - loc.(i) <- stack_slot (make_stack !ofs) Float; - ofs := !ofs + size_float - end + assert false done; - (loc, !ofs) + (loc, Misc.align !ofs 8) let incoming ofs = Incoming ofs let outgoing ofs = Outgoing ofs let not_supported ofs = fatal_error "Proc.loc_results: cannot call" let loc_arguments arg = - calling_conventions 0 7 100 103 outgoing arg + calling_conventions 0 7 outgoing arg let loc_parameters arg = - let (loc, ofs) = calling_conventions 0 7 100 103 incoming arg in loc + let (loc, ofs) = calling_conventions 0 7 incoming arg in loc let loc_results res = - let (loc, ofs) = calling_conventions 0 7 100 103 not_supported res in loc - -(* Calling conventions for C are as for Caml, except that float arguments - are passed in pairs of integer registers. *) + let (loc, ofs) = calling_conventions 0 7 not_supported res in loc let loc_external_arguments arg = - let loc = Array.create (Array.length arg) Reg.dummy in - let reg = ref 0 in - let ofs = ref 0 in - for i = 0 to Array.length arg - 1 do - match arg.(i).typ with - Int | Addr as ty -> - if !reg <= 3 then begin - loc.(i) <- phys_reg !reg; - incr reg - end else begin - loc.(i) <- stack_slot (outgoing !ofs) ty; - ofs := !ofs + size_int - end - | Float -> - if !reg <= 2 then begin - loc.(i) <- phys_reg !reg; - reg := !reg + 2 - end else begin - loc.(i) <- stack_slot (outgoing !ofs) Float; - ofs := !ofs + size_float - end - done; - (loc, !ofs) - + calling_conventions 0 3 outgoing arg let loc_external_results res = - let (loc, ofs) = calling_conventions 0 0 100 100 not_supported res in loc + let (loc, ofs) = calling_conventions 0 1 not_supported res in loc let loc_exn_bucket = phys_reg 0 (* Registers destroyed by operations *) -let destroyed_at_c_call = (* r4-r9, f4-f6 preserved *) - Array.of_list(List.map phys_reg [0;1;2;3;8;9; 100;101;102;103]) +let destroyed_at_c_call = (* r4-r7 preserved *) + Array.of_list(List.map phys_reg [0;1;2;3;8]) let destroyed_at_oper = function Iop(Icall_ind | Icall_imm _ | Iextcall(_, true)) -> all_phys_regs | Iop(Iextcall(_, false)) -> destroyed_at_c_call - | Iop(Ialloc(_)) -> [|phys_reg 8|] (* r10 destroyed *) + | Iop(Ialloc(_)) -> [|phys_reg 8|] (* r12 destroyed *) | _ -> [||] let destroyed_at_raise = all_phys_regs @@ -177,14 +129,14 @@ let destroyed_at_raise = all_phys_regs let safe_register_pressure = function Iextcall(_, _) -> 4 - | _ -> 7 + | _ -> 9 let max_register_pressure = function - Iextcall(_, _) -> [| 4; 4 |] - | _ -> [| 10; 7 |] + Iextcall(_, _) -> [| 4 |] + | _ -> [| 9 |] (* Layout of the stack *) -let num_stack_slots = [| 0; 0 |] +let num_stack_slots = [| 0 |] let contains_calls = ref false (* Calling the assembler *) diff --git a/asmcomp/arm/reload.ml b/asmcomp/arm/reload.ml index 09174387..65d81181 100644 --- a/asmcomp/arm/reload.ml +++ b/asmcomp/arm/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Reloading for the ARM *) diff --git a/asmcomp/arm/scheduling.ml b/asmcomp/arm/scheduling.ml index 930e1bc2..8f49ad1e 100644 --- a/asmcomp/arm/scheduling.ml +++ b/asmcomp/arm/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) open Mach diff --git a/asmcomp/arm/selection.ml b/asmcomp/arm/selection.ml index 929f0347..ded233ed 100644 --- a/asmcomp/arm/selection.ml +++ b/asmcomp/arm/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Instruction selection for the ARM processor *) @@ -18,6 +18,7 @@ open Misc open Cmm open Reg open Arch +open Proc open Mach (* Immediate operands are 8-bit immediate values, zero-extended, and rotated @@ -39,11 +40,32 @@ let is_offset n = n < 256 && n > -256 let is_intconst = function Cconst_int n -> true | _ -> false +(* Soft emulation of float comparisons *) + +let float_comparison_function = function + | Ceq -> "__eqdf2" + | Cne -> "__nedf2" + | Clt -> "__ltdf2" + | Cle -> "__ledf2" + | Cgt -> "__gtdf2" + | Cge -> "__gedf2" + (* Instruction selection *) class selector = object(self) inherit Selectgen.selector_generic as super +method regs_for tyv = + (* Expand floats into pairs of integer registers *) + let nty = Array.length tyv in + let rec expand i = + if i >= nty then [] else begin + match tyv.(i) with + | Float -> Int :: Int :: expand (i+1) + | ty -> ty :: expand (i+1) + end in + Reg.createv (Array.of_list (expand 0)) + method is_immediate n = n land 0xFF = n || is_immed n 2 @@ -114,19 +136,65 @@ method select_operation op args = | _ -> super#select_operation op args end + (* Turn floating-point operations into library function calls *) + | Caddf -> (Iextcall("__adddf3", false), args) + | Csubf -> (Iextcall("__subdf3", false), args) + | Cmulf -> (Iextcall("__muldf3", false), args) + | Cdivf -> (Iextcall("__divdf3", false), args) + | Cfloatofint -> (Iextcall("__floatsidf", false), args) + | Cintoffloat -> (Iextcall("__fixdfsi", false), args) + | Ccmpf comp -> + (Iintop_imm(Icomp(Isigned comp), 0), + [Cop(Cextcall(float_comparison_function comp, + typ_int, false, Debuginfo.none), + args)]) + (* Add coercions around loads and stores of 32-bit floats *) + | Cload Single -> + (Iextcall("__extendsdfd2", false), [Cop(Cload Word, args)]) + | Cstore Single -> + begin match args with + | [arg1; arg2] -> + let arg2' = + Cop(Cextcall("__truncdfsd2", typ_int, false, Debuginfo.none), + [arg2]) in + self#select_operation (Cstore Word) [arg1; arg2'] + | _ -> assert false + end + (* Other operations are regular *) | _ -> super#select_operation op args -(* In mul rd, rm, rs, the registers rm and rd must be different. +method select_condition = function + | Cop(Ccmpf cmp, args) -> + (Iinttest_imm(Isigned cmp, 0), + Cop(Cextcall(float_comparison_function cmp, + typ_int, false, Debuginfo.none), + args)) + | expr -> + super#select_condition expr + +(* Deal with some register irregularities: + +1- In mul rd, rm, rs, the registers rm and rd must be different. We deal with this by pretending that rm is also a result of the mul - operation. *) + operation. + +2- For Inegf and Iabsf, force arguments and results in (r0, r1); + this simplifies code generation later. +*) method insert_op_debug op dbg rs rd = - if op = Iintop(Imul) then begin - self#insert_debug (Iop op) dbg rs [| rd.(0); rs.(0) |]; rd - end else - super#insert_op_debug op dbg rs rd + match op with + | Iintop(Imul) -> + self#insert_debug (Iop op) dbg rs [| rd.(0); rs.(0) |]; rd + | Iabsf | Inegf -> + let r = [| phys_reg 0; phys_reg 1 |] in + self#insert_moves rs r; + self#insert_debug (Iop op) dbg r r; + self#insert_moves r rd; + rd + | _ -> + super#insert_op_debug op dbg rs rd end let fundecl f = (new selector)#emit_fundecl f - diff --git a/asmcomp/asmgen.ml b/asmcomp/asmgen.ml index 0fa0d9fb..9cdf61f4 100644 --- a/asmcomp/asmgen.ml +++ b/asmcomp/asmgen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmgen.ml 8930 2008-07-24 05:35:22Z frisch $ *) +(* $Id$ *) (* From lambda to assembly code *) @@ -90,7 +90,7 @@ let compile_genfuns ppf f = List.iter (function | (Cfunction {fun_name = name}) as ph when f name -> - compile_phrase ppf ph + compile_phrase ppf ph | _ -> ()) (Cmmgen.generic_functions true [Compilenv.current_unit_infos ()]) diff --git a/asmcomp/asmgen.mli b/asmcomp/asmgen.mli index 19a79c84..fe578bd4 100644 --- a/asmcomp/asmgen.mli +++ b/asmcomp/asmgen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmgen.mli 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) (* From lambda to assembly code *) diff --git a/asmcomp/asmlibrarian.ml b/asmcomp/asmlibrarian.ml index 68f8b2f0..d54d8929 100644 --- a/asmcomp/asmlibrarian.ml +++ b/asmcomp/asmlibrarian.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmlibrarian.ml 7079 2005-09-24 16:45:56Z xleroy $ *) +(* $Id$ *) (* Build libraries of .cmx files *) @@ -71,4 +71,3 @@ let report_error ppf = function fprintf ppf "Cannot find file %s" name | Archiver_error name -> fprintf ppf "Error while creating the library %s" name - diff --git a/asmcomp/asmlibrarian.mli b/asmcomp/asmlibrarian.mli index 0224d89a..66f6a127 100644 --- a/asmcomp/asmlibrarian.mli +++ b/asmcomp/asmlibrarian.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmlibrarian.mli 3123 2000-04-21 08:13:22Z weis $ *) +(* $Id$ *) (* Build libraries of .cmx files *) diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index b4e2ab9c..c1b03106 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmlink.ml 9338 2009-09-16 14:03:37Z garrigue $ *) +(* $Id$ *) (* Link a set of .cmx/.o files and produce an executable *) diff --git a/asmcomp/asmlink.mli b/asmcomp/asmlink.mli index 301e9203..2070c815 100644 --- a/asmcomp/asmlink.mli +++ b/asmcomp/asmlink.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmlink.mli 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) (* Link a set of .cmx/.o files and produce an executable or a plugin *) diff --git a/asmcomp/asmpackager.ml b/asmcomp/asmpackager.ml index 8be1521c..cb757efc 100644 --- a/asmcomp/asmpackager.ml +++ b/asmcomp/asmpackager.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmpackager.ml 8523 2007-11-15 16:09:57Z frisch $ *) +(* $Id$ *) (* "Package" a set of .cmx/.o files into one .cmx/.o file having the original compilation units as sub-modules. *) @@ -83,10 +83,10 @@ let make_package_object ppf members targetobj targetname coercion = let objtemp = if !Clflags.keep_asm_file then chop_extension_if_any targetobj ^ ".pack" ^ Config.ext_obj - else + else (* Put the full name of the module in the temporary file name - to avoid collisions with MSVC's link /lib in case of successive - packs *) + to avoid collisions with MSVC's link /lib in case of successive + packs *) Filename.temp_file (Compilenv.make_symbol (Some "")) Config.ext_obj in let components = List.map diff --git a/asmcomp/asmpackager.mli b/asmcomp/asmpackager.mli index 9d47e851..7d0bb588 100644 --- a/asmcomp/asmpackager.mli +++ b/asmcomp/asmpackager.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asmpackager.mli 7003 2005-08-01 15:51:09Z xleroy $ *) +(* $Id$ *) (* "Package" a set of .cmx/.o files into one .cmx/.o file having the original compilation units as sub-modules. *) diff --git a/asmcomp/clambda.ml b/asmcomp/clambda.ml index ec836be1..5e31c3bb 100644 --- a/asmcomp/clambda.ml +++ b/asmcomp/clambda.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: clambda.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* A variant of the "lambda" code with direct / indirect calls explicit and closures explicit too *) diff --git a/asmcomp/clambda.mli b/asmcomp/clambda.mli index 82d35600..724490c5 100644 --- a/asmcomp/clambda.mli +++ b/asmcomp/clambda.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: clambda.mli 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* A variant of the "lambda" code with direct / indirect calls explicit and closures explicit too *) diff --git a/asmcomp/closure.ml b/asmcomp/closure.ml index 544772a6..7524fb4e 100644 --- a/asmcomp/closure.ml +++ b/asmcomp/closure.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: closure.ml 8966 2008-08-01 12:52:14Z xleroy $ *) +(* $Id$ *) (* Introduction of closures, uncurrying, recognition of direct calls *) diff --git a/asmcomp/closure.mli b/asmcomp/closure.mli index f0decfcf..f1637906 100644 --- a/asmcomp/closure.mli +++ b/asmcomp/closure.mli @@ -10,9 +10,8 @@ (* *) (***********************************************************************) -(* $Id: closure.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Introduction of closures, uncurrying, recognition of direct calls *) val intro: int -> Lambda.lambda -> Clambda.ulambda - diff --git a/asmcomp/cmm.ml b/asmcomp/cmm.ml index 234da9fa..68625e24 100644 --- a/asmcomp/cmm.ml +++ b/asmcomp/cmm.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cmm.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) type machtype_component = Addr @@ -129,4 +129,3 @@ type data_item = type phrase = Cfunction of fundecl | Cdata of data_item list - diff --git a/asmcomp/cmm.mli b/asmcomp/cmm.mli index 79b00697..1b090716 100644 --- a/asmcomp/cmm.mli +++ b/asmcomp/cmm.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cmm.mli 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Second intermediate language (machine independent) *) @@ -115,4 +115,3 @@ type data_item = type phrase = Cfunction of fundecl | Cdata of data_item list - diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index f17bdd40..b1dde74c 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cmmgen.ml 9167 2009-01-26 17:06:10Z xleroy $ *) +(* $Id$ *) (* Translation from closed lambda to C-- *) @@ -52,14 +52,18 @@ let floatarray_header len = block_header Obj.double_array_tag (len * size_float / size_addr) let string_header len = block_header Obj.string_tag ((len + size_addr) / size_addr) -let boxedint_header = block_header Obj.custom_tag 2 +let boxedint32_header = block_header Obj.custom_tag 2 +let boxedint64_header = block_header Obj.custom_tag (1 + 8 / size_addr) +let boxedintnat_header = block_header Obj.custom_tag 2 let alloc_block_header tag sz = Cconst_natint(block_header tag sz) let alloc_float_header = Cconst_natint(float_header) let alloc_floatarray_header len = Cconst_natint(floatarray_header len) let alloc_closure_header sz = Cconst_natint(closure_header sz) let alloc_infix_header ofs = Cconst_natint(infix_header ofs) -let alloc_boxedint_header = Cconst_natint(boxedint_header) +let alloc_boxedint32_header = Cconst_natint(boxedint32_header) +let alloc_boxedint64_header = Cconst_natint(boxedint64_header) +let alloc_boxedintnat_header = Cconst_natint(boxedintnat_header) (* Integers *) @@ -461,6 +465,12 @@ let operations_boxed_int bi = | Pint32 -> "caml_int32_ops" | Pint64 -> "caml_int64_ops" +let alloc_header_boxed_int bi = + match bi with + Pnativeint -> alloc_boxedintnat_header + | Pint32 -> alloc_boxedint32_header + | Pint64 -> alloc_boxedint64_header + let box_int bi arg = match arg with Cconst_int n -> @@ -472,7 +482,7 @@ let box_int bi arg = if bi = Pint32 && size_int = 8 && big_endian then Cop(Clsl, [arg; Cconst_int 32]) else arg in - Cop(Calloc, [alloc_boxedint_header; + Cop(Calloc, [alloc_header_boxed_int bi; Cconst_symbol(operations_boxed_int bi); arg']) @@ -1553,13 +1563,13 @@ let rec emit_constant symb cst cont = Cdefine_symbol symb :: emit_string_constant s cont | Const_base(Const_int32 n) -> - Cint(boxedint_header) :: Cdefine_symbol symb :: + Cint(boxedint32_header) :: Cdefine_symbol symb :: emit_boxed_int32_constant n cont | Const_base(Const_int64 n) -> - Cint(boxedint_header) :: Cdefine_symbol symb :: + Cint(boxedint64_header) :: Cdefine_symbol symb :: emit_boxed_int64_constant n cont | Const_base(Const_nativeint n) -> - Cint(boxedint_header) :: Cdefine_symbol symb :: + Cint(boxedintnat_header) :: Cdefine_symbol symb :: emit_boxed_nativeint_constant n cont | Const_block(tag, fields) -> let (emit_fields, cont1) = emit_constant_fields fields cont in @@ -1609,17 +1619,17 @@ and emit_constant_field field cont = | Const_base(Const_int32 n) -> let lbl = new_const_label() in (Clabel_address lbl, - Cint(boxedint_header) :: Cdefine_label lbl :: + Cint(boxedint32_header) :: Cdefine_label lbl :: emit_boxed_int32_constant n cont) | Const_base(Const_int64 n) -> let lbl = new_const_label() in (Clabel_address lbl, - Cint(boxedint_header) :: Cdefine_label lbl :: + Cint(boxedint64_header) :: Cdefine_label lbl :: emit_boxed_int64_constant n cont) | Const_base(Const_nativeint n) -> let lbl = new_const_label() in (Clabel_address lbl, - Cint(boxedint_header) :: Cdefine_label lbl :: + Cint(boxedintnat_header) :: Cdefine_label lbl :: emit_boxed_nativeint_constant n cont) | Const_pointer n -> (Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n), @@ -1950,9 +1960,9 @@ let generic_functions shared units = let (apply,send,curry) = List.fold_left (fun (apply,send,curry) ui -> - List.fold_right IntSet.add ui.Compilenv.ui_apply_fun apply, - List.fold_right IntSet.add ui.Compilenv.ui_send_fun send, - List.fold_right IntSet.add ui.Compilenv.ui_curry_fun curry) + List.fold_right IntSet.add ui.Compilenv.ui_apply_fun apply, + List.fold_right IntSet.add ui.Compilenv.ui_send_fun send, + List.fold_right IntSet.add ui.Compilenv.ui_curry_fun curry) (IntSet.empty,IntSet.empty,IntSet.empty) units in let apply = if shared then apply else IntSet.union apply default_apply in @@ -2071,7 +2081,7 @@ let plugin_header units = crc = crc; imports_cmi = ui.Compilenv.ui_imports_cmi; imports_cmx = ui.Compilenv.ui_imports_cmx; - defines = ui.Compilenv.ui_defines + defines = ui.Compilenv.ui_defines } in global_data "caml_plugin_header" { magic = dyn_magic_number; units = List.map mk units } diff --git a/asmcomp/cmmgen.mli b/asmcomp/cmmgen.mli index 4f5efc20..bd3d9acf 100644 --- a/asmcomp/cmmgen.mli +++ b/asmcomp/cmmgen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cmmgen.mli 8800 2008-01-31 09:13:19Z frisch $ *) +(* $Id$ *) (* Translation from closed lambda to C-- *) @@ -23,7 +23,7 @@ val generic_functions: bool -> Compilenv.unit_infos list -> Cmm.phrase list val entry_point: string list -> Cmm.phrase val global_table: string list -> Cmm.phrase val reference_symbols: string list -> Cmm.phrase -val globals_map: (string * Digest.t * Digest.t * string list) list -> +val globals_map: (string * Digest.t * Digest.t * string list) list -> Cmm.phrase val frame_table: string list -> Cmm.phrase val data_segment_table: string list -> Cmm.phrase diff --git a/asmcomp/codegen.ml b/asmcomp/codegen.ml index 2d9d750d..280f1394 100644 --- a/asmcomp/codegen.ml +++ b/asmcomp/codegen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: codegen.ml 3123 2000-04-21 08:13:22Z weis $ *) +(* $Id$ *) (* From C-- to assembly code *) @@ -39,7 +39,7 @@ let rec regalloc fd = let (newfd, redo_regalloc) = Reload.fundecl fd in if !dump_reload then Printmach.phase "After insertion of reloading code" newfd; - if redo_regalloc + if redo_regalloc then begin Reg.reinit(); Liveness.fundecl newfd; regalloc newfd end else newfd @@ -95,7 +95,3 @@ let file filename = close_in ic; Parsecmmaux.report_error msg | x -> close_in ic; raise x - - - - diff --git a/asmcomp/codegen.mli b/asmcomp/codegen.mli index 06378ab0..b6d8caa6 100644 --- a/asmcomp/codegen.mli +++ b/asmcomp/codegen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: codegen.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* From C-- to assembly code *) diff --git a/asmcomp/coloring.ml b/asmcomp/coloring.ml index 64b5ea5f..37c03a05 100644 --- a/asmcomp/coloring.ml +++ b/asmcomp/coloring.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: coloring.ml 6592 2004-08-12 13:34:42Z xleroy $ *) +(* $Id$ *) (* Register allocation by coloring of the interference graph *) @@ -50,7 +50,7 @@ let find_degree reg = let cl = Proc.register_class reg in let avail_regs = Proc.num_available_registers.(cl) in if avail_regs = 0 then - (* Don't bother computing the degree if there are no regs + (* Don't bother computing the degree if there are no regs in this class *) unconstrained := Reg.Set.add reg !unconstrained else begin @@ -131,7 +131,7 @@ let iter_preferred f reg = List.iter (fun (r, w) -> walk r w) reg.prefer; reg.visited <- false -(* Where to start the search for a suitable register. +(* Where to start the search for a suitable register. Used to introduce some "randomness" in the choice between registers with equal scores. This offers more opportunities for scheduling. *) diff --git a/asmcomp/coloring.mli b/asmcomp/coloring.mli index c92fd41b..cbfb2d6c 100644 --- a/asmcomp/coloring.mli +++ b/asmcomp/coloring.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: coloring.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Register allocation by coloring of the interference graph *) diff --git a/asmcomp/comballoc.ml b/asmcomp/comballoc.ml index b62a1b05..5a862b17 100644 --- a/asmcomp/comballoc.ml +++ b/asmcomp/comballoc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: comballoc.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Combine heap allocations occurring in the same basic block *) diff --git a/asmcomp/comballoc.mli b/asmcomp/comballoc.mli index d6d72f58..329e9276 100644 --- a/asmcomp/comballoc.mli +++ b/asmcomp/comballoc.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: comballoc.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Combine heap allocations occurring in the same basic block *) diff --git a/asmcomp/compilenv.ml b/asmcomp/compilenv.ml index 64171f88..2bf4b6ec 100644 --- a/asmcomp/compilenv.ml +++ b/asmcomp/compilenv.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: compilenv.ml 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) (* Compilation environments for compilation units *) @@ -179,7 +179,7 @@ let record_global_approx_toplevel id = let global_approx id = if Ident.is_predef_exn id then Value_unknown else try Hashtbl.find toplevel_approx (Ident.name id) - with Not_found -> + with Not_found -> match get_global_info id with | None -> Value_unknown | Some ui -> ui.ui_approx @@ -240,4 +240,3 @@ let report_error ppf = function fprintf ppf "Corrupted compilation unit description@ %s" filename | Illegal_renaming(modname, filename) -> fprintf ppf "%s@ contains the description for unit@ %s" filename modname - diff --git a/asmcomp/compilenv.mli b/asmcomp/compilenv.mli index 5bf8b165..74120f4c 100644 --- a/asmcomp/compilenv.mli +++ b/asmcomp/compilenv.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: compilenv.mli 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) (* Compilation environments for compilation units *) @@ -106,5 +106,3 @@ type error = exception Error of error val report_error: Format.formatter -> error -> unit - - diff --git a/asmcomp/debuginfo.ml b/asmcomp/debuginfo.ml index 84390442..a7124e17 100644 --- a/asmcomp/debuginfo.ml +++ b/asmcomp/debuginfo.ml @@ -33,7 +33,7 @@ let none = { let to_string d = if d == none - then "" + then "" else Printf.sprintf "{%s:%d,%d-%d}" d.dinfo_file d.dinfo_line d.dinfo_char_start d.dinfo_char_end diff --git a/asmcomp/debuginfo.mli b/asmcomp/debuginfo.mli index 151cd0ab..c3c9c406 100644 --- a/asmcomp/debuginfo.mli +++ b/asmcomp/debuginfo.mli @@ -28,4 +28,3 @@ val from_location: kind -> Location.t -> t val from_call: Lambda.lambda_event -> t val from_raise: Lambda.lambda_event -> t - diff --git a/asmcomp/emit.mli b/asmcomp/emit.mli index 57b0066f..ab7657af 100644 --- a/asmcomp/emit.mli +++ b/asmcomp/emit.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Generation of assembly code *) diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 0cae6ddb..d4db78ad 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitaux.ml 9314 2009-07-15 12:14:39Z xleroy $ *) +(* $Id$ *) (* Common functions for emitting assembly code *) @@ -138,7 +138,7 @@ let emit_frames a = let filenames = Hashtbl.create 7 in let lbl_filenames = ref 200000 in let label_filename name = - try + try Hashtbl.find filenames name with Not_found -> let lbl = !lbl_filenames in @@ -165,7 +165,7 @@ let emit_frames a = Int64.add (Int64.shift_left (Int64.of_int char_end) 26) (Int64.of_int kind))) in a.efa_label_rel - (label_filename d.dinfo_file) + (label_filename d.dinfo_file) (Int64.to_int32 info); a.efa_32 (Int64.to_int32 (Int64.shift_right info 32)) end in @@ -189,4 +189,3 @@ let is_generic_function name = List.exists (fun p -> isprefix p name) ["caml_apply"; "caml_curry"; "caml_send"; "caml_tuplify"] - diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index 88eac2f5..4f666be7 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitaux.mli 9314 2009-07-15 12:14:39Z xleroy $ *) +(* $Id$ *) (* Common functions for emitting assembly code *) diff --git a/asmcomp/hppa/arch.ml b/asmcomp/hppa/arch.ml index 33804321..eb2e1938 100644 --- a/asmcomp/hppa/arch.ml +++ b/asmcomp/hppa/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 5304 2002-11-29 15:03:37Z xleroy $ *) +(* $Id$ *) (* Specific operations for the HP PA-RISC processor *) @@ -71,4 +71,3 @@ let print_specific_operation printreg op ppf arg = | Ishift1add -> fprintf ppf "%a << 1 + %a" printreg arg.(0) printreg arg.(1) | Ishift2add -> fprintf ppf "%a << 2 + %a" printreg arg.(0) printreg arg.(1) | Ishift3add -> fprintf ppf "%a << 3 + %a" printreg arg.(0) printreg arg.(1) - diff --git a/asmcomp/hppa/emit.mlp b/asmcomp/hppa/emit.mlp index e6bf5a7d..b697a335 100644 --- a/asmcomp/hppa/emit.mlp +++ b/asmcomp/hppa/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9475 2009-12-16 10:04:38Z xleroy $ *) +(* $Id$ *) (* Emission of HP PA-RISC assembly code *) @@ -137,7 +137,7 @@ let emit_imports () = let is_offset n = (n < 8192) && (n >= -8192) (* 14 bits *) -let is_offset_native n = +let is_offset_native n = n < Nativeint.of_int 8192 && n >= Nativeint.of_int (-8192) let emit_load instr addr arg dst = diff --git a/asmcomp/hppa/proc.ml b/asmcomp/hppa/proc.ml index 3debb291..c0b40adb 100644 --- a/asmcomp/hppa/proc.ml +++ b/asmcomp/hppa/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the HP PA-RISC processor *) @@ -40,18 +40,18 @@ open Mach %fr31 temporary *) let int_reg_name = [| - (* 0-4 *) "%r6"; "%r7"; "%r8"; "%r9"; "%r10"; + (* 0-4 *) "%r6"; "%r7"; "%r8"; "%r9"; "%r10"; (* 5-10 *) "%r11"; "%r12"; "%r13"; "%r14"; "%r15"; "%r16"; - (* 11-16 *) "%r17"; "%r18"; "%r19"; "%r20"; "%r21"; "%r22"; + (* 11-16 *) "%r17"; "%r18"; "%r19"; "%r20"; "%r21"; "%r22"; (* 17-20 *) "%r23"; "%r24"; "%r25"; "%r26"; (* 21-22 *) "%r28"; "%r29" |] - + let float_reg_name = [| (* 100-105 *) "%fr4"; "%fr5"; "%fr6"; "%fr7"; "%fr8"; "%fr9"; (* 106-111 *) "%fr10"; "%fr11"; "%fr12"; "%fr13"; "%fr14"; "%fr15"; (* 112-117 *) "%fr16"; "%fr17"; "%fr18"; "%fr19"; "%fr20"; "%fr21"; - (* 118-123 *) "%fr22"; "%fr23"; "%fr24"; "%fr25"; "%fr26"; "%fr27"; + (* 118-123 *) "%fr22"; "%fr23"; "%fr24"; "%fr25"; "%fr26"; "%fr27"; (* 124-127 *) "%fr28"; "%fr29"; "%fr30"; "%fr31" |] @@ -141,7 +141,7 @@ let loc_results res = let (loc, ofs) = calling_conventions 20 13 100 107 not_supported res in loc (* Calling C functions: - when all arguments are integers, use %r26 - %r23, + when all arguments are integers, use %r26 - %r23, then -52(%r30), -56(%r30), etc. When some arguments are floats, we handle a couple of cases by hand and fail otherwise. *) @@ -218,7 +218,7 @@ let contains_calls = ref false let assemble_file infile outfile = Ccomp.command (Config.asm ^ " -o " ^ - Filename.quote outfile ^ " " ^ Filename.quote infile) + Filename.quote outfile ^ " " ^ Filename.quote infile) open Clflags;; open Config;; diff --git a/asmcomp/hppa/reload.ml b/asmcomp/hppa/reload.ml index 44371522..54208fcc 100644 --- a/asmcomp/hppa/reload.ml +++ b/asmcomp/hppa/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Reloading for the HPPA *) diff --git a/asmcomp/hppa/scheduling.ml b/asmcomp/hppa/scheduling.ml index 8d2ed7cc..0cdd0998 100644 --- a/asmcomp/hppa/scheduling.ml +++ b/asmcomp/hppa/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Instruction scheduling for the HPPA *) diff --git a/asmcomp/hppa/selection.ml b/asmcomp/hppa/selection.ml index 67e9c0c9..a13b5271 100644 --- a/asmcomp/hppa/selection.ml +++ b/asmcomp/hppa/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Instruction selection for the HPPA processor *) @@ -69,7 +69,7 @@ method select_operation op args = Cand, Cor, Cxor : never *) | (Cmuli, ([arg1; Cconst_int n] as args)) -> let l = Misc.log2 n in - if n = 1 lsl l + if n = 1 lsl l then (Iintop_imm(Ilsl, l), [arg1]) else (Iintop Imul, args) | (Cmuli, ([Cconst_int n; arg1] as args)) -> diff --git a/asmcomp/i386/arch.ml b/asmcomp/i386/arch.ml index 5bc296e7..04d673d9 100644 --- a/asmcomp/i386/arch.ml +++ b/asmcomp/i386/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 7382 2006-04-16 23:28:22Z doligez $ *) +(* $Id$ *) (* Machine-specific command-line options *) @@ -144,11 +144,10 @@ let print_specific_operation printreg op ppf arg = if i > 0 then fprintf ppf ", "; printreg ppf arg.(i) done - + (* Stack alignment constraints *) let stack_alignment = match Config.system with | "macosx" -> 16 | _ -> 4 - diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index 2992f29c..5d4802fa 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9475 2009-12-16 10:04:38Z xleroy $ *) +(* $Id$ *) (* Emission of Intel 386 assembly code *) @@ -98,7 +98,7 @@ let use_ascii_dir = "solaris" -> false | _ -> true -(* MacOSX has its own way to reference symbols potentially defined in +(* MacOSX has its own way to reference symbols potentially defined in shared objects *) let macosx = @@ -987,7 +987,7 @@ let end_assembly() = efa_label_rel = (fun lbl ofs -> ` .long {emit_label lbl} - . + {emit_int32 ofs}\n`); efa_def_label = (fun l -> `{emit_label l}:\n`); - efa_string = (fun s -> + efa_string = (fun s -> let s = s ^ "\000" in if use_ascii_dir then emit_string_directive " .ascii " s diff --git a/asmcomp/i386/emit_nt.mlp b/asmcomp/i386/emit_nt.mlp index d75a60f3..da1606e4 100644 --- a/asmcomp/i386/emit_nt.mlp +++ b/asmcomp/i386/emit_nt.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit_nt.mlp 9189 2009-03-21 16:15:47Z xleroy $ *) +(* $Id$ *) (* Emission of Intel 386 assembly code, MASM syntax. *) @@ -49,7 +49,7 @@ let slot_offset loc cl = | Outgoing n -> assert (n >= 0); n -(* Record symbols used and defined - at the end generate extern for those +(* Record symbols used and defined - at the end generate extern for those used but not defined *) let symbols_defined = ref StringSet.empty @@ -74,7 +74,7 @@ let emit_label lbl = (* Output an align directive. *) let emit_align n = ` ALIGN {emit_int n}\n` - + (* Output a pseudo-register *) let emit_reg = function @@ -257,7 +257,7 @@ let name_for_cond_branch = function | Iunsigned Ceq -> "e" | Iunsigned Cne -> "ne" | Iunsigned Cle -> "be" | Iunsigned Cgt -> "a" | Iunsigned Clt -> "b" | Iunsigned Cge -> "ae" - + (* Output an = 0 or <> 0 test. *) let output_test_zero arg = @@ -687,7 +687,7 @@ let emit_instr i = ` cmp {emit_reg i.arg.(0)},{emit_reg i.arg.(1)}\n`; let b = name_for_cond_branch cmp in ` j{emit_string b} {emit_label lbl}\n` - | Iinttest_imm((Isigned Ceq | Isigned Cne | + | Iinttest_imm((Isigned Ceq | Isigned Cne | Iunsigned Ceq | Iunsigned Cne) as cmp, 0) -> output_test_zero i.arg.(0); let b = name_for_cond_branch cmp in diff --git a/asmcomp/i386/proc.ml b/asmcomp/i386/proc.ml index 0b802c4b..d2e3cdda 100644 --- a/asmcomp/i386/proc.ml +++ b/asmcomp/i386/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the Intel 386 processor *) diff --git a/asmcomp/i386/proc_nt.ml b/asmcomp/i386/proc_nt.ml index 0489cd6c..5e617ff1 100644 --- a/asmcomp/i386/proc_nt.ml +++ b/asmcomp/i386/proc_nt.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc_nt.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Description of the Intel 386 processor, for Windows NT *) @@ -183,4 +183,4 @@ let contains_calls = ref false let assemble_file infile outfile = Ccomp.command (Config.asm ^ Filename.quote outfile ^ " " ^ Filename.quote infile ^ - (if !Clflags.verbose then "" else ">NUL")) + (if !Clflags.verbose then "" else ">NUL")) diff --git a/asmcomp/i386/reload.ml b/asmcomp/i386/reload.ml index 57e45cb7..539d45da 100644 --- a/asmcomp/i386/reload.ml +++ b/asmcomp/i386/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) open Cmm open Arch @@ -28,7 +28,7 @@ class reload = object (self) inherit Reloadgen.reload_generic as super -method makereg r = +method! makereg r = match r.typ with Float -> r | _ -> super#makereg r @@ -37,7 +37,7 @@ method makereg r = will never be reloaded. Hence there is no need to make special cases for floating-point operations. *) -method reload_operation op arg res = +method! reload_operation op arg res = match op with Iintop(Iadd|Isub|Iand|Ior|Ixor|Icomp _|Icheckbound) -> (* One of the two arguments can reside in the stack *) @@ -66,7 +66,7 @@ method reload_operation op arg res = | _ -> (* Other operations: all args and results in registers *) super#reload_operation op arg res -method reload_test tst arg = +method! reload_test tst arg = match tst with Iinttest cmp -> (* One of the two arguments can reside on stack *) diff --git a/asmcomp/i386/scheduling.ml b/asmcomp/i386/scheduling.ml index 61a107ea..6f018cc8 100644 --- a/asmcomp/i386/scheduling.ml +++ b/asmcomp/i386/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 2779 2000-02-04 12:43:18Z xleroy $ *) +(* $Id$ *) open Schedgen (* to create a dependency *) diff --git a/asmcomp/i386/selection.ml b/asmcomp/i386/selection.ml index 1515592b..5a8720fb 100644 --- a/asmcomp/i386/selection.ml +++ b/asmcomp/i386/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Instruction selection for the Intel x86 *) @@ -72,7 +72,7 @@ let rec select_addr exp = end | arg -> (Alinear arg, 0) - + (* C functions to be turned into Ifloatspecial instructions if -ffast-math *) let inline_float_ops = @@ -159,7 +159,7 @@ inherit Selectgen.selector_generic as super method is_immediate (n : int) = true -method is_simple_expr e = +method! is_simple_expr e = match e with | Cop(Cextcall(fn, _, alloc, _), args) when !fast_math && List.mem fn inline_float_ops -> @@ -181,7 +181,7 @@ method select_addressing exp = | (Ascaledadd(e1, e2, scale), d) -> (Iindexed2scaled(scale, d), Ctuple[e1; e2]) -method select_store addr exp = +method! select_store addr exp = match exp with Cconst_int n -> (Ispecific(Istore_int(Nativeint.of_int n, addr)), Ctuple []) @@ -196,7 +196,7 @@ method select_store addr exp = | _ -> super#select_store addr exp -method select_operation op args = +method! select_operation op args = match op with (* Recognize the LEA instruction *) Caddi | Cadda | Csubi | Csuba -> @@ -269,7 +269,7 @@ method select_floatarith regular_op reversed_op mem_op mem_rev_op args = (* Deal with register constraints *) -method insert_op_debug op dbg rs rd = +method! insert_op_debug op dbg rs rd = try let (rsrc, rdst, move_res) = pseudoregs_for_operation op rs rd in self#insert_moves rs rsrc; @@ -282,7 +282,7 @@ method insert_op_debug op dbg rs rd = with Use_default -> super#insert_op_debug op dbg rs rd -method insert_op op rs rd = +method! insert_op op rs rd = self#insert_op_debug op Debuginfo.none rs rd (* Selection of push instructions for external calls *) @@ -302,7 +302,7 @@ method select_push exp = (Ispecific(Ipush_load_float addr), arg) | _ -> (Ispecific(Ipush), exp) -method emit_extcall_args env args = +method! emit_extcall_args env args = let rec size_pushes = function | [] -> 0 | e :: el -> Selectgen.size_expr env e + size_pushes el in @@ -310,7 +310,7 @@ method emit_extcall_args env args = let sz2 = Misc.align sz1 stack_alignment in let rec emit_pushes = function | [] -> - if sz2 > sz1 then + if sz2 > sz1 then self#insert (Iop (Istackoffset (sz2 - sz1))) [||] [||] | e :: el -> emit_pushes el; @@ -324,4 +324,3 @@ method emit_extcall_args env args = end let fundecl f = (new selector)#emit_fundecl f - diff --git a/asmcomp/ia64/arch.ml b/asmcomp/ia64/arch.ml index 3c2a4c85..77dddaca 100644 --- a/asmcomp/ia64/arch.ml +++ b/asmcomp/ia64/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 5304 2002-11-29 15:03:37Z xleroy $ *) +(* $Id$ *) (* Specific operations for the IA64 processor *) diff --git a/asmcomp/ia64/emit.mlp b/asmcomp/ia64/emit.mlp index 09a4de4b..3d8eeb97 100644 --- a/asmcomp/ia64/emit.mlp +++ b/asmcomp/ia64/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9314 2009-07-15 12:14:39Z xleroy $ *) +(* $Id$ *) (* Emission of IA64 assembly code *) @@ -347,7 +347,7 @@ let insimm opc arg imm res = for i = 0 to Array.length arg - 1 do Hashtbl.add code_uses arg.(i) node done; - (* Insert in appropriate queue *) + (* Insert in appropriate queue *) if node.instr.kind = KB then add_branch node else if node.ancestors = 0 then add_ready node @@ -359,7 +359,7 @@ let insert opc arg res = let rec longest_path node = if node.length < 0 then begin - node.length <- + node.length <- List.fold_left (fun len (son, delay) -> max len (longest_path son + delay)) 0 node.sons @@ -447,10 +447,10 @@ let can_issue instr = | KF -> if !num_F < 2 then (incr num_F; true) else false | KI -> - if !num_I < 2 && !num_A + !num_I + !num_M < 4 + if !num_I < 2 && !num_A + !num_I + !num_M < 4 then (incr num_I; true) else false | KM -> - if !num_M < 2 && !num_A + !num_I + !num_M < 4 + if !num_M < 2 && !num_A + !num_I + !num_M < 4 then (incr num_M; true) else false | _ (* KB | KB_exc *) -> if !num_B < 3 then (incr num_B; true) else false @@ -481,7 +481,7 @@ let emit_node date node = end) node.sons -(* Emit all ready nodes that we can emit given the architectural +(* Emit all ready nodes that we can emit given the architectural constraints. *) let rec emit_ready_nodes filter date = @@ -561,7 +561,7 @@ let end_basic_block () = (* Compute critical paths and rebuild ready queue sorted by decreasing criticality *) let r = !ready_queue in - ready_queue := []; + ready_queue := []; let max_length = List.fold_left (fun len node -> max len (longest_path node)) 0 r in List.iter add_ready r; @@ -760,7 +760,7 @@ let is_immediate_adds n = n >= -0x2000 && n < 0x2000 let ones_pos n = let rec ones p accu = - if p >= 63 + if p >= 63 then accu else ones (p+1) (if n land (1 lsl p) = 0 then accu else p :: accu) in ones 0 [] @@ -795,7 +795,7 @@ let emit_instr i = Lend -> () | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in - if src.loc <> dst.loc then begin + if src.loc <> dst.loc then begin match (src.loc, dst.loc) with (Reg _, Reg _) -> insert "mov" (regs i.arg) (regs i.res) @@ -1198,7 +1198,7 @@ let emit_instr i = | Lpushtrap -> end_basic_block(); stack_offset := !stack_offset + 16; - (* Store trap pointer at sp, handler addr at sp+8, + (* Store trap pointer at sp, handler addr at sp+8, and decrement sp by 16. Remember, the bottom 16 bytes of the stack must be left free. *) ` add r3 = 8, sp\n`; diff --git a/asmcomp/ia64/proc.ml b/asmcomp/ia64/proc.ml index 3e425f89..15311aa0 100644 --- a/asmcomp/ia64/proc.ml +++ b/asmcomp/ia64/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the IA64 processor *) @@ -71,10 +71,10 @@ let int_reg_name = [| "r88"; "r89"; "r90"; "r91"; (* 80-81 *) "r14"; "r15" |] - + let float_reg_name = [| (* 0-13 *) "f2"; "f3"; "f4"; "f5"; "f6"; "f7"; - "f8"; "f9"; "f10"; "f11"; "f12"; "f13"; "f14"; "f15"; + "f8"; "f9"; "f10"; "f11"; "f12"; "f13"; "f14"; "f15"; (* 14-29 *) "f16"; "f17"; "f18"; "f19"; "f20"; "f21"; "f22"; "f23"; "f24"; "f25"; "f26"; "f27"; "f28"; "f29"; "f30"; "f31"; (* 30-61 *) "f32"; "f33"; "f34"; "f35"; "f36"; "f37"; "f38"; "f39"; diff --git a/asmcomp/ia64/reload.ml b/asmcomp/ia64/reload.ml index b9b9e6dd..338c0884 100644 --- a/asmcomp/ia64/reload.ml +++ b/asmcomp/ia64/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 3235 2000-07-16 02:57:31Z xleroy $ *) +(* $Id$ *) (* Reloading for the IA64. *) diff --git a/asmcomp/ia64/scheduling.ml b/asmcomp/ia64/scheduling.ml index 55a4e753..9bed03a6 100644 --- a/asmcomp/ia64/scheduling.ml +++ b/asmcomp/ia64/scheduling.ml @@ -10,11 +10,11 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 3235 2000-07-16 02:57:31Z xleroy $ *) +(* $Id$ *) open Schedgen (* to create a dependency *) -(* We don't schedule here on the linearized code, but instead schedule the +(* We don't schedule here on the linearized code, but instead schedule the assembly code generated in Emit. *) let fundecl f = f diff --git a/asmcomp/ia64/selection.ml b/asmcomp/ia64/selection.ml index 43351089..86d26917 100644 --- a/asmcomp/ia64/selection.ml +++ b/asmcomp/ia64/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 6276 2004-05-03 12:27:07Z xleroy $ *) +(* $Id$ *) (* Instruction selection for the IA64 processor *) @@ -106,7 +106,7 @@ method select_operation op args = Turn general division and modulus into calls to C library functions *) | (Cdivi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> (Iintop_imm(Idiv, n), [arg]) - | (Cdivi, _) -> + | (Cdivi, _) -> (Iextcall("__divdi3", false), args) | (Cmodi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) && n <> 1 -> (Iintop_imm(Imod, n), [arg]) diff --git a/asmcomp/interf.ml b/asmcomp/interf.ml index b3e49df2..30f17b72 100644 --- a/asmcomp/interf.ml +++ b/asmcomp/interf.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: interf.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Construction of the interference graph. Annotate pseudoregs with interference lists and preference lists. *) @@ -98,7 +98,7 @@ let build_graph fundecl = | Iexit _ -> () | Itrywith(body, handler) -> - add_interf_set Proc.destroyed_at_raise handler.live; + add_interf_set Proc.destroyed_at_raise handler.live; interf body; interf handler; interf i.next | Iraise -> () in diff --git a/asmcomp/interf.mli b/asmcomp/interf.mli index f78f4059..00f4df49 100644 --- a/asmcomp/interf.mli +++ b/asmcomp/interf.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: interf.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Construction of the interference graph. Annotate pseudoregs with interference lists and preference lists. *) diff --git a/asmcomp/linearize.ml b/asmcomp/linearize.ml index 9a617fcd..5833595a 100644 --- a/asmcomp/linearize.ml +++ b/asmcomp/linearize.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: linearize.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Transformation of Mach code into a list of pseudo-instructions. *) @@ -49,7 +49,7 @@ and instruction_desc = let has_fallthrough = function | Lreturn | Lbranch _ | Lswitch _ | Lraise | Lop Itailcall_ind | Lop (Itailcall_imm _) -> false - | _ -> true + | _ -> true type fundecl = { fun_name: string; @@ -84,13 +84,13 @@ let rec end_instr = (* Cons an instruction (live, debug empty) *) let instr_cons d a r n = - { desc = d; next = n; arg = a; res = r; + { desc = d; next = n; arg = a; res = r; dbg = Debuginfo.none; live = Reg.Set.empty } (* Cons a simple instruction (arg, res, live empty) *) let cons_instr d n = - { desc = d; next = n; arg = [||]; res = [||]; + { desc = d; next = n; arg = [||]; res = [||]; dbg = Debuginfo.none; live = Reg.Set.empty } (* Build an instruction with arg, res, dbg, live taken from @@ -98,7 +98,7 @@ let cons_instr d n = let copy_instr d i n = { desc = d; next = n; - arg = i.Mach.arg; res = i.Mach.res; + arg = i.Mach.arg; res = i.Mach.res; dbg = i.Mach.dbg; live = i.Mach.live } (* @@ -187,7 +187,7 @@ let rec linear i n = copy_instr (Lcondbranch(test, lbl)) i (linear ifnot n1) | _, Iend, Lbranch lbl -> copy_instr (Lcondbranch(invert_test test, lbl)) i (linear ifso n1) - | Iexit nfail1, Iexit nfail2, _ + | Iexit nfail1, Iexit nfail2, _ when is_next_catch nfail1 -> let lbl2 = find_exit_label nfail2 in copy_instr diff --git a/asmcomp/linearize.mli b/asmcomp/linearize.mli index b85010f9..aaf03184 100644 --- a/asmcomp/linearize.mli +++ b/asmcomp/linearize.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: linearize.mli 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Transformation of Mach code into a list of pseudo-instructions. *) @@ -42,7 +42,7 @@ and instruction_desc = val has_fallthrough : instruction_desc -> bool val end_instr: instruction -val instr_cons: +val instr_cons: instruction_desc -> Reg.t array -> Reg.t array -> instruction -> instruction val invert_test: Mach.test -> Mach.test @@ -52,4 +52,3 @@ type fundecl = fun_fast: bool } val fundecl: Mach.fundecl -> fundecl - diff --git a/asmcomp/liveness.ml b/asmcomp/liveness.ml index 9407f229..4e743d64 100644 --- a/asmcomp/liveness.ml +++ b/asmcomp/liveness.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: liveness.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Liveness analysis. Annotate mach code with the set of regs live at each point. *) diff --git a/asmcomp/liveness.mli b/asmcomp/liveness.mli index de2509e8..3353b444 100644 --- a/asmcomp/liveness.mli +++ b/asmcomp/liveness.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: liveness.mli 3123 2000-04-21 08:13:22Z weis $ *) +(* $Id$ *) (* Liveness analysis. Annotate mach code with the set of regs live at each point. *) diff --git a/asmcomp/mach.ml b/asmcomp/mach.ml index 07ac1492..027550ab 100644 --- a/asmcomp/mach.ml +++ b/asmcomp/mach.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: mach.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Representation of machine code by sequences of pseudoinstructions *) @@ -82,23 +82,23 @@ type fundecl = fun_fast: bool } let rec dummy_instr = - { desc = Iend; + { desc = Iend; next = dummy_instr; - arg = [||]; + arg = [||]; res = [||]; dbg = Debuginfo.none; live = Reg.Set.empty } let end_instr () = - { desc = Iend; + { desc = Iend; next = dummy_instr; - arg = [||]; + arg = [||]; res = [||]; dbg = Debuginfo.none; live = Reg.Set.empty } let instr_cons d a r n = - { desc = d; next = n; arg = a; res = r; + { desc = d; next = n; arg = a; res = r; dbg = Debuginfo.none; live = Reg.Set.empty } let instr_cons_debug d a r dbg n = @@ -128,5 +128,4 @@ let rec instr_iter f i = instr_iter f body; instr_iter f handler; instr_iter f i.next | Iraise -> () | _ -> - instr_iter f i.next - + instr_iter f i.next diff --git a/asmcomp/mach.mli b/asmcomp/mach.mli index 30c510e8..438d15d2 100644 --- a/asmcomp/mach.mli +++ b/asmcomp/mach.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: mach.mli 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Representation of machine code by sequences of pseudoinstructions *) @@ -71,7 +71,7 @@ and instruction_desc = | Iswitch of int array * instruction array | Iloop of instruction | Icatch of int * instruction * instruction - | Iexit of int + | Iexit of int | Itrywith of instruction * instruction | Iraise @@ -83,11 +83,10 @@ type fundecl = val dummy_instr: instruction val end_instr: unit -> instruction -val instr_cons: +val instr_cons: instruction_desc -> Reg.t array -> Reg.t array -> instruction -> instruction -val instr_cons_debug: +val instr_cons_debug: instruction_desc -> Reg.t array -> Reg.t array -> Debuginfo.t -> instruction -> instruction val instr_iter: (instruction -> unit) -> instruction -> unit - diff --git a/asmcomp/mips/arch.ml b/asmcomp/mips/arch.ml index 411c9877..c174ef6c 100644 --- a/asmcomp/mips/arch.ml +++ b/asmcomp/mips/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 5304 2002-11-29 15:03:37Z xleroy $ *) +(* $Id$ *) (* Specific operations for the Mips processor *) diff --git a/asmcomp/mips/emit.mlp b/asmcomp/mips/emit.mlp index 0899e2fc..06915fd3 100644 --- a/asmcomp/mips/emit.mlp +++ b/asmcomp/mips/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9314 2009-07-15 12:14:39Z xleroy $ *) +(* $Id$ *) (* Emission of Mips assembly code *) @@ -94,7 +94,7 @@ let emit_addressing addr r n = let int_reg_number = [| 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21 |] - + let float_reg_number = [| 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30 |] diff --git a/asmcomp/mips/proc.ml b/asmcomp/mips/proc.ml index 964ade46..53971890 100644 --- a/asmcomp/mips/proc.ml +++ b/asmcomp/mips/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the Mips processor *) @@ -50,7 +50,7 @@ let int_reg_name = [| (* 6-13 *) "$8"; "$9"; "$10"; "$11"; "$12"; "$13"; "$14"; "$15"; (* 14-19 *) "$16"; "$17"; "$18"; "$19"; "$20"; "$21" |] - + let float_reg_name = [| "$f0"; "$f1"; "$f2"; "$f3"; "$f4"; "$f5"; "$f6"; "$f7"; "$f8"; "$f9"; @@ -143,7 +143,7 @@ let loc_results res = or float regs $f12...$f19. Each argument "consumes" both one slot in the int register file and one slot in the float register file. Extra arguments are passed on stack, in a 64-bits slot, right-justified - (i.e. at +4 from natural address). *) + (i.e. at +4 from natural address). *) let loc_external_arguments arg = let loc = Array.create (Array.length arg) Reg.dummy in diff --git a/asmcomp/mips/reload.ml b/asmcomp/mips/reload.ml index 26a620b4..0bdd208d 100644 --- a/asmcomp/mips/reload.ml +++ b/asmcomp/mips/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Reloading for the Mips *) diff --git a/asmcomp/mips/scheduling.ml b/asmcomp/mips/scheduling.ml index 273e20bd..062529ad 100644 --- a/asmcomp/mips/scheduling.ml +++ b/asmcomp/mips/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) open Schedgen (* to create a dependency *) diff --git a/asmcomp/mips/selection.ml b/asmcomp/mips/selection.ml index 34be3c90..4dbaa86e 100644 --- a/asmcomp/mips/selection.ml +++ b/asmcomp/mips/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Instruction selection for the Mips processor *) diff --git a/asmcomp/power/arch.ml b/asmcomp/power/arch.ml index 33081429..8828de7c 100644 --- a/asmcomp/power/arch.ml +++ b/asmcomp/power/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 7430 2006-05-31 08:16:34Z xleroy $ *) +(* $Id$ *) (* Specific operations for the PowerPC processor *) @@ -84,4 +84,3 @@ let print_specific_operation printreg op ppf arg = printreg arg.(0) printreg arg.(1) printreg arg.(2) | Ialloc_far n -> fprintf ppf "alloc_far %d" n - diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 4b321993..b6496f98 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9475 2009-12-16 10:04:38Z xleroy $ *) +(* $Id$ *) (* Emission of PowerPC assembly code *) @@ -116,7 +116,7 @@ let emit_reg r = Reg r -> emit_string (register_name r) | _ -> fatal_error "Emit.emit_reg" -let use_full_regnames = +let use_full_regnames = Config.system = "rhapsody" let emit_gpr r = @@ -607,13 +607,13 @@ let rec emit_instr i dslot = | Lop(Iintop_imm(Idiv, n)) -> (* n is guaranteed to be a power of 2 *) let l = Misc.log2 n in ` {emit_string sragi} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int l}\n`; - ` addze {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` + ` addze {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(Imod, n)) -> (* n is guaranteed to be a power of 2 *) let l = Misc.log2 n in ` {emit_string sragi} {emit_gpr 0}, {emit_reg i.arg.(0)}, {emit_int l}\n`; ` addze {emit_gpr 0}, {emit_gpr 0}\n`; ` {emit_string slgi} {emit_gpr 0}, {emit_gpr 0}, {emit_int l}\n`; - ` subfc {emit_reg i.res.(0)}, {emit_gpr 0}, {emit_reg i.arg.(0)}\n` + ` subfc {emit_reg i.res.(0)}, {emit_gpr 0}, {emit_reg i.arg.(0)}\n` | Lop(Iintop_imm(Icomp cmp, n)) -> begin match cmp with Isigned c -> diff --git a/asmcomp/power/proc.ml b/asmcomp/power/proc.ml index 510b9b1c..ab8e5a5d 100644 --- a/asmcomp/power/proc.ml +++ b/asmcomp/power/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the Power PC *) @@ -45,14 +45,14 @@ let word_addressed = false let int_reg_name = if Config.system = "rhapsody" then - [| "r3"; "r4"; "r5"; "r6"; "r7"; "r8"; "r9"; "r10"; + [| "r3"; "r4"; "r5"; "r6"; "r7"; "r8"; "r9"; "r10"; "r14"; "r15"; "r16"; "r17"; "r18"; "r19"; "r20"; "r21"; "r22"; "r23"; "r24"; "r25"; "r26"; "r27"; "r28" |] else - [| "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; + [| "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; "22"; "23"; "24"; "25"; "26"; "27"; "28" |] - + let float_reg_name = if Config.system = "rhapsody" then [| "f1"; "f2"; "f3"; "f4"; "f5"; "f6"; "f7"; "f8"; diff --git a/asmcomp/power/reload.ml b/asmcomp/power/reload.ml index abcac6c6..3f74c3f5 100644 --- a/asmcomp/power/reload.ml +++ b/asmcomp/power/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Reloading for the PowerPC *) diff --git a/asmcomp/power/scheduling.ml b/asmcomp/power/scheduling.ml index 4312457b..aac37c87 100644 --- a/asmcomp/power/scheduling.ml +++ b/asmcomp/power/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 6423 2004-06-19 16:17:31Z xleroy $ *) +(* $Id$ *) (* Instruction scheduling for the Power PC *) @@ -63,4 +63,3 @@ method reload_retaddr_issue_cycles = 3 end let fundecl f = (new scheduler)#schedule_fundecl f - diff --git a/asmcomp/power/selection.ml b/asmcomp/power/selection.ml index d39ee518..2818c4fd 100644 --- a/asmcomp/power/selection.ml +++ b/asmcomp/power/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 8499 2007-11-09 15:06:57Z frisch $ *) +(* $Id$ *) (* Instruction selection for the Power PC processor *) @@ -69,7 +69,7 @@ method select_operation op args = a power of 2, which do not correspond to an instruction. *) (Cdivi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> (Iintop_imm(Idiv, n), [arg]) - | (Cdivi, _) -> + | (Cdivi, _) -> (Iintop Idiv, args) | (Cmodi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> (Iintop_imm(Imod, n), [arg]) diff --git a/asmcomp/printcmm.ml b/asmcomp/printcmm.ml index 0d0e1be7..364d9ea8 100644 --- a/asmcomp/printcmm.ml +++ b/asmcomp/printcmm.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printcmm.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Pretty-printing of C-- code *) @@ -108,7 +108,7 @@ let rec expr ppf = function | Clet(id, def, body) -> fprintf ppf "@[<2>(let@ @[<2>%a@ %a@]@ %a)@]" - Ident.print id expr def sequence body + Ident.print id expr def sequence body | Cassign(id, exp) -> fprintf ppf "@[<2>(assign @[<2>%a@ %a@])@]" Ident.print id expr exp | Ctuple el -> @@ -142,7 +142,7 @@ let rec expr ppf = function for i = 0 to Array.length cases - 1 do fprintf ppf "@ @[<2>%t@ %a@]" (print_case i) sequence cases.(i) done in - fprintf ppf "@[@[<2>(switch@ %a@ @]%t)@]" expr e1 print_cases + fprintf ppf "@[@[<2>(switch@ %a@ @]%t)@]" expr e1 print_cases | Cloop e -> fprintf ppf "@[<2>(loop@ %a)@]" sequence e | Ccatch(i, ids, e1, e2) -> @@ -172,7 +172,7 @@ let fundecl ppf f = let print_cases ppf cases = let first = ref true in List.iter - (fun (id, ty) -> + (fun (id, ty) -> if !first then first := false else fprintf ppf "@ "; fprintf ppf "%a: %a" Ident.print id machtype ty) cases in diff --git a/asmcomp/printcmm.mli b/asmcomp/printcmm.mli index f07a31db..d498ddb7 100644 --- a/asmcomp/printcmm.mli +++ b/asmcomp/printcmm.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printcmm.mli 3123 2000-04-21 08:13:22Z weis $ *) +(* $Id$ *) (* Pretty-printing of C-- code *) diff --git a/asmcomp/printlinear.ml b/asmcomp/printlinear.ml index 941d6493..3737e72c 100644 --- a/asmcomp/printlinear.ml +++ b/asmcomp/printlinear.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printlinear.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Pretty-printing of linearized machine code *) diff --git a/asmcomp/printlinear.mli b/asmcomp/printlinear.mli index dee1733f..5e90c11c 100644 --- a/asmcomp/printlinear.mli +++ b/asmcomp/printlinear.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printlinear.mli 3123 2000-04-21 08:13:22Z weis $ *) +(* $Id$ *) (* Pretty-printing of linearized machine code *) diff --git a/asmcomp/printmach.ml b/asmcomp/printmach.ml index 87722121..d7d538df 100644 --- a/asmcomp/printmach.ml +++ b/asmcomp/printmach.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printmach.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Pretty-printing of pseudo machine code *) @@ -27,7 +27,7 @@ let reg ppf r = fprintf ppf "/%i" r.stamp; begin match r.loc with | Unknown -> () - | Reg r -> + | Reg r -> fprintf ppf "[%s]" (Proc.register_name r) | Stack(Local s) -> fprintf ppf "[s%i]" s diff --git a/asmcomp/printmach.mli b/asmcomp/printmach.mli index edbda322..28328707 100644 --- a/asmcomp/printmach.mli +++ b/asmcomp/printmach.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printmach.mli 3123 2000-04-21 08:13:22Z weis $ *) +(* $Id$ *) (* Pretty-printing of pseudo machine code *) diff --git a/asmcomp/proc.mli b/asmcomp/proc.mli index 15086a44..ba593592 100644 --- a/asmcomp/proc.mli +++ b/asmcomp/proc.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Processor descriptions *) diff --git a/asmcomp/reg.ml b/asmcomp/reg.ml index 3d996093..f9bef496 100644 --- a/asmcomp/reg.ml +++ b/asmcomp/reg.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reg.ml 3216 2000-06-29 11:44:06Z xleroy $ *) +(* $Id$ *) open Cmm @@ -59,6 +59,12 @@ let createv tyv = for i = 0 to n-1 do rv.(i) <- create tyv.(i) done; rv +let createv_like rv = + let n = Array.length rv in + let rv' = Array.create n dummy in + for i = 0 to n-1 do rv'.(i) <- create rv.(i).typ done; + rv' + let clone r = let nr = create r.typ in nr.name <- r.name; @@ -76,7 +82,7 @@ let first_virtual_reg_stamp = ref (-1) let reset() = (* When reset() is called for the first time, the current stamp reflects all hard pseudo-registers that have been allocated by Proc, so - remember it and use it as the base stamp for allocating + remember it and use it as the base stamp for allocating soft pseudo-registers *) if !first_virtual_reg_stamp = -1 then first_virtual_reg_stamp := !currstamp; currstamp := !first_virtual_reg_stamp; diff --git a/asmcomp/reg.mli b/asmcomp/reg.mli index b8ce2b64..b802344d 100644 --- a/asmcomp/reg.mli +++ b/asmcomp/reg.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reg.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Pseudo-registers *) @@ -39,6 +39,7 @@ and stack_location = val dummy: t val create: Cmm.machtype_component -> t val createv: Cmm.machtype -> t array +val createv_like: t array -> t array val clone: t -> t val at_location: Cmm.machtype_component -> location -> t diff --git a/asmcomp/reload.mli b/asmcomp/reload.mli index 154c4cc5..fc72446e 100644 --- a/asmcomp/reload.mli +++ b/asmcomp/reload.mli @@ -10,9 +10,8 @@ (* *) (***********************************************************************) -(* $Id: reload.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Insert load/stores for pseudoregs that got assigned to stack locations. *) val fundecl: Mach.fundecl -> Mach.fundecl * bool - diff --git a/asmcomp/reloadgen.ml b/asmcomp/reloadgen.ml index befc5c68..898c65c9 100644 --- a/asmcomp/reloadgen.ml +++ b/asmcomp/reloadgen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reloadgen.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Insert load/stores for pseudoregs that got assigned to stack locations. *) @@ -109,13 +109,13 @@ method private reload i = (self#reload i.next))} | Iifthenelse(tst, ifso, ifnot) -> let newarg = self#reload_test tst i.arg in - insert_moves i.arg newarg + insert_moves i.arg newarg (instr_cons (Iifthenelse(tst, self#reload ifso, self#reload ifnot)) newarg [||] (self#reload i.next)) | Iswitch(index, cases) -> let newarg = self#makeregs i.arg in - insert_moves i.arg newarg + insert_moves i.arg newarg (instr_cons (Iswitch(index, Array.map (self#reload) cases)) newarg [||] (self#reload i.next)) | Iloop body -> diff --git a/asmcomp/reloadgen.mli b/asmcomp/reloadgen.mli index 80e90f79..e84a73d7 100644 --- a/asmcomp/reloadgen.mli +++ b/asmcomp/reloadgen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reloadgen.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) class reload_generic : object method reload_operation : diff --git a/asmcomp/schedgen.ml b/asmcomp/schedgen.ml index d89b448a..388d0d4c 100644 --- a/asmcomp/schedgen.ml +++ b/asmcomp/schedgen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: schedgen.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Instruction scheduling *) @@ -91,7 +91,7 @@ let rec longest_path critical_outputs node = then node.delay else 0 | sons -> - node.length <- + node.length <- List.fold_left (fun len (son, delay) -> max len (longest_path critical_outputs son + delay)) @@ -287,7 +287,7 @@ method private ready_instruction date queue = then instr else best in extract new_best rem in extract dummy_node queue - + (* Schedule a basic block, adding its instructions in front of the given instruction sequence *) diff --git a/asmcomp/schedgen.mli b/asmcomp/schedgen.mli index 73450659..0f54e2d6 100644 --- a/asmcomp/schedgen.mli +++ b/asmcomp/schedgen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: schedgen.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Instruction scheduling *) diff --git a/asmcomp/scheduling.mli b/asmcomp/scheduling.mli index 62c55741..dd24354a 100644 --- a/asmcomp/scheduling.mli +++ b/asmcomp/scheduling.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Instruction scheduling *) diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml index 705e501a..0b75c64b 100644 --- a/asmcomp/selectgen.ml +++ b/asmcomp/selectgen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selectgen.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Selection of pseudo-instructions, assignment of pseudo-registers, sequentialization. *) @@ -259,8 +259,8 @@ method select_operation op args = | (Cnegf, _) -> (Inegf, args) | (Cabsf, _) -> (Iabsf, args) | (Caddf, _) -> (Iaddf, args) - | (Csubf, _) -> (Isubf, args) - | (Cmulf, _) -> (Imulf, args) + | (Csubf, _) -> (Isubf, args) + | (Cmulf, _) -> (Imulf, args) | (Cdivf, _) -> (Idivf, args) | (Cfloatofint, _) -> (Ifloatofint, args) | (Cintoffloat, _) -> (Iintoffloat, args) @@ -335,6 +335,13 @@ method select_condition = function | arg -> (Itruetest, arg) +(* Return an array of fresh registers of the given type. + Normally implemented as Reg.createv, but some + ports (e.g. Arm) can override this definition to store float values + in pairs of integer registers. *) + +method regs_for tys = Reg.createv tys + (* Buffering of instruction sequences *) val mutable instr_seq = dummy_instr @@ -374,7 +381,7 @@ method insert_move_results loc res stacksize = self#insert_moves loc res (* Add an Iop opcode. Can be overriden by processor description - to insert moves before and after the operation, i.e. for two-address + to insert moves before and after the operation, i.e. for two-address instructions, or instructions using dedicated registers. *) method insert_op_debug op dbg rs rd = @@ -391,22 +398,22 @@ method insert_op op rs rd = method emit_expr env exp = match exp with Cconst_int n -> - let r = Reg.createv typ_int in + let r = self#regs_for typ_int in Some(self#insert_op (Iconst_int(Nativeint.of_int n)) [||] r) | Cconst_natint n -> - let r = Reg.createv typ_int in + let r = self#regs_for typ_int in Some(self#insert_op (Iconst_int n) [||] r) | Cconst_float n -> - let r = Reg.createv typ_float in + let r = self#regs_for typ_float in Some(self#insert_op (Iconst_float n) [||] r) | Cconst_symbol n -> - let r = Reg.createv typ_addr in + let r = self#regs_for typ_addr in Some(self#insert_op (Iconst_symbol n) [||] r) | Cconst_pointer n -> - let r = Reg.createv typ_addr in + let r = self#regs_for typ_addr in Some(self#insert_op (Iconst_int(Nativeint.of_int n)) [||] r) | Cconst_natpointer n -> - let r = Reg.createv typ_addr in + let r = self#regs_for typ_addr in Some(self#insert_op (Iconst_int n) [||] r) | Cvar v -> begin try @@ -460,7 +467,7 @@ method emit_expr env exp = Proc.contains_calls := true; let r1 = self#emit_tuple env new_args in let rarg = Array.sub r1 1 (Array.length r1 - 1) in - let rd = Reg.createv ty in + let rd = self#regs_for ty in let (loc_arg, stack_ofs) = Proc.loc_arguments rarg in let loc_res = Proc.loc_results rd in self#insert_move_args rarg loc_arg stack_ofs; @@ -471,7 +478,7 @@ method emit_expr env exp = | Icall_imm lbl -> Proc.contains_calls := true; let r1 = self#emit_tuple env new_args in - let rd = Reg.createv ty in + let rd = self#regs_for ty in let (loc_arg, stack_ofs) = Proc.loc_arguments r1 in let loc_res = Proc.loc_results rd in self#insert_move_args r1 loc_arg stack_ofs; @@ -482,7 +489,7 @@ method emit_expr env exp = Proc.contains_calls := true; let (loc_arg, stack_ofs) = self#emit_extcall_args env new_args in - let rd = Reg.createv ty in + let rd = self#regs_for ty in let loc_res = Proc.loc_external_results rd in self#insert_debug (Iop(Iextcall(lbl, alloc))) dbg loc_arg loc_res; @@ -490,16 +497,16 @@ method emit_expr env exp = Some rd | Ialloc _ -> Proc.contains_calls := true; - let rd = Reg.createv typ_addr in + let rd = self#regs_for typ_addr in let size = size_expr env (Ctuple new_args) in self#insert (Iop(Ialloc size)) [||] rd; self#emit_stores env new_args rd; Some rd | op -> let r1 = self#emit_tuple env new_args in - let rd = Reg.createv ty in + let rd = self#regs_for ty in Some (self#insert_op_debug op dbg r1 rd) - end + end | Csequence(e1, e2) -> begin match self#emit_expr env e1 with None -> None @@ -536,9 +543,9 @@ method emit_expr env exp = let rs = List.map (fun id -> - let r = Reg.createv typ_addr in name_regs id r; r) + let r = self#regs_for typ_addr in name_regs id r; r) ids in - catch_regs := (nfail, Array.concat rs) :: !catch_regs ; + catch_regs := (nfail, Array.concat rs) :: !catch_regs ; let (r1, s1) = self#emit_sequence env e1 in catch_regs := List.tl !catch_regs ; let new_env = @@ -566,7 +573,7 @@ method emit_expr env exp = | Ctrywith(e1, v, e2) -> Proc.contains_calls := true; let (r1, s1) = self#emit_sequence env e1 in - let rv = Reg.createv typ_addr in + let rv = self#regs_for typ_addr in let (r2, s2) = self#emit_sequence (Tbl.add v rv env) e2 in let r = join r1 s1 r2 s2 in self#insert @@ -586,10 +593,7 @@ method private bind_let env v r1 = name_regs v r1; Tbl.add v r1 env end else begin - let rv = Array.create (Array.length r1) Reg.dummy in - for i = 0 to Array.length r1 - 1 do - rv.(i) <- Reg.create r1.(i).typ - done; + let rv = Reg.createv_like r1 in name_regs v rv; self#insert_moves r1 rv; Tbl.add v rv env @@ -602,25 +606,21 @@ method private emit_parts env exp = match self#emit_expr env exp with None -> None | Some r -> - match Array.length r with - 0 -> - Some (Ctuple [], env) - | 1 -> - (* The normal case *) - let id = Ident.create "bind" in - let r0 = r.(0) in - if String.length r0.name = 0 then - (* r0 is an anonymous, unshared register; use it directly *) - Some (Cvar id, Tbl.add id r env) - else begin - (* Introduce a fresh temp reg to hold the result *) - let v0 = Reg.create r0.typ in - self#insert_move r0 v0; - Some (Cvar id, Tbl.add id [|v0|] env) - end - | _ -> - (* Must not happen, we no longer support nested tuples *) - assert false + if Array.length r = 0 then + Some (Ctuple [], env) + else begin + (* The normal case *) + let id = Ident.create "bind" in + if all_regs_anonymous r then + (* r is an anonymous, unshared register; use it directly *) + Some (Cvar id, Tbl.add id r env) + else begin + (* Introduce a fresh temp to hold the result *) + let tmp = Reg.createv_like r in + self#insert_moves r tmp; + Some (Cvar id, Tbl.add id tmp env) + end + end end method private emit_parts_list env exp_list = @@ -709,7 +709,7 @@ method emit_tail env exp = (Array.append [|r1.(0)|] loc_arg) [||] end else begin Proc.contains_calls := true; - let rd = Reg.createv ty in + let rd = self#regs_for ty in let loc_res = Proc.loc_results rd in self#insert_move_args rarg loc_arg stack_ofs; self#insert_debug (Iop Icall_ind) dbg @@ -729,7 +729,7 @@ method emit_tail env exp = self#insert (Iop(Itailcall_imm lbl)) loc_arg' [||] end else begin Proc.contains_calls := true; - let rd = Reg.createv ty in + let rd = self#regs_for ty in let loc_res = Proc.loc_results rd in self#insert_move_args r1 loc_arg stack_ofs; self#insert_debug (Iop(Icall_imm lbl)) dbg loc_arg loc_res; @@ -764,11 +764,11 @@ method emit_tail env exp = let rs = List.map (fun id -> - let r = Reg.createv typ_addr in + let r = self#regs_for typ_addr in name_regs id r ; r) ids in - catch_regs := (nfail, Array.concat rs) :: !catch_regs ; + catch_regs := (nfail, Array.concat rs) :: !catch_regs ; let s1 = self#emit_tail_sequence env e1 in catch_regs := List.tl !catch_regs ; let new_env = @@ -780,7 +780,7 @@ method emit_tail env exp = | Ctrywith(e1, v, e2) -> Proc.contains_calls := true; let (opt_r1, s1) = self#emit_sequence env e1 in - let rv = Reg.createv typ_addr in + let rv = self#regs_for typ_addr in let s2 = self#emit_tail_sequence (Tbl.add v rv env) e2 in self#insert (Itrywith(s1#extract, @@ -808,7 +808,7 @@ method emit_fundecl f = current_function_name := f.Cmm.fun_name; let rargs = List.map - (fun (id, ty) -> let r = Reg.createv ty in name_regs id r; r) + (fun (id, ty) -> let r = self#regs_for ty in name_regs id r; r) f.Cmm.fun_args in let rarg = Array.concat rargs in let loc_arg = Proc.loc_parameters rarg in diff --git a/asmcomp/selectgen.mli b/asmcomp/selectgen.mli index 89edce67..fa2cddcf 100644 --- a/asmcomp/selectgen.mli +++ b/asmcomp/selectgen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selectgen.mli 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Selection of pseudo-instructions, assignment of pseudo-registers, sequentialization. *) @@ -39,6 +39,11 @@ class virtual selector_generic : object method select_store : Arch.addressing_mode -> Cmm.expression -> Mach.operation * Cmm.expression (* Can be overriden to deal with special store constant instructions *) + method regs_for : Cmm.machtype -> Reg.t array + (* Return an array of fresh registers of the given type. + Default implementation is like Reg.createv. + Can be overriden if float values are stored as pairs of + integer registers. *) method insert_op : Mach.operation -> Reg.t array -> Reg.t array -> Reg.t array (* Can be overriden to deal with 2-address instructions @@ -57,7 +62,7 @@ class virtual selector_generic : object (* The following method is the entry point and should not be overriden *) method emit_fundecl : Cmm.fundecl -> Mach.fundecl - + (* The following methods should not be overriden. They cannot be declared "private" in the current implementation because they are not always applied to "self", but ideally they should be private. *) diff --git a/asmcomp/selection.mli b/asmcomp/selection.mli index 66abf607..ab17b557 100644 --- a/asmcomp/selection.mli +++ b/asmcomp/selection.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Selection of pseudo-instructions, assignment of pseudo-registers, sequentialization. *) diff --git a/asmcomp/sparc/arch.ml b/asmcomp/sparc/arch.ml index 6bd9876f..61ba35b9 100644 --- a/asmcomp/sparc/arch.ml +++ b/asmcomp/sparc/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 5303 2002-11-29 15:03:08Z xleroy $ *) +(* $Id$ *) (* Specific operations for the Sparc processor *) diff --git a/asmcomp/sparc/emit.mlp b/asmcomp/sparc/emit.mlp index c5cbe854..f44f813e 100644 --- a/asmcomp/sparc/emit.mlp +++ b/asmcomp/sparc/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 9475 2009-12-16 10:04:38Z xleroy $ *) +(* $Id$ *) (* Emission of Sparc assembly code *) diff --git a/asmcomp/sparc/proc.ml b/asmcomp/sparc/proc.ml index f21ac977..2fd147bf 100644 --- a/asmcomp/sparc/proc.ml +++ b/asmcomp/sparc/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml 8462 2007-10-30 12:37:16Z xleroy $ *) +(* $Id$ *) (* Description of the Sparc processor *) @@ -50,7 +50,7 @@ let int_reg_name = [| (* 12-16 *) "%l0"; "%l1"; "%l2"; "%l3"; "%l4"; (* 17-18 *) "%g3"; "%g4" |] - + let float_reg_name = [| (* 100-105 *) "%f0"; "%f2"; "%f4"; "%f6"; "%f8"; "%f10"; (* 106-109 *) "%f12"; "%f14"; "%f16"; "%f18"; diff --git a/asmcomp/sparc/reload.ml b/asmcomp/sparc/reload.ml index a3558a7f..a590ba3f 100644 --- a/asmcomp/sparc/reload.ml +++ b/asmcomp/sparc/reload.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: reload.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Reloading for the Sparc *) diff --git a/asmcomp/sparc/scheduling.ml b/asmcomp/sparc/scheduling.ml index ebe9e7c2..efe9a1f4 100644 --- a/asmcomp/sparc/scheduling.ml +++ b/asmcomp/sparc/scheduling.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scheduling.ml 5303 2002-11-29 15:03:08Z xleroy $ *) +(* $Id$ *) open Cmm open Mach @@ -62,4 +62,3 @@ method oper_issue_cycles = function end let fundecl f = (new scheduler)#schedule_fundecl f - diff --git a/asmcomp/sparc/selection.ml b/asmcomp/sparc/selection.ml index 37573ae4..10538547 100644 --- a/asmcomp/sparc/selection.ml +++ b/asmcomp/sparc/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml 5303 2002-11-29 15:03:08Z xleroy $ *) +(* $Id$ *) (* Instruction selection for the Sparc processor *) diff --git a/asmcomp/spill.ml b/asmcomp/spill.ml index 93b32227..968987d4 100644 --- a/asmcomp/spill.ml +++ b/asmcomp/spill.ml @@ -10,9 +10,9 @@ (* *) (***********************************************************************) -(* $Id: spill.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) -(* Insertion of moves to suggest possible spilling / reloading points +(* Insertion of moves to suggest possible spilling / reloading points before register allocation. *) open Reg @@ -130,7 +130,7 @@ let find_reload_at_exit k = List.assoc k !reload_at_exit with | Not_found -> Misc.fatal_error "Spill.find_reload_at_exit" - + let reload_at_break = ref Reg.Set.empty let rec reload i before = @@ -400,4 +400,3 @@ let fundecl f = fun_args = f.fun_args; fun_body = new_body; fun_fast = f.fun_fast } - diff --git a/asmcomp/spill.mli b/asmcomp/spill.mli index a9fcd436..16a8c01a 100644 --- a/asmcomp/spill.mli +++ b/asmcomp/spill.mli @@ -10,9 +10,9 @@ (* *) (***********************************************************************) -(* $Id: spill.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) -(* Insertion of moves to suggest possible spilling / reloading points +(* Insertion of moves to suggest possible spilling / reloading points before register allocation. *) val fundecl: Mach.fundecl -> Mach.fundecl diff --git a/asmcomp/split.ml b/asmcomp/split.ml index 391568d6..9e6130d2 100644 --- a/asmcomp/split.ml +++ b/asmcomp/split.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: split.ml 7812 2007-01-29 12:11:18Z xleroy $ *) +(* $Id$ *) (* Renaming of registers at reload points to split live ranges. *) @@ -189,7 +189,7 @@ let rec rename i sub = | Iraise -> (instr_cons_debug Iraise (subst_regs i.arg sub) [||] i.dbg i.next, None) - + (* Second pass: replace registers by their final representatives *) let set_repres i = diff --git a/asmcomp/split.mli b/asmcomp/split.mli index 2cb16fda..67e0956e 100644 --- a/asmcomp/split.mli +++ b/asmcomp/split.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: split.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Renaming of registers at reload points to split live ranges. *) diff --git a/asmrun/Makefile b/asmrun/Makefile index ac03dea5..633ce525 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8521 2007-11-15 13:21:15Z frisch $ +# $Id$ include ../config/Makefile diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index 43f221cb..ca24bc71 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8521 2007-11-15 13:21:15Z frisch $ +# $Id$ include ../config/Makefile diff --git a/asmrun/alpha.S b/asmrun/alpha.S index 98ce9139..c5251b73 100644 --- a/asmrun/alpha.S +++ b/asmrun/alpha.S @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: alpha.S 6050 2004-01-03 12:51:20Z doligez $ */ +/* $Id$ */ /* Asm part of the runtime system, Alpha processor */ @@ -80,7 +80,7 @@ caml_allocN: .set at ret ($26) .end caml_allocN - + .globl caml_call_gc .ent caml_call_gc .align 3 diff --git a/asmrun/amd64.S b/asmrun/amd64.S index fe96110b..42172c94 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -11,14 +11,18 @@ /* */ /***********************************************************************/ -/* $Id: amd64.S 9119 2008-11-07 10:34:16Z xleroy $ */ +/* $Id$ */ /* Asm part of the runtime system, AMD64 processor */ /* Must be preprocessed by cpp */ +/* PIC mode support based on contribution by Paul Stravers (see PR#4795) */ + #ifdef SYS_macosx #define G(r) _##r +#define GREL(r) _##r@GOTPCREL +#define GCALL(r) _##r #define FUNCTION_ALIGN 2 #define EIGHT_ALIGN 3 #define SIXTEEN_ALIGN 4 @@ -30,6 +34,8 @@ #else #define G(r) r +#define GREL(r) r@GOTPCREL +#define GCALL(r) r@PLT #define FUNCTION_ALIGN 4 #define EIGHT_ALIGN 8 #define SIXTEEN_ALIGN 16 @@ -41,21 +47,86 @@ #endif +#ifdef __PIC__ + +/* Position-independent operations on global variables. */ + +/* Store [srcreg] in global [dstlabel]. Clobbers %r11. */ +#define STORE_VAR(srcreg,dstlabel) \ + movq GREL(dstlabel)(%rip), %r11 ; \ + movq srcreg, (%r11) + +/* Load global [srclabel] in register [dstreg]. Clobbers %r11. */ +#define LOAD_VAR(srclabel,dstreg) \ + movq GREL(srclabel)(%rip), %r11 ; \ + movq (%r11), dstreg + +/* Compare global [label] with register [reg]. Clobbers %rax. */ +#define CMP_VAR(label,reg) \ + movq GREL(label)(%rip), %rax ; \ + cmpq (%rax), reg + +/* Test 32-bit global [label] against mask [imm]. Clobbers %r11. */ +#define TESTL_VAR(imm,label) \ + movq GREL(label)(%rip), %r11 ; \ + testl imm, (%r11) + +/* Push global [label] on stack. Clobbers %r11. */ +#define PUSH_VAR(srclabel) \ + movq GREL(srclabel)(%rip), %r11 ; \ + pushq (%r11) + +/* Pop global [label] off stack. Clobbers %r11. */ +#define POP_VAR(dstlabel) \ + movq GREL(dstlabel)(%rip), %r11 ; \ + popq (%r11) + +/* Record lowest stack address and return address. Clobbers %rax. */ +#define RECORD_STACK_FRAME(OFFSET) \ + pushq %r11 ; \ + movq 8+OFFSET(%rsp), %rax ; \ + STORE_VAR(%rax,caml_last_return_address) ; \ + leaq 16+OFFSET(%rsp), %rax ; \ + STORE_VAR(%rax,caml_bottom_of_stack) ; \ + popq %r11 + +#else + +/* Non-PIC operations on global variables. Slightly faster. */ + +#define STORE_VAR(srcreg,dstlabel) \ + movq srcreg, G(dstlabel)(%rip) + +#define LOAD_VAR(srclabel,dstreg) \ + movq G(srclabel)(%rip), dstreg + +#define CMP_VAR(label,reg) \ + cmpq G(label)(%rip), %r15 + +#define TESTL_VAR(imm,label) \ + testl imm, G(label)(%rip) + +#define PUSH_VAR(srclabel) \ + pushq G(srclabel)(%rip) + +#define POP_VAR(dstlabel) \ + popq G(dstlabel)(%rip) + +#define RECORD_STACK_FRAME(OFFSET) \ + movq OFFSET(%rsp), %rax ; \ + STORE_VAR(%rax,caml_last_return_address) ; \ + leaq 8+OFFSET(%rsp), %rax ; \ + STORE_VAR(%rax,caml_bottom_of_stack) + +#endif .text /* Allocation */ FUNCTION(G(caml_call_gc)) - /* Record lowest stack address and return address */ - movq 0(%rsp), %rax - movq %rax, G(caml_last_return_address)(%rip) - leaq 8(%rsp), %rax - movq %rax, G(caml_bottom_of_stack)(%rip) -.L105: - /* Save caml_young_ptr, caml_exception_pointer */ - movq %r15, G(caml_young_ptr)(%rip) - movq %r14, G(caml_exception_pointer)(%rip) + RECORD_STACK_FRAME(0) +.L105: /* Build array of registers, save it into caml_gc_regs */ pushq %r13 pushq %r12 @@ -70,7 +141,10 @@ FUNCTION(G(caml_call_gc)) pushq %rdi pushq %rbx pushq %rax - movq %rsp, G(caml_gc_regs)(%rip) + STORE_VAR(%rsp, caml_gc_regs) + /* Save caml_young_ptr, caml_exception_pointer */ + STORE_VAR(%r15, caml_young_ptr) + STORE_VAR(%r14, caml_exception_pointer) /* Save floating-point registers */ subq $(16*8), %rsp movlpd %xmm0, 0*8(%rsp) @@ -90,7 +164,10 @@ FUNCTION(G(caml_call_gc)) movlpd %xmm14, 14*8(%rsp) movlpd %xmm15, 15*8(%rsp) /* Call the garbage collector */ - call G(caml_garbage_collection) + call GCALL(caml_garbage_collection) + /* Restore caml_young_ptr, caml_exception_pointer */ + LOAD_VAR(caml_young_ptr, %r15) + LOAD_VAR(caml_exception_pointer, %r14) /* Restore all regs used by the code generator */ movlpd 0*8(%rsp), %xmm0 movlpd 1*8(%rsp), %xmm1 @@ -122,22 +199,16 @@ FUNCTION(G(caml_call_gc)) popq %rbp popq %r12 popq %r13 - /* Restore caml_young_ptr, caml_exception_pointer */ - movq G(caml_young_ptr)(%rip), %r15 - movq G(caml_exception_pointer)(%rip), %r14 /* Return to caller */ ret FUNCTION(G(caml_alloc1)) subq $16, %r15 - cmpq G(caml_young_limit)(%rip), %r15 + CMP_VAR(caml_young_limit, %r15) jb .L100 ret .L100: - movq 0(%rsp), %rax - movq %rax, G(caml_last_return_address)(%rip) - leaq 8(%rsp), %rax - movq %rax, G(caml_bottom_of_stack)(%rip) + RECORD_STACK_FRAME(0) subq $8, %rsp call .L105 addq $8, %rsp @@ -145,14 +216,11 @@ FUNCTION(G(caml_alloc1)) FUNCTION(G(caml_alloc2)) subq $24, %r15 - cmpq G(caml_young_limit)(%rip), %r15 + CMP_VAR(caml_young_limit, %r15) jb .L101 ret .L101: - movq 0(%rsp), %rax - movq %rax, G(caml_last_return_address)(%rip) - leaq 8(%rsp), %rax - movq %rax, G(caml_bottom_of_stack)(%rip) + RECORD_STACK_FRAME(0) subq $8, %rsp call .L105 addq $8, %rsp @@ -160,30 +228,25 @@ FUNCTION(G(caml_alloc2)) FUNCTION(G(caml_alloc3)) subq $32, %r15 - cmpq G(caml_young_limit)(%rip), %r15 + CMP_VAR(caml_young_limit, %r15) jb .L102 ret .L102: - movq 0(%rsp), %rax - movq %rax, G(caml_last_return_address)(%rip) - leaq 8(%rsp), %rax - movq %rax, G(caml_bottom_of_stack)(%rip) + RECORD_STACK_FRAME(0) subq $8, %rsp call .L105 addq $8, %rsp jmp G(caml_alloc3) FUNCTION(G(caml_allocN)) + pushq %rax /* save desired size */ subq %rax, %r15 - cmpq G(caml_young_limit)(%rip), %r15 + CMP_VAR(caml_young_limit, %r15) jb .L103 + addq $8, %rsp /* drop desired size */ ret .L103: - pushq %rax /* save desired size */ - movq 8(%rsp), %rax - movq %rax, G(caml_last_return_address)(%rip) - leaq 16(%rsp), %rax - movq %rax, G(caml_bottom_of_stack)(%rip) + RECORD_STACK_FRAME(8) call .L105 popq %rax /* recover desired size */ jmp G(caml_allocN) @@ -193,15 +256,15 @@ FUNCTION(G(caml_allocN)) FUNCTION(G(caml_c_call)) /* Record lowest stack address and return address */ popq %r12 - movq %r12, G(caml_last_return_address)(%rip) - movq %rsp, G(caml_bottom_of_stack)(%rip) + STORE_VAR(%r12, caml_last_return_address) + STORE_VAR(%rsp, caml_bottom_of_stack) /* Make the exception handler and alloc ptr available to the C code */ - movq %r15, G(caml_young_ptr)(%rip) - movq %r14, G(caml_exception_pointer)(%rip) + STORE_VAR(%r15, caml_young_ptr) + STORE_VAR(%r14, caml_exception_pointer) /* Call the function (address in %rax) */ call *%rax /* Reload alloc ptr */ - movq G(caml_young_ptr)(%rip), %r15 + LOAD_VAR(caml_young_ptr, %r15) /* Return to caller */ pushq %r12 ret @@ -218,17 +281,17 @@ FUNCTION(G(caml_start_program)) pushq %r15 subq $8, %rsp /* stack 16-aligned */ /* Initial entry point is G(caml_program) */ - leaq G(caml_program)(%rip), %r12 + leaq GCALL(caml_program)(%rip), %r12 /* Common code for caml_start_program and caml_callback* */ .L106: /* Build a callback link */ subq $8, %rsp /* stack 16-aligned */ - pushq G(caml_gc_regs)(%rip) - pushq G(caml_last_return_address)(%rip) - pushq G(caml_bottom_of_stack)(%rip) + PUSH_VAR(caml_gc_regs) + PUSH_VAR(caml_last_return_address) + PUSH_VAR(caml_bottom_of_stack) /* Setup alloc ptr and exception ptr */ - movq G(caml_young_ptr)(%rip), %r15 - movq G(caml_exception_pointer)(%rip), %r14 + LOAD_VAR(caml_young_ptr, %r15) + LOAD_VAR(caml_exception_pointer, %r14) /* Build an exception handler */ lea .L108(%rip), %r13 pushq %r13 @@ -242,12 +305,12 @@ FUNCTION(G(caml_start_program)) popq %r12 /* dummy register */ .L109: /* Update alloc ptr and exception ptr */ - movq %r15, G(caml_young_ptr)(%rip) - movq %r14, G(caml_exception_pointer)(%rip) + STORE_VAR(%r15,caml_young_ptr) + STORE_VAR(%r14,caml_exception_pointer) /* Pop the callback link, restoring the global variables */ - popq G(caml_bottom_of_stack)(%rip) - popq G(caml_last_return_address)(%rip) - popq G(caml_gc_regs)(%rip) + POP_VAR(caml_bottom_of_stack) + POP_VAR(caml_last_return_address) + POP_VAR(caml_gc_regs) addq $8, %rsp /* Restore callee-save registers. */ addq $8, %rsp @@ -268,7 +331,7 @@ FUNCTION(G(caml_start_program)) /* Raise an exception from Caml */ FUNCTION(G(caml_raise_exn)) - testl $1, G(caml_backtrace_active)(%rip) + TESTL_VAR($1, caml_backtrace_active) jne .L110 movq %r14, %rsp popq %r14 @@ -279,7 +342,7 @@ FUNCTION(G(caml_raise_exn)) movq 0(%rsp), %rsi /* arg 2: pc of raise */ leaq 8(%rsp), %rdx /* arg 3: sp of raise */ movq %r14, %rcx /* arg 4: sp of handler */ - call G(caml_stash_backtrace) + call GCALL(caml_stash_backtrace) movq %r12, %rax /* Recover exception bucket */ movq %r14, %rsp popq %r14 @@ -288,24 +351,24 @@ FUNCTION(G(caml_raise_exn)) /* Raise an exception from C */ FUNCTION(G(caml_raise_exception)) - testl $1, G(caml_backtrace_active)(%rip) + TESTL_VAR($1, caml_backtrace_active) jne .L111 movq %rdi, %rax - movq G(caml_exception_pointer)(%rip), %rsp + LOAD_VAR(caml_exception_pointer, %rsp) /* Cut stack */ popq %r14 /* Recover previous exception handler */ - movq G(caml_young_ptr)(%rip), %r15 /* Reload alloc ptr */ + LOAD_VAR(caml_young_ptr, %r15) /* Reload alloc ptr */ ret .L111: movq %rdi, %r12 /* Save exception bucket */ /* arg 1: exception bucket */ - movq G(caml_last_return_address)(%rip), %rsi /* arg 2: pc of raise */ - movq G(caml_bottom_of_stack)(%rip), %rdx /* arg 3: sp of raise */ - movq G(caml_exception_pointer)(%rip), %rcx /* arg 4: sp of handler */ - call G(caml_stash_backtrace) + LOAD_VAR(caml_last_return_address,%rsi) /* arg 2: pc of raise */ + LOAD_VAR(caml_bottom_of_stack,%rdx) /* arg 3: sp of raise */ + LOAD_VAR(caml_exception_pointer,%rcx) /* arg 4: sp of handler */ + call GCALL(caml_stash_backtrace) movq %r12, %rax /* Recover exception bucket */ - movq G(caml_exception_pointer)(%rip), %rsp + LOAD_VAR(caml_exception_pointer,%rsp) popq %r14 /* Recover previous exception handler */ - movq G(caml_young_ptr)(%rip), %r15 /* Reload alloc ptr */ + LOAD_VAR(caml_young_ptr,%r15) /* Reload alloc ptr */ ret /* Callback from C to Caml */ @@ -338,7 +401,7 @@ FUNCTION(G(caml_callback2_exn)) /* closure stays in %rdi */ movq %rsi, %rax /* first argument */ movq %rdx, %rbx /* second argument */ - leaq G(caml_apply2)(%rip), %r12 /* code pointer */ + leaq GCALL(caml_apply2)(%rip), %r12 /* code pointer */ jmp .L106 FUNCTION(G(caml_callback3_exn)) @@ -355,11 +418,11 @@ FUNCTION(G(caml_callback3_exn)) movq %rdx, %rbx /* second argument */ movq %rdi, %rsi /* closure */ movq %rcx, %rdi /* third argument */ - leaq G(caml_apply3)(%rip), %r12 /* code pointer */ + leaq GCALL(caml_apply3)(%rip), %r12 /* code pointer */ jmp .L106 FUNCTION(G(caml_ml_array_bound_error)) - leaq G(caml_array_bound_error)(%rip), %rax + leaq GCALL(caml_array_bound_error)(%rip), %rax jmp G(caml_c_call) .data diff --git a/asmrun/amd64nt.asm b/asmrun/amd64nt.asm index caa4eb48..c1d97e05 100644 --- a/asmrun/amd64nt.asm +++ b/asmrun/amd64nt.asm @@ -1,17 +1,17 @@ ;********************************************************************* -; -; Objective Caml ; -; Xavier Leroy, projet Gallium, INRIA Rocquencourt +; Objective Caml ; -; Copyright 2006 Institut National de Recherche en Informatique et -; en Automatique. All rights reserved. This file is distributed -; under the terms of the GNU Library General Public License, with -; the special exception on linking described in file ../LICENSE. +; Xavier Leroy, projet Gallium, INRIA Rocquencourt +; +; Copyright 2006 Institut National de Recherche en Informatique et +; en Automatique. All rights reserved. This file is distributed +; under the terms of the GNU Library General Public License, with +; the special exception on linking described in file ../LICENSE. ; ;********************************************************************* -; $Id: amd64nt.asm 7942 2007-03-01 10:26:51Z xleroy $ +; $Id$ ; Asm part of the runtime system, AMD64 processor, Intel syntax @@ -46,11 +46,11 @@ caml_call_gc: mov caml_last_return_address, rax lea rax, [rsp+8] mov caml_bottom_of_stack, rax -L105: +L105: ; Save caml_young_ptr, caml_exception_pointer mov caml_young_ptr, r15 mov caml_exception_pointer, r14 - ; Build array of registers, save it into caml_gc_regs + ; Build array of registers, save it into caml_gc_regs push r13 push r12 push rbp @@ -65,7 +65,7 @@ L105: push rbx push rax mov caml_gc_regs, rsp - ; Save floating-point registers + ; Save floating-point registers sub rsp, 16*8 movlpd QWORD PTR [rsp + 0*8], xmm0 movlpd QWORD PTR [rsp + 1*8], xmm1 @@ -83,9 +83,11 @@ L105: movlpd QWORD PTR [rsp + 13*8], xmm13 movlpd QWORD PTR [rsp + 14*8], xmm14 movlpd QWORD PTR [rsp + 15*8], xmm15 - ; Call the garbage collector - call caml_garbage_collection - ; Restore all regs used by the code generator + ; Call the garbage collector + sub rsp, 32 ; PR#5008: bottom 32 bytes are reserved for callee + call caml_garbage_collection + add rsp, 32 ; PR#5008 + ; Restore all regs used by the code generator movlpd xmm0, QWORD PTR [rsp + 0*8] movlpd xmm1, QWORD PTR [rsp + 1*8] movlpd xmm2, QWORD PTR [rsp + 2*8] @@ -116,10 +118,10 @@ L105: pop rbp pop r12 pop r13 - ; Restore caml_young_ptr, caml_exception_pointer + ; Restore caml_young_ptr, caml_exception_pointer mov r15, caml_young_ptr mov r14, caml_exception_pointer - ; Return to caller + ; Return to caller ret PUBLIC caml_alloc1 @@ -181,41 +183,41 @@ caml_allocN: jb L103 ret L103: - push rax ; save desired size + push rax ; save desired size mov rax, [rsp + 8] mov caml_last_return_address, rax lea rax, [rsp + 16] mov caml_bottom_of_stack, rax call L105 - pop rax ; recover desired size + pop rax ; recover desired size jmp caml_allocN -; Call a C function from Caml +; Call a C function from Caml PUBLIC caml_c_call ALIGN 16 caml_c_call: - ; Record lowest stack address and return address + ; Record lowest stack address and return address pop r12 mov caml_last_return_address, r12 mov caml_bottom_of_stack, rsp - ; Make the exception handler and alloc ptr available to the C code + ; Make the exception handler and alloc ptr available to the C code mov caml_young_ptr, r15 mov caml_exception_pointer, r14 - ; Call the function (address in rax) + ; Call the function (address in rax) call rax - ; Reload alloc ptr + ; Reload alloc ptr mov r15, caml_young_ptr - ; Return to caller + ; Return to caller push r12 ret -; Start the Caml program +; Start the Caml program PUBLIC caml_start_program ALIGN 16 caml_start_program: - ; Save callee-save registers + ; Save callee-save registers push rbx push rbp push rsi @@ -235,39 +237,39 @@ caml_start_program: movapd OWORD PTR [rsp + 7*16], xmm13 movapd OWORD PTR [rsp + 8*16], xmm14 movapd OWORD PTR [rsp + 9*16], xmm15 - ; Initial entry point is caml_program + ; Initial entry point is caml_program lea r12, caml_program - ; Common code for caml_start_program and caml_callback* + ; Common code for caml_start_program and caml_callback* L106: - ; Build a callback link - sub rsp, 8 ; stack 16-aligned + ; Build a callback link + sub rsp, 8 ; stack 16-aligned push caml_gc_regs push caml_last_return_address push caml_bottom_of_stack - ; Setup alloc ptr and exception ptr + ; Setup alloc ptr and exception ptr mov r15, caml_young_ptr mov r14, caml_exception_pointer - ; Build an exception handler + ; Build an exception handler lea r13, L108 push r13 push r14 mov r14, rsp - ; Call the Caml code + ; Call the Caml code call r12 L107: - ; Pop the exception handler + ; Pop the exception handler pop r14 - pop r12 ; dummy register + pop r12 ; dummy register L109: - ; Update alloc ptr and exception ptr + ; Update alloc ptr and exception ptr mov caml_young_ptr, r15 mov caml_exception_pointer, r14 - ; Pop the callback restoring, link the global variables + ; Pop the callback restoring, link the global variables pop caml_bottom_of_stack pop caml_last_return_address pop caml_gc_regs add rsp, 8 - ; Restore callee-save registers. + ; Restore callee-save registers. movapd xmm6, OWORD PTR [rsp + 0*16] movapd xmm7, OWORD PTR [rsp + 1*16] movapd xmm8, OWORD PTR [rsp + 2*16] @@ -291,7 +293,7 @@ L109: ret L108: ; Exception handler - ; Mark the bucket as an exception result and return it + ; Mark the bucket as an exception result and return it or rax, 2 jmp L109 @@ -318,7 +320,7 @@ L110: pop r14 ; Recover previous exception handler ret ; Branch to handler -; Raise an exception from C +; Raise an exception from C PUBLIC caml_raise_exception ALIGN 16 @@ -327,8 +329,8 @@ caml_raise_exception: jne L111 mov rax, rcx ; First argument is exn bucket mov rsp, caml_exception_pointer - pop r14 ; Recover previous exception handler - mov r15, caml_young_ptr ; Reload alloc ptr + pop r14 ; Recover previous exception handler + mov r15, caml_young_ptr ; Reload alloc ptr ret L111: mov r12, rcx ; Save exception bucket in r12 @@ -340,16 +342,16 @@ L111: call caml_stash_backtrace mov rax, r12 ; Recover exception bucket mov rsp, caml_exception_pointer - pop r14 ; Recover previous exception handler - mov r15, caml_young_ptr ; Reload alloc ptr + pop r14 ; Recover previous exception handler + mov r15, caml_young_ptr ; Reload alloc ptr ret -; Callback from C to Caml +; Callback from C to Caml PUBLIC caml_callback_exn ALIGN 16 caml_callback_exn: - ; Save callee-save registers + ; Save callee-save registers push rbx push rbp push rsi @@ -369,16 +371,16 @@ caml_callback_exn: movapd OWORD PTR [rsp + 7*16], xmm13 movapd OWORD PTR [rsp + 8*16], xmm14 movapd OWORD PTR [rsp + 9*16], xmm15 - ; Initial loading of arguments - mov rbx, rcx ; closure - mov rax, rdx ; argument - mov r12, [rbx] ; code pointer + ; Initial loading of arguments + mov rbx, rcx ; closure + mov rax, rdx ; argument + mov r12, [rbx] ; code pointer jmp L106 PUBLIC caml_callback2_exn ALIGN 16 caml_callback2_exn: - ; Save callee-save registers + ; Save callee-save registers push rbx push rbp push rsi @@ -398,17 +400,17 @@ caml_callback2_exn: movapd OWORD PTR [rsp + 7*16], xmm13 movapd OWORD PTR [rsp + 8*16], xmm14 movapd OWORD PTR [rsp + 9*16], xmm15 - ; Initial loading of arguments + ; Initial loading of arguments mov rdi, rcx ; closure - mov rax, rdx ; first argument - mov rbx, r8 ; second argument - lea r12, caml_apply2 ; code pointer + mov rax, rdx ; first argument + mov rbx, r8 ; second argument + lea r12, caml_apply2 ; code pointer jmp L106 PUBLIC caml_callback3_exn ALIGN 16 caml_callback3_exn: - ; Save callee-save registers + ; Save callee-save registers push rbx push rbp push rsi @@ -428,12 +430,12 @@ caml_callback3_exn: movapd OWORD PTR [rsp + 7*16], xmm13 movapd OWORD PTR [rsp + 8*16], xmm14 movapd OWORD PTR [rsp + 9*16], xmm15 - ; Initial loading of arguments + ; Initial loading of arguments mov rsi, rcx ; closure - mov rax, rdx ; first argument - mov rbx, r8 ; second argument - mov rdi, r9 ; third argument - lea r12, caml_apply3 ; code pointer + mov rax, rdx ; first argument + mov rbx, r8 ; second argument + mov rdi, r9 ; third argument + lea r12, caml_apply3 ; code pointer jmp L106 PUBLIC caml_ml_array_bound_error @@ -445,10 +447,10 @@ caml_ml_array_bound_error: .DATA PUBLIC caml_system__frametable caml_system__frametable LABEL QWORD - QWORD 1 ; one descriptor - QWORD L107 ; return address into callback - WORD -1 ; negative frame size => use callback link - WORD 0 ; no roots here + QWORD 1 ; one descriptor + QWORD L107 ; return address into callback + WORD -1 ; negative frame size => use callback link + WORD 0 ; no roots here ALIGN 8 PUBLIC caml_negf_mask diff --git a/asmrun/arm.S b/asmrun/arm.S index 3a3a7323..8a47d182 100644 --- a/asmrun/arm.S +++ b/asmrun/arm.S @@ -11,141 +11,129 @@ /* */ /***********************************************************************/ -/* $Id: arm.S 8823 2008-02-29 14:21:22Z doligez $ */ +/* $Id$ */ /* Asm part of the runtime system, ARM processor */ trap_ptr .req r11 alloc_ptr .req r8 -alloc_limit .req r9 -sp .req r13 -lr .req r14 -pc .req r15 +alloc_limit .req r10 .text /* Allocation functions and GC interface */ - .global caml_call_gc + .globl caml_call_gc caml_call_gc: - /* Record return address */ - /* We can use r10 as a temp reg since it's not live here */ - ldr r10, .Lcaml_last_return_address - str lr, [r10, #0] + /* Record return address and desired size */ + /* Can use alloc_limit as a temporary since it will be reloaded by + invoke_gc */ + ldr alloc_limit, .Lcaml_last_return_address + str lr, [alloc_limit, #0] + ldr alloc_limit, .Lcaml_requested_size + str r12, [alloc_limit, #0] /* Branch to shared GC code */ bl .Linvoke_gc - /* Restart allocation sequence (4 instructions before) */ - sub lr, lr, #16 - mov pc, lr + /* Finish allocation */ + ldr r12, .Lcaml_requested_size + ldr r12, [r12, #0] + sub alloc_ptr, alloc_ptr, r12 + bx lr - .global caml_alloc1 + .globl caml_alloc1 caml_alloc1: - ldr r10, [alloc_limit, #0] sub alloc_ptr, alloc_ptr, #8 - cmp alloc_ptr, r10 + cmp alloc_ptr, alloc_limit movcs pc, lr /* Return if alloc_ptr >= alloc_limit */ /* Record return address */ - ldr r10, .Lcaml_last_return_address - str lr, [r10, #0] + ldr r12, .Lcaml_last_return_address + str lr, [r12, #0] /* Invoke GC */ bl .Linvoke_gc /* Try again */ b caml_alloc1 - .global caml_alloc2 + .globl caml_alloc2 caml_alloc2: - ldr r10, [alloc_limit, #0] sub alloc_ptr, alloc_ptr, #12 - cmp alloc_ptr, r10 + cmp alloc_ptr, alloc_limit movcs pc, lr /* Return if alloc_ptr >= alloc_limit */ /* Record return address */ - ldr r10, .Lcaml_last_return_address - str lr, [r10, #0] + ldr r12, .Lcaml_last_return_address + str lr, [r12, #0] /* Invoke GC */ bl .Linvoke_gc /* Try again */ b caml_alloc2 - .global caml_alloc3 + .globl caml_alloc3 caml_alloc3: - ldr r10, [alloc_limit, #0] sub alloc_ptr, alloc_ptr, #16 - cmp alloc_ptr, r10 + cmp alloc_ptr, alloc_limit movcs pc, lr /* Return if alloc_ptr >= alloc_limit */ /* Record return address */ - ldr r10, .Lcaml_last_return_address - str lr, [r10, #0] + ldr r12, .Lcaml_last_return_address + str lr, [r12, #0] /* Invoke GC */ bl .Linvoke_gc /* Try again */ b caml_alloc3 - .global caml_allocN + .globl caml_allocN caml_allocN: - str r12, [sp, #-4]! - ldr r12, [alloc_limit, #0] - sub alloc_ptr, alloc_ptr, r10 - cmp alloc_ptr, r12 - ldr r12, [sp], #4 + sub alloc_ptr, alloc_ptr, r12 + cmp alloc_ptr, alloc_limit movcs pc, lr /* Return if alloc_ptr >= alloc_limit */ /* Record return address and desired size */ + /* Can use alloc_limit as a temporary since it will be reloaded by + invoke_gc */ ldr alloc_limit, .Lcaml_last_return_address str lr, [alloc_limit, #0] - ldr alloc_limit, .LLcaml_requested_size - str r10, [alloc_limit, #0] + ldr alloc_limit, .Lcaml_requested_size + str r12, [alloc_limit, #0] /* Invoke GC */ bl .Linvoke_gc /* Try again */ - ldr r10, .LLcaml_requested_size - ldr r10, [r10, #0] + ldr r12, .Lcaml_requested_size + ldr r12, [r12, #0] b caml_allocN /* Shared code to invoke the GC */ .Linvoke_gc: /* Record lowest stack address */ - ldr r10, .Lcaml_bottom_of_stack - str sp, [r10, #0] + ldr r12, .Lcaml_bottom_of_stack + str sp, [r12, #0] /* Save integer registers and return address on stack */ - stmfd sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r10,r12,lr} + stmfd sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r12,lr} /* Store pointer to saved integer registers in caml_gc_regs */ - ldr r10, .Lcaml_gc_regs - str sp, [r10, #0] - /* Save non-callee-save float registers */ - stfd f0, [sp, #-8]! - stfd f1, [sp, #-8]! - stfd f2, [sp, #-8]! - stfd f3, [sp, #-8]! + ldr r12, .Lcaml_gc_regs + str sp, [r12, #0] /* Save current allocation pointer for debugging purposes */ - ldr r10, .Lcaml_young_ptr - str alloc_ptr, [r10, #0] + ldr r12, .Lcaml_young_ptr + str alloc_ptr, [r12, #0] /* Save trap pointer in case an exception is raised during GC */ - ldr r10, .Lcaml_exception_pointer - str trap_ptr, [r10, #0] + ldr r12, .Lcaml_exception_pointer + str trap_ptr, [r12, #0] /* Call the garbage collector */ bl caml_garbage_collection /* Restore the registers from the stack */ - ldfd f4, [sp], #8 - ldfd f5, [sp], #8 - ldfd f6, [sp], #8 - ldfd f7, [sp], #8 - ldmfd sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r10,r12} + ldmfd sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r12} /* Reload return address */ - ldr r10, .Lcaml_last_return_address - ldr lr, [r10, #0] - /* Say that we are back into Caml code */ - mov alloc_ptr, #0 - str alloc_ptr, [r10, #0] + ldr r12, .Lcaml_last_return_address + ldr lr, [r12, #0] /* Reload new allocation pointer and allocation limit */ - ldr r10, .Lcaml_young_ptr - ldr alloc_ptr, [r10, #0] - ldr alloc_limit, .Lcaml_young_limit + ldr r12, .Lcaml_young_ptr + ldr alloc_ptr, [r12, #0] + ldr r12, .Lcaml_young_limit + ldr alloc_limit, [r12, #0] /* Return to caller */ - ldmfd sp!, {pc} + ldr r12, [sp], #4 + bx r12 /* Call a C function from Caml */ -/* Function to call is in r10 */ +/* Function to call is in r12 */ - .global caml_c_call + .globl caml_c_call caml_c_call: /* Preserve return address in callee-save register r4 */ mov r4, lr @@ -161,34 +149,29 @@ caml_c_call: str trap_ptr, [r7, #0] /* Call the function */ mov lr, pc - mov pc, r10 - /* Reload alloc ptr */ + bx r12 + /* Reload alloc ptr and alloc limit */ + ldr r5, .Lcaml_young_limit ldr alloc_ptr, [r6, #0] /* r6 still points to caml_young_ptr */ - /* Say that we are back into Caml code */ - mov r6, #0 - str r6, [r5, #0] /* r5 still points to caml_last_return_address */ + ldr alloc_limit, [r5, #0] /* Return */ - mov pc, r4 + bx r4 /* Start the Caml program */ - .global caml_start_program + .globl caml_start_program caml_start_program: - ldr r10, .Lcaml_program + ldr r12, .Lcaml_program /* Code shared with caml_callback* */ -/* Address of Caml code to call is in r10 */ +/* Address of Caml code to call is in r12 */ /* Arguments to the Caml code are in r0...r3 */ .Ljump_to_caml: /* Save return address and callee-save registers */ - stmfd sp!, {r4,r5,r6,r7,r8,r9,r11,lr} - stfd f7, [sp, #-8]! - stfd f6, [sp, #-8]! - stfd f5, [sp, #-8]! - stfd f4, [sp, #-8]! + stmfd sp!, {r4,r5,r6,r7,r8,r10,r11,lr} /* 8-alignment */ /* Setup a callback link on the stack */ - sub sp, sp, #4*3 + sub sp, sp, #4*4 /* 8-alignment */ ldr r4, .Lcaml_bottom_of_stack ldr r4, [r4, #0] str r4, [sp, #0] @@ -209,14 +192,11 @@ caml_start_program: /* Reload allocation pointers */ ldr r4, .Lcaml_young_ptr ldr alloc_ptr, [r4, #0] - ldr alloc_limit, .Lcaml_young_limit - /* We are back into Caml code */ - ldr r4, .Lcaml_last_return_address - mov r5, #0 - str r5, [r4, #0] + ldr r4, .Lcaml_young_limit + ldr alloc_limit, [r4, #0] /* Call the Caml code */ mov lr, pc - mov pc, r10 + bx r12 .Lcaml_retaddr: /* Pop the trap frame, restoring caml_exception_pointer */ ldr r4, .Lcaml_exception_pointer @@ -234,16 +214,13 @@ caml_start_program: ldr r4, .Lcaml_gc_regs ldr r5, [sp, #8] str r5, [r4, #0] - add sp, sp, #4*3 + add sp, sp, #4*4 /* Update allocation pointer */ ldr r4, .Lcaml_young_ptr str alloc_ptr, [r4, #0] /* Reload callee-save registers and return */ - ldfd f4, [sp], #8 - ldfd f5, [sp], #8 - ldfd f6, [sp], #8 - ldfd f7, [sp], #8 - ldmfd sp!, {r4,r5,r6,r7,r8,r9,r11,pc} + ldmfd sp!, {r4,r5,r6,r7,r8,r10,r11,lr} + bx lr /* The trap handler */ .Ltrap_handler: @@ -257,59 +234,56 @@ caml_start_program: /* Raise an exception from C */ - .global caml_raise_exception + .globl caml_raise_exception caml_raise_exception: /* Reload Caml allocation pointers */ - ldr r1, .Lcaml_young_ptr - ldr alloc_ptr, [r1, #0] - ldr alloc_limit, .Lcaml_young_limit - /* Say we're back into Caml */ - ldr r1, .Lcaml_last_return_address - mov r2, #0 - str r2, [r1, #0] + ldr r12, .Lcaml_young_ptr + ldr alloc_ptr, [r12, #0] + ldr r12, .Lcaml_young_limit + ldr alloc_limit, [r12, #0] /* Cut stack at current trap handler */ - ldr r1, .Lcaml_exception_pointer - ldr sp, [r1, #0] + ldr r12, .Lcaml_exception_pointer + ldr sp, [r12, #0] /* Pop previous handler and addr of trap, and jump to it */ ldmfd sp!, {trap_ptr, pc} /* Callback from C to Caml */ - .global caml_callback_exn + .globl caml_callback_exn caml_callback_exn: /* Initial shuffling of arguments (r0 = closure, r1 = first arg) */ - mov r10, r0 + mov r12, r0 mov r0, r1 /* r0 = first arg */ - mov r1, r10 /* r1 = closure environment */ - ldr r10, [r10, #0] /* code pointer */ + mov r1, r12 /* r1 = closure environment */ + ldr r12, [r12, #0] /* code pointer */ b .Ljump_to_caml - .global caml_callback2_exn + .globl caml_callback2_exn caml_callback2_exn: /* Initial shuffling of arguments (r0 = closure, r1 = arg1, r2 = arg2) */ - mov r10, r0 + mov r12, r0 mov r0, r1 /* r0 = first arg */ mov r1, r2 /* r1 = second arg */ - mov r2, r10 /* r2 = closure environment */ - ldr r10, .Lcaml_apply2 + mov r2, r12 /* r2 = closure environment */ + ldr r12, .Lcaml_apply2 b .Ljump_to_caml - .global caml_callback3_exn + .globl caml_callback3_exn caml_callback3_exn: /* Initial shuffling of arguments */ /* (r0 = closure, r1 = arg1, r2 = arg2, r3 = arg3) */ - mov r10, r0 + mov r12, r0 mov r0, r1 /* r0 = first arg */ mov r1, r2 /* r1 = second arg */ mov r2, r3 /* r2 = third arg */ - mov r3, r10 /* r3 = closure environment */ - ldr r10, .Lcaml_apply3 + mov r3, r12 /* r3 = closure environment */ + ldr r12, .Lcaml_apply3 b .Ljump_to_caml - .global caml_ml_array_bound_error + .globl caml_ml_array_bound_error caml_ml_array_bound_error: - /* Load address of [caml_array_bound_error] in r10 */ - ldr r10, .Lcaml_array_bound_error + /* Load address of [caml_array_bound_error] in r12 */ + ldr r12, .Lcaml_array_bound_error /* Call that function */ b caml_c_call @@ -325,17 +299,17 @@ caml_ml_array_bound_error: .LLtrap_handler: .word .Ltrap_handler .Lcaml_apply2: .word caml_apply2 .Lcaml_apply3: .word caml_apply3 -.LLcaml_requested_size: .word .Lcaml_requested_size .Lcaml_array_bound_error: .word caml_array_bound_error +.Lcaml_requested_size: .word caml_requested_size -.data -.Lcaml_requested_size: .word 0 + .data +caml_requested_size: + .word 0 /* GC roots for callback */ .data - - .global caml_system__frametable + .globl caml_system__frametable caml_system__frametable: .word 1 /* one descriptor */ .word .Lcaml_retaddr /* return address into callback */ diff --git a/asmrun/backtrace.c b/asmrun/backtrace.c index a875822b..0825cade 100644 --- a/asmrun/backtrace.c +++ b/asmrun/backtrace.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: backtrace.c 8839 2008-03-14 13:47:24Z xleroy $ */ +/* $Id$ */ /* Stack backtrace for uncaught exceptions */ @@ -131,7 +131,7 @@ static void extract_location_info(frame_descr * d, uint32 info1, info2; /* If no debugging information available, print nothing. - When everything is compiled with -g, this corresponds to + When everything is compiled with -g, this corresponds to compiler-inserted re-raise operations. */ if ((d->frame_size & 1) == 0) { li->loc_valid = 0; @@ -147,7 +147,7 @@ static void extract_location_info(frame_descr * d, info2 = ((uint32 *)infoptr)[1]; /* Format of the two info words: llllllllllllllllllll aaaaaaaa bbbbbbbbbb nnnnnnnnnnnnnnnnnnnnnnnn kk - 44 36 26 2 0 + 44 36 26 2 0 (32+12) (32+4) k ( 2 bits): 0 if it's a call, 1 if it's a raise n (24 bits): offset (in 4-byte words) of file name relative to infoptr @@ -222,4 +222,3 @@ CAMLprim value caml_get_exception_backtrace(value unit) res = caml_alloc_small(1, 0); Field(res, 0) = arr; /* Some */ CAMLreturn(res); } - diff --git a/asmrun/fail.c b/asmrun/fail.c index 0b2544cc..a1ec0fb0 100644 --- a/asmrun/fail.c +++ b/asmrun/fail.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fail.c 9030 2008-09-18 11:23:28Z xleroy $ */ +/* $Id$ */ /* Raising exceptions from C. */ diff --git a/asmrun/hppa.S b/asmrun/hppa.S index e394ad47..abdd4554 100644 --- a/asmrun/hppa.S +++ b/asmrun/hppa.S @@ -11,7 +11,7 @@ ;* * ;********************************************************************* -; $Id: hppa.S 7382 2006-04-16 23:28:22Z doligez $ +; $Id$ ; Asm part of the runtime system for the HP PA-RISC processor. ; Must be preprocessed by cpp @@ -366,7 +366,7 @@ L102: ldo LOW(G(caml_young_limit))(%r1), %r4 ; Call the Caml code ble 0(4, %r22) - copy %r31, %r2 + copy %r31, %r2 L104: ; Pop the trap frame ldw -8(%r30), %r31 diff --git a/asmrun/i386.S b/asmrun/i386.S index 95198e0a..73ac4674 100644 --- a/asmrun/i386.S +++ b/asmrun/i386.S @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: i386.S 8962 2008-08-01 08:04:57Z xleroy $ */ +/* $Id$ */ /* Asm part of the runtime system, Intel 386 processor */ /* Must be preprocessed by cpp */ diff --git a/asmrun/i386nt.asm b/asmrun/i386nt.asm index 8f128919..711449cf 100644 --- a/asmrun/i386nt.asm +++ b/asmrun/i386nt.asm @@ -1,17 +1,17 @@ ;********************************************************************* -; -; Objective Caml ; -; Xavier Leroy, projet Cristal, INRIA Rocquencourt +; Objective Caml ; -; 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. +; Xavier Leroy, 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: i386nt.asm 7812 2007-01-29 12:11:18Z xleroy $ +; $Id$ ; Asm part of the runtime system, Intel 386 processor, Intel syntax @@ -32,7 +32,7 @@ EXTERN _caml_backtrace_active: DWORD EXTERN _caml_stash_backtrace: PROC -; Allocation +; Allocation .CODE PUBLIC _caml_alloc1 @@ -42,12 +42,12 @@ PUBLIC _caml_call_gc _caml_call_gc: - ; Record lowest stack address and return address + ; Record lowest stack address and return address mov eax, [esp] mov _caml_last_return_address, eax lea eax, [esp+4] mov _caml_bottom_of_stack, eax - ; Save all regs used by the code generator + ; Save all regs used by the code generator L105: push ebp push edi push esi @@ -56,9 +56,9 @@ L105: push ebp push ebx push eax mov _caml_gc_regs, esp - ; Call the garbage collector + ; Call the garbage collector call _caml_garbage_collection - ; Restore all regs used by the code generator + ; Restore all regs used by the code generator pop eax pop ebx pop ecx @@ -66,8 +66,8 @@ L105: push ebp pop esi pop edi pop ebp - ; Return to caller - ret + ; Return to caller + ret ALIGN 4 _caml_alloc1: @@ -76,7 +76,7 @@ _caml_alloc1: mov _caml_young_ptr, eax cmp eax, _caml_young_limit jb L100 - ret + ret L100: mov eax, [esp] mov _caml_last_return_address, eax lea eax, [esp+4] @@ -91,7 +91,7 @@ _caml_alloc2: mov _caml_young_ptr, eax cmp eax, _caml_young_limit jb L101 - ret + ret L101: mov eax, [esp] mov _caml_last_return_address, eax lea eax, [esp+4] @@ -106,7 +106,7 @@ _caml_alloc3: mov _caml_young_ptr, eax cmp eax, _caml_young_limit jb L102 - ret + ret L102: mov eax, [esp] mov _caml_last_return_address, eax lea eax, [esp+4] @@ -134,25 +134,25 @@ L103: sub eax, _caml_young_ptr ; eax = - size pop eax ; recover desired size jmp _caml_allocN -; Call a C function from Caml +; Call a C function from Caml PUBLIC _caml_c_call ALIGN 4 _caml_c_call: - ; Record lowest stack address and return address + ; Record lowest stack address and return address mov edx, [esp] mov _caml_last_return_address, edx lea edx, [esp+4] mov _caml_bottom_of_stack, edx - ; Call the function (address in %eax) + ; Call the function (address in %eax) jmp eax -; Start the Caml program +; Start the Caml program PUBLIC _caml_start_program ALIGN 4 _caml_start_program: - ; Save callee-save registers + ; Save callee-save registers push ebx push esi push edi @@ -163,20 +163,20 @@ _caml_start_program: ; Code shared between caml_start_program and callback* L106: - ; Build a callback link + ; Build a callback link push _caml_gc_regs push _caml_last_return_address push _caml_bottom_of_stack - ; Build an exception handler + ; Build an exception handler push L108 push _caml_exception_pointer mov _caml_exception_pointer, esp - ; Call the Caml code + ; Call the Caml code call esi L107: - ; Pop the exception handler + ; Pop the exception handler pop _caml_exception_pointer - pop esi ; dummy register + pop esi ; dummy register L109: ; Pop the callback link, restoring the global variables ; used by caml_c_call @@ -188,8 +188,8 @@ L109: pop edi pop esi pop ebx - ; Return to caller. - ret + ; Return to caller. + ret L108: ; Exception handler ; Mark the bucket as an exception result and return it @@ -205,7 +205,7 @@ _caml_raise_exn: jne L110 mov esp, _caml_exception_pointer pop _caml_exception_pointer - ret + ret L110: mov esi, eax ; Save exception bucket in esi mov edi, _caml_exception_pointer ; SP of handler @@ -221,7 +221,7 @@ L110: pop _caml_exception_pointer ret -; Raise an exception from C +; Raise an exception from C PUBLIC _caml_raise_exception ALIGN 4 @@ -231,7 +231,7 @@ _caml_raise_exception: mov eax, [esp+4] mov esp, _caml_exception_pointer pop _caml_exception_pointer - ret + ret L111: mov esi, [esp+4] ; Save exception bucket in esi push _caml_exception_pointer ; arg 4: SP of handler @@ -244,51 +244,51 @@ L111: pop _caml_exception_pointer ret -; Callback from C to Caml +; Callback from C to Caml PUBLIC _caml_callback_exn ALIGN 4 _caml_callback_exn: - ; Save callee-save registers + ; Save callee-save registers push ebx push esi push edi push ebp - ; Initial loading of arguments - mov ebx, [esp+20] ; closure - mov eax, [esp+24] ; argument + ; Initial loading of arguments + mov ebx, [esp+20] ; closure + mov eax, [esp+24] ; argument mov esi, [ebx] ; code pointer jmp L106 PUBLIC _caml_callback2_exn ALIGN 4 _caml_callback2_exn: - ; Save callee-save registers + ; Save callee-save registers push ebx push esi push edi push ebp - ; Initial loading of arguments - mov ecx, [esp+20] ; closure - mov eax, [esp+24] ; first argument - mov ebx, [esp+28] ; second argument - mov esi, offset _caml_apply2 ; code pointer + ; Initial loading of arguments + mov ecx, [esp+20] ; closure + mov eax, [esp+24] ; first argument + mov ebx, [esp+28] ; second argument + mov esi, offset _caml_apply2 ; code pointer jmp L106 PUBLIC _caml_callback3_exn ALIGN 4 _caml_callback3_exn: - ; Save callee-save registers + ; Save callee-save registers push ebx push esi push edi push ebp - ; Initial loading of arguments - mov edx, [esp+20] ; closure - mov eax, [esp+24] ; first argument - mov ebx, [esp+28] ; second argument - mov ecx, [esp+32] ; third argument - mov esi, offset _caml_apply3 ; code pointer + ; Initial loading of arguments + mov edx, [esp+20] ; closure + mov eax, [esp+24] ; first argument + mov ebx, [esp+28] ; second argument + mov ecx, [esp+32] ; third argument + mov esi, offset _caml_apply3 ; code pointer jmp L106 PUBLIC _caml_ml_array_bound_error @@ -310,14 +310,13 @@ _caml_ml_array_bound_error: .DATA PUBLIC _caml_system__frametable _caml_system__frametable LABEL DWORD - DWORD 1 ; one descriptor - DWORD L107 ; return address into callback - WORD -1 ; negative frame size => use callback link - WORD 0 ; no roots here + DWORD 1 ; one descriptor + DWORD L107 ; return address into callback + WORD -1 ; negative frame size => use callback link + WORD 0 ; no roots here PUBLIC _caml_extra_params _caml_extra_params LABEL DWORD BYTE 64 DUP (?) END - diff --git a/asmrun/ia64.S b/asmrun/ia64.S index ca64ed55..d4296fa4 100644 --- a/asmrun/ia64.S +++ b/asmrun/ia64.S @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: ia64.S 9341 2009-09-17 13:05:47Z xleroy $ */ +/* $Id$ */ /* Asm part of the runtime system, IA64 processor */ @@ -239,7 +239,7 @@ caml_start_program: mov b6 = r2 /* Code shared with caml_callback* */ -.L103: +.L103: /* Allocate 64 "out" registers (for the Caml code) and no locals */ alloc r3 = ar.pfs, 0, 0, 64, 0 add sp = -(56 * 8), sp ;; @@ -503,7 +503,7 @@ caml_callback3_exn: .align 16 caml_ml_array_bound_error: ADDRGLOBAL(r2, @fptr(caml_array_bound_error#)) - br.sptk caml_c_call /* never returns */ + br.sptk caml_c_call /* never returns */ .rodata diff --git a/asmrun/m68k.S b/asmrun/m68k.S index bf3cbfcb..559eacbe 100644 --- a/asmrun/m68k.S +++ b/asmrun/m68k.S @@ -11,7 +11,7 @@ |* * |*********************************************************************** -| $Id: m68k.S 6050 2004-01-03 12:51:20Z doligez $ +| $Id$ | Asm part of the runtime system, Motorola 68k processor diff --git a/asmrun/mips.s b/asmrun/mips.s index 2ce19ef2..03fd6234 100644 --- a/asmrun/mips.s +++ b/asmrun/mips.s @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mips.s 6552 2004-07-13 12:19:15Z xleroy $ */ +/* $Id$ */ /* Asm part of the runtime system, Mips processor, IRIX n32 conventions */ diff --git a/asmrun/power-aix.S b/asmrun/power-aix.S index 0f0abf86..d63cdae8 100644 --- a/asmrun/power-aix.S +++ b/asmrun/power-aix.S @@ -11,7 +11,7 @@ #* * #********************************************************************* -# $Id: power-aix.S 6050 2004-01-03 12:51:20Z doligez $ +# $Id$ .csect .text[PR] diff --git a/asmrun/power-elf.S b/asmrun/power-elf.S index 8a2f0011..968e3aeb 100644 --- a/asmrun/power-elf.S +++ b/asmrun/power-elf.S @@ -11,7 +11,7 @@ /* */ /*********************************************************************/ -/* $Id: power-elf.S 6050 2004-01-03 12:51:20Z doligez $ */ +/* $Id$ */ #define Addrglobal(reg,glob) \ addis reg, 0, glob@ha; \ @@ -204,7 +204,7 @@ caml_c_call: Storeglobal(12, caml_last_return_address, 11) /* Return to caller */ blr - + /* Raise an exception from C */ .globl caml_raise_exception @@ -298,7 +298,7 @@ caml_start_program: stw 11, 4(1) mr 29, 1 /* Reload allocation pointers */ - Loadglobal(31, caml_young_ptr, 11) + Loadglobal(31, caml_young_ptr, 11) Loadglobal(30, caml_young_limit, 11) /* Say we are back into Caml code */ li 0, 0 @@ -316,9 +316,9 @@ caml_start_program: lwz 9, 0(1) lwz 10, 4(1) lwz 11, 8(1) - Storeglobal(9, caml_bottom_of_stack, 12) - Storeglobal(10, caml_last_return_address, 12) - Storeglobal(11, caml_gc_regs, 12) + Storeglobal(9, caml_bottom_of_stack, 12) + Storeglobal(10, caml_last_return_address, 12) + Storeglobal(11, caml_gc_regs, 12) addi 1, 1, 16 /* Update allocation pointer */ Storeglobal(31, caml_young_ptr, 11) @@ -396,7 +396,7 @@ caml_callback2_exn: mr 5, 0 Addrglobal(12, caml_apply2) b .L102 - + .globl caml_callback3_exn .type caml_callback3_exn, @function caml_callback3_exn: @@ -418,4 +418,3 @@ caml_system__frametable: .long .L105 + 4 /* return address into callback */ .short -1 /* negative size count => use callback link */ .short 0 /* no roots here */ - diff --git a/asmrun/power-rhapsody.S b/asmrun/power-rhapsody.S index 48265379..765de9c8 100644 --- a/asmrun/power-rhapsody.S +++ b/asmrun/power-rhapsody.S @@ -11,7 +11,7 @@ /* */ /*********************************************************************/ -/* $Id: power-rhapsody.S 7812 2007-01-29 12:11:18Z xleroy $ */ +/* $Id$ */ #ifdef __ppc64__ #define X(a,b) b diff --git a/asmrun/roots.c b/asmrun/roots.c index 7953a961..dad820f3 100644 --- a/asmrun/roots.c +++ b/asmrun/roots.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: roots.c 8828 2008-03-10 19:56:39Z xleroy $ */ +/* $Id$ */ /* To walk the memory roots for garbage collection */ diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index da4491d6..f8f542ad 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals_asm.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ /* Signal handling, code specific to the native-code compiler */ diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index 102711d6..76552e5e 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals_osdep.h 9194 2009-03-28 15:18:31Z xleroy $ */ +/* $Id$ */ /* Processor- and OS-dependent signal interface */ @@ -76,6 +76,25 @@ #define CONTEXT_SP (CONTEXT_STATE.CONTEXT_REG(rsp)) #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) +/****************** ARM, Linux */ + +#elif defined(TARGET_arm) && defined (SYS_linux) + + #include + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, ucontext_t * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ + sigact.sa_flags = SA_SIGINFO + + typedef unsigned long context_reg; + #define CONTEXT_PC (context->uc_mcontext.arm_pc) + #define CONTEXT_EXCEPTION_POINTER (context->uc_mcontext.arm_fp) + #define CONTEXT_YOUNG_PTR (context->uc_mcontext.arm_r8) + #define CONTEXT_FAULTING_ADDRESS ((char *) context->uc_mcontext.fault_address) + /****************** AMD64, Solaris x86 */ #elif defined(TARGET_amd64) && defined (SYS_solaris) diff --git a/asmrun/sparc.S b/asmrun/sparc.S index d205c65e..38d0be0c 100644 --- a/asmrun/sparc.S +++ b/asmrun/sparc.S @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sparc.S 6631 2004-10-06 06:33:25Z garrigue $ */ +/* $Id$ */ /* Asm part of the runtime system for the Sparc processor. */ /* Must be preprocessed by cpp */ diff --git a/asmrun/stack.h b/asmrun/stack.h index 0b632406..578e9cf8 100644 --- a/asmrun/stack.h +++ b/asmrun/stack.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stack.h 8477 2007-11-06 15:16:56Z frisch $ */ +/* $Id$ */ /* Machine-dependent interface with the asm code */ diff --git a/asmrun/startup.c b/asmrun/startup.c index 7508901d..d22e58fe 100644 --- a/asmrun/startup.c +++ b/asmrun/startup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: startup.c 9131 2008-11-18 10:24:43Z doligez $ */ +/* $Id$ */ /* Start-up code */ diff --git a/boot/myocamlbuild.boot b/boot/myocamlbuild.boot index 58a535d7430f5b16bb8a0815c1c615e58f832650..836eb30299eccd99f3d1fc191d56020e6ad39fdf 100755 GIT binary patch delta 110307 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 z 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 Xm%8KPc0bZ^d+h?;atUw`v!?zpDF*JC delta 105443 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 fy@Eud{D;1* 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≪Xz-eQvc@Z{!-0w#jw3G=TW>kJ7d>8g+NVKo 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

bQx|=sUS8TKfCY9qG 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
    N#){E^DO zvOrfJWJ4K8oKJmJU5OmwfekBx zMW37rq3eJxeH69d2KcKG%57cEp%Gw3bgT)+09&C5(PtnuTH}~5|6@Qw@CB3MTX@2m zhdA+V!3LuSB5-oX{}#{?e8F4+*lvxo8&~lWLZ2I=QL-E|WDEZB91OQa2HTNHAaW*W z{EtEWe2IuLJW9f$QoA$_qd7-6$EHLrk5RE~dP?;cp(Hp$%b_j4omqU^l5O`5aqi~D zi6i+Tx+lFWbUs{;^H!}5!o-QzoV?nmF`cl3I^E78?BZHBRG8o7LJo-}wk#!q5OgKA zjX4n32}&K%oRM=c;!7ycivTIC?WO^`0RMa!KwOinUX5|l5h*MLCU;OLExN_{2XN3y zNnksI7)vzFeOl_i$x>i^QgAy-V+m@QT(>l@&XL+W7iZ)(I8%}GOy6kYFM_u6kGEm_ z(EQ{7XgT*}8Fq(aRHWcgDx)!(mua;Z=YbqOx#MR^j*$D&N$Y6HUyxq0r-0#2uEj8p z1v3=<@Ei-bSh!nL#&2lK)j)Z5+ybYLg_-@ID z+@=Z-hi@Zmi~4Yp!{M-4ONnXDRqw-pv2crp=eL&)JzndJ941_zpl%Ek;=V3(-{knER&d8J z#@&%&YE;rX^a|rkT_B}gSd}v4hUAElwQLEO*bJYWi=-ii)>G-iV(A+BAp{tAbn)5x zr(^41+;yt(Fk#aAcZZu0xfZWCa&c4+eJ5;WvQxvybIdDjlkF|KGFdmN@8CNSxVxqCqZ zmvbZfDEym4p!t0^>1)eb!rV0I&+lKG@ZnK%`bnlAZ~E#&XLwYIC78Bt;ye9L(-U)R zg8p1>Iq8v7u|DMRHEj4Xx^<^Knz09t8<<1*91RsifmcV`+`M(?0&%X+{$=dpYG|1w zA?8r(okb3zUF-FIJ5)4qej{yv^T!!$%<6;cK=O5)Gl;VmJ;^(7RRScP`id_hcb=C=QsnV|e>RIDb^#io=Uxb7zoH?7*iEBc=>~V?XljK>4jh5Mp&; z2z(H)R61ZgQxW1GE*C0%VTLtV`teMx4(&6LsacyN4u|&n&mAsj2$F)tLw z=Y|NT519OyARP%6Or|teQyGibLE^cjfcweTRk@fDebI&mgxDwFVXO?+wXle0i1u5e90CV__Fn>e<8 zHsEQzuHzy2;&Vd`55oD`pdq179C>AYE?)QL`Wy&{%b5~6R=@_ZbR)=wSG<98C9Mw(%R9ay3w1oshQ`yu#p14GF(qUwLMX z!uZTD331~)JPpS;I%yrs*B1<|P1jsc$K(L<*|zuuQmivUJPGBwa5(*42ru^f-O-}> z-03*aaxKDs^6BSMjl&0FaMBquFt09 z&>N1Aapmu5U^wy`9Jk&D7Q%2t{vou@*&S+NBe@ofKO9-zI5P{hH4~Fb@{e4u@kY@g$Vz6-ACl zjW0vr5|4hY3CCH&2sP=^?}Qo*Crx+y#HAA+3=Xg2Zv;1jfp1A@U#H?BF!8w|2A9`H z;PGz`3EQIM%5bQG5axym+?=<7f*C%Q*b=f;Q`(BDQR2h*lC;ka5w3+_PNEVVH^w$i zWt-w5bj9a}kURNPFWW#zLY+7}b=;kbhfoop8{%+HK6ZkJggSBhblg70L$Jl?h8P~P zHWfI1pdq17oZULE3|$L0{kH9f2%Nm~zZ*0pR4^GD*Hq$|z$ZRJ=yOAa3VG$9Q~e~= ziPNvC^kb@_`0!G&~?UXGvAiKBqwatn({PG&a_1J?@k$mu-#JXN1xuao6UNYZx!a=dQ>Ws+Y} zrEvcGsxn7g=odKCV{$`y_a;%MFg~e}|C0&=WqQ^XazxXv(8Y^I>{w0;f`!E#xo)hI z5VJ_&SXXy}%B3WC#o`ykI|X~AG@#9?@F8>#UZx$wt2CYqL-Qf$0H+-i@RgX`HDlEzD6Id@DTrd-h(<|_g%?oaw6`2(Y zUJ_g|mtK072DjEPZ1zXFjCw_o_yCqw1h=+uC3dnan&u*R3HO6w4_5JJu?B;|iUnQ$ zF-=?hvXCTi_LnVcCOcS{-tEVl?kq8^CGU&u<;rd>VBdok^<3tih~%@}+3%$t=) z8va!{OPWYLe!V}b7jLh~GG5V}?(CNN;q7-ze9=Rj8#e@mHmj1F5d4R!Vx+xMrOS z7R9HcD=zZ4U=4r9h^Dm=-5<-$ou3u9ER2-rZi*$a=saEN??{78GPN&~>h{Yr{Dsg_ zIunHeSp4p+&fms``8pS%y}tD9`5L=yepOe0_bPu&42$H2D=w^0B?o%@a<#AVX3pQU zr>xfRUmH!}3j>*`AHrj)doAqkKjPmrkcwjEKEHV|zbn}t1(_t*ll$i;l73`x zQpB#DGhdL(kh&IGmZayB1kb6+K2q*y{ER<65R)bTOsqe$J6bt+zC=u~s_G#rZF_$D zBmB+)4Opi*Yd-Yav+_tt2B&{dylhETcPzEa?+dy_tW9balnq7qN2O1<8x;7m2N zXGeduKbbmE6V%MK2I>>|ctWguMFV5xH{#3GR$1yLLyrcf^u4^+4USAf&&hF(k=4U~XN}f!d-6X41U_C1(H` zvp2d!%5Tkjt?$~k*+TRi6rvBK09B(?{bPIxLK|M-kzHT7b;oLJd}H-M%NIWIvxo4l z2bx%5+j~E}XKS)9ac;dT-}ITM??wb&z53bjBd_mRyUy4qs zde8okf)6Qhf$$gq^`T#Wd4Hs_8T?y=Q@FJ|8Jhw;D1hf9X6 zIB?;e)BgGPvkwLj2mUbO3u_nu9DzecGVtjae)h`8HrHy1EM7nQ7~)dt`hazQptGb>lDoZ^SVrJ@Bqa)aCDqJ^9??;P0<{-?g8GD&}OX z+d#v{&$qr~`I(2S79_sCyyDA0ftI9d4&2#s<70iz{;A)4`K3?%>6Yn#z_&}9ckT+j z(6acU+g5%)9ewBVN-@?>_P|BtbcsEDk()+w+Hd zYY+52`tfuA{;#(@|1|NVnLzF0x$hV}|IB}|R=oRA`?MFY0~k-Hz@b;ae$Mi@omO}4 zwL7=I`0E?+O%_*e8R+}rbw9i9hc{jF(uBP~|Jqr|pFyYc4m@)2HH%dA2fMDg?y>3@ zJ~kH_G*s0G?t1Rto%7RkKlZ6JUmWkdxg3QiTSo`Hb3gdue|z%$Ww!UgcX#ytbXu^c zc}-Y(=Txm}Xkl+gt!Zdz;}svF!rFjI;WeT55O!sq*4EjGdchm6X{|xH_b)&hTZ1;> OqKhxScyl1I{Qm>S={-XL literal 289555 zcmdSi3%uvmSsr?l;W8s=Gy)+_0&{0>0YU;ARA!SINC>$iAqJ8mxF=zT5XcoxNJw-D zV2#xpZM98p)z)aeTlKW3_F~UTYZJ899#b#J9$V9^)wZ6tT2C$K`TpnkOcp=?d(VJa z?eg=uZtr^E=e?};|L;9BWZRZY-~G;aTzc0%tGC~EY5w0^@4EE)&wJkGhcEr|qjw*l zzvJC^f7VT>op#!n}MrKM{2N$&A(Wk$?{U=LWY2KObmxxF7RaT$wdz*xDMQ;eD77m-uW4mcL(|S?4Um1kumP<^bV4#eD!B(A;TtakN2E-JIgkIHUt{G z>+Lx+moLw9d%Rr!IQsCq_<2?!&tmV6-V)TuBhy&zwQh{T=f^Xr@xk=o_0}<6txxr& z7QNlxZ94U>O}geX-t&utO@W4w+?9jcYrXtH#%k$-K>NJFK7P&{Xm#M+H9qwYy)onO3EYix{Ma;a+{zKByMyY%lb)48W5c{Q z%X_2EG;zUQduvcR=gimQB_?dk$=s&ct9`NA7m(GyD!%LS={kQtnsvU`ma}IB&6T{7 zdnnM@wbr@Znb%KsQ(o`SSRR`vT-{yo2pi5>E5v7eASPn;hrt2=^*FpS`|>~LMr^JO z)V;H6uX*d9J2LK-yV%KroU(me@JoSQe{;Z&ILz;|clVaS_dmAS`TT&cx$JuPKH>{o z^l9vpXP2(>G+qtl5%7FQK#mWU!}ZCk2lq(K)~bg$X74)!9K@g;a0R}oH?e6Ay)omS z!BbO%?y`0;kc$JsreGe+_2SN^`-Lw);?+3zPG#w|Uz_d}et$M#&l$1P?h1Z9%GA`; zgRyQheaya`kNb@Q-|$&hSAQn!c-0;|=LS9l>1xdBkYhUT55(!Lz?&*w?ju=mLUmcA z=aInO_YPbZIHx@rTos6|+9jhs5Ii@ar!{?k#(35j@8}rg+H9WbQkyt6-emsK6z|4a zZZv+gf$yt>=8Avy+ulD4`0ftdyC9%z-0K_m%&d>`JDhp-t`6f27dpLjbUITxb8+lE z!xQf*dF|oAgI&A61C4ewJ#oG@A$D5hB~~3bc6U!}pGuDT-1lwoQyudHS3*^J~-R>%b(ng=UXq%8n1O$&7bUSL>6_T zj#f<4Zav;D*6ClF=GOO42sCpA+n#WXAnpn8|;9Hvh5N{ChLMD|#*p zjt2Jz4+L6ceqqM$67F(vbx>LPcAuhV!HcX~u!bkS<9zdMzGXJwI-74B=A)m7Vo$C3 ztP>l#d`Z?unHNqn?ptM^HIw<=X?|5?eC}56zyFU%ALU!;Kb1M%`-0ZokNz-ZKRW3c{UX7Q-n>{@Lu0x_>hBasS7r zeecEg;85@z0bBGoZkJ>%pUpcR_Vpv5k4E1(|Hy3q&}{zx+5BCz`H{@Mc|IexQTLZ+ zufC7#FPrH&Fq>aBn_n`UZ=cPdHJd*@b9Q$Jdil}s2}T|pCb`R}{pU^n^JjAZ>35Io z`+{lzg|q!%%l@eMmuB;yna+#TDED_}az8T3y=by?a3=rl)BcNR>)$-Bzic{p!_>cg z>U}rlfBk&HG*?sBzi{eX&tE*v@wLA)^&>Cq*G=m$nfjMbeRfb)~@0@zyYsi1a)W2uy@0^OxK;Q zUT^r;;6s7-tI@&NQGS_C_4w3D4*$ydOzrx6GZvfwebTurWBeLdIoc55CyyhKOESkn zty~z0;plJe*{jd)B7dDBUm0_d7dfu)@~LLzoV@tpL#G15CJX@75 zXE7P|(9d2u(>ZdsR~v_>J#nfpbKYV_UM$w)&0qe{IX559Ht*`Rwv79ZxJUA>hUk(v z`t}9R^6P7oZ*^I@vEF(Q`8(!<410~Gae2{OUTp0R*`1OpQ z{N})ZWz|IG)Nk#KvhJ(%Y*dC#K7c*z{E#0$HMYI0^vQ=iNY-5J>WjGBdpOW=(ncBQ z%vuh(VHCv}N)Yi3)=Y0=ljY*k1`WT%Q`$pK`(n*9Qabna8`wK*;Cb|e_jiJiFH zo9pb}=)XK}3|h;L>n&L$PY?d{9O9%M48(w}IBDWA+K@L~ji;%(j8{eeaX?6G@a zApVyHWP4_Oo5+vz@;{Pwpa0I|I-cjt^}`xlqmKGIuANLT9o3uRqTU-5d-V&C`sKUa z$ZNE>mS3%*xleOjwIL^Lbia3UC2QKP!8}*|kn_C(`9C$i+wuqd0y^z|DsOhW#XIWE zxc6VO$9L~h*UdjW`qG`SVeR!<>pL>ao}YE^(kp|v1h};h+*RX*6``R_<$cgKm>wLW&cSTl= zb_aU`xrhCMCKhtt9I#7%SzetxFzty2UihguaS_AogHwsivb@rbuRApIrLTPPlb4Zm z`S$0Ju?|O`__47bU$#!Q4wvzD9=wCTZx|m8#FM;u;oraOYmnAdU}>w!HW$FBzhjZFFTZ8Z?nauOGFalxyxX$;D9 zUQ2$r+V^CvCEWTR7>o0mPkNfqW%cyyOWp-Bo%_mS)Bjl8gZ6;cqq_( zZ>6tuZ-IUBRR8w`;?Z{x2en^$Jjh$Gy!z<(w2c{G5nLSj-J{P=P4DfYi~fFAZO@p# z-jyR6w-);yz~|W*pSv?>f2>LGqILIYSsoLfN0;51e>cSKtellEbx}U$(s(=>T*UuW zxa^MHos^-DTtDjJj+Nt%G_~N5%&Owhshi z-1-y~vFhiyTF}%dJIi!ln)SI(zE$U`Ef*>r$%snAka1*?@r9eIxxoFxrZk? zYw~_mAXny%DZO}$X?f#kZLR#c1AW`)--X2T@#Mwd5y7`V*OmKPw#WPHZL1&da{YL` z9M-zOa-xaS2iGAb6eCHJi@e7&V3NBLfl zW4~95M>*nFj<3#G9d8QwX}s*6?Dxv%I${fc>aqNs)gCzBJ?4!YW4$H&qYo#GbA6zn z56+kW4ZADhj;d7AH=_@q1SWBChT`f|KwcIN4``M=1Y?_U}DJ;8nl z(?%b^B>Q(|O`Tcy9owCzU+(|je>)x%dvYg_WW0y^p6R;x!Mfb*eQ(x#v&MDbug#w| z^=iZX!l~ap_1mW2XR-ZVQ@hAPpw_T|UsM(c@lgqaHe(+Y%V}`BR#-zT-%*HMZH=8jQT@RTH%_k3ntFwVn-oWX2dQ(@8%x9>#b( zi#Kkd&R}a$?tX^a7_f!+hM@7Fr(DU;xmp|Juq|_Ttc$asb?8`2FMj0les-W4U$huK zHm79yL^q$J$F*V@+F&?{l-a9$$LpLF^jua>UoWp{>Uke>~_g#j5H z3I8$2KEKTm24Z$#>gDB7puUd;?+Ko0zDIk@>Xu#ho-7*|MAzIW_m+?B@Uib$eS9Em z+UbF_>O{`flFz%|ANjc=u-ET%w`Sbh7=1lI>!-?t@9Ot|hJF6`?$!T!j{DZvZ||v? zsIk>)ywf@MWHtWx5e{0s&<4T}a=43vvRdaKno8u?j zzPD~!9OQXRP`eo}d}^J|KO2_SwlmK6jXs!h@6r5TRUe!4J!jmdl|Y-%R~Dijrri(n$ft&bi#{FJ0^2E#By>CwBnSMF9KjwWUbB%3WH1D6dwHAzVe10(h zyl_v-SFZ7AqkMhFX!w%T*5lhZQl9a_`9pz5uQec78NO``*jx#;UBRYcLr}T)m8Wkd z&?=9=e42avv~gZv$!QN9?;i7>H4c1smMou*@%A%dekJfI9y^16p1mOBD+6*Xfi}Lm z^lFU}{k}_S#&l_?5?{5mHE3+<6jvDI*qDhGzWsht*)fJ{uJWTS|J?_Ay<>PfuPs|| zjQ=qFefYT9MGWi19~XaHQ_b(Oa211Z2<)jf_57oOCg(rA7=5O`tbK6Fn!m@d9SG>x z_l@8`To{}ljCJAOKk>8x|iu=f0Q3(#!ZW32V}2kL;5!$}{2%+eg#0`;|f8%6l^AGj2YYw+8Cgn$IJ1XU6%FVT}*o zaqpIMeOuPLYhN3g@vi+q=9*Z2?_%`WyLR7_wRcQwV@&6Ft?%!{lPq84ke~BCzKN%P zCD6v2;QxxnG_f7;*jl>A^P}Eny4K70c=l9nk7q`EBd1Z~3hBfzat^33` zv2usR?&tDn5ytcNjrlWGUhnb)wrx=to3`%#*8a7)*AV_O!?#2@k+)T{u_dF zrBfp}#?hZU;Vln%q|*r_E#k!13k9-897I^njlJJj33|Sxm1C8dtv0YoYOZFnij@ zz_~97dM?8g=Nf-&KRfx#?&zyMzQ~`(7k9exYp$!myqe?j?13d`UzoME&WigOGREKZpOO$nOobe?FVf|E&2(vtPUCMc&y_|8LFoADi@zGQT&;%+H>kKYuNcqf5>` zJNu)a=g#K)XY*GN`Yv0d?>#g5Z=cN{nazK9Hh)_F9rnm)`)vNI+5CO8`8Unx-!q&4 zgW24_J0I=+-fVtu{(O7fzkD`-MdoVTJ15R+?nm+&r!Ku=K7YD?|MchoqrTV8^nK-Q z{+DL+f0}tzE_835diBqSJNx;Q?XxrXZnihZM}6q6>-|1k?|sm#KfTWxJ-_t)&{yvK zY2LnaTc-7GQ}11H&S#o__tfKS{@kg*bm}jk`WH<7^QYdsLEatJfAQ2`J@sEQ^)H(B z*G==6O#O?e{)VZ4`P9F1>R+9nPCPaK;>zw-f$xYv9oXL!^qmvWdjh%Wd-G7nw+G&7 z?cw0PftYLde>E8Q|7+%Qq}l(SKrLw>3jRmX_s{$6?+UVshc=F#za|*<-;()g|L@NB zKb84t{}(bJ?f212?+N&Zm$=;@$mf{>fAs1=yEPz7j?Ei`_XOnSlAnAu zuAF;W-OgPeY!ArbSq{#Udoa+}vQLifW%iwCpY6)ApD-={O*z}{AlEkR44q@V$&;g3 zlb>>~Uq`Zr9~*pE2bJNMHu_N?+0^9h{ec|Uw}TnaeWRCeYVD$cP4enfO}5`O&H01V z<^cb>@77Mm_tyC6`?9Y9|fiAv`F^n=3v2%^bdo!l%H&eT->D?)N8cyO`@MlLhXeBJ?vB8kIiKGY&?iRD9|-QA z#@DAml{o$%vp71_Sm96S_^#R)=f>PV`7!@&uLd|(*IIG^w~=Yw)k5P={-1@L9DHqX zRj@hGs>|Mo1NTk*#izNz%bI!;yAKAq<86K1Z$4T}=Dwphw&rwe4+XxP$ltinUkx|) zfm^?)s-N}n^z3g7UNFdAoAJo!hRjdJKQdn)Ec226Q`PaVHFV&4syfu-G9LUrRUPkG zLx)^8{_W-Ix59 zoWObhJzgDbpX^*?GVeF!><0t!gOk0p&z!vvIdbCdKQH6n?`LN$uHHXyuFtL8gP#wU z$%&UU-U@9kJ?>5QER!4cc$fIZ-Up{~x)Zu_!_gUIwtHrG#(M(i!FRg-)A(R|`Er(T z*0pi$?UEO7-rm4Fgic82V;0B(B#s&&YzL7eX%S@@A=3LA93gzchZ?L*3OXQ&-fkx zC7H|XjzH79>&}xOaeLI2&&XJ`07@-bh_hmp_qk(={jiw*u1Z_M~p0WP?f zOXFVKe-JJ&jovvIw%Cx1*7K2!&$A28 zip?7XanW`K&h9ly^Y8dKrSJTgXY(JL&HcCFM){j&^Gj#*Uz>i{Tm7$|{oAc)XU=!~ z{P^6=&mQJyWIo<)GXFaNHfucd%bAa7{_*s0xAsjs)1CJ5>G#F8^EYQ_zIDl&U!0ve zHal}TbGfa~J(-WZo|Cy+>;AuwzA<+HPv+$LhreFF^m48r$IhC!m*a6C7jvJ9dY?b~ zi)Q`SX}*2xcTT<9AipQLI`C#`^j#3VFt{P`onlLHUeLGr){HgxmM`9@`u$&16P5Fp z`Rrs<9j*rRwcT06L9T&5zn}Ss0eL*#H)A#bYk@c(49Fe`)V{rc9nAO0c$e`yn*QEt zp6MbVcV)gYkUQUDd~T7qPj7vZ2R>^5SN5DEqfgl{`jqdYPbn<=qH z=Z~!x{cle_ZuI<@srP4T=Kgo6^uIOrK10miW4(XlsrU1v{x_!HcY1UG&6X?EzbvR9 z;v?@q&-8N5uMNT1PVz6$nA|ymxU@dS$(ib~Z%#&EIb%>$`tzrrEps)YZ_Qpf%{Nc| zsno3V`zHBIrv9?2f5EKxhLdkECgxu<^wi_HUpc6#8UxOsEuo~V8C#)nThKT-QR zx;QU(8lQUy-D~5~mhVmc<162G1Z?wLy{%4T`*Yvukzae_vh@K$G9dDG>b*ev5OR%)JowMzDyK;r{n?C}i``^#k3%cb++91i;ee)8ex zmiUZEeO6!Mz>oUvo$~ux>-f3neOpzWBKl+O5aCg*+MU@#K@fdCpcS zNt@?X{hSf3PJ8^>9qb8=VP2=dxFlz%TBoD#s6J8at&J^NQ|t00j?K9`5WnjKZCO0X z$Q8a~E~n0jH$PefVq^VzfiYdJF>jQ!bUi%~%k}ixuRd@8$@KAaJ$?4+VB1)os1dxD z-LX?$%khQJn+?*I#gDD|`zB6eaeg2!YCh?IRKDc`*Lh9JA?|QZpjBqQI;-t{k(aLx z!Ls*ZtTo)4yVeT3IM63<>Zor)dF;;Go&bN1j63V>T)(xk7U_igh69s{@^KQ zho^CE-aF07j_-u?xTqI3;C;Z~ef2xA9f9|xaifpl?+nPXd0s$=+_Jwnu&cZYDg)rU1=iU?Ya<(z@Vll4M{p&g7t+YP3?cBSw&yIZ@ zYXA9J$CIymanPS0jIr<8jajb^z1-+)+xu?5?7Q35StqZFp);)&erxUoTiUXF#CJMC z?zRPDe|gY6(nY_xRKKydFKC?qMPg}PZt2}0Xh#D2)okzNrfE$Ly(VyHUmrNHw#f76 zP$1rX*c!Ah*`$L$WASm;_`Lz0%l`X3bn``iH1T0aTNWR=1+ihD4Y5(rYH>B7kKM+` zSQ}&WFNfHO2c7H1L(av6E;@auCLC6bNd2*oBQwS8{;U?aya_yEwE<4KFjC->faUl zDAwK%{)qGA{jNB##paT}dA?S%rp@!IcGT^u*5@ysBwzA7=4!0Z)`EO%&ABsU&Yc-` zr~!3-eV|<%RK{6#O~!rfy=*K_&l-FDR-58N*QtI_Tu)!)Oy8+~Ph3wQU-0v$8Mi*X zWy|i?sjlVt!spEfY0KirmYB}@iR*cR822+tuH*vOc|C2(8t!mSpjBqQ8e@B3AXoH0 zk#~Vj_URHcHFR4b@8!@MWJ4q4-EnrTL4I4aFD4rTI-!15W^Rk_#*07wEIvGqYxCY| zPImqs5trtF{EnFAMJ}IXkhUzBc>4?zi}M5VnEU3tWBtMp>KA$YW9&}$M({~I#M1Ap zUJ-~pU3Ug=3)GKz*xwO|>DGV@yf<){E(ulxYdDH;W9^Rb3+QqFC#KJCGObVdQVjZ? z$$jc~1m6=!zr~0yXUcEcccgwt@SQ+@ouTWcLD$rnIB9ZfPEHdae(w#$gV$GU2+4MA=1%~CbKC znH^{K?ybId`g4$)WY632uAHsRcuu|W-yYj~YkINK&-HsxtoP@vXHIi()zyLX8vAs= zFz_ba6!^T_9qbAC4EVT@UmlEgab@POn)cLW>w%6}2R(PoZ12Wl4_EJr8r7=9_zeNs zuF?CYLG|K0?wNOw+_?9e%<*MQ|Jq>8rMF|8`x$4P`+bOWUpAfh-FDpf_ru2dU!Tpt zFLU|o8=wYS2hC&arul8&<+AydKR#;mXDokWe6sxA7a1|>z2?uYf!w|?7~|zFZY=Ma z?a52`&d>PfV6FV!F+0mv&mNuac~`o3WVZLl%<;W_>eb>H?^Dg6I;F>ZHlF{Z&flBD z=VbZ&#>mX`_vWmL=|`qL_tiZS_r~(!*`C;T?_~M=;OwlN_3T&A_U;_^zG}AjmdwTd zuBm@(`Z4~el0TncuL#tdJM)1c*J^Pu@6K2pz9wKt&5k@rTl2g5{jcHLB+*xCH_HBWjujWGbGyUb6_j?@vFAKC62jH=`&xC2DO?xOt*4s}u_nKsEoW+r{=PHSKex%&d<{=_=j-Lw_1%%#6W~-o+2Oxh zpa*X?@krntKJ#-AWlf{Mdd7467rUQ1FNSOBI+;!O*{IEPr@5G_R~)>ppA6_a5{RkK z0l@3_;O7HvFxJke6|K;_Xe8Z<&F2Vws&W5tS@%u0-x%0ZhLTg zaAu&GC#U@SN17wEiC3y(mB7%g+J@@XB(f!#yN0Ky*(Ug ze9*i{d^sHW9@3nsd-H=qb&0LKUK_Y`?+Yht}34VJ`~6kKb&t}i6>t4;X?Ll!EFIP{k)`yZT5`4(Y-_O&6v$khX;S1p;ONA zXIDPh;+HX92LoKp@mf}oSzhpQPTX-5k6nS7><;z>xPTY{{y!AV{S_B{#FEdS6UY_0 z`FeB8X7lb0E^Od0UIzki4WG5fth$}ia3-@J=O4`eA4ksa={o~?+Z$;AXsWx;zil@E zuKW(cXU@9Y4{n2wzI{j59E za~UpOr_bmAmSB`$YdvBM`QF!ihPn83PFLT!Ifs*-b)V;F&&!%~Y~Z_={tsnOBX_E2 z=&Nr0`=(kSxu}u#WJgZys}p|6v+oSv8aWh?4S{^Im20~AZ->eu8NBxeWZ@IpuP-AN3rrY}84(2t^2Q~7Ppt59IL->y}tt0Dz6FcQ8 zPhz|;pi@4-JoW6mV{3y<{plG0j=i%TJKwQ4x?^^GZ>^~{I>ZjT=DfL>vndwcQ-5kh zzZx6~FJ>xumK2xfL-g3kNuliC>YN_&k6SvNted;jhqx#3;K+qZ^C!X@c zCSG)DI9uBr&~<;}EgyJXA2`>0Q7_L`S*Jj&h`nZv=j-?ipzy*;|-^2^q)j+~fkt#k2PO`WT) zy@B}+nX3e7euKi9}S#|Nr+4tFtGbdZ!{(d74o&Q3G$jxMu)e{XW(ynywcR?mH=PxjsEOuY@H9*iHn=D-0;PCb08$XpD}aWF53XHN6-xL}%>i_b0c<`?E@x{kE z^5SORyotMeZ;uUoIGE#L-kkTdl@D^k2W?m2t=b*z3DghV99T2 z(Stu9Um9q}FItR_$JG8Zzwr@sIkJ!Y!9dJ624Z3D0|9$t^!|W;cF8m+di(s_HmzH$ ze{6_Bb=AhGPi)DxW?CDg-cjG&KAmjJqqx&k-tNiH;H*GQ=^WQGUHBy?8sFuXuX3;P zZAZWlwIo(#@(NACXGeMi^wB`Ovi)S^3in}syvFI$YBocB_#-9PEwoZkHs3-L4NJAb`T?t@%7 zV;#4~iSJ`wADH%?Yi!gj`EjlBQj_97w_O`^+vOxj%WSvC*{l7owU@i@jXd~Hzj`|( z(8l@rp4elfdGh{f@qi=G{7xm}OSmr;ybdKj5 zH|ORxv0fbHzC78IPkF`bKp_8Y!8L(KMjr8W@7NP_eAkQfp6qLEZeNU!`?t&{E_}fS zKU{Di%UAQ>rDGXua<1V*?##ehF(u0v=)6AAdpKy_WVqmXM*2H~{P?%{Z|2g!8dPpQ zUwt-ce0{}Ybet2v#Fk&|@`In&akVb5)^Q~}_xFLUY4&j<(|g4pzrlWeG{&2(_Tceu z@pBs;M<(C`<9Fn_ZaH5|H@kFIkMYTLmH*C3Z+VWfKAb)4xQ=mGdwlNiM3=?a`%}K^ zz!~!`ftu|e`+Tcid$na;TYjc8US^BmYELh2+XDWXvn}V{yEx-b0o{Dt5Y!(1wdZHc zwd}D~U&NvLtxs&WCfMnEeP#EIpz$U12jSrR(lQR#)y8@p#<)jx!F&ET9mqPL#dgbV z>}Mcxx;tn*tJC^2zn(swS(Zz6Gv-Sy%~t{qhsM#IP5x;|0{7PbJg-?=+;e{LhfX=# z7Ldh7o(=|Tg^ZYzC+q#6B`?vME59GDxWaMFe?!!Nwe2};G z_{%|KNY>8?%WSMpdPZ4#JMZVb__}+ws~_J>y2VP9Z}N0^-Pw-kJ~o!lJw4Ej`Jm2x zms3Y#+L~&7y-i}swi;tYoV9WOM`=^dX?)ta7#;sP1HXPAv_{0N_lzw6uM5_aweCG( zLmd12l!Mb6n^#R^bxgNC@jDPS*W%lnG49VV*2LFmedE6^W9L9Vr++s^cHG;L`B!DHvYDRtbF=xUGZ**D(D`2`eQMOb zVxO*`i2bwEv!Twr{;kuW1*tFl)rH%J{0GnYJNkAk@?`0+EW0m>ES=ihBg01J^tehEfE;91qyxP&vWqva<-Yk1~>eb|E>*D-7ug z_Hg2lwaem<+?n%r%M=4|U(Z_qj+veRKAV4j{(P$P5kGD3Z2pqW`FVl8fX?5U{!GjF z?XLa3tnqc!^}3m^w`3lX6K6g+>G3wTHd_ng(D>Rj=f9qezWFqUbEp3NsmIy6w^HwO zTz}!zZ=U+CQ@?%ccTT`dAJHnr*ycX1ROHG^aGZVYb-J`v!>_X1xW=-3zFLH|2bYpdzY z>70z&us7Fj@BRQcG4S0;zdz7!4d@k%L%|~f9`cQ^y41|orFReK=7D}Zw+7{J?Vg~Y z_3qdWfpgn}l|Z9^o;Pv5D4=6Q;Qeq9d=7|%{J57J1F_j0(7|>&v0Dz-60XJHIiPDj zF5=SoiAm$q_{pI)y!oQxG{)`0%x|04(=Gn}&{gT#*6{f|;e+po1M$Uw{Eq*o+5B+k z8r|NrHwNAixzipBW4xqN631aAyZ51My1DfiBZtM$Hf&W-hx>4|$w?#|>u-}~;n z5IsAC@httd(b_vRYs>Dg`$&g7*gEW6p2oh%-;5qB4V zr?)niaS^-jH+J-kGd-{`5I1Z7J*fT0(7kfs#gZQHhjuJ*PkZmo-4XAGIDU0-W#AsJ z1e*JFN8sl^XW2BztMhWS2M2>A0s9B0-W#(cxHQ-v;48*GD-PPVL2H1Xy92hp)#`zq z9C~B61{Ve5Vb5oTGkj;)`&hgCGu|AqTOHL;-%A7jYzWF}J%8BW9?&=X(KF43SmIY( z#(ZRR^vgMZkACroe))2qKl~C~^+$K#ZgQIganR_hPxk5)|M*V_`>zSeS|8UoPHXtq zmwPfMTi$17tZt44jdO;J&m;Qyh_@UXFY_BWHb%eYk8Zv5{67%zdDGCZYjq`;`qr&8Yvs>b{t| zdf0atacC`w*@mF!KPzMM>Q-*V!WnX{jq-jlYjfUm=RElld>He#J##r>ufFhW2 za@#b`m-*6K6i@PVUO3UUR=pj`o?269{A)kwy*Yb$YjQ!ab}*nrY{xTfUK~_T%=l=2 zIB-wMXgI$jpr4P8x0sH1Y&;`=^~sohJjCwmpmxi3Z`QP5$!EWKc0T{NejlCfziBqV zZZ`jt+582w`Ig!I@6Udp(3hwE+q183e8$?tLF|p^z0V`-z8~w)oBC%=y`NvKKWplr zGxgp@>stajWly8$+~9@5!-2Z^7Dm(LTO749F8=otyb(JC{I%6!l=uCYt?``yJq7j2 zj`fZ=W{mIAfZpwadOa)H9qbA40Q>Zc-;SX6tBXwcyGEBa4aeRUHUEj=&cJ7%9Q90w zkI_H(Z}iLmZp0W5IT>Ryo*n&RW7Oln0ap9gI~E`LYMuU@$Q{Xij1?Kp8F9HF7&&En zVo$Bi_ePFnM_zOP?2qzzY5A4)iU0lQuC-Qh68AAS^H`L-vmIYDjGvqF7zh8m8q4A^ z>UAIZ>mBH4rn>4qxiDk(-&#^X*6_SBP!q=j`|h-6-(AwL#co>SA#iNAPzuf{tu^3K-6wl|6%at8w(%Uc`@c@zil-QM(K^RF{5 z7rA6tENX`gzxpPLf!YE&RZq@4qgTUvG1iNdo?gD-is!z73~pZ(4t`hpRl&CfeTY+P3k9Nfy-=CUn;Bz1lL-y>^DUP)-KltNduN>%t`i38U zjU|4S6-Tmkxm(SF|2-b(=mng6=d4%Pm=}7~lK9fcKYV+>aaqZl)?COLeq46xGwcB@1?Bqo3J{JGfQQuDfH@2-Sac|s=N8R+xarf1*{pu@+@)+e>FJt`GLF4~m z#_tP0Td>o_*nCswf7F=scwpf5@mzpEHO#+d7(bc3|4HKTWm7DEF#UJLj(%?A-%e`} zFWLLNC2Py%<~n~qwrZa|y9L=%NA2s!b#mPu%tb83#Yba@escWq+0p%FcK9f7?+ozK zJOPo_e2k zxXklm4)fUIE;jtr*aUK|hsI|$YmM>Ij2n*(7dFS3{i&=qW-rS4DZyGX`}*w7WBFwA zR}YOTe@_^!`lm-d z(9v95TgJzJYqYuBkv0CxoqeEdncmjMsHfa-oX*hy-NSdQ&6$hs_&sKC=9B*zF{sO%~9`**v#wAn!I}J#H45B^{(LVXsup-@?9S7PlZoq+t1JN-RF)P*&XZ&=JyXM{U*?lNbpSuFJT6z4) z)9uXOz`oy4^}apco=*Dks$P9#=w6#wP8`kErXEkd`u16jKVS9*?veVrBEP8dyXT(_ zoNw-rWZZbEH}R3j`a8zwP}b?i)9)@;0vsO-*kPaiu3;>%&g=~EeMTT|_Xoa<;NrU} znfgGMKCQWUBxAOY1(yWQu~k1V&v-}R9DO*9c_Zt4)i(tAkDvYQ;Xe0y{QZo2)x?^f zKOL~ao*K~p)l>uYizVy}*rxv{v%i|2|G0|BXfxAAOss1M0zTJHV>|bYY`@oyGRES1 zZP3_^_Uw!AjY0ExS;p>(_F!;TuqR-%vBux{AIG15mN@^mz-NkFh^bgFm+OKp!Tvx~@3lq$k=a`Pl_$Wx{?-TFKOAfd&J6ITNB-!> z)0%e-@EG&zf3v{3#z#!58*e)3E*HAg!CirK?iIbbvFprj0lQ*wG#JwKn(!G*z?bM;KF>w7b%%kNg%+!|>8oWxNK%FEm34Bmd1 zy^IT4y0!#;JLJb5*4%#(k9`4o9Dh3ca6S^?$+mNv@4V^>?0JK01BXk4tAgq-Z@!VQ zpI+JbAGWadC_wiwG%%yn9q3^lI2LnDF2;|NlKQ-~~n=5yG zGH;#rvqs!B=fthC74Ky^%<_rc;P8v_k?t`!>OyNCaKUjcedRRYrx)%D#NoXGAL;M< z`0K#97p})J&)-FS-U+@Yi|l}3g|x^h%fu^2>N>5R zI5rmi)o^#l_lu7N&iIb;aKI-q6`zg49l?%Zl(9~RK6c&Z-nrVs9hRNT@`;$@SYG3I z%JLz*B^YDi&;9GOI63bM)_&`-Pwu(X8U3li z+sZ%r=l?htSM|UL?+mcJDNu9Xm-;4N<5_#+AU@9zS}$X4?Df3ZtheX$Rh;sSF7kd~ z#_}eQ8s85Ej|A4#sMydik94a&zRqibKe)_mflvJPhRkch-i?8}d@#5_`2IkXL-X(X zV}Ku?aTw<~UYmfF=eXCkC!_yV?ELMC$IqlM=DPpoB=h&De%$}@C2OPHvVG_OSy21r zYg=!B)KUBTah(qO_2c?DemHydiKnJ6K4-#(>Af%RjJu$g&Iq)%Hg5~O?YR3SGkdO z24DND!Fu~gPqP2!lkC4}o&9XBX}f!UpZP2fV%7U^&IcU*+zaIDqqu90*P)EPJK{+1 z|LVVA7mL2-jf2ku7~?R;Nv=O{LS@vdv3TvA`gAAi&HbqC#TkpQ&mcVxedDcZWWB|Q z0`c~l>n@Sin$sg0zaa4Uv9_ikKLav7Ava%F-|oupU{9d-wSG_O9qN7Q{qE0CK7-st zcZ3h0&fkl@BOh4(SqD$|(cNH+jOLurtKK_4^4VQ-=KkR3X>Q#+K$h?2C^ps`8yt@X zWZ3B&ps(L}j_ZA!tX~j}w(0g6jO%C@kI|+W{X*i-{)YqlantO5|FDNUy=u+acaVz$ z&1Wbc(0Ul<#A}?Zy>Y%dbM4si?t~qD*x?`f&gU_DUiSFO{um=MX{@(q%ujxi=^6Rc z$d&thGHwp}+B52a4UN2=Mz2V-Z8w~Nx7yMr|NB;;(?#P zpZ=kM%sBzS@u*$vboU<6?M-a`t9jhWeJXmKwNKa1U{f&alH-j5+kG?icx?{o5$9vU zb<;fE!e_eq2xQ7hJY#zC_ug;I_@@I+oSb>0_Fs{+xbhF5y94~R>c-{W!4u&_@A=c& z_oY`OUleHKabqBkjmMshy~EDQLv!1od2m&iILc4!OdZIDm}~6NuN@5NKM>GKml|+C zwght<@>v_zueQjRYweNsbLTe&R|fR21lp~E7^*|9{*rkpxGca+doZ{vsPDDQPVZ@k zi@UKsy_}0t7Gvdd#yK~R9XWraqxQOvx>FH;udmA&}8fg727OV2)$KlwNe`mzf8k^*C zaUQqoG-gK}>W4K=44lR9V1SGIQFFbMM>5928sNP-@OEzx z+qjqMiMqz|C&J}*>FGQi90}Cj*5Hkr9{@Ne?9b;4u)*71(Pt>Rw zvSGhE)C`E%-9cqqqYq_GD=+m!UMu&;OrHPzu-+I|&biv(o3ZBKM7VqA_J28Z@x*6K z!1wO?*baX5-Yeb9K-<#@l$*dH0}$Ua@+8)DJoCA4D_LU?s(*L>agDhcckP#c`?0!y zYBv8^=A-R5XYM>+wK?Y1-D9J9CTs4qK<{TXz4u)2yPIBJ;l%IHn`~A`W9J@_QTHqP zkHU?-Zu+gq{%`7Bm-*R~Jg(2ne3aih+kZyp?ndMCd-;d-qx`?ke2n?0X7i8FEk>6?D+UQ>AYK4CGHS6Ba7X}{< ze1EyYp)~x|1*jo5@pBem_V}l_=k0!faC2adpLB>DuEx$%Z%pQ%;J)C?0_QddJ;$!x zu)P|nHRm4;G%=D(oWocO01lhwvMlPBph z{~q`J?6bqKp2geR)<9glhZ`ZETMrwjZ3*O5j>zr}HU$1XS=Z^ZPQU++;IkOY z8DGfp#d-DT3?KY^MEk%-{hf0ka}luxr_uI*jvjHPqwyw3rh3`dmaXBrR$Or$`O`7V z^F>?l-vPfk`|{X$i$U!z^R4mmZz=i3e*LO^bGko!8ky?@>vAA}&7HWa!JZX+pAnY? zWbO~t^;v=S=LPQ2a|4{k&KYZ$28V)20(EdKAhVS~n)ymVujb721AK7ncYgb=aool| zXK+&&_XoIb3^aQ<==lX_23q$HWn6v_WqeKWxPpzyIRPhXXwD@h)=7+w$o^ zdu<>V;EsE1M&3T-a1g&21U^UPZBsDn`^TBD29?#z+16mLuQ96s_}?1*oj}9?uT1D})eAsi2k2vsc{OE~PR=*4Ycz!p9are5igYdZOCPPV$}*gLKJ-OIR# zzddz%+d6x%T4&GiYSz+udG^FW9KETZ8$3P0U2nZT9ovIZmpZ;~T32^u`6ph@q4DK` z{HhGb&z?s2mZ_(EXF#9Uy+aw#bLZ{Wjs;f-V=c_}sdM=$zg-!N@3@9<>kePG zm+`$T>-4Pz8eQ~g&Ri7C`F?rUzB178JrbO2l4gEyQ2xvG&$%9r{7RrL^97GNe|gZ@ zUNJ~>c8v8h?%o0SSSwe$_&nD&kMo_8SqU_@=KITds!h!vK34{RVVe7yNlk4Gw8|XH zc&rcc6ki-Gb56$M_JzR>fwncE|JwrV^6w3|?p*Du^RZUmlKD!Y@yi___t(nd?#S&4 zo;tx@Xa6q--c!EORXIALa(^k~%AJw%D3|GCuQl8~w$2Z34(MJD#9~X}-51NQ?ai3I zU(XxCjySl>-if}4aws6!CSZ;xIvt$y`&T_E1py+^GhHi2y6XFg-R^!*I-nP{%Y^xk4U zyLx%r7sxfPH-|Ib&8s_xU-QoQkw>N{en#sVdc{=@ig)GZgdI7ljJ$3O>{*i+bxxNU zsLxRcZhUi&%>98oB*v>jb=%t-khk}O;NQnL`f#((9vg>(M}ppqFV497^yI1!PvcP^ ze*CiLXCA$uUn=7~J^KQ7+4nozp9q{&7rk%BJuiN8-}pJpcjxP;cr}Lhol*)S#Gd4IWQSeLk^uf6$t|BI9ol*ut$k z8&Cf>Wgbs=by+-}q3=6_=7+v9men`bB!BsBukn%R{_ix2V`JW!in|zznObSg`Q<&( ztl?4LT8FDyQ}b+GAM6TnRO{@wF73~C_q$?sAC1fx1~&v6fBzu%nr~b*JjGj$sr&tb zrf&FV|E#H3Q+orve=hOCL%zv~w|X58n21)0c-_oAa-E!fjtbhqb4qFkYGe&8b_1dxNhJzBAaDUnu>B z;2#EW%^s@1n13qpGaOa;^Ki4|#BaaOloQ$N-;wITKzJ?75r z4K$zs6?itJ9pm{8gb7dhA~s%=KjHF&yUe))##j1#(lK{@dT1 zhWT$~?yUh_HwWqsf3aelUoQ{bHBF4h^?nBt6Ml~N4`+TPP+Q*{;PT>ty^8~Rsl2md ziwFHZ_k9`P6@=>I``EUOaROY_?gi8QX!?~vTUq@7&wMZ0n7Pj#dDWje^*FEve8h3B zo*&;IG>>$!If5R1UorH)FZy0-U2MBwyY1QK|J4ECv|RztVq^T2z&-zgKn%)dyaPWt zTW<|I_e1NP`{6attyR0t9Zpa#ty}!mj(pqSJN16H?4F;g`QxP`L_>q=X}Sg?t3zB{fO<>C3D>9b2rp99m{;o@JD8Fomw87#NBO9np5_c>F-&2A$xH^w()Z3G0&domm+(YqM7901Bo!V$!wNBafrjc0|zbrrIEVu0GMc;>oUK_U85FyNNTe4_c3Y77(YcfySPge<%=N zKQoc-XY$K4##!snNaV)PY45C9Y4m%eTJP56v-_1TpOZyb%WiZ-Va(boF~s=YGFMU*{KOykVI8ovpl# zc@{ejPy2WpJBx!cy?7Y2x$L|C+=t!+d1b>~te4%3EH8A+F@E!ybl;s>wqN~XvX+if zW-UFnLx+0m`+HZ$a(E=TCeTLz%*BRY=fq2sM>?#@i6)oMHkb11tk`b}@U*7h_{y$2 zJC*MMwJ%p%>u6;$J8qZW#)4gWW>+(>?{d$s-uHmD{BJ&&$9)lOPpIP?uWD2x}p=`ah~Z3`ya^I_jUW~1gCO-bH;4&wQs%q-I`X98otia)fiS+ zme%#hcU1hGhm~MMz$U%=w+8HQ3)BrxWW5y^2WJHu`FY&@Tp+d^1C5NDYdqvh4*AUP z=o|mYu`P~#ql^4J##vg_E?y(|6&qK?a{3r2zobeT&#R%ZM-9Rk>#&- zcJ*wFDS!D&j=!z3Gc&da{Mr$aVgI$knfbqq(ys+^0Cp-v*QVgh0`b8`!^1ir%+qvUJL?d(7Y3nA;WmzOk(@dT^%mP;h=gj!unEW46Wa@}T}-k+C>5R%_YB+4<3?IMc@_PHgg9 z46LsN+A{lFvySgdpjAc;=Ii3oI2c3k2EX?OE5R#+FAwewzA^Z&U`I$l6#QiH2nW)x z4RFWT=b0vk*7TbKIw$ed{#M>&V|(td`?E1{cZ|J1_XN0Xo%-w3^GQ7TRR1zu#IW|o zNfXzu$%kg|rGc|-H1BhLqd$0Q)knt-L3PZ}R!%I$UE?P%-E)6@KRrEAH*AQ9+TIc1 zrZq0~jB)8)T;Ch8RUhdUBYNn^b3>rfVXblTy+Ol^&ho^MtnV{h0`l^tX656l)BNS> zYlF=(7G&s?L!ghJ&8xHKn*Hjg!`wc*__IMDp5kA<=Jn-W8Ef{e*&BU2Uf;*#M8Dj# zd1-JsI6d&)L;S>FUYwT~b?Gg~x1Y&$thXm0^|@!?pEbFnXT7s)ajDMwEaoSZW$W?U z=Rf~?jvv=ViHXY}Lca&-~h;F?v<(ab^64MzB>Xo8o$FCJAW`x)36d~D~tbs{C>YQV}7#F&jW#2 zs3rYMpgDg-K$h*winl!+&ky)zjURp6$l7;qlHQYh;~;>Kl2{-?-r@Zsv5E z&*Lh`-REb0$Z!!K`qVyK8e7)Hjz06+bDj^)gIdy#9q$%?8$J~9htI1){liUOeCF*8 z&I;!H{N5342zCd10_Ol9@xg=N=KMDAzVmdmJwJaWYxtA7IKZ(o@}xEHhcm8z@t|MM znr~-u5MTRU=hGJk^ zS^GpFKJ1s1JJ&dk@t|{@^IhYI_`zDXuFc*UFK5M2|MIElQ+44&pPZf%Xa@s2)UBU= zv;%=PJ${u@Z!Zlr{*7<4_}ITbU~^Z%2A$(~`AkpfV^eOl(I(r@pB~K5kMU*`zm-6% z9sXAz8)P(V_R3TK?D465ad$`ShjI7usZIMGci&lSM}n0=qu2T!!TA}ekN+C%4K)8v zicRS|_xE?l`NuQAGW$Og)IaedPp|(i9X@pawVBIv=kLm#zn$Nn`CXZR)+hel7marO z?^%p>e4%_cYa@hgPgrK|1pwuC-%z!szHadUEh=S(f4Oha`lZL8>cmA z*!i9O{aAUItG^c96(l^1*l)|&9zVLilCie3`2U~zjxxsOSE6&A-#^Xy=w6iX>!)>b zwzqNG+mQaknU2rTTpY>y9cFd>^ZaG7ag9$uKCStgw0<7T+8CRAXY-@8`5R{QS7$Dc zW4u>pGP`E;vogo6`L3T^Ctm#gh3UV)MNXXce*V&LnfmSN`Qcsqp6S2M<&Cdz-!SRu z{Mc;%uG#!>=4@5|rp#L-;&(9f`e}Y?=J=dDoY^w1HJ{`@e_A_#kUL{q<5TVZcK!hh zea)k@|7Kbnd3-{13e@<&+NJnF%w!drIQ@8eZ1Z>)SXxj7rbG~Df2Nt zFP_d`Je}R0zIy+}wCBB~ch9i*>-h_Y*2-tx`}p+VDQisr`Xp=a%yS1l-NB>d*4;6A7}wk}Hm%in{=G0@2aoe&$DZ})1!Viyc24iO-?yy$jc4bdH_2Z= z>2p>r_2Zg4nXmE9n(qy`7>mn%t(-@>@*da9UA3!x|p&1;d*6 z*xDBjYu-z1Uox!y|LmQ2oZeNH|4AlQz)C_uATyaHq|pT=3i*aff)D`}5|(0Eoj@u@ z5fl&zf`H1;u4}=LZPzaLUe*E#x{I#57F29&SFEV{ecsR9&v0`5exG@s$$lowa8}skjKJf(!`l>i+}rRr2Hw7fw>j|kE4;XN|HR{5Ung)L282j26U~{x zu5rR`>33RwD$(x|&3Uo>>(cxd(VRu*X=j&td^uNu&)vQz@X3|=18M!e}Q`J<}BX$>usO? ztMtRt=-#o&5Zh(qMS4Hc_F-v}BR0K7j`fj0O?>;fBFOgyJr@Q3FZ4?a91HeE-_d2B z`}$_hvwyVd2Jw(PP@qmYC&vnX0zUX&wB5v>J#3fvv7GtOkPLd=Kd#W64fvb~dgp9y zp>vL&RQMN^{wbw@Lg~+IpkH42uPFViO8=VDzq0gKrvBW`Be{Z4RU-}Q0KCgRI;s1N--%@(}+N^Wcg{0s z9(~TI_sPBM>D5L4wWW97-dJe&&ez+-KSDT1pz%I{49}VygcF7RCjIT#-Byb~Ll`G4 z6F8Rx0_PN(a|wOlGA2KqTh>hwSjTfss$1`Jth>K(pfFdMD)5YEeu+S%Hl_>czErR- zc<4eWZFhnFZWgW-dWFdXjeH`LO2ZfQV9R>p!2)|N7O<^fKp)_} z2wBgwhFDG%<_imiaRuav_2h`PCkc3kU!7ukkwqsu@EIQa+V0I7_X^BY3yv){O^&HM z;P`3SiXZa$%NoxSBmBkgsEhU3%>G#xTbP4SzL6n6=*T?s2$l*o@_`-XuAN`hEjCbF z$l3-ChxbBH-j8~CPYoX%L9~PV%{jy-{2-V3xIMWfU+5sl&K)*8UuSFVTo6a$UZ#+4gOxjM1gog`_8*qi3AQ!}#wK;Bkibo?C$h==bhP`eTunBvKgIsLsLqGTb2L$R8 z`^d{u0U2^$2{i7?xE32|k&nMy1lGE4;+o$vp+-zL2-tVDfNTkQYtAvRo5RL-amS~T z;?BN(MQ)3F+lvj+-W!9xW3?|n+x_o_xII|DY)`#?w2QcX>|To7 zC$$favp3THP)TN_dx`VO^B|s6$8EIr_HpU!^f~Ye$=)01^hw%>M%;LBI8fl(w^+b; z-g&scXgtq+7mXC-he>v%7^4e#Kjdc#JRduGb`YOFA>ZNH%exl38S@OLKIlJH`cJDT zpS^-*{!?Q=_jw=17Ifh2NYCQ&lHt9eSD+D3;s+01rwN_JBm1+P*71zxdBXR5{f=|7 z=v4y0_iRwTpWDb|>kec2B^yrW}_-^;P#Mxn_D;>}*zj4ks8$HBU@Pd7=XNgqB% z+oyG)@8&M_VVmm&8}Qk-P+$E5Ir@Tt-D?CsC$1960duzqagG`ypXha-uF;si`UK8e zCD2Y4n&fi563YbwF`=;!`e_3KcUFuQIY2ixj(x`qn}yE_)DAY$u!(u=U`*c0IeyTi z+dc6i&-j6j3k7n!Nav4rTLgS1|1S|Z@7RofVn+oNxEE-?J6VTaH1gtD;v4&NXHg%H z1HI#f4(wo_x>+Q!2m4>4pI?EG9eslJ+SWPZ5yxyN{?V2R_>8^ShtE+Dc4G_nWgV=e zSx4R4I-jw7i+~Tdmwkvau^|4$+%do&`!ikRZu}vJ*`GR_h~X9?+T?f)h<~xbx#ai5 z4XU3f;J?oe>(&XM6YA=pcmr(j7igAaEjCh9w-!Ek?|5OZfNkCf9zgbs0y@!yJaXtp zALj?1&w!S?fQy%o!Ujd9q&0BPZNj}=abl)=h$+8|Bry( zl|aK!=W?9JV7Y+aWdgbe1biQQ_ILNS(-}p__@aZ@eO2H&i;b?6*&35`Y5^PAlf9vN zM#q}?nrQTVz4ZU99-n#zbg+*3ZwQ=O&Trm}JfbuEjvi!*9W_Kek&8Uy$v$37&4ASc z>lrT-IP3U9PdouSqb~Fli-iJye^cj~`NabA{X&#yZ~P&b-xN6a*aH16A=db}6McK2 ziR&VPJ!zlP&w*hB?IzhkZP}&^MH5rg{+pfn1&`c5u&l8hJbrF7>iN3p_2Sz`=8$)e z=;6`hJ3V{QJ4QU;{}lc<=ZC{(V~hX=>Pq^^#$&efo{&+1vZtZuIdp zfb8$Rh#fZZtcbmBr$0i#RvL1=3mhhVN8s*yvB3S@EAU=$lR#`X3)BdEV9O=KDuH@D zO_(Xn5Y7;g+bEnXpr7^FGo|#{yGFQK;5>X+pq4mu)C{!;y|U1~>NywG1p8lB#=EE| zpYSgdu!lMwRF7}W(dG$^@r!ubFLYry_IM6ku^+o#-%B*^6|jwFee*S5Ah3U2PtJkY z@2Bx>f%QBSXrALd^$EmRrnhoWY~Cecm*rMyj2w;q$-nn^46bHUjoO4~n!H1!58rPT z&JmnP?uRJ?XZ3r6_tdbJU+iW*^5Asgor3Mqa9Hnpjk65#S%{FDeq?N$pBLe8%aaGs ze<0CsO7wFQy-GCxu_u0$-&kwRQS**Fb-|dLzeAwruf#buo_XAp%Y?ZCF`h2KJ4&Di zsdvPwF=F`xfqC;a9KJ`aZ@GBZ$9x?>?t>3epXITE+N{&X95HB`qaK^)h*8rVb>X>a z<0SEIqwA17(})MPiapfa69x9)EGS(|s6C%y=9z=XokA_5o7lrYP+)&}G-{4|Y}%8Y zaDLcpFJXg#9@})D#+E_uRKfKF&3hhogk8|QTO1;MUm!1>jZ*~dVV?S-KS8iBkv~m* z`!rEw@@JojEe)U0*Ul&Gwok;>{@@F9?0K$$%)?7RSv|g3*1kvi==<4{C06KSjIE9X zdWpji1mBHkXzVx;XV$G3VjRqmabOLxbR4E?Od}51yjDO*v>Uw_3dm4rF;>t~9y?|U z$Z}S>*M2BO8RE95kYfoi){Eufv7VR^Q(^$vtH1QUZD?#E|JiQz|7w!d!8 z^J>;Sw_y$b|46`B?B%&hO->P*`>~Mke9m8t>s-85;zcYr3+SK@tYe18=ztexIXj#& zpDpAq!?Tn6r#Zia8oSonA8_YW3$!RlZTvu3!h{;@<_Oezr+V;py0A%b?rzrj0s%ic zn;Qje#{W1+&1?`j195JB;t>OIzJUGYFxRp3_aM#n3HWUu=M4X$?+|GCNiL$Eg-odN zb?2$-O@CH2_8%``8-8(rA+wWkiLgp|puqbp_QB^&lS}6bK5JYvb?=yl1AY?6N}$aX*xxmj|6j$grW!k4G%+U+tYMFtg$IqU z2Z?4L`z%0C&?`(9u-|sCl^pLj#FJ+Jqs6CgOwSih3`{>*v}?}1or(~o_(c`Eqj-~W{n)axn7X}h4}E0rFZ<9 zyFLAXnqMih$RHbinee^NvIg8Z4fF3YMj+M!U6%E*i{L% zQ-pcKc!7H6o*Io|b2yI(hiy9iISeh%xb5B%qfVy;1k&pn816Mr;=P&b^9S)%PL zHSrt4wTvivbWHGXjc~JYrLeDneYEug^Q>Jdux4)oyJ*y}eBJ8$wNC7G4Z-`eWT+={ zf1}`at|@BQ^^RPWMaJvS(U@3XCD5ov{JT@g{@F%+AeY$(Vi@-nIlK>hTmeJPv9Qgq ziCLO+jPVh^ZQwkSC(aLZ#3RnJwn<)7!}nRA#@Mo~^yI>K9C>gZaR0GalqYV~IQCO( z^u)yH)^{eh^_DsIs+#*^30cRB{m>cbH;Y~@@VsDOY6aWLD{K86!LM}!bwl3B2laG~fL>~? zN1(YDYy)er5LoM+L7ygY@6hUWB2O-eExpe;`#`T34iea#*wyjoi@%`E%}|f;_K7nY zeWHG&PwY=)5AG}POa0dQ#i!lPj;^|DAnFW~F{&k(*)_9UmonmOyhHeycA#(IEnyV%p? zOEu;^QIk=I{Vfy6JQJYVZ>2yy`i02jY+{#vL(V*E=@x^=;7D_D#`vP}or*MmGzah5ZETnt06=Xx*&m9C`iyTC49~ALGsb zK9_O-#btf8|Ei*Al6rDZzohVZCee6KQ#+g;Z0EkAMLnED9h(u~oxUfTcn-XdSovPe z=PJhWK9X}RxqGQs=4tSWk@?(tH2C-qADcPPc@O6ST^?VmG5-22?G)xX50;DLbHr~t zE1XOAuRD*q-eW%5m)!hG==A(_Qtx+3-zH(b&}1{`JLcIwcT?|P&$ECtK#YCAP1Ts^ zQ(aDwi}lM|=a3jWhpatWm?3a4-%sFvq*ksFXy~Hh>jMSmYy-Ob1wMB&Mu&5LipJPa z%^xCgKF~EFV2jTK>yUHJadvDUbGDE5wvXE9EMN;ZO%WX5b2Mfj_{1pN8tubwbhfjP z7$HYb!#?X^-Jb==n>x*Y#WT;?zF~hn&-j90P0wWNoPF@;8UdeY34;Q4?)w0rp)V0Q z#~eMJX%95u2~puJtX*v~Y-b1u@45KVsmBGCV}^jpIf;INXkx%V*m1i) z+{E=CDKvFTEVyqFq#nO3a1MwgvB!?ObAVs08>e;1Hr3jA%~RLpw@+}5qnj~#A#aSa zg`S#;H1BTx0zRP!+UvcBIo2>wj|{!#7z1)lKV3LNK%Pc^8RKt{Y^I-3`ibge{7zK- zVtkjT`2JR3myPq+iH_^fE_96lB<(Sp_)pflrufG__enNfl)m13XrYOXW9mFOmVBLu znj-fPki6&Fhjo@?j2vh5uJU{J#xif{=l-YPT_BI_O(Tzt$={Tczp16ak9z8DMUgp5 zJvMTmGR80Jg)udczlM%#;xwii3#>VH9B1~oAJ}U@u-9?MR{LQ)9cSB# z9@~k2+ll?Qll`-ue($i~$OGGHo6&EZ+1oZ_r)|bg+l-yqY@1kPo6u#O*cY474HgR2 z<2%#u&U~(D_F^al$4 zWlU`05tmA!%@d@qwa#PfMsL*37#+k39eJNwWv)_Bb3LIKyR4V7^-eEy*pHvg*-rQ9 zWu97L-oClV$Grt=&ORW=9Wg;z8~B4^YjpjyU_oEYjqRc7=dVSw7P~L+pco)`NotpCR(&d3+-ta|Luc2FP%i zIR@x(4D1VQxhKyNnCJbEJ9?$S`hKAjXs##t$o(V5i#m5a94}%*ym;otdHc+>55I{; zJHHRmJhA2OqAe1L0l7Itb?^pZP~-Iid*?hL7xTdW&O@$6&Ytsy9H71}j}4q>`XvI5 zbIcwwCvokAHRoJis4-_?iohDjjC180!Y2HI=lM7n>kA#oEfN?Lmrs>=P*>PNJg}EW zZSjocjP(huHIKT7M}M-gpRi8YS0G2OOKhJdpo5rmH+zo#`-KMz$XPe%0^Rsdjt&*D zgJxM`bc+!02+lKlXqK~1Y6?4i&!3|4JOTb80zTv4fZ(_jTjr5-?#Uni;x|0&XJ2f# zUd%-=>+AF~k6vOxLoaQEfX+DrXW=QrQw98FkF|p5v6*@FBZEHl&KDMxF*Ng>9rAmA z>8-Z^8NI&0uhba*+(mKCWump+)(z^(Bm1rt zu)klxE_mE|>^)b&Cv-R$+(DBIA6vd9oFXuf9Cr^rx(0-Jr(vh{XgGZLaL3Gsp~f0w zn{6R3)G~fX8{t!z*zyelUD!-xFWaBz?Gy9(x=e80kng(ZXU>J=N1XcvpAVl6;`%wo zn;w5S8?GhnoL1mib>kO0@gdrcAD!AwjCUD zB=55C66Oo&rbfYz!Xd&gBCwg7zfPcG8|R#}*|cuj2Kqk5*K0#Z`Z)%vopLIfk&+2?G|{uiRS);zkA~22mA*oK6e)UJrbW;R8jC&KG+CsiB@reWcS&2^#!tYOf?m+mn6Q5dz&)@%bY>5x|B>cIFPaVPE zJMpO{`12B<+J`?s@cC?YoWR}9+=4L2-rS+^7bgDn!e1mlaiI>lvwa6sGu+SAqxYDp zF}n8A8gg>7K+ZS|`-;ai@4Eue0P3Ih$WsU8WI(u3SS?V8as7TZ>m7%>_1J~I?1S$# zo)LZyHSw`$f9*woK6KV{^6xRy!1zueo5)8 z(l0Ijk)UbJPoSkJ22u;SPX)bfL*1^kYOjhZ{t5 z#?i}J^s|7PAxAgN$zo7JsO22REvt0J^Aw`Z_ zK`*sI|M1fD?1QdKe`M*Gm3~F(A5r>aN`I_+){+YvxyDvvdP1oM@-w^Mv z5^0UG2YKj9pm{#7ohUxOohU)ilSi*b5AX2QPM<)%!@~yddE!KEvcJ#a`hSiUfo<=q z7!zt{m1636L9Y&Ul>J8@bN|?f?X`1z*LP#bX4%bMRJVpR%h~4MQc89>Snq`JI3wou zi5KmSakw|{xS6sE+c=l>{iVMr?{oG!yzE2#pqG|@p!Ca2e^lv@F8#{VbH}mn_|iYR z^e2>lRq0PEJ?}xt^Zr85dldcYrGH%Mxr5-JQTlbICqM8vmHw>KpHuoLl>WTZpI`bX zm;S=iU#yNh+4bW&AH1^9<(>#ikvFg9P7|^EKwVqv=-T`Mj6FJvO*te)J( zxyhobFV;^Jwg}8enXz7fu=KMZv8GW6Ifi~Fk%K;gSlL%>gGZcrPr#?Og8d^$!~s6F z#^(|8NBm9`n8$CPcg_>~o+_*o_}(lsrwFV=jyoNj$^C#p4aH}*^^3jDdpWk+mlYbb z5BWm}_R?P_Xv@}TRp_MxZJxlM`0xs0P?##P7xv=|jrHua3q)zu+Zy3!f!J*p_7^S@ z@X>VzpL)Mop#IUr{Euaix?$a&?n|ue_9eE&EAM-$czIuJAkLg;a?DwuA`r)w0%xaR z;NEzY;JjM+~qLUuoXg{#+^EEJ1&ot?SreKNx90_Rjn1&$n&O>xql) zCFU_^t|w$%8~EZg6l3V~Lk_4lYJQ%8K5Cv=6C3K1nx{6Qw3yBmLl@@ zAQY-`*C4~(DdH_rPg^h4jnTieuu#C3!xancI#p}210VfaX_3ar;Kz&g`Q$o*Z8^Wh zh!_xGbRomv@=W=2os5a)kpeMP_U~5uE$U@%>+VN( zoqTqR&Y5nTcMP==F)-km!wx-V|uL z)T%>bwpo1Yg}mG}Cv|~t?gAR; zfqj{yXO1(cr7ivEYEWrRW4>ab#@3D|O;=2#zXwGU4!>+D-x zcfRJ(jop<%}St9A1+Sv z_|PMu^QoHiTI{)`$U08wuG4vG8=aR0opo!sv{`$3!`f)`(?*by$*ow#vw20s8vMiW zD;sRGE@YlwbkzBDRn2*X}Z-`>tFcOg%bsGJ55+Gbn@&vN^*72t}De~D)0>8 zUOq@zTj=A}qn~?xih%tK1)d?j0`_1FF~&~LF!g$~fZoRm*1M<1gN5!?FKe^jc<(RM zylarXPZuT$JVRLrI5U@(F?RrQgYW0=hxB~JE^^NKrgid+K^|SSZso7mnxz8IR@&2r zQv~hEH}sEoD)spM^(i4&c{b!YqLt zuP8W1eH|8vAD@|ZGVm4)M+oZ#{Iw0xXC@jy;{17uJ|odQi=+IxiM}Awyt74lVi;-H z264x}^V9rO0?pZ=y;U`}K|Qwny@Wiiui;UjUU#9^-A6R%nRf~ z&5cjr!;iYW2mVk4oL3rW79D(sc&2o7ubevJ?t2iu+Ji8|3xp?n0wK3 z$gt1J0((>U&ys$8xK=&y{NEMU2)78Q2<%P#k-$9`nkJ%1#F7`L3iq(>m~X(Sk~X5 zo*efH*uO%>e@Ib{Fs;d$KIPAWv-)vsnUpW)1$HUB<+exFcg7 zEZMHB&Mn-#@IwXkgG$4|0e-rN!)GwnHu*B$axJhqRv?J>=D)w zJ91-v*pF{9ey(f#MGfFHzV`{lhTP5-qTkxOy&67*=fxeeE=wlBW_E{fx@%1ViwTT|i9*x+r z2H)_JxGfcE_{2PX^igX~ved+QVNhUS&KEqkb*(cGjjpo<^sg8Ax)ZUW4t$3ryF{R! zI@Gmdg+17DnV>7A^=wB6AeQ)rz35ye93-435J&i&71t#`6YHCW%>wrL*+-nQ6bxnwvyo?oKzEP*{8U*>as`I-;$C3i8t*bw6jeT6{3P9T2hbG#Xo zqsT*+mTkv3Y@?39CS+aQqf-Q*H*!F2Tr5y$@UdZEp`GqeYM$0k<^!6~cE|mlm$-i? ze!Wh5JF)SllC%G=O>%0R?DKQPqqXzpD$QG$^AdHL_bACxGuJiL6}jmV*o&GVU*v%L z=FH|A;_OgE_}eRZoomtg)^@G>Yj;k5p3X_G1M7BPI7^cHjGtO~ zyQwF}uV@ov`(|HajS*wkzp`e%&o=wUSVE6aJo4!GqE6!f7kwrh)S7t$=WM>PKtMNq zc#h%G8dEFmNqw9pa5mNpuI0%ZH$4-kX^z@JC-=s3p(&r-=hPTJ@NPlOn(lt`lj8v0 ziT^)L^+)`$NnvSywsp?i`DK6k97C+;2n&Tif%aJ8{{-U6{r)N$W;vd{$T3Gf;45)C zM`()837R7|_((mH18V2h4SG4R$WniR9FRZGI(Nh>0sokz4)eTgey!&4al%?*y)6s`Gqq%Yk1BlpWK2Gm3N&QVy-rZ5Tkn48r_Q5(cjce5TdG3)`55Kd zb3e_K2l!q`9_}o^OUgFgCK?&`HSg1fhp)`hqldX}sh?fwx$3DYVo4(g+{cFruT$K3_q;}!FDwwq3ph#O?FZlSmwSYU-2*};(B=um zfi>{)8{3x&l|VaCzz*WheSE!ysn`6o648c}HQy(2MtHv^PJneQ1#IdsJ&-|z@11wUayV3 zkI2@&$v)%^I~NJqLVL3G(4!Zg|E^4wc}|ky|JlP{;#3JVVog0zhi{M~>aZ>rLv=WQ zhw++UA+RSsJ}ehpYs7m%z(?wOa-p4~Io7{P>#0HZj5>NnlLPkh9JYAfo6EW>nvd()n{}*VZS>n~ z|6LQrCa=S0>?H61AsN>ScD^Ohv39O2`6DjGWT`+Shtvl-e5=-y!~VJYM~ygA*EH=m)XBVbT?!Po<0mn5Ew9y>JlQYK88M-L zkZYRf?6GFCKnxtecJkB$4c+5~CfW6x!zN5hczz5Db^dzKO7pZ% zY@`Nq+=vVON}!>Kx@y|jwzi8!(>~ZtzMA4xX^s|c@P63i@x8J4_UuvNgqrhMwWz!O z8jbF{9F0bgb6}h9X&amBh`RIM)I+D|ku%h_6elQU^u*xs$K&051c;_x2DVPhG;H^qea zk8X8GJK1A?4#MXI{8R~O{bpKW+o^E*vES7NvLmHK?IP%Cx& zu|C_4pFM(YX1qOl#8>NLe1=eG%Sg3aX&o_-y0*tI&TrJ!ZH%}Fy`C6tk6%-QE@ITq z7V&aiI>#>)b?nIt@gY(jDEU^bvLaw)a;=DCIznkJnZQDK# zTlXVpbbI`?9`b)r`sjT+sY_&Io}12R)4db#O8jbCze#gE|39P!es}w@#_T;?z*f#T zapBG&_W4~59izExn{wZ6F6(08X9m7Ij`-3P2cMUwdB^D^Ax*xwY7rgzzH^)%T7KicD%ioH!t?};;0v56Yb=Zb-v^GF>MXKc&0SXT?&n@ZL2 zdScp?=cZVo*Zy?fu)$0X{+rY1Xx zBWvS3Lp!@IKUr&{&F%EpJ*TH^=lV|H6Xt0jYVDpl6HWJJQ!HZ6Wzv{GD@Ri|t{2-w z?z`2~biZ{QhcmTz-5s(~eC*733-@i^X9wa;Zn8W&1`2<%`hKBLKpt7XU&C2}haJlV z^z;27zGno@7#)>B<9k8WBHx$g4AH1L#!db+Pfc!5ob&l!D}8mb!?(KF`Tkt4d3?k- zVuo-2xrKbM;*aCR{*GOxG0lFpv&HKtNZxUVM?TD}G^U{s8@i3tXnbpD^H|2OE=P{r zNcA!r8*^;&r4o7s-`~W&+p|Yq)tx=ZKJV+hlD)hyHPmfx9luyF@G603-R#p8Pi(JS zLrj`tj9=Znw``I;@9`hgLFb-g{Be!3Z?=Ga+!0N2XHC1ht29siqQBkh+FW#C+b4pZ zpG%7uh?tkkd zuhgAs?k{M^soQ<ckqCD5wYze9Ur$7s$LI$h^cA2Heo(`uX8W*b zEcFqutZ#e#|3`tdHj3s-R^V7rUu`MN!=O8cYMtGt&0gUT~_oAlzypt-cPxU z`UKuxLCzPoI#xAdoAVx=*S}|8n*3{e&f-T?PV!km*3TY(KE?5FSEJMkaj!eSo5iP& z>(0qo)r#+jI=kD|Nz-(*`iTAK+1!QJM>?+c6Z5>bY2QwKi@NZkogL^S7GG2>;<}OS_xqRY+54FG`gzhV)opFC zE@Zu~F0a-#+B3LJ`YU0ofSrAUYrfK$#vb;i&Ia;sd#wYxN}%1-K2+Mn_H*7R2u=BQ zyhc+?oSnr*zvEOD+Bs(Lv3idou6{+WsxmTLvMN+5prlkvT= z=cKgf8KUdXG5*-LklKXafXxh&;PF$is;?iv``F^RimY+?xZRjE%0$Hj9t_bv81` z`nq$mNqlUkc48bkU%aDbKK7vpU>{#MrxyI#k1k^+J7f zX2>Pag{E2=N!ORhP}f(+P}l#Ap{}ovp{}oup{}owp|1ZOLtWn(LtWn-LtWn*LtWpl z(Y03RsO~x0?hJ9Sat`MTJWJOJJU8p~jOP8r_x4ih^j>o`_FkO*y1jTtBcJaOeBth> zixS0{9ff}a;16V=J$Ym(!cN5 z*h#Fg@dq_?_V0%^bFBH1`1C(k|M&9G?|_{?<43CLO8!h2oDXu-^jVy}EjQBV4f2j` zly5qB=tZ8Gb|O#BlZXFP9(adg{1c5?J6pg9&PzK#T$gdbk>s_-Hug2i6LZIXsm4>f zSjX9{gsEvwyVyk^n&cd_pN5$ItR`kn>vQh;T@ybq>$#`K3r%ai_b&J=E#1 zR<-`U`_BD!%^YifBR>6|>N~x6Mr-S4?K4qezu#&<=k9kJ$MePKitUZX@1?Vn9$MA< z_wHEyp=J)7{wO~EpVZ%*vA9e7ITnA`cr0S!Izv|{?-fn;6?68NVCP?J>|Cq8sKvUP z=L|8oOsIr>=9|_!E?c!9HjxnsV242gW;VlJr&bn^v{{9f}!w zz>ir%B@ol-Pt)^}x+0I$f_#t0V^tsgKF4TBw|ZlJOdfxCeN539y|V>;b$v`N{E_OT zDb~IRD(T!sh_*My(D`8vZJr=A8lS;UdvnG>CD71AE}HhmR?f|Rv{|K|=DnNNFt4kj zYujR6yiYsZyib!I=vyY>?|^_GJIW94LUQNtJ69Uh?AKb2eHX>AgRU2UC!y{xg^&K7 zM$q5RAMEves(WgKdobrr+cf43JL}||&P9`7=*W7oe>Cyo&LwXAY!%N2eBwT_pOwb6 zs`c;Pb=j@WqphKC_aQFS7I~+(=$8ulU35@9WOL0>YYIizv2<>U-EyH4XjSXqAv>^( zdF;X_au)BHZu1xStfY%pwf?<3PiKm*^Rwxhj81IKaUqWAVXhKrRqNlOy(VbmgSo z?VF!pquoC~`^kTu-gfrH^~9tSXtoDGe1{O9IvW3T-LanMRJZYr_ZREEcf0$WHTldF z2mJPW#@(KE;(>3DDd&jiBDPpB<8JlFnEPIwm~?gxGjbKTBY*5N}Xpg-E%w3p*aALX0;YkJpn>=sK8=d4elZYK%W3%^^vo3(~@ z)c*aH1bY<}Q9WHWKb|7bH`<9blpZ;r+qb{(G> z`(1(`(`x)!EB%gV{5+lOs!48>)|2DuVV_;oKGagT_Z<8Co}H?3j8V6`h{r?$J7)wt zcT0A*t3}_r`58>?Kqb)T38T4ZtiM8uTAj|OyCB{lti=Yo)>t>*>z?!l`~Q*Nv%8I5 zQ@uCEF4n7DAFhLL_iefhoAzz0zos*?QMPfea_+gG>psJJGXAOEL2SYmsG*^ALTv&Te#}uNz(6#?AUW-J?hLtP{v5^_gpJG&M-Q z#hP=i5HIo;=;7=?SO(Z` z=sgm>XP~?FYpm@2d+pnl7xGwFtMKcd2h?D!7h;c3j(d}TP5EzT9g>(Csr8 zdwl-l*=>pw=NZ)fKi7XRpWEH5n`CQU9dvtV5s$k6r@{AIH}4$2pLwT1FMYg2`U-DA zeSF{WI_#(f+B|{xk#6h9_a%2B@u>tF`g#P;6=UC(aZLT@=jVFy?#a4tsxACr?@E{= z>@Lg^@L@DDajnE>Q6*hbH_yQ)d**45m^Gb4Z1o=Tyy1uQz%$r>bh1~w`lrt8_QQ_4 zb8kDAX&xEsyAo)8R^4m-5KVk5frbooGc`wD5PyHKe5uC7!~RUvxG6ScZEJ5ETl+e+ z^`3|=@v4iI8o zYTR^2&}})_1@(lyY4kR&r!IZhu+D23H~GVwrgPwPCy`pc#If7lIHrrWmi2vYbT`@T zII%wZ$U9)a0%RVsYSPi5p;Gdy(g+x{msCo?}h5^9B9X z>g-gj-R{Z#Hb*+5O(X5wu9h}QU)^1Re%DO&nHtXTXTHDUnszo(-<{lN5*xl(o8lDX zAMNDM@x5q0)MeAY^E5ZE&Ajg)WRT^a8BJ|=8dGxOXQPI#J*lB4`-y{Vg4(9pPR?`m zFOGdT$Jn7O#}0qTDhJq8w{NbkIg)eEMr(7^Uies7_t=$vw+(eR+pcb7lYQ+g_EhR= zoGD_yyFeU9%6+zZEc4Z_=I+UTM-$Wd{z7iZUAHyh+NiXaW=M{g&x$aE@8>^qgEzB`qj*oEw*4rJMv7_^JiS(^8At`j?X zPR~`a@@GJFbQ%}_{`_OgzMaO0H9YUxr_(sGW=mPqNxVi=W1aep-JSZ{jgQE7;@e2I z(CPeI?bq&k(Nt@l>i>JM=UsMh)wk`1o|owPiC&QCg^6C2=zS8sZ=&~0^!|xHAkhZ~ zdZhT_&p|;R`XPxvIMIg$x=DZC+1Z}whVSkk+1IpZ%+aC2Mtpi`q7O^-;y^d)|9klK z&pn5pE&08@?wyuc`MoICOShk2q8^n+>+H9yyMN|r`*YNE=GH6ze)o1x$w||52l=Mj z;Mqv4tC7*_!=|y+hi~2J)L-W`T4SIfgqP!UyDCUg~&ZLAgmU6C&uR`65#KW z_Y}GkO?~YpOc446*0JX00&SUq|LCG;?p%RdXO8u8?(i_@z4`x<(9hma7X}6XzqhHv zA;MDGQK_d@t$**<%lwfw^Vq`NK+POqZ(?p)%^bgDj=AMEb9^6`xfPo0^mhjkuk6oJ zHM(u@BWmVs@6k1Lw)dEtIorEZbKTl&y^pNXYg>=4ndAF<#OS!1Ilgws-0@x5Gez>m z&w3wKqZfO)uZfd?rkZ^oT_fvQKBi`lH7AHqf1>(MW5#DFpE2tGP@(CJt&-k&##W1N zI%8K#53TNu{j2y*XN-BLpb3O-;?_y8B zm*g1K)%sw~K90%SnmO`%hWPYnc3}s#L>mye+fEY3?XYL-cR0+_xCuN%n&!5LFSRXO zcy^B$T-TMxH1p&6)@e~C8lL;Srblz=CT~2$ z3A+iih5ZD_f!J;qX!v=S;M~#UzrSYfdlw$-W(hRb<*#Gbt&Otr>z5))aJ z_xvW!=kvrn#jGMfLA~?Km_{yd6t00#+eKhce4zGk7OoWb5!i?3HJ53;RgE)S>)_Vgh2#%o5Fe(K+&aNA>tXZn&3L3;C>07mqqx)-cbV&-`-X3W1h& zKo1JBURXn|?iTpiiX6G;*}}R$0Xr*!=DT*R7^(%2|xOw}|IhKSyh#{wIn?C%m}ki&`Vr zuzkpI2U&*we-`wfob(=%=zS7>*Pn;{+Ntbe-?;a&mHK1m0cnCRdBXM1L~T?@sh968-E%KPAzRPxJ|i zK0ML;CVEDqrzZM0f7sT)I}-hkMBkR^n-l%%M87}LuTAs|68)@1Uyl6K= zL|>KYCntK7Xr4h&7kCEo%srv-t_r*rY2E&b-aXM15`E`yw~fQM5`Bwk?08|=^Bqa% z`b0lF(U&Ir$%$T<=tn1dX`&Y=`k+M5O7yry|N72tef~kBznJKcizWuwhZwxL@LnHy zPbs`N1m4+&_r}0`bm6@z@D3=vHwWJCh4=4)H=*$UBk*qj&5(U>3A~RM-dh9j^@aDg zzYt?)h;c$3q*U;S#^y}py^ zuP6Gy6aAq?Uy$g3P4uG@y-%WdP4whM|6U)IVr+hy=r1SwV~KuyqFTb zCnWmRM6XQr!xH_FME527&R=Zn@8=SIeWI^U^tp*XIngT;eMF)UO>|$P@A&z)_T7@` zk0$y}iGE3Jiy@lS#Gt-`x2@NO!+I|A=Lh4+`hyT0)L8h9@+JU$frx&O?<<0Zhn3kz>t;61MJ zeyg?k-Baf9`>-IFzAD-xa61{Vx@BF`Q?Yu3~A4>FV5`9^s&rI~AM3aYI zLu?+JWEK^f`v#f&B$>bdcw0Nao#@YqW}gQJ9oHwBmlT;@g3KjJ<_U>DHPH`G^xQ;G z7mXcr!X8_Hw5{#mOY}{N{#c^loak31`r1Takmxf-W7EFDrsE24zrb5ocrjP=3h#g* zw{zhg7c(a4t9Y6S6U-7vrGJL)69YtntSoea$TPPm#_(y+a zSa*7nSsK<7ha6{>4kSxS&Q6Jg%@MFU*W}A z?pk;;mRr9!WLu2o4-4;+VUJr2FUInHg%@M_s=_-yti8JMVl2-oyhjJQlM3%Kfw!da zP6)hNg%@KrvG5#IiSO_ueM5pcuMTT(Dm;Ep%g@TU72av$A-}%Nalc$u<{n$-HiWq~ zWzIZJ?XaluHWoQ}yAT=;AF}!U!24$5T@ZL5EW9TN-Ydn6?<~(RG8YAzi;~RQ zMdqnN=H$Y=B=8=V*6o+*-bC+KbX*>E+`sUi7I<5~y{*kZOY~O~{i#I1BhfEN^f`%M zo#;bFQ;*LKHq9)&Xy^UYx(SKC>08_S@u5V&KGB;KeOjVdBzj?@rzHCSzPauGpGov< z6aCCYKQYm#B>KoiFGzI1XyW+l5Xaq<%zYDm=QoDdTocxOyYOBfc()YZb%FQc!h1#F zy}IyT8F*I}-m3!d%)*Pd9#VL(333y~i|6T&|2t%F)b*Ldi@IJRUR-xkq90q<@bd`1 z9~UH<$%($>>)Y!5Y@$D&=yxXirHQ^g(Hj!|=tLiu=)OdcPxM`18;aFCf{(v0ypIOn z*9-5xfp?R5F@EnXGH(nr*CmNr|`ZNc()ebw*&8kg?D@4y|(ba6L`-oyzd6y`Gxnrz&oMv z?g+exiWh5QR-$)G^u(g$OF_pkzr3xEJ46%bp9GoD6&`H54=kY zkG~J}zYV;9 zFTCFc-b)Mb_knkL;qf;uy~pOl=V81MfZJ#kjsI(a$JrVjRy+G8+>8__8L(>*yqNc#(;E=OvjvicHMK4u!|xo3sBv z`mZ6sVlHkjJpSIA zu1-|{KK7m?Kap znWi>Y3G)Q0Z`I190*$XJIF7xD+NN+FCdFe)Ejfh3zLLd!fF9N z`!dJp1jg)vk4psfu%2_URG^(Y)V1c(kL~!1FGm*Iz6=Cf>i?mA!AJX2XX{kWpDYj? za*^W-kGOJ<&;xylK)hK)EG`s?J3RIv#>{zN4O{W8+aFo(9At?vwqP@{&ox4QP)DrM z6*O!U>#&KuW}DCjKi2~CmujM^4ycDZdy$_Z^aW`=Iuq zrg)}PQ`FE=0(X$_zIcZr%e{QGKn?J0=G?KCM!g>^u->|Po-$7@u@Ci1EzT4;FVq=z zxS{k-_dasAiRUzDbe4c#8hWX}PUX&!Y@I%QoF>?24Tp7m4KmY(y8X`-AHB%z+8{%m zIVbo*EZB>fWi`iRgv(DB^d|KR-dh(u(y(f9b2J0rr*hOsW_GB$J%(}}2?m28Yw(va9 zT4KIJupGSQ0&!Xy&LLg5xp6}>Fmgh5LYLER~d+a||SR-IB@j+MS!^1D?fIa(# zjY6I5Ch^%j>+pLBI#`De_MTbjLG{Fnd!G8@8OE4%hX3RszF%RlW6#;f$CW}nUml~| zW8{cIq={jq$#0||k?3O+?fU|o&`+%5dg?XOyCj+%#d%^JY2p=WVj1b96Mamg_fIr& zi|dJNq!%T6pG5DQ==~B+twwzd61_0d zz3Ni<_?THxH%xNppx+Tv`hi}+X2i(XlLy)r0(+yEdyp|YnXiix^^^S- ztF`Aw^|oUvOf`HZ4p%nBA?}%N$aD`1)zIm6wk5{VxgpQ^6KS4j$gUMQFB?i9-xsHe z*DJ7pUf*p@*rO>XPj85cZN#_H*vOgYeT96i5vU=2K31Scn16-0K)`1j zXA9ejjnDi8H0~Fu=WB&2Wy~7n2ZTO>23>dNu>ml@kHEPaYYVa@vm24AEjrwcA%*l^m-3?vjoji9fUN6&_+9#jH;Szzm;=VXdKnHfN z5pEW8zF3D2gvexWKYKm zUpccc6FNP!)R*<==QK8BBYR*6w)P1$=(;o8BR(K@y9$E>vENjB>Jwj?pDo}szF3Y} zAm2`Ip61zOzOX>RK5&xIql`~h&wBQ!cJ>ht6_yGI3s=c8*Y6FY&lI@Zh#&J;k1&5t zn|bUQ5QyoK0(75ni0}-pb3VQA-r^GjuS4#c9m+kcL%D0)$T^1iPUEg5HrVNVLCae{ z@w_MQG<-yEg}~V(pN!8bG;7g0Nnjm5GN#^^31(8mhsCCB8^_7R`y0&|xN z=x1Me*lHfSrU|UaZq`vxy9?xGr2yY?*RVCWM*YnK^?rqLx=2 zj^_cHra4Uw-$U$&+#&&6S@-F3cVIVja|PlTV}UHO@Y!X4mVmyig~tiRn}&UFmQM13 zFEnJ93Q^|sMaKDHoxWw(`g(?aWc|IdCw^=exRa=va|LR~=SsuY_hfR75EpDEj&<>| zPsG(eG0r|&4jZtA{qeod|0uh*$YLvSJ~V9Qkp3EBt3XW+3J(_g1ZtW*t`nXjP{W)z ze8Rr?*(KUczF5CRKo-4A1scy0T8^7@OdVinKSFBI=L??426WQ!^ZBX=?pfjvh_P|s zGUh#Soq+Fgy~oTE$4E~Nw1%xS_;~f%4%SW)yq2>*AgmWI3ViN<^NBBGVz5%6Ht?4? zF?X~;Lnm|A>30RM_Z>4+GG_>^N3Z3m5ym$O_=6mGNY;m~@ae6?w&8EDKpoJS$3B0K zfoFTX_5|^`2e%013P0%C*ZvJ^%=gsM<@tj({(o|qx}hB+JX$UjeF?{NidRQp*2>OxE;omy~k2t?UJj=0%WuGTLdsFW;>&<&0kH}?`C*IJs zV?^($o;pN7eD?djzR?=x-kRwAdtw%+`S1T_==Y*LN6PS#8YYiChu90<^xm6!Xk_Ru zM=qhs4?VR?@1J?tOXEet6oDAt{`;+4`JD!@xohjzHwiEP^VY4e7oH`1o-ZKhJ+KR1 z>|ExMjh(RiLf9=#_r>@gr*D6l8;v}FSKkKgmSg8=s7ufZPZMHjlU zVUB=pv{Qxo!UBPLd?!}eYdbU?uKo3ek3Ga2e`whc_VfBWKlW^`YW9N~;`4`rIJRFCb>n0}H9d)lNwD)HF zJWnpD3F;oZ?Hhdd;68dm2X-MJ?c%;*KlIt}N@E)FpwaUzp02Wp3Xu^oSypCROV z$9hn6u3ZgVai_-ch4YIIv<144=obp`^uM4C{~QuL<4FpHPGalJAfLYQMc64VZsZgh&()B2R5Dw_T;Q_YS6o@K>flW5U>$YZ_9;Q z!oLW_hxknwEQibr0U2_2v_S088})Hc=L*=F`K*P<9l*X(R%Eetd@G*5ldy~Zd?twJ zVgdWuhy7{TX*u(AERZ3l#AKW_Fb3pchJbwsl>TArmkP%UgMxk4uw_5?VLxkV*l8a7 zPlTz)p62&yobAtYoF(fdPTj0MNb;TR;kf6$;V%@%3)hu;jc+`RK2CwpY_F8;CLIFUrER z{vM69Z`jUWLuYNLR*Z=!_ZU5QORum}oFStqlH_G_e>e2ZJ;jhAd z#_g~JJiyPwE)WJauB#X9$T4$nvCZ+VJF}YJrVh}>Gqj%xHLpQWj6E@K${+Pay^I&$ zILdlyw;ypD={e(=*muVR+w5c0S*V+j{#v)s#9;EV(>BHri+2QQCik;JS)BMvB!QT4y`^HKutF_;EhwJ?f47MVli(%DcwD zsn6j}^=Lg0kqtaA?5l0VS9D?{&&3r2GTr2DB>((O^m_p3$97;JeC*>HRd==~iBH2$ z;+UT=@O=ODXq@lQ9mV4rkDYve_qoxpfccxak$)O?`T5FCGG6o)Ce&<)_w*X`{XBr5 zZ9(R4y%SpXhJ6nZ91~>73-<0R)a5_lPuT0awVt{hPm|nebBtfuM4lYO_teC2qUN*T zymR2E9wWo|z5Vnv!ZkXOTlEtxhi6v2FbC)5^szTH7z|FB~D9E}SJ? zAY4|UuBG2L69?82YxZw?E;?5DqW`sWn|iBT>pWV2J`e5IaEA0{udS9L-q?#S>WjSB z)e>@31#(K`dm+A0d}l-*p5xpSH`W91j~@K>*C`ikjDGB*5i4qhhQI7VeM}Z;*z7yO z{-BR_69ih!!vjUz=ej)Du68o`H$xaH-tFsY=(7grklG;D+&i>rFYn%UdGI+H)O_^A zHGv<0D*4rL`1um=aK6q-p7GV^$+5N#@R_GscQ>-O!#?DgPz(6tI>A1kdA5T+^F6-2 z@O-ECh^ApPu^9as-+B1+5O+VeVi)@zC!8j5#;*~cC%jVl4}s=*;qR}*xoXPIoo!^S zi#p@$O(WGJHR5yh$#5Qhj`E%3JX-%qbu9J6xn~XMt`jjGiM5QWIoE@R z!?9xyoAHJAtl&$$Tdc!1({#6B$M2*AeLceFpwF=p`)}?TYS3%z{EYcQww(-mu)UKQ zN4?xr-K@zmcimCL3k34uT;%iCuem{iHRFZ6X6S1pL+>@j4L#UO9@v+AhI~#CXx77+ zn#j-NtRG#(XlS2Ft@wv;M(Z6Vye&uHC z884Axd%D>dpUAWI=iCkDY|8NW*B&HU?ksxpPVMnri!}p{z6pU(tWGR^%ffSw=~o*L z*O=#>L&tcM7IzU^l%@v&ZFnr-o1+>^cHKGv7xu_EZ^4z%tjx%mFCrL7$0^8z26 z&F|CLcb{|LgOD2e7^ez>o+NOO3<{h{e5VZv*0oS$>Pf${Z}>ef>#UR4uaf9UKIX%F z5)zjqiR~gk(O2~0$58_HL#~iVcfUY`UL+ugZy%Hnde_q&jalpcnFD^WWQ@<` z8({B5ff&}=J#+?!zOO^fkr^!V=)w;4*;e$${h0^MuMv2j`wk@zG@fJB;F1<~_xDPP z&EdtW4(Ukcv;y+ww53?6d4vqSS9>9z2GrF9GR zP{1c->6c2Dd*J~BHA#)xCgOFX+2tn5jF~66ZVu{JTF+wzUbs@8}!uF5dyiQu@`fP2``eP+*gNE z7;26;wRg1O^LD7l#|blqLxdM=9XY!}SSQR9s1Jbs87c5`3wc`6oEVwKWwJP7Z&E%*Lu$Qs~cq3YYrWiK!c`!DuGtD{=GW~)C}=Q=WC?Xwd{H)zMa;{Yqg&9>O9(h z*NCQu@1NI=AWMy47iY}+?#X&OLB&ICi5<_1S;A_8*wJjmks4FOF;DO~``9~}=7=A< zXy`a!pia@@So50%wzZgSj=rEdqIgzgD1rsjqbcdeP^* zkyxx06yE>O-j@K@QPltM%)Zj5P-shAXlct!(i}~bv`y)KrT2Y6TMBI&n(Md6`EpPZeOa71GgGte&F~r=HaRDlk&F zuOVdJkcRgK>RE`>whir^`f)<2L7jd#I@gSt$Y{TbqQtl}@Sq{P>KC2wm zWe`qli!48BST4%6ah8$o7{|#xZ@_8q8Hk23(y`18N8&8QNf~s!cJpzv?B57-ju&%(J3 zC)<;b{VR2&&R2J%Guz9`p>0sk8913A?VuPZ>xwe1zP8K&W##eB{m6r|d*F=9rhebb z;q9tEKo*X}y3&WX$}*SZr2f?N8ngpL)|)LSb+9m&kNQOGow6-0`96e`?LeENv)2vt zpk46#egNmkaK>?3TebDbI<|3JZflT@{Yw7Cs9SsvC= z4bBH~+UtUFt4kEmG7`@E>aH9>W#yZjhn2ywI~lBV+BNH$_C{yzmwhqwr)$I+$4NP~ z$0azKUjfcFID6uxi`uHSCBn;bQV*UVgKe<>*w0uQY&%|0w*7fMFn&Ky;&_c%8Pw^L zE@V)4ZvNCO+NPw5Ue9?*^Ipd~7?1PY5YBlU~W_g&`b=}ai-g^Z!ySkz2AJ9;bYMgWyMm=_ek9C$?j%vW@s*NxAJ|FRQ zIBCzkKFCj7plsHQz4t9boOMN+)SvqR+B|dfiPqQkpzEr>cnwoN>x6v)W!?Zt?-y zbe?-HDB&wQNJiF%gfWc{(cSE64)5W)z*3$TF*sWa=; z=0jVKRJueAX@=K)f-4+w!sP8*q-s$u?wPRfF?EoaE)T z%{&;V&9OX;pMrA@POkgcA+&XhXjpE-XA%HMz5kXt^BqM-xbGkj>c;UiVbq}wFq@`6 z>yV~>u)Qoz66>>Uvzx&{9PRr+oO5uJm-b7zr9Tq%OtZdt63#Zd4C}t+W14wQK{{F< z=J5mMVarDu)Yr=W4c3rtn*2{99WCEkNLxLKKNjg|ew9I*Z4=d-`cp1LdvXlOeA%w& z*P_LlSs23xDRc#Y%2k0 zUD1yD-!jx?5zdJ?*$2^4_8^@3I0>R|xTaJfIezR!=NvDSw`k{M>o882E4;T6U~eJ?{=lzT>(9>%P9Tb-O%3ycnY*E zPcNLTo2Xvge{rL=>Y*RX3OU!dJ&IeKOI)tn%=Ccwf^Phr~ z_=kYM0AXFCsj()}*w|86Q{U0lw4)QCW@BSZqFulpt@VlaWENpMo!C*+kZi9>)Yqp2 z<`5QPO;})*rmYJ;!aDH*80G6|ZcA)Tnru6fI$ReVU1bh_2 zKueacjV%ph$3!JUU{-0{wxqKvskLQWGE0TFRCAOc$xYF8T}xJFAen`3Ph@c;nT1Z| zNKfR5OXTn~U6qx6GL==o$t_WAb9S;Z8AUc`mAfGe*N}x1i^#eF>KYSmZK;hrq5>Q0 zU|F_1L1Ifss%~>OsIH}>8CO7?*cE8dyM*zuBLKW9)!Y&oGE<3@BdLuYjg2`VLr~M! zn5qk|8Za4s>)KN-!Ns^Kfu`wbh5_O_PBcljspg!^Edr?7m~Lsxx>%YL>9$RY#v1gL ziJG?5DM4nuhO%lWxTvC+YH&G**Ayb-s%n~(!IdmY^s`niVsR-&lemUpo4Ny|HrrAS&B^SXHr9YYstP)-97uMD zBiVr}(g_JHw^C6jQjbybojWv;)u!6pa{4t98TM|Z2*pe|Dyu1wj5Y<5(WXE$+7w7e zn}XO#Qy>{_3M3|51@NeuXvG7P(-cCJUF|~E2_~|}RYj{z zq-DcE*PLiiZB2I0xl4F%6C?YaCKe^5*Ahen*mV<=pMx3}-ZgQUwQFVv3Y*%2!sd3M zu*n@LY<33MJWXDUEy`+K)JGnI~3NIOm1csbOJ=RZN<1I zN)x1`Byy|F(n&y3l?)_1r${3iRWQJcR1-6bP)IULAbGUaVPw^qY7XkLF}b}a+1wDO zo0HpcL(7IW)sN4%AEen>q8;Zs4UH|e!R_4v+b|`-Afl!{QQH{gmQHf$Q@f)*Sr@h> z#`b2WB{Cd)T}L{d!~h}Lyfu|>X>LMXkg4XaEtqk%rxSHa401b~BV!egqf&J;cN6LW zf&p-#LjXu88?t64IWqQwbz!p;>?&;`)x(2xl4^ zV>;s?=tt4(ZVZQUjfqn*K5Rj)Y-69kEs+ie3I<{3S6N`TKx;=W25~h_$@We5CJJjt z`J#cezv0xY17HJ z4y#o<*?{`PjFa_IAD#DaOC~ngh=oeQ4Inf`lM2n$rcjX9pxT9hQ_^1TCQUmLX&Z4T zYD76D`)ru$Q3RB1ZtF-VVM!=oOZzt}M^kM}Fq^R)>^@+kO(~8ZC3lNLIcsb`3Xy@i!OB|F^);+|(}@aCn55F}9d@b- z3CZns$yU>qhcw>DKKr#Fd1~&@u^4|37W%Q;S9N+X@4#u^&WaVdxnji81k+9L*g0|) z%p#dix1@KL%ul2mQ7b#gENaF=O{$)@h!$;b-#KbtGyA|AUK%^c%uQ`gwei+byQAim zWV&VN$mK1VSYr-czq4XlqP-4l0fDH>Ri=hn8@?%IKBJ z^j559Y)!UR&O;Z{zvg7`j5n|b3CDOQ5)a_Y&~X1`IL6HyY(PJ4mtpnBN95MG)L>lC z4yt-rsact;Y{Fl;|8#EIEG|G+(zt^tyT6eF#ZbOnVzXP?+gqBdM=r$`SJ{+kttvCI z6fVE2(I$$URlS)9SB-ILGtRE62moo`l&i{3O8UO4%c`p-jot?XyyUKuMw0_{dwhxT zrITB+V$oVv*xbIU)bJuw(B4?EslK{kLv6u^_JR$~1sl=@8#WYdC@GzTimj~Ml&&7X z%5>qCX>?HS3Ebh#n#557Gz(Z|NmH9ADz0Rwi#BgFW;VkCyVATYK*MxL1yOU!1#y~Aeo;K0Ux1?oM`dAiqB(D* z8Fp-(60c3v$1$2m_uhhAPrR))S(n;$`lxuSxf6VBc|6e`XJ-{}?r5q_rsI>WOzMQI z2)!=*>3C6I=_-+0Dc6j2Zd2k|r!$Khaof|!t5MnY@!FQ{L3X2Uk~i}Brj{v8V=x^z z>8!%;0~L?QCzBB+PBuW%EWR>gM7;vkR=hM1B`%LQ;4ahL5btQUrA*YJN3%sOM8%BU zXxkva_m$Oi@+)y$g!k@XP7?M0~#T6Bsl8voJ z#-Ci&HYMKCyt%n$TXVd{+|%PH6}6RA_Rbqi)HY1C8eCfuH8n~X$3p`QQQP7uWAD5| zvP7hywUhO2ag@roc4hBU(vW(mXs|QT2ekzD-U6H+pPOoHZA|Qlw{J?d#d#N?or>r- zp$Yi*O&Smdd6mYIGk(4EPtQLs|J1S|2|)3*X4KJ)l3D47%GrtfQicmrOD3|ay`{B! zMA4Y4?HGtOV31!KUg*`Xi^gqNoZ=HvxS!67^toR7F=oh&%K=Mnwxf>#$5oX%iu~<( z%KEgYhu0o6N+0&%{G)V_x8MD#K4ACahxCZ;SN>QJ|4HKlU9`I42|Zxgr|;3_UwU(! z9y8(g3w6oFQE%$QdVM-i>$8^}uBXhu=``K{)4y1#y+_;YbpLgCU9NjveB@|7yj_j7U-GJe)lW-z?s{h)r0#SakiekXZoFb_@!rFr2E$Y zc&VQ7v%nO*nuC?BYv~|Lpt{C=bqQ&{#0AhU04?X_E=~^%S>G$;D*E2(PZ~wh->VjA9snmylrm{-++wrNVb!qIfrMjwR+AX^8 zs|yC}VSk?Xgf4shODpum*Pq;^C)b`aK_Ad^_?`N|GcG=b<1RDKnpX`=DjG9kdr{lO z`4}X!cfg&#r4{2E%yHNY9hD7lLr0z39xtdIT~N89u(EPA&J9R08pmL*vNC^k@#))6HeO3?QbzG1}bdCOMfau2BH>}c4QY96tsIkmlLZK`=()vi&vONkB~ zNnNw3dRIk9d#bT*bW^IW4xR8Ri^t5E5ucC89gT96ni3zgj3@&NZb~KQ+L+y2!nWQe zL3cXI%zrTJ=jiN?|Jni@xs8#}hDel+Atx^%^yS<99#T{OES2=fZNVZjhoSWuS* zb#-~m8tUre6&ssdDxgp@UD4Xo8m~aAuC=uS_f%GNykadzwegC%HS-rOomaDB{`^(* zR@cm4w0hO_2}cop%)EKaS06KL`RaI8MI)yh$+mb!W2+P+ufpW8-y+Hy>*E#ac)X$| z9@KqdMQcOeVk4y%lcUBY^lijgpI1j4nhI%vWxf+K`eud=6S)QkYmYX6)E7v0}`aiD6<^leUltu&lZ751qVuDw0la;W( zY78r?t0yhR+yn!lO0#r^CrycTt64#fqt`Cy%OvmNtLXRfMt@Jd(G|mRycgcKn(a;E zfLDd1b9p6@ut|Iuhi_tX_pdw?<6gODzg&H`xtZj6{0!a4YdgJg_CSnVGcY^8P)2tk z(sVZMUM=lm;PU!c5H+ux@pT?LZp^ViN9P=bziXc_wAmcGruZ+kyBgr6%1o>bfkND+ zgeN!Mout1XuGo6|Y#M8>Fx<5VGm*=Q425-aoaEdkdLNEFO^9my0!5iB7U$0{<_1|{wQeArmtyD71w7TLF8%4+92nD}6djq#sZi^!YQn5e~5(m39V!ek7K zvk=coHZ_V$h4NWhR^}C(G-g`7S#x&XwyC89xBg9ut;skCNSMK;+AF0LnAz8D!fHud zG7kMZnmgK1im6h-j@pXW1oBN|ni=Bq3bDR|S$QMY73wy(;dP`2cOPNT^G^mXo?<+}3Di-ULw&Ys^VD7$%Jv z_QunAHjr*^!`wBEf|^MrUXtO8uPJin$h>Ks#kaNZz%Vn;K^NYnLI!P8r>1R8Q7cT1 zaAMEqXz0K&nrdz^xys5nYr_tTpk5+=(zaClrV>tWgDNlYUE2Z8TH+g1$wp3TA*!|o zD@of>BEH>Z%G81tPCgB&#B?I>B$Gi<-%bf+wK1J&z~H#D_oDW=sUEJ!psthKH=zVv zw2yDwlx*gD3aY<@PkG6+RU2MN7u!JI_^qA8iXru zW$%T&D3B$V3X3#yXDT@X)&* z@5PVX_r(V)m<_b#N#8X zE93EkYAoNy3ku`#i)*-sQ}awQr~UDQ(t>g<9AV+BqTDQ52HECUL@2Y|V2vcBA0-kb0SUnAe*gY6h}6BDLmYYxnEW>I1vVyY`= z6eU)3MXMY3%53)0A`91OrK!XTk+kWdgLQ+Q1yiPce`mq^6RN8jy+NYIW_pq?#ObWm5M3VL#YFl>Zw#OrSg>Ot<*tE^-=0z zr4CW5uTuS#>aWzHN)1qIpi+aBI!vj`B!<0Hwskl=4N);$osMH9h zij*o=szj+$r7D#gt<+IUjaO=dQWKS$q|{`krYJR4scA}0S8AqGkU2}K*-Fh(YOYfA zl$x*9LZucdwOFYoN-a}rxl${YI$Eh?lv<_KYNggFb*xfrl{!wTyl`B=D)EK44 zDpjS_IHhJNwLqz*O07`p1f`PIm}>dh2~IZnlbJqe_FNp`RL30$;p3a!gA=Ah!h_pc zcXb?&Pk|1{XGDYX8P>sBhfJ{IUe`yym+uwe7=h1ej=(1~rRFHX$2k=^Mg~Wvmwi;> zV;mkwsaOe{l{p0+*ymGE;#D3bkq+YXeIH-9UJj+ z*DQR^yB&G89u8a_Ub9w&QU9YgT> zS$`bo?#Hpsv&RN}tb15^tjFiVn{jYE>C?BS3ybKjm(p6Gdp45#sBnxFySBy&yF+a+a+(mE6HxJNW z21k7N2XkSE+!HjmJd&H#z0^L-%RKBsdF;ZepJ*tdXhnX?vYLww$`crCgfXc_@=Gm9 z8`?74vXWBDV(WpqPy+Lm!^)z5)J=4kx@4R=(TOZt#Q~;vtc5Y;A)IVa$z9rxH7Xhl zUYWFQUn!T>$krFzh3zkOB-Tb6O5zfyXvol((`s$gq>CO>ciFz+$+^(A$=x+0P$jP4KWkAPko z!F)yi)TADV|ECZ>)VnW?3+FGqr@VIn<5m)X4sl$!e>X_wdAkvN8j!u-E_I!HQ9UcH z-Wz})9mMw)l!C4VgCJ<=m8-8}Q1pAmyLW%|zG(0d8vk`e_#4FURClP`5&l@+qHa|; zsPC#9)%Vo*)sGC_ZR#e352+uTl$HKVq~0=#li~l~g1t2u=;7mOoGT4IypTegJy3MTUlaYc_lyZI5rpxJy_?k!)b&O`&%45VIEY!2;X!&_ z2>+V8N_|~@LtU-D3ZkpLuXx{5-&EgL*QjgNHv##Q_o#Xj15rx2oSt#t@eT|nSQx|K zd9T3l-z81~`YS{HOZeXjXsQf^Ua5)w-1`~AI7W|j#|Bi4KcViAqzLKGeIXa2-uM3G zz32TogkKcKg;>X`nH^X~g{aQV%UO=ADsXiDd^Rsoj=Or+ofJ?L_fY_j2b%5*Q zh_-mrZyf&$Omne3%m2K1d&gxsjy!dHN8Hy7+l|)cwJG8_74lH@w%p zSEC582WDCX@Xy$WVZQWS78b1nctZr%j1k*+P5Nlegs_n>COQ#x7@Zx)Y-CvwnPUOo z#fYsnsbfNzjhqRom#Q6s?28b#1@WyxXeocIUIye5109X295zafP>jVa=_t&REH%T& z)X$Kf8od(H2H1sE6u2+k>%MPSCm)aIcIT0%o*qj5)6iYEj`lR=X0FHV@ z?2}jnITc||L__=yvbQWq?=*i~!;LFGg}J|{2KB(yaweuqi!oKIHq(=(m<%t6Qsca@ zsiRQE$D*T5>Hhu?a08g&rLdy$b+y6sv8?e8^{oEAw?Z%0Us6l-3AnI&spIu`_1k)Y zPOGE*8}+ZfllAxXZtpu@GuBC__&?IO>PkIYU#BN}m-z#AyZ-|{NdG}Uss5yE{W|}< ze&5(D{#UR-G|78YeNz8ky@5rMBh+M6!)&b8Ou@8%hn|LM-*il9&qDE+t8>vkzu;Yh zhCNJItFzJFZNq?Q5EfQ`=-uK?&=2YR_2vGLyj#5o^n?1R>I(nY`Wb(c>hOQ2ey$!- z4f;U;FZ!?gJ$_wyQ8}+(+t$13=Ie_#XQEYB*TM)lRm3TKo!p)F|?Yc@wX!^MO=`Z+S z@OfvX{NC!|^3qX9tBXbnC;qG(@ZI2_q&}oRsvgFOd%=;O*Q$7sXX^;rP=;~3bJViT zHeiNB{!m?#IjUlt-l5Oad&{0tKN$Ikk!y-C((Bdr{!jE<>UGdui4$8)$xWD1Z*X_zEaNw6iK^j$$cT-we6!(7XB#jE=vkZ}dhWc8Gs&L~~cS?4_k_ZT?VDY*YO+ll|rT zs*rlmFtokVuHHY%ukiPl9aucNY$hP1%QpL!2rK=I^!5Hk(^f_ac(%T5+Vf@`8B9;f zFka-doYE?v_s&DA#Q#O+bk(GuP|ql_jb|XUxOAj{0MZjPhv+#f-@ByrC~&XFnd{Sy`=Ogr|{N0cwx_zg7OwpL4ofT>Qo${R( zcgEx>&!qjde`l;bQ=ZvbQ4X%O(X+U;#pmjcb2}@xsjE$$o$POzJ z$Z0p)e1(65fe`9>at$yhZH#deYW!?a)OwGUw)!22EgrJMi+kT!dxq`C$ey(AfbLO0 z^!E(g>3<*bLEd(MFf<#bN5kTOh}cH}eFN>tgLOZ;tU2>3wBR1>FZD%S>bLk0`qT9( z{^vn=El$!LTK)!NcK);rQhte=_^}VGHx%C~Cmr3>{^&C5dr9f<42E(1C9a86(iQ3j zeT7<+`GWo{V9ayRuscxCk7iCX{G<_^znuFNd4KeK#f~k1QlFU_mnkl7^S7xd4c|BY z*_pC|_o!;j$_K>ohr6iLn+)c(^4BtRpkW57Co1khtvpg%I(*Nt$NfF(e*cJADS9rR zsGFFMJqoI4K>ezJm1Yg@8TN`_7<3oIn)=W5ha(SMC!k)L86D$6s}^@mhIaoO z|26Os@-EKe($C|(Ld}J2I@^Xe<#|6V-!tqy|2g27`%Sp|UiXWU$C)Gd3_Hlb1HI$) z*omf(c*cJlSM9UDG8&BZ&kOQx8+Ny;p)s)|)m-3C_NT!=)KDD;e@Kk2vN$#~w#>ko zGq3OCf)rW-b++7J5n^vveMhZ|9T~eykBBV*G#}^Nf&P`?{;0PRkka87cpvuOLEe*q z+cV79b%3%4%VK+m?HTqM^xLf}V(oq+CN@T_b^Q%3`^!%m(09tkc38_z>I?cnV~Gn! zVhbr)!sN`uY7RI~95oVBNBVt6O1RhbICEof`&VaF>}sQj)bJA(kD*jg>1Qw|<@L23 zDQT4!^%YzhSLr>&Hh_CVtT}dvdZJ>HrY-m;*N=Nr65d~A3ozcN82^>Yp&~ZJXper= z|FAzRc5=lR(92*mHJrDYao7{4MaZ!=c1nzObb9PVvEtHgv9YQeymMnC{i$IM*s>ps ztL+RxPt`~3wR&Z2p`myl*6Vs!%%cG956QgNUo|#Rf%-lhb!_jp)Z~iHI~DI#oM~Eu zR>#`8Fs5S5V>Pi$)oQ?ZQ$5J0q?^^FncGboy$Wza)T=;Vf5kOw)08Cfsj<1HT&_0| z_()utD)u?>**Z8L@#V0|OHt;L!Ikk&#aCjN1J1l9H#4Y!!SoO@&L18aoAm*Ae#pBkcY;wc7jxHv4ss>5p?&fiHdPgjBpg$v1^aaPP^2Zx~TB;L&qL;o%hi|*TVwjmtj=rW!^z9+>3qR?%a}} znYs5#U21N5CqYlv117nKZgHTu;8`ZRFWD6qNp|b|vicI@&*)v#OA-h6k=hAS9@}A$ zf4nhT2hELrtPpjHdKK+*u{JIB^W}k$p=Q*ej}4F-+7#Qo&$3(Y?!#@+y0bGquos8^ z?;=0Ciwl3-MLB4nmuA(cP-E(CT2JivGy3hgh2x#)L0=zm(7-JN3;UmR*kc1P=>M1g zsY4$>w59KJeU3hO)_}cz7xkMs=)3*UwFE0J*Bo$vugS1p>n?@5#e!ia{CFZitk|R##2870q9=*+Unq-n^;%SxdxyG z>aFnu>+TUOZ`>8;VHNs%0C^#&gcdL1t3f%LYKhekx@S*o@~L(E3B_0k@b(Ecalye0lV{J}kmISc+==tkc;V^o_)C51k*t1)J*^%lZwTx+EiY zJ1Ml)Z2Gczc3M)W<&V}FB!^|mrFj7Lb7NNdUdko;o6>{Bn=WS3a0UM7_h~gz;h%sm zxDlg;J{;)#iNk+)_=>?%n(R3DZ5P)ZXUOGO4C%}yTaY*R>${ZiD0=hO;F8DnsEY0Eq40#`2l^iG ztjw?V_3zK}uFV{nnT!qj=fD4Q?3DM<_ilb)zPMNvyE*7a{%k7ePx|MvKW4^c&h>x! z-eK=)@7WkP=pW}l{@yP$6Ah(Z6P*V5@BaGR%(L&El)2@vPrY}&p7h?Z_veLG4#V*$ z#pe5W#14v`WjGh$y^!y{Klc6GVrxAq(>F2)^_UCX%RN2^6E5c2<4^t{{JrnrZV0{t z$X9z@7Apr$Pkq9BQ}qdea68+}{aKpZ?oPnD=>3B-&F>HK^WR(d{@(XizRzv%#i43W zeD_2wWnYIyvU%Kt8*k=Zs*cC9>W{E6I#AuF`|A7jv3Mon6fCf{sfX1``bb@sYdXLA~VN?7gUN*8^1>Rk9!N?+;W@d4tsB`Y_c;kJIn^fAM$v z6aAynvmd5r_(K(6^LSdns!RMd^qlSU1&=M5((*-_ulPUpZ&9nfA$|&vd$xEB^sm$c z{dxU4y#?5zDye>}?$ocSgZ*}IpgLU-QUm-!u?2dmI@2oYg1bP z4vlysbURV^j(tNLGZ$t5ChCKBWp{Q&qG7WxV&rwm3}v-tUR zk3Jmle|_1n_dle6q5g^oMeloryrp`23sk%AFm*gw9T*#m$<7!3n{+>YIbO!v?hS)p z*FoM?btGt5s*D=$y{&%ir!Z~J^KbXps$TkLJs1yL{{(xQftSoWyx-~X`_sX(#P6?b zbdf*Y%Xn|0_TEN4@;Ee>fxq4Ru>T?d48H^U4^TD!Gir=K0I$7G0~P&U-s@PfU|YO} zH_iTt+B{J&^jdTw?5dYvtM5SFOwtGWGw>?fP_-N3+iIdd1$KS1|3}!?X*%U^K>hw2 zuaXT`FR7G&2ioo#ZW2t0Q8|^~cpWyt}+z{wLIn{u|yF)asky+k$!-iYuZgN zgJZq*7WI974z&J;HyXMw0^P@94PREjgN3}UUQy4fEm&}S9vTi-pY$K_x1iQwb>2w* zqB;lG|FYi)ZFQB9p{>^G2H4FBdV+tcdeJM>qx1>- zXZ{Jez6L|1&*}}xs~>!^eF@9;PT0k#)gb>Ih0YJyb?65^gZB>Cd)J}m2Lro7t?*95 zYk~)PL;ctAs9=_Q8}pSd-Ue0REB&TA)EkMH5r3yD(3)?lGV}xOp!tG7%Ae`KiF(-q zIdgEuo#x$vlE(cVkT}l&I9j#<4^20y!(z|liY><6Yp_~?<;EBANdGNZ%oQf@Z+dT{ zwr1mj#0qbxR}U+IzJ3M#ao@Dq`OoOj`{#iAB%I?>q7~i*)WR!hu_`PJ4#fk`wD$_&tMKCEcy%TO7A#Z@h@ z%Plh4MOgBqjjh0|uv>w>)1M4E&w#JhyWZdKpW!`+$3y3P=lI_TeX+g?|En=UouVJ| z`+$qKu-4SW&E6@fgB$z>nwGc%_PtZz<}X6s-R0kp*Uo<9{lq^+{TT3@{g3(|^M3){ z4t1A0NB3C3x7SJpU?wii@@=Of318i0qUn=3+O#@x7rOo=iubA*Z(vi zWq1lR0%d!`d(!)~-s(+N8}Xq33Fx^MrA>Q3$9-b3y2~%ZYq=$;3D((JXvsHGOHbh` z&I-JC@T`AGY%X5Z*y=s3Gst-XUf#V&J%9(T_p1Bw3UDjx@P6EX7wGG8EsTb>ptR`2 z9zecR@fi4L>{9=MpoSN!0kKx^LG>-X*sui)gz;E@tO{?`9-)Wn3F;wG zovKb#r{mGe8F=h?ruqmTv3yLOrOw7Rdye{qI#->C2Y;Ug-3984cn`P^d93&7pMg34 z06e6uQj?)u9bQ+Sg7a#;p}P$42tNmoKlsn%@p)ZvtihH49Q1n;{lPkQ68LLX0=O5{ z;re7;8P}uR+X5~PN=;k6#@zNS8n*I#R47Z;;H+XYU(7sQuDh?{I) zj-Bj11N^P(PW6;}TI~hRZ%po!y(+-BLh5tsmw2H5JfMGpb=IlBs&{a0)~O!)UjJP+ zSWm_f>lrm1i<0N+INEWtmyh&gxTXt$dmd6+y&~P)8;=J{FQ^&18a>%$?^=^P^X{$Y zX!a^|HLMUETcOcpWAQ7II@DXE&qK-_n*LSLDXph_O}aw0>1*^>eXX9N&)0W&XXpz6 zZ^bjXFQTOiynFT4c>F&a5B!V0>(q3#KVOn$UM1@18oOGkiy*NS@K(S}(1VSIrTtc4 zqQ9iey`zB}jsIxnE3{XlTwl}Q)_ZU_zt(#JdHuq`*Q0FHy`SjdTK)nz1 ztNh8}gUtpXOKl3;f0YU23$q)L#bL>r{om+`kUgEBuv^d$fOyzXmHv*Qo>+ z>QC}F`bj`*RfGQ|UMO$GIOsaq43E=sRn@8vJrChWKvRS(wFvMV{qGq}EwHufLjNBB zVgCtzpZ|`21Xov)ddz>^uZ1062a9_W4;fm$r~K!QCUdc{|0^uQ{}s8vgW7t**Rfg^ zi}i>d5E~lnhXwQNAdz{Ghz*Yw0oR7H%(2LM8#sD;*8}qku2j-6@0)SoTjk$`Jc}TY zey#c%MlZFv&VHv}L-@A3A0yx0xJS%a^Yxz~=~~q*cC{Yiuk}CS->%N{e~HI38tzm#wP{Ob_*W^%Z@E zj_J5s?SIEV9Hlt}J=A)m-Of-n28xVx+QLjv2haQUgw_yS!?j6`2-F4`Ft?xq0CHz`rV-m-I%>+`3xeNFq znBc5e*LrWD#l-PJ8L{h83)aVrH9qrw&wn3&^mPPMKB;<|DHi$fQrGIM{IB_6hfNZP zHMS7vdG`P!{V=hQq8}zjt9OR?JaRDHNR#g|gCX{D#JG0g+=F4Nz{r*wVLx0PD**%# z1J!SM>6 zP1}%pzR-mx#9PUZR$^VH4Ka9L4i2Vmyt}Y7g-8+jz9l$bp|fclGS7F72HA3mw-84w zv98jF7(6cp2h%p*UD%mIqzHW95*)A4*|ZIr=UZ@t5JxMquF{4$;CTTSz=O`l zy9+y0h$MmUTY}>iI-9m3^UQRi3Gr64qm@`!X+sR2cf*5^+V^#kBNs1H1l|?i(K}wD zvuPWW@@XSKTMqFSVrg^Jq#(bgW%$?dz{A&l9+Z|#K^Pt3Hq51wwBr>zo369CJSZ`jf-pM5ZJ0|VX~!#cHf=*vUE75m;;m#$o0}$u zXdtvqJsli|ITE+a}F^iYb`cE5Li?g)XSac|d0Md$NCqD|cc%d@H z;Mp4-l9m+X79I_=p~B(#y5_R@C^hBCnay)!NMv&ryrpvaTkfd7j@DwYg$3{s=i(Ob zLQ=St<#2qtcqdC}qCUB;1Sj)}kVNp7f?!g){4KY@1n+!euL%x9@h`&Wa50Nzmg>i++fb;j zZ-jO7$ZaK9${X>7!#crR3PMR`^^=%DtsJ4X91=c(85j?7E^gs2B!x>^4#$^^cd~>g z>XX|_a5BFik_g^X5KJnYzoe}%R8gOFPX-66Ftaj;i&-qgT&MvAURQW0D@rMGO0$;d z@{kvvNFjJjArK1_sPkPcD)W1=03PC8+`?T*3YW4RjxQJQWC=~wC%2X0WZn^y2;Nc< zOe&kdq^&PhQQyk`z9$DM@sGgfa50Nzmf=HNilBWF3g1rhxnw*#XDJ1N=xrx zj`QviNSKvrIV?=zmWyYoJ`Zs&Zs9H@g-clu$Cr(_DZ%IZz-WL)I-ck@uDwn?{6qw+hZ)M+tF9~^w zb8&%5IvZ+X0gDNQ8gH6*k`|?MapvdpB%GYLh6GW(040ZP`65H)M18`45*)%UDaIKS zKT2Waf)yS|ZRssMm&(FPC#Ud={}b;vMvRN%EhMT>Ko*fhY*glbo*Y8y;*5C#E*mN- zXE)>&YD+J&9Mq;=D6%Cjk|^QckRXb;R04Cl5bo%#6idzU*5DABq%7QF3AfN}4#(&4 z0uyc<&kiZ=R_`GLbdnv7;9c6v%FWx+St-JEE81TUNxL{>UWk=c=d^GMoN?0KW`S98 z0X`VuNW+uvw!oLrBn&K?CKc24C6-Gk)Z&xw-rx{ANioit_)!WQ7p(9&YD;h7qgO0Q!Nm3SWkOAK51ZzJw1NhzFk-`t~5V#4T1n$s?Q) z@fp7C-5*JrXyEblX}&E!3^c~lpAm2j6jZZa!Eyp{&5+jmva@bH(lpqi* zjd1Ijv*ar=feXy@4nbblmryL?5bVxbh|?Y9laz$aQ*@*6xE_`ayeWnkpSm0U>GPzM z@DRL9$CTr=7z-oTI_50-N=)Da!&@juiujTei+CIu=E4-?4r(FHlN91R{7pf|la+8y zHZ=5k(n;Z#W{MHZq{sW@dz+< z^clA)iP^LvF`mN<>{0X#ov9qXNM<^h)5A8r0?Vc*j1r?#1%|Dt42SrV5{vjeFm&`8 zw<(F)v>`E`!$)BP#dn-RAM0=;ndz=Mqm)8LIytRWoA&Uf6=C8_C>C)uV082ukER4- z(1AB5#0#B(EtjR-5|*W>w_aOHE7_(=9gRn2i6#!qn55`Gs&2-~<7T|U`DpMaJ>laO zw}cR!$P-^6w40+0;3&Kq$dtuCh`pd}+`;(<=VuIt+c(ouj)XR4`G_NIA-%u}waxpe zfWl&#CJ)b}(Eg9A3(P^hvxWMFpzQq-uLIp;{r7X-z<&si1!dP0YV-gpaLhx!h|A9EqqZ*Vr@D*?s5i2aO#6K7+BBShRnU~*xkwsv9pNKHDi7;fsF z>x7c>9Id5^N)edIisrr0w0~Ohpp>-HzZrho;S#d_ zFH}5;6>A{Jg(jCM&hiPh#fvt=O$w2~7^RV_#b^@Mf>=i>9HN0>9L}cu8y&@uQgTad zZY(Aot;kQd%eqkYhcyV++J)Pu%)%{1?8fG0Q%z<|Gs@>_H#qAbdHbAjdHdY*NNDqx zx6cW)Z=aJxWIY&YYB>!8Us^o`YJph{L$-gj;z2s`qcMlWMns@l5KucxpG14>SF^h@73B+v& zM6gS_n8+2TuJpE)*`er7SX6J3^cx@dTd^-?;JpL)bAS4bme;zRee*t0LP;8n!9N)`hT@M?(Vc!Rw zh1d?D2w^c!x)KSpe10iPH!_5l;SU_j@lBsY+H=H~c8VcbMpOoa2ocBT| z-t-OR2#gX5S!AG(2DFs=sQEHvcQ z2-zhrc}r>${`82Lg@)VmEr!HJO00l5QqWn5jn6lEQvxxI1CB*TAK_c12IlZBHPYzY zyeSR)G8y<{qtDVnE0IggQrOL6>>1G6Sw3pO_Fr$do0axoY(@}^4McJfIJWo?awNwb z;FlVUnF*g5{=p9KHN;BZQ9i<~zDw08lM+fsg)*9+qj=w=#LiNfH%e)6f+gJ?#rB`0 z76%;EitRtkvv#obxPA>~yVj(LII5KGJw<0E3=g^a+luP0VGO(cxl z90`>;b7T&%T_Z&}iKABZ=M!mgb1_CBAN?ixGbeKJ51i%!LYU20WC$PO7HddCue@8h zaFTGnvT@3x#qbY_2xmHq6RdEsCm=4GcO}xq(r3=r5$-IJ;}db~6*2s?E4opJQ}Qk{ zae)(4ZvK`ETmKqL_g%5@Q3g4R0zA{sF)nL4B&P%;7 zV7vV87#F`ZMCVkPDB z2%JzktuNAT>dV-Ni*bfl(ogU%gw;am1h)}SQ3-D|JW*{P0xX)g&)9_Wr+CUFI~!!v z*uTmk@8f|4X=i?el06UFX!86y1dv+J>{-N90aRvk**SG>v!wZ3XL5F)RvPH%dICF> zvpHApbEavjB>YF{CszvPaW4E>Be>37Q_m`1^_}%|SBfEq=bj<(UED6OdX)s-Mz6uJ z@T%vg?1!7y&&NMr8bH|lQKu`s0{lrwR44vL53k-P_}N!I{w4$cVT+lci==$@wZo6ubt(#!8ZB6<|!BqaQ>vkS8 z{#2wd{#ViM59$wr4Z7IAbR(4<#QnQ8QvP%3=>iHysjeuJ{8RKy1Hg(C8Oku7ohxwMI5pCXvq0 z^|<}am6HC}Trc*?)m5(hTUK&^P_FFbS;H);8|8MDD`})v_g%yLpXa&$|9+nT_;O;c zIqUw)dXoFA)a{YRcB6Gmyx0+AbnKZs*DW#G)@$qbgYqP2cHI(^ohKpxm^`^+BsRoY zAq9u7bDpvi6}2G}=ay4euI##%@K~Wty@Z^Y8}?)gV-9a)Hhd{UFI>b(%*iGdrA7Uy z1hyyfQnwOwcpI~!)U8lCTAQ{IxjxBb`y#%JAu^;dvUN*XS9MFR=-eDDTDMOF6Rlfn zbq~rQyJ?Zn?xw}Kb)wZ?tf}%ZxcL<2aqv7~Muhx}YUcHzsR?p$JS6Uy=6OyD62HPJ zH4vb@XG}!y0nZ|CwX%76IZtd@E}NHOHC{9?0=mvi=)22{SX(Zk{Ghyqih0pxmrG!h z7vtIGA|yL6Le4}TI>))2l#8+Z41#&xhxcP2K=>d|7vsI{AwzSqE;F$Tq};oZdptLH zb1}mZ@g5K3jB)NJjxlOM_cQEDC*OfcOtkog(FcD`WoYO<73dQJ5V87DmeWGYCUnsf zaV}{c%jWbU)XJh3PS#I@tHkm>73wXrY+jU=ofkQzL{g7Hc=Th0pm<1^ZZ7SvLkK>Mc85I9jW>rEwU6JZ09A-0m5lbp(h-*O8nA&M333RGM zJn4)1^yv+KKm1%tZ)!^VeNamLCxpI7KLCi8bPwKQ=&C=LcT3I#<$2ggmf>STD0!q& zC-s2V<6ji(A>%v~vIN4zn8+Z6l;VVkagi!g0%Rnh)ZX0wzPEQ8ZV`jccCp9dpFn?& z8^{6J2)_w8y$ZcXjn_T#V81`k?|Z%Rxx7<)ffqw^wG{t*J;A&JFxgA!sa_qnbob1G*9cTU#n%WH zfqyo524M^SBQ?5Xb+JENO;lH^zWB7E0{jE9)%s)@?Nt1|V?S)U?_q;vPYqTp{d!Py z+JLD7AVbt0c+4~wn=Y@_ZQcxQ6uugdY!a$J{%mrG*Wj~h$hTcRjYlWD^$2W2Jp!91 zduk2*hy6#edHMAk_2K2IoAqZrZZo^q9DTidY*lV^Vtp+1FYq&1kX?&JbjIBM-P-b>h|d6&1qU#WccJIL;-`o-3$HxXkA%hWob^+7$>0QYm$=0K!Y zs!iaUhK=uE$M*ND(UvHge;gz}s7nC51RFvR1Z*=-$%%YJDc$FWx^q#6)u1~}eOn&~ znl;GjI2_F7T%YAxjSFI>|7%a-GI~UPR`-LItWm3w(>B$FGI?n6laS+TY^J90ZsLJw?m;sJWrY zqaQBV3;aF)5lHnzPKB_y`_#9fC3Q_GKHY|VVSe|=eAM8L*symEUSLT1^N=HJV~v`NKX~X5n!T{MwMef;{q4jC&M#og=oq$l zei@Vp$7aGGV(6(wJ@nZO+o(itC+c^R(K^}Q zQ1{n|VoT(`*m!(^K3s2BNo*G_Iju7}9SQrKg`Czv?@hRZ=BiPewy;)x3)I-q4|2z1 zOK4gMHHv|9u%Tb8Civ(08&DSqt7*`%A8MM5be<60Sy`WTCnF()5~XxYp)_BHmh1FbJ;%RN|3D8z zz2xC<9B#v(gv^9>&xBO|5AQBr>F?6>Q0gVBN35s1Q7^$3-D9-Avtrz2460(CrU z{#fuZJQ3Q>L;t})(e)ss0bxDDdB(Mkg z6VYqF4*d^B|F;X*+eAzpaMfY+;u`46(k|embzCbW&~FsO+BW-(koyeP8x}Dhv5C-- zbV=x+XJXvM`cPakNoe82e--9>yqe}CM}M8F_UqMbV9CQ8_Mm?f+u!%Zc{=`^Wdi7S z>4Q<0spLR;X8I#QQIC6$^i_iu|C4;Ey3cHvO`ZFquiB2Q8992T=&L-`(rMmQpA(?9 z$Y(s{%*GW?dFT7XkW!@fmM0EPtMwi5$m4x3s?ml&AU!L%V7CAJ9I? zVmM+Xvb@EAv&LrJSAt>zv|Wdfx2E84MlyhsYZWA&087Fo$mH7>=_D+$5r5F!jQh_J z{K>`;P)T1kQ2iBs_c~)$_xgQeLt;n7C}jg=Bw>?f>K-%jlZnoQm_|e=FOQoc83$l9 zumyHK`VZdWH^CNqLbtc^I>w8@%v8(J#)m+sez*$`F?}?9&3j=9?Cpn`HcsLih=IQ! zczJK7t!&11b};Y*O?iBzXMjuYf~(M1Nf{0W#To?1g?eEKAuQnH2 zlMnoXkU0do^fT8PuV$Xhbj)bi6ZOG%q7G|ep_}m%3H9RDyaMN1bqqEvXP-0=(&nN4 zW01B46id)oC85WVpeOUew-)ySUd=og15O=gnpUYt8S0VCUfgr~n9}kdD1B8Q(^suk zm*86U&>q7fvjl(DF%o~?F~sQ52l>2f@?!5Y9vjw+^(;Xx3B?U=Owcx~BjmYDLMhhBRo#(@{0*E|?ySPN+} zQ$H&aUyJ+CCLBW`kptKMxFa;9m;IWahMfDshi;J22PxJ8t`t*>87PB?yaocUF+#Cz zJ{NUy5a4&~m^u`9g`Ox+9?CE5_gK;U=T5-h|w@U@vkN9^tWv zde-ZQJK7@E;60-ge$QB`s`Qtm7JufqBd5jwR{Y&e6aETdjsKMY5~Oax{bi<~$+X~3 zlF7`(DQ+-offgvKB|*3vlys%I3o^vW5OF;07aPp5#0pl%2ulI2M;Rz}f`M~%pULpA4xqV#P+BG< zC3z-<%){RXEyEu$tne43JxTFeh|6Rq0wVn|OTs>n6!-e~q1`n~S+Dkhx&hFo21D%8 zh^-1!gsclwLru*bX?*s>Bk(5*nT)3tEKh3V0Mte=*l}<4Wt`9-j2^ZxuIT=-@d0Sp zOh$S~Y1d)sKbQkuA@1W0c}??AeB=%$f1Sa*&p2Sm;|2SPY7%1i`crZJ$p|5nnPu)^ zbJ4DR>2INtvjnffEmOB zzqmi;irV6TYMZf)nT*_{8T;USG^woX{vIt9yhlf!+{*+Ky_Z=Udyi(CsD5{ByU zZ!_lcuTd^)vcZ(52L9h$u1rS8!T&nt;@JL!%0+Ge9c__%e^A-}TQ1hpzt1&BZU6sh zvrLBbXqLD0J(|#ejW*k#{^Ot5UYQKn2Ur`O-9P_6#ytO1%l7|Ax&CvmvCg*mpHsGf zo-J0GXS1FA4no*}SU1bWWqr}YxZ3)!IS!_V|IB_-YM}dZF!BGaHlytS%d-8qTx@~; zAA9^?w-@u@SDR%r(dQGS-rus3cK>aWv|aTdgj<*Ud_v&eUuXY}a#>yW_ZlPpf6K+E zYqsXPZ!c2(U$zKrv7JleYT<7! z$vnJIVM{_@d6U4+`S)FtdQ%R&67EW3Ey@eVwlPE36TV2!WW;8sYq0P`y zn{4M=wyVC*LrG{^qD@b{8RAMYH|q@mN|igTwJaw&YFS;CB4ysR_)jYZYvkX*E&g{) zk;(Lhz2&Z@|IaPz-=`GOek#@JYVE3@V%fy~Bd=~s+*ex!S(>189~CV{l+wmK_qG=E zkL{x<^}nU)eCKnu{a=gfJi_1CUGML+D5-DW`~Kdxz!qekdINWd{af$d|C3UX*OkKF z&!vRo|9w|C-=F-Sw?!rs9o1Q_JkRw}78Wgqz+74Q=G@;`3i}SCNbEdL=lhf~jH4zZ zhu}?mJO`4u0_A;5ryt8A?^AMqNw|-2C`Eno%~U$qBAE=|;N&~m_P)t$e1@TO zW5VpwEl2tyhkmwQO~?DT4#&4)-TRby_ZwxAGLeR(QE>+a?_%bbsXlxI+EOx%mdWW7 zEmM?Q;+@OnXmYO=&%EoL{f;Q9S$k4)mWlHy+dlkG$i7Q#>)4jX&5&ICxV*E=Vy(!Q zg|j{DoR*f#wU4_Ngvx43-e~(U?b^ptMaz=iF67`{k?-zGoIbxtw6^A;g`s^pd$G0_ zwJ*nE?$D6pwak_K9 zBJ|nqAaquDn_}p4qwZqC)Sd6}v$bqZIo)k;QQeuFw1caudNWfK-DPeb&DYjc_Ds!E zxZDIH7VP6a{p=ow&yb}IEP1rm|K}FWZ=OWUnFyT)ySLA&rSx6d7Hq#qkhjlCW#2xR z_F>Jf>r@t&lzms{x52Vo>4WT+O<7X2JM-;?vFj^_K{Wx+bYp- z0*LFXRjlrvTZJ6*JxH`w+?Byr;a5teYY6&;&B6Qs(&rEpyTNi>P~OwCXV;YuKGTUcUQDr1zl+@wAojIt#83C!M)o`WVkNpp40>15Q)a} zjYU^if#v6&iQiZpsp2X>lv<1!znijD4CNcGOy($jt7yNm5WIYgPz@e_gCn}~8;eDV z+un!YSmZi;XF4Io)v7u(CXfzCnAU!49AcorDI9ApN?N>YeLrGa5bQ)Ugm#=ng3t4>B z`dw+pDOwbJ9e%YV&VJqU|Ju72_&AF5K6>~e@hZ50dG>5swrnhO*v1B9n>(LQ_JLlO zPRN$+h?8z5oqf7f?oNJDAZbVgG$G;PJPn8j(qED$<=3QnP#|qX9&HK~LK51Nk`mIA z2T3SxN(yBA|Ic^h*}Xd>$)SP%e%ZO5`SyFwH{Z_8&d%QKvPPMwN1KaO{v+6RxvGoT z0*-;bS5J;(xn_@guEe;+tlHtV;Ebx&k&#$2BTr(jlX+2U_K*QmGt0CAc#e2vT*8&k zXTS~_O_t!)Rp2IaM5hWdDb(+Co!$F_IoLW znOjqF1sT1haX1&$#Wh_#W^R}3zKazy*6`Gie5&~fmq5U_ESHvkJM!_W@OFR3wp~$JFNF@nWke0 z>zOIFDU2`tCbd^kIWN>Ln?O>(h>7CK8+nK^ zE!L#Q2ejLGV>@7LxACOKNG@hov@Mabnky@rDPChLXBpBoFT{tRD%Bcl~w}Z#Jb@Z<`~V94TCA_gYgz|WzaPA^U4r{jEsuOZN`*@&B|lKX5%$THd$dOFh|9_ zGPo|w!V#G%i|d-Q@JX}s0yt#ZlX`VNGSAly= z=ZEE7$SQFEc+y;@&3KY>W;`h?+hw)VR^5&`p5%Kzw!z+hy~2B!_U)D0eqIZCmF9b< z_*{)+7QY>5dS+II(x5ry4%=UUypnci^%Be&ks{}r^~c=F34ag9yc`3&uGq-Yoc}Ij zXK~CWcXHlbj#g*MGt)acv5)OW>=Qpxlev>4%x!mxeS&q}|10~Xr7)M-@X}oE&Exca zfwcN^`)o@ww#iwOBmY_Rwt8FBe)z4_rZconu50^8DV>~41Dn+Asn?!0poF)7jf zk3!jflo<`7+W7Uejc<*RH(H2xe>-?%Z4-;^b>hutTi=oE@tf>R+h!NvQWC&7 z$+Ja|sw$6gOpeln`{)14&+7E^eErKQbIq0Nk(9Fze)ap7W%I5(cU|_(<-R2!X9jKU zHRYTtPs&V{CwYFG=bOd1wl9)<4xSx5M&l7T+g5lab%?c$o4s~=+vlmEdg~C+_*&r1 ze=%$>qD5lUSG65^iXzW5nHQ~MUXly>IUW+ZHa+U%HGuq5yM%J|7HsnJz7>ly-n@(s ze_q5^&P({^dgJXaBrj6^Plu+;OY}|m+D2{%@1Nw`z6ksCBF3Cq!g9YXKIGV2?gE(C zT>aKDysr(g+z$}qwe3uu&c|~DLcHg;Bkl&zTgUwO1C%wJT@^^kUe5`cyAoLyNP7el zE4CG%rf*hnciVZyZYi6|i@N-I zQA$c=?6$hZZqa4)GP)?~*Jb@UUAw8nyG?Dkm)mc*rA%$Nf9_@Gc3U4wuCHykwM-z| z-Feh{^4k9P>Z)Y-iN%^=>YTrxoTI7UIV+>j>LNz!iO_5hNnNJ3iY6n?bf+GP66&gw z9+I%x`jNBM#D18Xc&}_Yy!19;C8ttNG2PdaF56bLdp@Nxnmli*1%t8H(7hJ49Vv^+ z!&3WE79(q@MhAOuZ~o@ZipBz#w0t8KufMOpIo#eA?beafaZk9TMd`gqg?oCU-Ep-k z9JzdJZ)ZFTsGEB+>E6^0N)!yy&9M#@X#>BCbhdQ@X6yl@TYJN8g5BI54acM1IB0JV zBkt&lcZXvgan;g^Uq=)X;kYDy9q~>TZR^2jd0|(y6Cc9Ws-oK>(XMz5Sw*)&TL-ka zhRN32*{xc8JGe(QT?0Uxe2b|zK5DQ>iV|y8C`zm&($?D&MY<*09g8E4#be>NSU>D; z3-@nVZ7h1Un6yPvZjGTc3_vFt*vDZE5hP^WV;#LvK-sQvceF#bhvShgsy!Ot(%GVf zs$;rD14c!AXG?EeRJHfU!<&$HMEg|drpuy{xPqfPyPygM?`nhguI|_saJ$;t8|~3< zF@Q-y;TbNv<%mDJqY>3DR`o>NV~UXgTf*I4swcKt^~6z9oWx#a8{dLF(yGyL%#?-BEP~PS+K&?l>z&A4U4M#9)74EWSn6T^oUF)!Nn>rsG>< z+d8{~2DrcgD-E#90ILB|Aij#U_?p!?Q=6h~sx8(M1)(Dxk6jTZOJ`SHC|%uAt)0fl zIyS3b;SAl{kjfNpZA7$crB2qYzIACPQAq7|fV*Ykf(`dxFrLWeQ<;(T)6RY;w_+@v zuB!TAS4H$kyDOr<*tI5-9UF5pg+L}-2o#*$SPFSK$qhY)95e^gDc}<65^CM*_-HC0 z7%GYmWiy3DDw7W+GJ%PVRT9Yil&p!R)6NK#4UHypi6QU>ni}&<>sA~5U}9)bKAp&q z2Aup*V%!O&GDbxd?1|| zbWniAm{ZppgLNaw*A&ayKjb*ce4sGu1agVYh!e;T2XfAM&dI|kiNQ2&&?0$K3I||R zWB$B0?eAzVm(5L1HY761O_P%g6Zy#G`3>|X{quJyHAtY(%0JMxv zXkQ%!d&b#!6=>PP-OfzvLj=x;iUYAXf!C`;@!nLfFaa2jTeOeT z+hF>>(Nx+|+lfjQMiu z5ryXR%i_3@@mu7db3gBX4^Q(K<9}o6s)yY7R(-ZAp#I*CsDG?_r7Ehns9yDZ)!%iW zcAs%KRbQo?>Rsyms-L_2t3OozO!c4F++6#7?E|x}#b-lY_weldX20y-I43ptCHDpQ zKin7H0o7cyOO30wHLuppojp?hsoHm{gL4Pf^D3u)=Kj?Ek(-#+QIl8CyJyx;sGqo} z&EBhi>`tiX+*{}VySseO@64)I|K`q7b$Dm`Tr~^ux99$H?zwg0x_@%N?S997(tW~B z);;V#;y&vBo%=QSU3Fh}zv6zP?%}$Tn*VfXtN(I;;cl#c)xB0-3;TZMK3(??<>IaO zuedL}|KpxG=jPgfR=;%rxb`XalKZVWKT!Yew%7i*`;uD+Y*W1pp3CZ=uYDCy`Hruu zn)QnN*7}#-=he^gWt+3AexX)Wy`+wZUhPU5E^JmUDxx;3FwhsPHEK1|^YJyz<@k!& zVtg{^QXF$T3*TT{fY0EZtHtZ_^)(i+MpeU+{G-68BH!#{N}1z|a6QglJ-%y9oOk2b z>`yJho`&PrBJKqx3hoB8?Qp2p-jtF1kld(L6L{j)mwFqaZsK=|*NEr=0R;ovH zGL2)uLgPdSsb(vO$&&$DDEJmdQIDjO2c<=qp$h&+613#|iV(F}PJs`rJAva)DqMNm zvzpr%EkZqHO>9)%`2Op-j^CrUsy=+t%Wk(9!A1C9>)H5B5$opZ_-MwNs9|T|Q%%3C z=AjYPp#Gjy7EZ>;m`=i13F}b9Yf;B%9!|gqJ&uQLgE~zGjv*X}!p~I;@v)@@zM6TZ z+J&$44XC%M%XJI981cnwEy6_=!bY^^0GZZ~?YL#P9jh!25sSCL8?*=p4t>S~-3 z28Bw0NJA16!>t!}=??T4TLG^Jy+-pG8FI{GgqWchP+UU><83m`m-{T}5Prt8_3NZx zF&GRXFGldRjC((1g(@=ZfRpc-?m=q4Xey8wBU+d*_dU?DN2Rrdk@1$ua0|b+SMXvX zHSNJ}g3uUGPZRUyzFTXclnK-!+iPp0muKPYuEK>sMQROxO~ONMqTT4F%wUn9b;))4 zZDpg$SmKqDGi1-qRr)*}M7#sLccT{W=3MR6oWeo;@9TWG3!-R)Hz&&}nyAMFp-Ekq zmOu>d8Fd}A81@ND?bnvkx*BK@D&q@)Devvh0d@uU(k%#Ce zR$>n#aFdq6F$6hQX`DA&?L8=Jpgc8rH_2ladKmwv`}lm&$kLUH4{%&7^)1)rb1^5o+-GwWx{U#dM&mS3f-fLLbY zN*q(+tgI@#YD^_dy4O<%HaaCWSf+Mcp;{{hp}$8b??z0Ca{0FcYuXA~-^*x**3Xo` z)E76E|h3PDvEnOvkx>y4J^Zxb&=JkxMdF@Ix+ zXr)bEMauhCd9Zd%3Gul^e1o<;SR2d7Nu3}rQBC+ldebok%E~Tz%(UG6nzKJ_!7XlS zu=W%3QvHdnADg$Vj&k{_T4n?V z;w~E@x#pObxe1?{E)DIPxgB>D0;wY8#dxnQ_Fx)i!;|o5S>_-WbkG{r($ciOp3{bjx&%pF-^ZnU4n^?Mc7v& za5AYhY`_I%K5oThdRlxHrk1>+fXR^qpqGb>F?n7ZPMBdSu9_i#Df{|T1deOa?Oa!! zuH$o=gBpHU5%XcisqQ!?rVk;$L*0f@qb7?~PVY%Qs8zQ^QYNkOW|HDW_iaZo)wE+CbO^tZ!5esi&*4EE zgYXOF#TXmJ^3$P1s8&WE^qzqSb$-ZVIML0VXc_l2phKvP&jF^=L^uB32TJL7jqUXQ`B;6^fi6P6 z3$+~!kuKCFa9u)O`gmc58;)BvpYR)*t_suP?=Nbjja|@J8YG_^iuqW5(}5@}yY;|y z%4>M!+?XS#;R-=?o7l@?a5G6O$xo-OUY>?BZ#Cd=Af>@?RVj5k$3{Z~ygVKLQl8R@ zZljN>cf#MmhQ3DE8G~hNDBe`Kych$Mvc~sFqSUh2K0db6TAk(cOLPfja!jlw?7Ciz zvEI-PRX7FPROX4w)3R3Au}xGP8;*6Nn^V)&Au%ETyRbA6&y8H2KC0kNTxp`)&}{0} zZn2g9b2Kd886yXKckYmp<2^=Ep*+vqa+ z@z_#@)0?Ls7HP4;*kx^Ohc!n3b`5P;41yELi!r=R+rh`(1flh7S(zp_7~;Gb!JD`r z8qBn^NDF0$*0ckEY7)qG1@dC>z7}waz5M%=@OU|PYArhzgXk5=i=lP0(|0?eN2pe2 zP|FVDk6Hp@otB2Y7;81{7=#X?TA5L;WmGW;w?JNuu@URWz%vRRLbWn`w5&`w3pZiB zOIc4v3r1qv%6$)X2vs;qO=~S_{Pj*CVhCBxejIV9t)ut@7yqOuRN>qYTxsy;?uW%f zo3o+b1nsUXvEZ1e*}O2h(u%v-MHyow`S*iX9*m~xrZ=nd;I-~1AKhv-JWMU@ozyn4 zSHJ5TEK{p(`p~Z{KmDA3eNN+-UtiPfrvVe)T(a?I-s&;stnlA$Zq+(IOUJ*NsLGR# z4wF| zHPt4KpbAST{M#HQ6nVBWb?j|Seob;zNkb*R-{RgV59sPte)*Y?2Vghh@fYKAYAI$u zc;YAlA7gp9PE2?4xcmX({0ggM47XQ@V;`yLE z8xJjARa-R+Fb)v$pk{XU92aj+P*rXy5D0`qYqCR$v2@ZIUmn=&VC{D{gXPGf6%APX zy$E}1S!hRNqA?NL6ba6=8;EWBccWC76cILiUBI|EutT)vcLmnxvlF=? zN4q7zvA$F1f>q}^XWiOB7Z%AEOyRU2oc*anQ**Jnby4Kp)R)R&b$5Pgpf?XS+1$QF zE*X$@?&rfx`GSK2V0F1&{=Snd-}QNb|3>qRn>BY`^ZKE& zQx;L~ag4Y>@)h3Zz5=jrI6C?R>RaGA)7e}(0;S>~A z^=RQ1eGTa4GD$8 zbXaw2(_(x>L|FBQU`rzo)~pUIN0*>czo!6sy-!<$BQ*4|nqW>#+VC!b%)}Tn+6hY{ zQ52*N9t$62@wIqU8=3=OB>&S=wPDo68 zXB^gt-ROF^iQLEpU%3&9KxxmC)}k~jQ0U(H(vEClU^qLG zNk&>h?uCtc>7*iIy6lScqM0O>vwMiNP^K@~lG>Z%#b99YzyMy~kc~tkx@|>I0WZ`T z$f7eEPG|Q;wvc)I3Mw2-XNUGU$$?Zh5(8`him-ld#gUR+2F@MpdeK`9qnacK&~hel zV)i-%(tabCYk#+HE;gd)(1<>W2DAw`)KB1*3%cS3-+I~yZXaBD=PTd)=_8-(|G-Zl z$6FOx#e$R1JbU}%?2FYe4e#B0_oZ*W4+6S<1rOhO&kN@^r*3&@$#drtlSHx9h}zS}{ON)mkA zH4m>l^`Z|ozOA*brgiy;@Un*{Qyqi5e>_*MNQ~|NWGeA*|9a_;J)oJo60CpfsYgei z>wfUATh_=vW$WqgX5rF4%th;{56tKK8Y~;8T}=dcn&dL2-4p4?g+h%=^B2Psj6ThMum! zTJ`@mM5KNOfAUaGJbiZ8tkJ4@^H2Wr`%VW%dY$0$KlqnFoWJfJ8y`Dm%Z=xbHJyVu zgdC~G!L@@Atp4PUdp`5ni6{5}^H=J>2;z|@8O*JEqm*@X7^0I{VWb>hJ5$zi{n+2R{He>E0~(t*UQ7 zcjr^jo_*jy3NN?D4t)zkrkf1je)SFC$$tK8U5`9)$31<2bl(VQrjZ6;dj4PLpY_qN z{Qdn8Kk(>@w=}PV@$9aGcU`jl_?w>yWzW9w@_F5_uD=B`rlkiLef*nWI{et-kKKLh zd98`rho6M)#qKuv(`73I-@h@^^_BbQo&CcXe}Q5ZyXN51O|6gL|K%@y>gykQ;*Z=@ zmg7Aq4V{C#gMFX*)%lM;`<7?=>b~&l-ofN!K%?yi7ksIE$9b2oYrW_4_n)@z>F=Ws zv7D<`2LC+1GyIV~yH8*Lr)~8cuc_Wgey0$8=)ql!zIps9w}1PDB^Upo{qx@i8ds*^ z=eAz*y$hc@d}H+8^AA6H-RTPNm$AKN@cM6@I_v8X{POOn9)I}7=#rJ6#R)pnc?bXO zVEZTbPJD0Hn)_dD3%>BPo8SP`)dx>#*!}&FUUTU{@1@V&as9f7#!yOqW^=(WhSxNH z=d<|-Z$9|)FP*Lj?+-;f@q(qA~#j#FLpH9OktkeP1=U zkMe%-hgV3t=#YhlMF4^!sH{T#6+t{eQ28_78z>vDmqb=4A0LpITRrhVXurbkEhFI& zd1d>$)Q1N%IUF?Fc~jzHO@%x;i5NcWLB7^f4p;bY%M!6fSB0CF^b44Rt+>J)1#G*mQB4Q8}UTP;Gs7T?L z9j=crq^$m-_d-7;H!9$HSMrwce8-%AaDSW&FE*-#OA)(iqNYlOTp$vWys>|T1KT-J5 z0~YF!ZMz4M%^P;ed^D&+T>ue|ScIUQp@U^5@7fUs>D;+m21|G#ei!TGt6c#$apg{# z&t_CH@4C{g>%VcnGYazgr#oe^mfyzj8ol-N*tMR^cFBBR7}k}JG-=dbJZ)DLJjZKy z$zU6A#_v{sepiLpZq%XOq&3sshHd_C^;muJ?p}Zn(fs|IfW%n2xzMa$6}~qPg=lPrf8<6n9Fo;VWt!OmbZ0>Y6ZYx77G! z`$mnD7P$6P7g~%01clnTI9$Fj3T4WDiTFLXFA%?7`}Fv&uG7K={e!wF2B-P0dcmD0 z+lY*F;J~ld+rV4;TlHHR{6q8|0hxY>Sjpf&^fz8Q593?WIBj5BZVv>7herAUK__b* z?`!bXUvHQg30JvwS0r@kqr19kJ9&OljYQ)Ykr)wu_oZNF)sFg(yw=8(kE_Rxe_4U2 zo$7Kteve(I?V9*iix1@trPU_HV#G*9Bq9l6#gBa*$VXneh`QZZ+I+|!Ed!+>>64#y zqfi3v;jLfy!KeJ>)d#SbAG;>U=$*e-i#?b2X!+(|H~v)*t`G0)DM8-JJQ?@+#*JUg z^Wtyx7QjB2(P5!X$D1RyWj&zVX|8me8)}KeSr$4Si4ZHGQL?UVo&|n!yXa`EDS* zsPDdO4Ip^W&w+4&+uv)3G@krZBJa5Gpm+Mkiy`TM{}yPt^MeZPQ;pxv`u+#W4CeCW zM}FayH$ z<(-0U>P+(Y(3vc*-7MF?`g^7=)Co%~e2&%$e=CT@N@WH9gHJZ&q6lsUiBMV5u&;T^YP{b1m8}VQ?L=R?@QB}ma z;#}A|-c+XlOU6++i)vpv?nvu?q7u?}EJ~^K+24H>0N@ZEnqHn0z$SwBAzxhj)kS-$dH% zSe#(dIh0}X!LSZ*i&h_yxxX~PHuq(xq0fi%xI=Wy0dF#ct1l=iDYWBpOSBtW#^XGZ zl>1=A$aMhb;;L+E7i0@O@=5;q;H7@4mI z!bRrOiF2c)hti&op1&c;C%UXV4Yfgl*IAv&Rp5wqqE>-PS|@&2K(+DysYWGQ|9k|! zb)=3RhQ<(3GExnrjt0M}P+}c3f)YM()WgznZN-uMe=O$o1BS?Lgw~AfmI7=p~|SHY86f!)5_u9D;_YD2+#ub&`>4v51cbf88L7Ec1cs#*wU2 zo03U#q6pg&h)W1cQaS)N2)g&l^xA=X4c630vLo@`kw-H?eZ!q-Z~^zK0Znq0&LDDh zBmTaYc~grc$d0*mKT16f8FL^2baIr@biENY-B<*T8G|5yXjLi@B?z)Za?&%GOCh71 zM6yALr5B=jfM>2xF&K!~6GH~1W19j&?^3)(qG>=HI6y?lK(K8VHfc`Zi{KcDd5X+a zSZGLcl`hM2L;->>M+%`7z7EkC1G4dw3gwm)Lh42y8G(O;kcs;-kQq)pe1@4CE!IHb zjfo$PG!?oo>9C_f*@>mG_!6Ey*};~aqI1ti?2d&nel2X2=!k_#}PK3qLVM;nwqTrh; zS#%E5$rNkj!9OVhRi*cc`8W~Cr$|cvJ0VTJNwfvh6iVrsCSULVA$sHC5S$ab`5?;) zz!B|{Z621f$Rqd3J2FLK7=^syp&5ZZ(xGTedJj#HR^z6Yct8H@#RTy1?nM!KYwi)5 z{#*nnfXwCNVRvwgP$Jvs1hT0IIZ3s-qlXPV0lL}X-%_p`N*2(G*deTwjE@Oz5(F9_ zS=5{MOuIN{lo*_oA&hR6m=w5&RpcU&W4EQIs$vnu;1S+pqOL4L)jHvv3OcN6Q}JBy z5QbD7s7@rNK^j(#X%KIGVo~&I&$}V$Ov8I1&G_{3OgEZTri0(Cb`%Ucgze1;+Ee2Y zv_wWnv8FZnZ*9?%j&G`q!g4X-pGHL3Vu*6@L`5M|F(4iWh+ zfhZjrq`gDlP?5Z#>uwWbF~SBxM-k0LIzS4r9gNt3Acy1#D*u=M_(MKo&;ad3Dw2UU z*fw_{8|gs@gzHiebe|@HKc5XYxJ*};f@;p6#hWHhGc=DgrI$3=U|Uoz!}Pc)8kW)X zL!4V?7W1Leb6pNm;s3AbiLJ{a89nY=4t+Gn3e2{PB1Q?3f09_WN@HR*EAbWGA#R%} z>y;pP?7%sY@1_LA+zb}0SAwtcMm$^)w#O`RN4XeR7ADvoc zMP{yPuzVJT6+SN;wu7+8M`KtWrW5Y&w*B~us6%xM9{uF8M7SeN0qoxo)%en@=8&8M z7xC(piyD7sV|aW6#>!z4{;k2&5NgSm+2X@*w*!kNXB-&%WVq$Plyc}b#7tq6GL5jd^ zO?gP9Z$PLbMDdg&x0@D~|&oFOG z-G=L_fo#>@c~hDD+m9|XueYA*V51)%`G{576vQ)+&vP%a6rZ~DEY#<21)Ed;A!qUj zfp=NP&N^FWKQGaXt=(~EBb#6M)qG~@TAIb?ulV>dbH5}HW>peie(L4wHn- z1~zWwI&Fz>lpVD_#r}lIzgwwZIP$p<{+2rPZS)~sy}Cf7 zC^~$6hHXvM@{m#Cp@q2yf1Jxgb$*c|Mwedw_fHP2o3Q)Q$463+O!q}wX{G2wuHyW% zA9@Qjj()fxciSu9J~|smlJ!NU>PkhpjtG~UrY+goI`D0b0#qBKY7Mrij)nG``YsI1R znjK?)@C%!Lxl@Cp7;Rypwn*{rof#cbkZZA6(LeLH{mP`C^a0>ly~A_gZ$GGTe>k@H+IuCv zY81^^m*kbME>J93ays?dX>NyR1{HlWZQ{FM=rDVdSFch0loHw|W}Pn4w6%^rzx}8d z*=g%b6ivF53+GOqJ1sKdZtLGWU&Fwl&!u6ZigV&lZSK7Fd0j`nj{i}ArneDU2EdDYDKzX0Qku%7?` delta 7536 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 XK{=B-t0qoJnP6iR8!fyxGv)sSq$P!> diff --git a/build/boot-c-parts-windows.sh b/build/boot-c-parts-windows.sh index 0d4608d5..3e2ca3dc 100755 --- a/build/boot-c-parts-windows.sh +++ b/build/boot-c-parts-windows.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: boot-c-parts-windows.sh 9527 2010-01-14 14:45:42Z xclerc $ +# $Id$ cd `dirname $0`/.. set -ex diff --git a/build/boot-c-parts.sh b/build/boot-c-parts.sh index e62beba2..a38c1641 100755 --- a/build/boot-c-parts.sh +++ b/build/boot-c-parts.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: boot-c-parts.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ cd `dirname $0`/.. set -ex diff --git a/build/boot.sh b/build/boot.sh index a976b65d..7329d20b 100755 --- a/build/boot.sh +++ b/build/boot.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: boot.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ cd `dirname $0`/.. set -ex TAGLINE='true: -use_stdlib' diff --git a/build/buildbot b/build/buildbot index f337e3f6..82cc26b1 100755 --- a/build/buildbot +++ b/build/buildbot @@ -26,7 +26,7 @@ bad() { } finish_if_bad() { - if [ -f buildbot.failed ]; then + if [ -f buildbot.failed ]; then finish exit 2 fi diff --git a/build/camlp4-bootstrap.sh b/build/camlp4-bootstrap.sh index 1b621863..d5b448b1 100755 --- a/build/camlp4-bootstrap.sh +++ b/build/camlp4-bootstrap.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: camlp4-bootstrap.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ set -e cd `dirname $0`/.. diff --git a/build/camlp4-byte-only.sh b/build/camlp4-byte-only.sh index 4154b53c..ab98ef50 100755 --- a/build/camlp4-byte-only.sh +++ b/build/camlp4-byte-only.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: camlp4-byte-only.sh 9099 2008-10-23 15:29:11Z ertai $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/camlp4-native-only.sh b/build/camlp4-native-only.sh index da19bf15..d9bdbd1d 100755 --- a/build/camlp4-native-only.sh +++ b/build/camlp4-native-only.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: camlp4-native-only.sh 9099 2008-10-23 15:29:11Z ertai $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/camlp4-targets.sh b/build/camlp4-targets.sh index 8c2eb319..7c68906a 100644 --- a/build/camlp4-targets.sh +++ b/build/camlp4-targets.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: camlp4-targets.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ CAMLP4_COMMON="\ camlp4/Camlp4/Camlp4Ast.partial.ml \ camlp4/boot/camlp4boot.byte" diff --git a/build/distclean.sh b/build/distclean.sh index 79284769..b3efb3ab 100755 --- a/build/distclean.sh +++ b/build/distclean.sh @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: distclean.sh 9099 2008-10-23 15:29:11Z ertai $ +# $Id$ cd `dirname $0`/.. set -ex diff --git a/build/fastworld.sh b/build/fastworld.sh index 977fbcd0..5c08e1aa 100755 --- a/build/fastworld.sh +++ b/build/fastworld.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: fastworld.sh 9283 2009-06-02 09:37:47Z doligez $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + cd `dirname $0` set -e if [ -e ocamlbuild_mixed_mode ]; then diff --git a/build/install.sh b/build/install.sh index 73cd4915..2197069c 100755 --- a/build/install.sh +++ b/build/install.sh @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: install.sh 9530 2010-01-15 13:33:23Z xclerc $ +# $Id$ set -e diff --git a/build/mkconfig.sh b/build/mkconfig.sh index 0d20911f..0eb69303 100755 --- a/build/mkconfig.sh +++ b/build/mkconfig.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: mkconfig.sh 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ cd `dirname $0`/.. @@ -8,5 +8,3 @@ sed -e 's/^\(.*\$([0-9]).*\)$/# \1/' \ -e 's/^FLEX.*$//g' \ -e 's/^\([^#=]*\)=\([^"]*\)$/if [ "x$\1" = "x" ]; then \1="\2"; fi/' \ config/Makefile > config/config.sh - - diff --git a/build/mkmyocamlbuild_config.sh b/build/mkmyocamlbuild_config.sh index dcd81731..9c7eebd3 100755 --- a/build/mkmyocamlbuild_config.sh +++ b/build/mkmyocamlbuild_config.sh @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: mkmyocamlbuild_config.sh 9520 2010-01-11 14:34:40Z doligez $ +# $Id$ cd `dirname $0`/.. diff --git a/build/mkruntimedef.sh b/build/mkruntimedef.sh index b7e7325b..54f7cc5c 100755 --- a/build/mkruntimedef.sh +++ b/build/mkruntimedef.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: mkruntimedef.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ echo 'let builtin_exceptions = [|'; \ sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$| \1;|p' byterun/fail.h | \ sed -e '$s/;$//'; \ diff --git a/build/myocamlbuild.sh b/build/myocamlbuild.sh index 728ba62d..4333542f 100755 --- a/build/myocamlbuild.sh +++ b/build/myocamlbuild.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: myocamlbuild.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ cd `dirname $0`/.. set -xe if [ ! -x _build/ocamlbuild/ocamlbuildlight.byte ]; then @@ -7,9 +7,9 @@ if [ ! -x _build/ocamlbuild/ocamlbuildlight.byte ]; then (cd ocamlbuild && make) fi mkdir -p _build/ocamlbuild - for i in "light.cmo" "light.byte" "lightlib.cma" "_plugin.cmi" "_pack.cmi" + for i in "light.cmo" "light.byte" "lightlib.cma" "_plugin.cmi" "_pack.cmi" do - cp ocamlbuild/_build/ocamlbuild$i _build/ocamlbuild + cp ocamlbuild/_build/ocamlbuild$i _build/ocamlbuild done fi rm -f ocamlbuild/myocamlbuild_config.ml ocamlbuild/myocamlbuild_config.mli diff --git a/build/ocamlbuild-byte-only.sh b/build/ocamlbuild-byte-only.sh index b2c7607d..17f7b87a 100755 --- a/build/ocamlbuild-byte-only.sh +++ b/build/ocamlbuild-byte-only.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: ocamlbuild-byte-only.sh 9099 2008-10-23 15:29:11Z ertai $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/ocamlbuild-native-only.sh b/build/ocamlbuild-native-only.sh index 907cdd23..ce964127 100755 --- a/build/ocamlbuild-native-only.sh +++ b/build/ocamlbuild-native-only.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: ocamlbuild-native-only.sh 9099 2008-10-23 15:29:11Z ertai $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/ocamlbuildlib-native-only.sh b/build/ocamlbuildlib-native-only.sh index 4517c80b..a7a570a9 100755 --- a/build/ocamlbuildlib-native-only.sh +++ b/build/ocamlbuildlib-native-only.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: ocamlbuildlib-native-only.sh 9099 2008-10-23 15:29:11Z ertai $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/otherlibs-targets.sh b/build/otherlibs-targets.sh index 69d96c65..19980424 100644 --- a/build/otherlibs-targets.sh +++ b/build/otherlibs-targets.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: otherlibs-targets.sh 9281 2009-05-26 12:50:41Z ertai $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + OTHERLIBS_BYTE="" OTHERLIBS_NATIVE="" OTHERLIBS_UNIX_NATIVE="" diff --git a/build/partial-install.sh b/build/partial-install.sh index 40b34b57..61997628 100755 --- a/build/partial-install.sh +++ b/build/partial-install.sh @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: partial-install.sh 8768 2008-01-11 16:13:18Z doligez $ +# $Id$ ###################################### ######### Copied from build/install.sh diff --git a/build/targets.sh b/build/targets.sh index 98bbbadf..09e619b6 100644 --- a/build/targets.sh +++ b/build/targets.sh @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: targets.sh 8768 2008-01-11 16:13:18Z doligez $ +# $Id$ . config/config.sh . build/otherlibs-targets.sh diff --git a/build/world.all.sh b/build/world.all.sh index 1b359da7..d8a18abb 100755 --- a/build/world.all.sh +++ b/build/world.all.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: world.all.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/world.byte.sh b/build/world.byte.sh index d6cffd93..d3e96dc4 100755 --- a/build/world.byte.sh +++ b/build/world.byte.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: world.byte.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/world.native.sh b/build/world.native.sh index 3412cdf1..ac4a1832 100755 --- a/build/world.native.sh +++ b/build/world.native.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: world.native.sh 8416 2007-10-08 14:19:34Z doligez $ +# $Id$ set -e cd `dirname $0`/.. . build/targets.sh diff --git a/build/world.sh b/build/world.sh index dd73e32d..bbe1632a 100755 --- a/build/world.sh +++ b/build/world.sh @@ -1,5 +1,20 @@ #!/bin/sh -# $Id: world.sh 9283 2009-06-02 09:37:47Z doligez $ + +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2008 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$ + cd `dirname $0` set -e if [ -e ocamlbuild_mixed_mode ]; then diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index 625a0f61..09c254d4 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytegen.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* bytegen.ml : translation of lambda terms to lists of instructions. *) diff --git a/bytecomp/bytegen.mli b/bytecomp/bytegen.mli index 29407c3f..04265fde 100644 --- a/bytecomp/bytegen.mli +++ b/bytecomp/bytegen.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytegen.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Generation of bytecode from lambda terms *) diff --git a/bytecomp/bytelibrarian.ml b/bytecomp/bytelibrarian.ml index 10391fc1..ba08fc01 100644 --- a/bytecomp/bytelibrarian.ml +++ b/bytecomp/bytelibrarian.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytelibrarian.ml 7422 2006-05-11 15:50:53Z xleroy $ *) +(* $Id$ *) (* Build libraries of .cmo files *) @@ -37,7 +37,7 @@ let copy_compunit ic oc compunit = end (* Add C objects and options and "custom" info from a library descriptor *) - + let lib_sharedobjs = ref [] let lib_ccobjs = ref [] let lib_ccopts = ref [] @@ -119,4 +119,3 @@ let report_error ppf = function fprintf ppf "Cannot find file %s" name | Not_an_object_file name -> fprintf ppf "The file %s is not a bytecode object file" name - diff --git a/bytecomp/bytelibrarian.mli b/bytecomp/bytelibrarian.mli index 2c706976..a4f9cc2f 100644 --- a/bytecomp/bytelibrarian.mli +++ b/bytecomp/bytelibrarian.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytelibrarian.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) (* Build libraries of .cmo files *) diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 704edf43..ede7bb97 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytelink.ml 9496 2009-12-28 13:05:36Z doligez $ *) +(* $Id$ *) (* Link a set of .cmo files and produce a bytecode executable. *) @@ -58,7 +58,7 @@ let add_ccobjs l = end (* A note on ccobj ordering: - - Clflags.ccobjs is in reverse order w.r.t. what was given on the + - Clflags.ccobjs is in reverse order w.r.t. what was given on the ocamlc command line; - l.lib_ccobjs is also in reverse order w.r.t. what was given on the ocamlc -a command line when the library was created; diff --git a/bytecomp/bytelink.mli b/bytecomp/bytelink.mli index 99befe1b..2e8f0cb3 100644 --- a/bytecomp/bytelink.mli +++ b/bytecomp/bytelink.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytelink.mli 7422 2006-05-11 15:50:53Z xleroy $ *) +(* $Id$ *) (* Link .cmo files and produce a bytecode executable. *) diff --git a/bytecomp/bytepackager.ml b/bytecomp/bytepackager.ml index dc53e4df..31eff07f 100644 --- a/bytecomp/bytepackager.ml +++ b/bytecomp/bytepackager.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytepackager.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* "Package" a set of .cmo files into one .cmo file having the original compilation units as sub-modules. *) diff --git a/bytecomp/bytepackager.mli b/bytecomp/bytepackager.mli index de5c0862..836eb9c6 100644 --- a/bytecomp/bytepackager.mli +++ b/bytecomp/bytepackager.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytepackager.mli 4367 2002-02-08 16:55:44Z xleroy $ *) +(* $Id$ *) (* "Package" a set of .cmo files into one .cmo file having the original compilation units as sub-modules. *) diff --git a/bytecomp/bytesections.ml b/bytecomp/bytesections.ml index 407aeec8..16eaf237 100644 --- a/bytecomp/bytesections.ml +++ b/bytecomp/bytesections.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytesections.ml 6130 2004-02-22 15:07:51Z xleroy $ *) +(* $Id$ *) (* Handling of sections in bytecode executable files *) diff --git a/bytecomp/bytesections.mli b/bytecomp/bytesections.mli index a58ea59c..5292cc1b 100644 --- a/bytecomp/bytesections.mli +++ b/bytecomp/bytesections.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytesections.mli 6130 2004-02-22 15:07:51Z xleroy $ *) +(* $Id$ *) (* Handling of sections in bytecode executable files *) diff --git a/bytecomp/cmo_format.mli b/bytecomp/cmo_format.mli index 6d78f11e..c87e6df4 100644 --- a/bytecomp/cmo_format.mli +++ b/bytecomp/cmo_format.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cmo_format.mli 7422 2006-05-11 15:50:53Z xleroy $ *) +(* $Id$ *) (* Symbol table information for .cmo and .cma files *) @@ -58,4 +58,3 @@ type library = ... object code for last library member library descriptor *) - diff --git a/bytecomp/dll.ml b/bytecomp/dll.ml index 57e18232..bcf66b42 100644 --- a/bytecomp/dll.ml +++ b/bytecomp/dll.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dll.ml 9249 2009-05-01 01:46:50Z garrigue $ *) +(* $Id$ *) (* Handling of dynamically-linked libraries *) @@ -172,4 +172,3 @@ let init_toplevel dllpath = opened_dlls := Array.to_list (get_current_dlls()); names_of_opened_dlls := []; linking_in_core := true - diff --git a/bytecomp/dll.mli b/bytecomp/dll.mli index 1af28c40..fea455f7 100644 --- a/bytecomp/dll.mli +++ b/bytecomp/dll.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dll.mli 7656 2006-09-28 21:36:38Z xleroy $ *) +(* $Id$ *) (* Handling of dynamically-linked libraries *) @@ -58,4 +58,3 @@ val init_compile: bool -> unit contents of ld.conf file). Take note of the DLLs that were opened when starting the running program. *) val init_toplevel: string -> unit - diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml index 755873d6..2cec99dc 100644 --- a/bytecomp/emitcode.ml +++ b/bytecomp/emitcode.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitcode.ml 8930 2008-07-24 05:35:22Z frisch $ *) +(* $Id$ *) (* Generation of bytecode + relocation information *) @@ -69,7 +69,7 @@ let out_const c = out_int (const_as_int c) with | AsInt -> Misc.fatal_error "Emitcode.const_as_int" - + (* Handling of local labels and backpatching *) diff --git a/bytecomp/emitcode.mli b/bytecomp/emitcode.mli index 6c78f046..fa20de18 100644 --- a/bytecomp/emitcode.mli +++ b/bytecomp/emitcode.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitcode.mli 7422 2006-05-11 15:50:53Z xleroy $ *) +(* $Id$ *) (* Generation of bytecode for .cmo files *) diff --git a/bytecomp/instruct.ml b/bytecomp/instruct.ml index 59c1edba..4f4fa14f 100644 --- a/bytecomp/instruct.ml +++ b/bytecomp/instruct.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: instruct.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) open Lambda diff --git a/bytecomp/instruct.mli b/bytecomp/instruct.mli index 89427c41..6b9367f9 100644 --- a/bytecomp/instruct.mli +++ b/bytecomp/instruct.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: instruct.mli 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* The type of the instructions of the abstract machine *) diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml index 10a7c2a6..ff94a6d9 100644 --- a/bytecomp/lambda.ml +++ b/bytecomp/lambda.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lambda.ml 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) open Misc open Path @@ -423,5 +423,3 @@ and negate_comparison = function | Ceq -> Cneq| Cneq -> Ceq | Clt -> Cge | Cle -> Cgt | Cgt -> Cle | Cge -> Clt - - diff --git a/bytecomp/lambda.mli b/bytecomp/lambda.mli index 68611e02..8c34ac94 100644 --- a/bytecomp/lambda.mli +++ b/bytecomp/lambda.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lambda.mli 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (* The "lambda" intermediate code *) @@ -175,8 +175,6 @@ val const_unit: structured_constant val lambda_unit: lambda val name_lambda: lambda -> (Ident.t -> lambda) -> lambda val name_lambda_list: lambda list -> (lambda list -> lambda) -> lambda -val is_guarded: lambda -> bool -val patch_guarded : lambda -> lambda -> lambda val iter: (lambda -> unit) -> lambda -> unit module IdentSet: Set.S with type elt = Ident.t @@ -205,4 +203,3 @@ val staticfail : lambda (* Anticipated static failure *) (* Check anticipated failure, substitute its final value *) val is_guarded: lambda -> bool val patch_guarded : lambda -> lambda -> lambda - diff --git a/bytecomp/matching.ml b/bytecomp/matching.ml index 478af3b1..21006cc6 100644 --- a/bytecomp/matching.ml +++ b/bytecomp/matching.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: matching.ml 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (* Compilation of pattern matching *) @@ -59,7 +59,7 @@ let pretty_ctx ctx = let le_ctx c1 c2 = le_pats c1.left c2.left && le_pats c1.right c2.right - + let lshift {left=left ; right=right} = match right with | x::xs -> {left=x::left ; right=xs} | _ -> assert false @@ -77,7 +77,7 @@ let rec small_enough n = function let ctx_lshift ctx = if small_enough 31 ctx then List.map lshift ctx - else (* Context pruning *) begin + else (* Context pruning *) begin get_mins le_ctx (List.map lforget ctx) end @@ -94,7 +94,7 @@ let rec nchars n ps = let chars, cdrs = nchars (n-1) rem in p::chars,cdrs | _ -> assert false - + let rshift_num n {left=left ; right=right} = let shifted,left = nchars n left in {left=left ; right = shifted@right} @@ -298,7 +298,7 @@ let rec jumps_extract i = function let rec jumps_remove i = function | [] -> [] | (j,_)::rem when i=j -> rem - | x::rem -> x::jumps_remove i rem + | x::rem -> x::jumps_remove i rem let jumps_empty = [] and jumps_is_empty = function @@ -363,7 +363,7 @@ type pm_or_compiled = or_matrix : matrix ; } type pm_half_compiled = - | PmOr of pm_or_compiled + | PmOr of pm_or_compiled | PmVar of pm_var_compiled | Pm of pattern_matching @@ -507,7 +507,7 @@ exception Var of pattern let simplify_or p = let rec simpl_rec p = match p with | {pat_desc = Tpat_any|Tpat_var _} -> raise (Var p) - | {pat_desc = Tpat_alias (q,id)} -> + | {pat_desc = Tpat_alias (q,id)} -> begin try {p with pat_desc = Tpat_alias (simpl_rec q,id)} with @@ -515,15 +515,15 @@ let simplify_or p = end | {pat_desc = Tpat_or (p1,p2,o)} -> let q1 = simpl_rec p1 in - begin try + begin try let q2 = simpl_rec p2 in {p with pat_desc = Tpat_or (q1, q2, o)} - with + with | Var q2 -> raise (Var {p with pat_desc = Tpat_or (q1, q2, o)}) end | {pat_desc = Tpat_record lbls} -> let all_lbls = all_record_args lbls in - {p with pat_desc=Tpat_record all_lbls} + {p with pat_desc=Tpat_record all_lbls} | _ -> p in try simpl_rec p @@ -577,7 +577,7 @@ let rec what_is_cases cases = match cases with | (({pat_desc=(Tpat_var _|Tpat_or (_,_,_)|Tpat_alias (_,_))}::_),_)::_ -> assert false (* applies to simplified matchings only *) | (p::_,_)::_ -> p -| [] -> omega +| [] -> omega | _ -> assert false @@ -633,7 +633,7 @@ let mk_alpha_env arg aliases ids = match arg with | Some v -> v | _ -> raise Cannot_flatten - else + else Ident.create (Ident.name id)) ids @@ -646,10 +646,10 @@ let rec explode_or_pat arg patl mk_action rem vars aliases = function | {pat_desc = Tpat_alias (p,id)} -> explode_or_pat arg patl mk_action rem vars (id::aliases) p | {pat_desc = Tpat_var x} -> - let env = mk_alpha_env arg (x::aliases) vars in + let env = mk_alpha_env arg (x::aliases) vars in (omega::patl,mk_action (List.map snd env))::rem | p -> - let env = mk_alpha_env arg aliases vars in + let env = mk_alpha_env arg aliases vars in (alpha_pat env p::patl,mk_action (List.map snd env))::rem let pm_free_variables {cases=cases} = @@ -758,7 +758,7 @@ let insert_or_append p ps act ors no = else (* fail to insert or append *) ors,(p::ps,act)::no else if condb act_q ps qs then (* check condition (b) for append *) - attempt (cl::seen) rem + attempt (cl::seen) rem else ors,(p::ps,act)::no else (* p # q, go on with append/insert *) @@ -781,7 +781,7 @@ let rec rebuild_default nexts def = match nexts with | (e, pmh)::rem -> (add_omega_column (rebuild_matrix pmh), e):: rebuild_default rem def - + let rebuild_nexts arg nexts k = List.fold_right (fun (e, pm) k -> (e, PmVar {inside=pm ; var_arg=arg})::k) @@ -840,7 +840,7 @@ let rec split_or argo cls args def = | rem -> let {me=next ; matrix=matrix ; top_default=def},nexts = do_split [] [] [] rem in - let idef = next_raise_count () in + let idef = next_raise_count () in precompile_or argo yes yesor args (cons_default matrix idef def) @@ -869,10 +869,10 @@ and split_constr cls args def k = begin match yes with | [] -> (* Could not success in raising up a constr matching up *) - split_noex [cl] [] rem + split_noex [cl] [] rem | _ -> let {me=next ; matrix=matrix ; top_default=def}, nexts = - split_noex [cl] [] rem in + split_noex [cl] [] rem in let idef = next_raise_count () in let def = cons_default matrix idef def in {me = Pm {cases=yes ; args=args ; default=def} ; @@ -936,7 +936,7 @@ and precompile_var args cls def k = match args with and var_def = make_default (fun _ rem -> rem) def in let {me=first ; matrix=matrix}, nexts = split_or (Some v) var_cls (arg::rargs) var_def in - + (* Compute top information *) match nexts with | [] -> (* If you need *) @@ -962,7 +962,7 @@ and precompile_or argo cls ors args def k = match ors with | _ -> let rec do_cases = function | ({pat_desc=Tpat_or _} as orp::patl, action)::rem -> - let others,rem = get_equiv orp rem in + let others,rem = get_equiv orp rem in let orpm = {cases = (patl, action):: @@ -1033,7 +1033,7 @@ let add make_matching_fun division key patl_action args = cell.pm.cases <- [patl_action] ; (key, cell) :: division - + let divide make get_key get_args ctx pm = let rec divide_rec = function @@ -1068,7 +1068,7 @@ let divide_line make_ctx make get_args pat ctx pm = They may raise NoMatch or OrPat and perform the full matching (selection + arguments). - + - get_args and get_key are for the compiled matrices, note that selection and geting arguments are separed. @@ -1103,7 +1103,7 @@ let make_constant_matching p def ctx = function let def = make_default (matcher_const (get_key_constant "make" p)) def - and ctx = + and ctx = filter_ctx p ctx in {pm = {cases = []; args = argl ; default = def} ; ctx = ctx ; @@ -1222,7 +1222,7 @@ let rec matcher_variant_const lab p rem = match p.pat_desc with | Tpat_any -> rem | _ -> raise NoMatch - + let make_variant_matching_constant p lab def ctx = function [] -> fatal_error "Matching.make_variant_matching_constant" | ((arg, mut) :: argl) -> @@ -1269,7 +1269,7 @@ let divide_variant row ctx {cases = cl; args = al; default=def} = match pato with None -> add (make_variant_matching_constant p lab def ctx) variants - (Cstr_constant tag) (patl, action) al + (Cstr_constant tag) (patl, action) al | Some pat -> add (make_variant_matching_nonconst p lab def ctx) variants (Cstr_block tag) (pat :: patl, action) al @@ -1378,7 +1378,7 @@ let inline_lazy_force_switch arg loc = Lprim(Pisint, [varg]), varg, (Lswitch (varg, - { sw_numconsts = 0; sw_consts = []; + { sw_numconsts = 0; sw_consts = []; sw_numblocks = (max Obj.lazy_tag Obj.forward_tag) + 1; sw_blocks = [ (Obj.forward_tag, Lprim(Pfield 0, [varg])); @@ -1423,7 +1423,7 @@ let matcher_tuple arity p rem = match p.pat_desc with | Tpat_or (_,_,_) -> raise OrPat | Tpat_var _ -> get_args_tuple arity omega rem | _ -> get_args_tuple arity p rem - + let make_tuple_matching arity def = function [] -> fatal_error "Matching.make_tuple_matching" | (arg, mut) :: argl -> @@ -1525,7 +1525,7 @@ let divide_array kind ctx pm = divide (make_array_matching kind) get_key_array get_args_array ctx pm - + (* To combine sub-matchings together *) let float_compare s1 s2 = @@ -1641,16 +1641,16 @@ let make_switch_switcher arg cases acts = let l = ref [] in for i = Array.length cases-1 downto 0 do l := (i,acts.(cases.(i))) :: !l - done ; + done ; Lswitch(arg, {sw_numconsts = Array.length cases ; sw_consts = !l ; sw_numblocks = 0 ; sw_blocks = [] ; sw_failaction = None}) - + let full sw = List.length sw.sw_consts = sw.sw_numconsts && List.length sw.sw_blocks = sw.sw_numblocks - + let make_switch (arg,sw) = match sw.sw_failaction with | None -> let t = Hashtbl.create 17 in @@ -1685,7 +1685,7 @@ sw_failaction = Some (Lstaticraise (default,[]))}) else Lswitch (arg,sw) | _ -> Lswitch (arg,sw) - + module SArg = struct type primitive = Lambda.primitive @@ -1730,7 +1730,7 @@ let get_edges low high l = match l with | [] -> low, high | (x,_)::_ -> x, last high l - + let as_interval_canfail fail low high l = let store = mk_store equal_action in let rec nofail_rec cur_low cur_high cur_act = function @@ -1897,12 +1897,12 @@ let mk_res get_key env last_choice idef cant_fail ctx = let klist = List.fold_right (fun pat klist -> (get_key pat,act)::klist) - pats klist + pats klist and ctx = if cant_fail then ctx else ctx_lub pat ctx in klist,jumps_add i ctx jumps) env ([],jumps_fail) in fail, klist, jumps - + (* Following two ``failaction'' function compute n, the trap handler @@ -1923,8 +1923,8 @@ let mk_failaction_neg partial ctx def = match partial with | Total -> None, [], jumps_empty - - + + (* Conforme a l'article et plus simple qu'avant *) and mk_failaction_pos partial seen ctx defs = let rec scan_def env to_test defs = match to_test,defs with @@ -1955,8 +1955,8 @@ and mk_failaction_pos partial seen ctx defs = (complete_pats_constrs seen)) defs - -let combine_constant arg cst partial ctx def + +let combine_constant arg cst partial ctx def (const_lambda_list, total, pats) = let fail, to_add, local_jumps = mk_failaction_neg partial ctx def in @@ -2016,12 +2016,12 @@ let split_cases tag_lambda_list = let const, nonconst = split_rec tag_lambda_list in sort_int_lambda_list const, sort_int_lambda_list nonconst - + let combine_constructor arg ex_pat cstr partial ctx def (tag_lambda_list, total1, pats) = if cstr.cstr_consts < 0 then begin - (* Special cases for exceptions *) + (* Special cases for exceptions *) let fail, to_add, local_jumps = mk_failaction_neg partial ctx def in let tag_lambda_list = to_add@tag_lambda_list in @@ -2159,7 +2159,7 @@ let combine_variant row arg partial ctx def (tag_lambda_list, total1, pats) = in lambda1, jumps_union local_jumps total1 - + let combine_array arg kind partial ctx def (len_lambda_list, total1, pats) = let fail, to_add, local_jumps = mk_failaction_neg partial ctx def in @@ -2208,12 +2208,12 @@ let rec event_branch repr lam = comp_match_handlers (for compililing splitted matches) may reraise Unused - + *) -exception Unused +exception Unused -let compile_list compile_fun division = +let compile_list compile_fun division = let rec c_rec totals = function | [] -> [], jumps_unions totals, [] @@ -2222,7 +2222,7 @@ let compile_list compile_fun division = | [] -> c_rec totals rem | _ -> try - let (lambda1, total1) = compile_fun cell.ctx cell.pm in + let (lambda1, total1) = compile_fun cell.ctx cell.pm in let c_rem, total, new_pats = c_rec (jumps_map ctx_combine total1::totals) rem in @@ -2298,7 +2298,7 @@ let rec lower_bind v arg lam = match lam with and pnot = approx_present v ifnot in begin match pcond, pso, pnot with | false, false, false -> lam - | false, true, false -> + | false, true, false -> Lifthenelse (cond, lower_bind v arg ifso, ifnot) | false, false, true -> Lifthenelse (cond, ifso, lower_bind v arg ifnot) @@ -2315,19 +2315,19 @@ let rec lower_bind v arg lam = match lam with bind Alias v arg lam else Llet (Alias, vv, lv, lower_bind v arg l) -| _ -> +| _ -> bind Alias v arg lam let bind_check str v arg lam = match str,arg with | _, Lvar _ ->bind str v arg lam -| Alias,_ -> lower_bind v arg lam +| Alias,_ -> lower_bind v arg lam | _,_ -> bind str v arg lam let rec comp_exit ctx m = match m.default with | (_,i)::_ -> Lstaticraise (i,[]), jumps_singleton i ctx | _ -> fatal_error "Matching.comp_exit" - + let rec comp_match_handlers comp_fun partial ctx arg first_match next_matchs = match next_matchs with | [] -> comp_fun partial ctx arg first_match @@ -2336,7 +2336,7 @@ let rec comp_match_handlers comp_fun partial ctx arg first_match next_matchs = m | [] -> body, total_body (* Hum, -1 meant never taken | (-1,pm)::rem -> c_rec body total_body rem *) - | (i,pm)::rem -> + | (i,pm)::rem -> let ctx_i,total_rem = jumps_extract i total_body in begin match ctx_i with | [] -> c_rec body total_body rem @@ -2424,7 +2424,7 @@ and do_compile_matching_pr repr partial ctx arg x = pretty_ctx ctx ; let (_, jumps) as r = do_compile_matching repr partial ctx arg x in prerr_endline "JUMPS" ; - pretty_jumps jumps ; + pretty_jumps jumps ; r *) and do_compile_matching repr partial ctx arg pmh = match pmh with @@ -2432,7 +2432,7 @@ and do_compile_matching repr partial ctx arg pmh = match pmh with let pat = what_is_cases pm.cases in begin match pat.pat_desc with | Tpat_any -> - compile_no_test + compile_no_test divide_var ctx_rshift repr partial ctx pm | Tpat_tuple patl -> compile_no_test @@ -2453,7 +2453,7 @@ and do_compile_matching repr partial ctx arg pmh = match pmh with (compile_match repr partial) partial divide_constructor (combine_constructor arg pat cstr partial) ctx pm - | Tpat_array _ -> + | Tpat_array _ -> let kind = Typeopt.array_pattern_kind pat in compile_test (compile_match repr partial) partial (divide_array kind) (combine_array arg kind partial) @@ -2499,7 +2499,7 @@ let check_partial pat_act_list partial = (fun (_,lam) -> is_guarded lam) pat_act_list then begin - Partial + Partial end else partial @@ -2590,7 +2590,7 @@ let for_tupled_function loc paraml pats_act_list partial = let flatten_pattern size p = match p.pat_desc with | Tpat_tuple args -> args -| Tpat_any -> omegas size +| Tpat_any -> omegas size | _ -> raise Cannot_flatten let rec flatten_pat_line size p k = match p.pat_desc with @@ -2650,7 +2650,7 @@ let compile_flattened repr partial ctx _ pmh = match pmh with compile_orhandlers (compile_match repr partial) lam total ctx hs | PmVar _ -> assert false -let for_multiple_match loc paraml pat_act_list partial = +let do_for_multiple_match loc paraml pat_act_list partial = let repr = None in let partial = check_partial pat_act_list partial in let raise_num,pm1 = @@ -2666,7 +2666,7 @@ let for_multiple_match loc paraml pat_act_list partial = { cases = List.map (fun (pat, act) -> ([pat], act)) pat_act_list; args = [Lprim(Pmakeblock(0, Immutable), paraml), Strict] ; default = [] } in - + try try (* Once for checking that compilation is possible *) @@ -2683,7 +2683,7 @@ let for_multiple_match loc paraml pat_act_list partial = nexts in let lam, total = - comp_match_handlers + comp_match_handlers (compile_flattened repr) partial (start_ctx size) () flat_next flat_nexts in List.fold_right2 (bind Strict) idl paraml @@ -2704,3 +2704,27 @@ let for_multiple_match loc paraml pat_act_list partial = end with Unused -> assert false (* ; partial_function loc () *) + +(* #PR4828: Believe it or not, the 'paraml' argument below + may not be side effect free. *) + +let arg_to_var arg cls = match arg with +| Lvar v -> v,arg +| _ -> + let v = name_pattern "match" cls in + v,Lvar v + + +let rec param_to_var param = match param with +| Lvar v -> v,None +| _ -> Ident.create "match",Some param + +let bind_opt (v,eo) k = match eo with +| None -> k +| Some e -> Lambda.bind Strict v e k + +let for_multiple_match loc paraml pat_act_list partial = + let v_paraml = List.map param_to_var paraml in + let paraml = List.map (fun (v,_) -> Lvar v) v_paraml in + List.fold_right bind_opt v_paraml + (do_for_multiple_match loc paraml pat_act_list partial) diff --git a/bytecomp/matching.mli b/bytecomp/matching.mli index 5e258565..ebfed841 100644 --- a/bytecomp/matching.mli +++ b/bytecomp/matching.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: matching.mli 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (* Compilation of pattern-matching *) diff --git a/bytecomp/meta.ml b/bytecomp/meta.ml index 3e2cdeb8..a4beaf42 100644 --- a/bytecomp/meta.ml +++ b/bytecomp/meta.ml @@ -10,17 +10,18 @@ (* *) (***********************************************************************) -(* $Id: meta.ml 6224 2004-04-16 13:46:43Z starynke $ *) +(* $Id$ *) external global_data : unit -> Obj.t array = "caml_get_global_data" external realloc_global_data : int -> unit = "caml_realloc_global" external static_alloc : int -> string = "caml_static_alloc" external static_free : string -> unit = "caml_static_free" external static_resize : string -> int -> string = "caml_static_resize" -external static_release_bytecode : string -> int -> unit = "caml_static_release_bytecode" +external static_release_bytecode : string -> int -> unit + = "caml_static_release_bytecode" type closure = unit -> Obj.t external reify_bytecode : string -> int -> closure = "caml_reify_bytecode" external invoke_traced_function : Obj.t -> Obj.t -> Obj.t -> Obj.t = "caml_invoke_traced_function" external get_section_table : unit -> (string * Obj.t) list - = "caml_get_section_table" + = "caml_get_section_table" diff --git a/bytecomp/meta.mli b/bytecomp/meta.mli index a5bc0119..774c5f13 100644 --- a/bytecomp/meta.mli +++ b/bytecomp/meta.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: meta.mli 6224 2004-04-16 13:46:43Z starynke $ *) +(* $Id$ *) (* To control the runtime system and bytecode interpreter *) @@ -18,11 +18,12 @@ external global_data : unit -> Obj.t array = "caml_get_global_data" external realloc_global_data : int -> unit = "caml_realloc_global" external static_alloc : int -> string = "caml_static_alloc" external static_free : string -> unit = "caml_static_free" -external static_release_bytecode : string -> int -> unit = "caml_static_release_bytecode" +external static_release_bytecode : string -> int -> unit + = "caml_static_release_bytecode" external static_resize : string -> int -> string = "caml_static_resize" type closure = unit -> Obj.t external reify_bytecode : string -> int -> closure = "caml_reify_bytecode" external invoke_traced_function : Obj.t -> Obj.t -> Obj.t -> Obj.t = "caml_invoke_traced_function" external get_section_table : unit -> (string * Obj.t) list - = "caml_get_section_table" + = "caml_get_section_table" diff --git a/bytecomp/printinstr.ml b/bytecomp/printinstr.ml index 1f0a095c..2f0508b2 100644 --- a/bytecomp/printinstr.ml +++ b/bytecomp/printinstr.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printinstr.ml 7031 2005-08-25 15:35:16Z doligez $ *) +(* $Id$ *) (* Pretty-print lists of instructions *) diff --git a/bytecomp/printinstr.mli b/bytecomp/printinstr.mli index 4b1efd69..e88e76ff 100644 --- a/bytecomp/printinstr.mli +++ b/bytecomp/printinstr.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printinstr.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) (* Pretty-print lists of instructions *) diff --git a/bytecomp/printlambda.ml b/bytecomp/printlambda.ml index 0c7fde69..0d6e1914 100644 --- a/bytecomp/printlambda.ml +++ b/bytecomp/printlambda.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printlambda.ml 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) open Format open Asttypes diff --git a/bytecomp/printlambda.mli b/bytecomp/printlambda.mli index 4c0d5681..352d6d02 100644 --- a/bytecomp/printlambda.mli +++ b/bytecomp/printlambda.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printlambda.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) open Lambda diff --git a/bytecomp/runtimedef.mli b/bytecomp/runtimedef.mli index f89d192c..27309f60 100644 --- a/bytecomp/runtimedef.mli +++ b/bytecomp/runtimedef.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: runtimedef.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Values and functions known and/or provided by the runtime system *) diff --git a/bytecomp/simplif.ml b/bytecomp/simplif.ml index 7f087650..6081d5bd 100644 --- a/bytecomp/simplif.ml +++ b/bytecomp/simplif.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: simplif.ml 8850 2008-03-19 10:26:56Z maranget $ *) +(* $Id$ *) (* Elimination of useless Llet(Alias) bindings. Also transform let-bound references into variables. *) @@ -26,7 +26,7 @@ let rec eliminate_ref id = function Lvar v as lam -> if Ident.same v id then raise Real_reference else lam | Lconst cst as lam -> lam - | Lapply(e1, el, loc) -> + | Lapply(e1, el, loc) -> Lapply(eliminate_ref id e1, List.map (eliminate_ref id) el, loc) | Lfunction(kind, params, body) as lam -> if IdentSet.mem id (free_variables lam) @@ -85,7 +85,7 @@ let rec eliminate_ref id = function (* Simplification of exits *) -let simplify_exits lam = +let simplify_exits lam = (* Count occurrences of (exit n ...) statements *) let exits = Hashtbl.create 17 in @@ -101,7 +101,7 @@ let simplify_exits lam = incr (Hashtbl.find exits i) with | Not_found -> Hashtbl.add exits i (ref 1) in - + let rec count = function | (Lvar _| Lconst _) -> () | Lapply(l1, ll, _) -> count l1; List.iter count ll @@ -267,7 +267,7 @@ let simplify_lets lam = !(Hashtbl.find occ v) with Not_found -> 0 - and incr_var v = + and incr_var v = try incr(Hashtbl.find occ v) with Not_found -> @@ -388,7 +388,7 @@ let simplify_lets lam = {sw with sw_consts = new_consts ; sw_blocks = new_blocks; sw_failaction = new_fail}) | Lstaticraise (i,ls) -> - Lstaticraise (i, List.map simplif ls) + Lstaticraise (i, List.map simplif ls) | Lstaticcatch(l1, (i,args), l2) -> Lstaticcatch (simplif l1, (i,args), simplif l2) | Ltrywith(l1, v, l2) -> Ltrywith(simplif l1, v, simplif l2) diff --git a/bytecomp/simplif.mli b/bytecomp/simplif.mli index fd8eab74..5e5217ff 100644 --- a/bytecomp/simplif.mli +++ b/bytecomp/simplif.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: simplif.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Elimination of useless Llet(Alias) bindings *) diff --git a/bytecomp/switch.ml b/bytecomp/switch.ml index ff58af72..4fa7b62b 100644 --- a/bytecomp/switch.ml +++ b/bytecomp/switch.ml @@ -20,7 +20,7 @@ let mk_store same = let r_acts = ref [] in let store act = let rec store_rec i = function - | [] -> i,[act] + | [] -> i,[act] | act0::rem -> if same act0 act then raise (Found i) else @@ -256,7 +256,7 @@ let coupe_inter i j cases = Array.sub cases i (j-i+1), case_append (Array.sub cases 0 i) (Array.sub cases (j+1) (lcases-(j+1))) -type kind = Kvalue of int | Kinter of int | Kempty +type kind = Kvalue of int | Kinter of int | Kempty let pkind chan = function | Kvalue i ->Printf.fprintf chan "V%d" i @@ -281,7 +281,7 @@ let make_key cases = incr count ; r | (act0,index) :: rem -> - if act0 = act then + if act0 = act then index else got_it act rem in @@ -291,7 +291,7 @@ let make_key cases = Kvalue (got_it act !seen) else Kinter (got_it act !seen) in - + let rec make_rec i pl = if i < 0 then [] @@ -303,8 +303,8 @@ let make_key cases = Kempty::make_one l h act::make_rec (i-1) l in let l,h,act = cases.(Array.length cases-1) in - make_one l h act::make_rec (Array.length cases-2) l - + make_one l h act::make_rec (Array.length cases-2) l + let same_act t = let len = Array.length t in @@ -330,7 +330,7 @@ let make_key cases = This condition is checked by zyva *) - + let inter_limit = 1 lsl 16 let ok_inter = ref false @@ -356,7 +356,7 @@ let rec opt_count top cases = divide top cases in Hashtbl.add t key r ; r - + and divide top cases = let lcases = Array.length cases in let m = lcases/2 in @@ -372,12 +372,12 @@ and divide top cases = else add_test cm cml ; Sep m,(cm, ci) - + and heuristic top cases = let lcases = Array.length cases in - + let sep,csep = divide false cases - + and inter,cinter = if !ok_inter then begin let _,_,act0 = cases.(0) @@ -398,18 +398,18 @@ and heuristic top cases = end else Inter (-1,-1),(too_much, too_much) end else - Inter (-1,-1),(too_much, too_much) in + Inter (-1,-1),(too_much, too_much) in if less2tests csep cinter then sep,csep else inter,cinter - - + + and enum top cases = let lcases = Array.length cases in let lim, with_sep = let best = ref (-1) and best_cost = ref (too_much,too_much) in - + for i = 1 to lcases-(1) do let _,left,right = coupe cases i in let ci = {n=1 ; ni=0} @@ -422,7 +422,7 @@ and enum top cases = add_test cm cmr else add_test cm cml ; - + if less2tests (cm,ci) !best_cost then begin @@ -488,45 +488,45 @@ and enum top cases = r := Sep lim ; rc := with_sep end ; !r, !rc - + let make_if_test konst test arg i ifso ifnot = Arg.make_if (Arg.make_prim test [arg ; konst i]) ifso ifnot - + let make_if_lt konst arg i ifso ifnot = match i with | 1 -> make_if_test konst Arg.leint arg 0 ifso ifnot | _ -> make_if_test konst Arg.ltint arg i ifso ifnot - + and make_if_le konst arg i ifso ifnot = match i with | -1 -> make_if_test konst Arg.ltint arg 0 ifso ifnot | _ -> make_if_test konst Arg.leint arg i ifso ifnot - + and make_if_gt konst arg i ifso ifnot = match i with | -1 -> make_if_test konst Arg.geint arg 0 ifso ifnot | _ -> make_if_test konst Arg.gtint arg i ifso ifnot - + and make_if_ge konst arg i ifso ifnot = match i with | 1 -> make_if_test konst Arg.gtint arg 0 ifso ifnot | _ -> make_if_test konst Arg.geint arg i ifso ifnot - + and make_if_eq konst arg i ifso ifnot = make_if_test konst Arg.eqint arg i ifso ifnot - + and make_if_ne konst arg i ifso ifnot = make_if_test konst Arg.neint arg i ifso ifnot - + let do_make_if_out h arg ifso ifno = Arg.make_if (Arg.make_isout h arg) ifso ifno - + let make_if_out konst ctx l d mk_ifso mk_ifno = match l with | 0 -> do_make_if_out @@ -538,10 +538,10 @@ and enum top cases = let ctx = {off= (-l+ctx.off) ; arg=arg} in do_make_if_out (konst d) arg (mk_ifso ctx) (mk_ifno ctx)) - + let do_make_if_in h arg ifso ifno = Arg.make_if (Arg.make_isin h arg) ifso ifno - + let make_if_in konst ctx l d mk_ifso mk_ifno = match l with | 0 -> do_make_if_in @@ -553,15 +553,15 @@ and enum top cases = let ctx = {off= (-l+ctx.off) ; arg=arg} in do_make_if_in (konst d) arg (mk_ifso ctx) (mk_ifno ctx)) - - + + let rec c_test konst ctx ({cases=cases ; actions=actions} as s) = let lcases = Array.length cases in assert(lcases > 0) ; if lcases = 1 then actions.(get_act cases 0) ctx else begin - + let w,c = opt_count false cases in (* Printf.fprintf stderr @@ -624,7 +624,7 @@ and enum top cases = make_if_ge konst ctx.arg (lim+ctx.off) (c_test konst ctx right) (c_test konst ctx left) - + end @@ -687,7 +687,7 @@ let comp_clusters ({cases=cases ; actions=actions} as s) = get_min (j-1) + 1 < min_clusters.(i) then begin k.(i) <- j ; - min_clusters.(i) <- get_min (j-1) + 1 + min_clusters.(i) <- get_min (j-1) + 1 end done ; done ; @@ -766,15 +766,15 @@ let make_clusters ({cases=cases ; actions=actions} as s) n_clusters k = r.(ir) <- (l,h,add_index (make_switch s i j)) end ; if i > 0 then zyva (i-1) (ir-1) in - + zyva (len-1) (n_clusters-1) ; let acts = Array.create !index (fun _ -> assert false) in Hashtbl.iter (fun _ (i,act) -> acts.(i) <- act) t ; {cases = r ; actions = acts} ;; - -let zyva (low,high) konst arg cases actions = + +let zyva (low,high) konst arg cases actions = let old_ok = !ok_inter in ok_inter := (abs low <= inter_limit && abs high <= inter_limit) ; if !ok_inter <> old_ok then Hashtbl.clear t ; @@ -793,7 +793,7 @@ let zyva (low,high) konst arg cases actions = and test_sequence konst arg cases actions = - let old_ok = !ok_inter in + let old_ok = !ok_inter in ok_inter := false ; if !ok_inter <> old_ok then Hashtbl.clear t ; let s = diff --git a/bytecomp/switch.mli b/bytecomp/switch.mli index 73799daa..33014c0f 100644 --- a/bytecomp/switch.mli +++ b/bytecomp/switch.mli @@ -67,7 +67,7 @@ module Make : functor (Arg : S) -> sig val zyva : - (int * int) -> + (int * int) -> (int -> Arg.act) -> Arg.act -> (int * int * int) array -> diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 244e5886..136144ef 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: symtable.ml 9347 2009-09-23 14:31:18Z xleroy $ *) +(* $Id$ *) (* To assign numbers to globals and primitives *) @@ -133,8 +133,8 @@ let output_primitive_table outchan = let init () = (* Enter the predefined exceptions *) - Array.iter - (fun name -> + Array.iter + (fun name -> let id = try List.assoc name Predef.builtin_values with Not_found -> fatal_error "Symtable.init" in @@ -180,7 +180,7 @@ let patch_int buff pos n = String.unsafe_set buff (pos + 2) (Char.unsafe_chr (n asr 16)); String.unsafe_set buff (pos + 3) (Char.unsafe_chr (n asr 24)) -let patch_object buff patchlist = +let patch_object buff patchlist = List.iter (function (Reloc_literal sc, pos) -> @@ -249,7 +249,7 @@ let update_global_table () = (* Recover data for toplevel initialization. Data can come either from executable file (normal case) or from linked-in data (-output-obj). *) -type section_reader = { +type section_reader = { read_string: string -> string; read_struct: string -> Obj.t; close_reader: unit -> unit @@ -262,7 +262,7 @@ let read_sections () = (fun name -> (Obj.magic(List.assoc name sections) : string)); read_struct = (fun name -> List.assoc name sections); - close_reader = + close_reader = (fun () -> ()) } with Not_found -> let ic = open_in_bin Sys.executable_name in diff --git a/bytecomp/symtable.mli b/bytecomp/symtable.mli index 2b1583f2..cbef01e2 100644 --- a/bytecomp/symtable.mli +++ b/bytecomp/symtable.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: symtable.mli 7422 2006-05-11 15:50:53Z xleroy $ *) +(* $Id$ *) (* Assign locations and numbers to globals and primitives *) diff --git a/bytecomp/translclass.ml b/bytecomp/translclass.ml index 6aec67cc..cf5783a9 100644 --- a/bytecomp/translclass.ml +++ b/bytecomp/translclass.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translclass.ml 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) open Misc open Asttypes diff --git a/bytecomp/translclass.mli b/bytecomp/translclass.mli index 135f8d86..4938278f 100644 --- a/bytecomp/translclass.mli +++ b/bytecomp/translclass.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translclass.mli 7372 2006-04-05 02:28:13Z garrigue $ *) +(* $Id$ *) open Typedtree open Lambda diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index edf8da93..31b1e809 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translcore.ml 8992 2008-08-27 10:23:21Z garrigue $ *) +(* $Id$ *) (* Translation from typed abstract syntax to lambda terms, for the core language *) @@ -762,6 +762,8 @@ and transl_exp0 e = (Lvar cpy)) | Texp_letmodule(id, modl, body) -> Llet(Strict, id, !transl_module Tcoerce_none None modl, transl_exp body) + | Texp_pack modl -> + !transl_module Tcoerce_none None modl | Texp_assert (cond) -> if !Clflags.noassert then lambda_unit @@ -790,7 +792,7 @@ and transl_exp0 e = Lprim(Pmakeblock(Obj.forward_tag, Immutable), [transl_exp e]) (* the following cannot be represented as float/forward/lazy: optimize *) - | Tarrow(_,_,_,_) | Ttuple _ | Tobject(_,_) | Tnil | Tvariant _ + | Tarrow(_,_,_,_) | Ttuple _ | Tpackage _ | Tobject(_,_) | Tnil | Tvariant _ -> transl_exp e (* optimize predefined types (excepted float) *) | Tconstr(_,_,_) -> diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index 9f8e1ac2..baac0556 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translcore.mli 8232 2007-05-16 08:21:41Z doligez $ *) +(* $Id$ *) (* Translation from typed abstract syntax to lambda terms, for the core language *) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index c05e1867..bd6107f0 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translmod.ml 8930 2008-07-24 05:35:22Z frisch $ *) +(* $Id$ *) (* Translation from typed abstract syntax to lambda terms, for the module language *) @@ -84,7 +84,7 @@ let primitive_declarations = ref ([] : Primitive.description list) let record_primitive = function | {val_kind=Val_prim p} -> primitive_declarations := p :: !primitive_declarations | _ -> () - + (* Keep track of the root path (from the root of the namespace to the currently compiled module expression). Useful for naming exceptions. *) @@ -266,6 +266,8 @@ let rec transl_module cc rootpath mexp = [transl_module ccarg None arg], mexp.mod_loc)) | Tmod_constraint(arg, mty, ccarg) -> transl_module (compose_coercions cc ccarg) rootpath arg + | Tmod_unpack(arg, _) -> + Translcore.transl_exp arg and transl_structure fields cc rootpath = function [] -> diff --git a/bytecomp/translmod.mli b/bytecomp/translmod.mli index 39eaa076..9e47ca5e 100644 --- a/bytecomp/translmod.mli +++ b/bytecomp/translmod.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translmod.mli 8930 2008-07-24 05:35:22Z frisch $ *) +(* $Id$ *) (* Translation from typed abstract syntax to lambda terms, for the module language *) @@ -23,7 +23,7 @@ val transl_store_phrases: string -> structure -> int * lambda val transl_store_implementation: string -> structure * module_coercion -> int * lambda val transl_toplevel_definition: structure -> lambda -val transl_package: +val transl_package: Ident.t option list -> Ident.t -> module_coercion -> lambda val transl_store_package: Ident.t option list -> Ident.t -> module_coercion -> int * lambda diff --git a/bytecomp/translobj.ml b/bytecomp/translobj.ml index 5d042346..a0df551d 100644 --- a/bytecomp/translobj.ml +++ b/bytecomp/translobj.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translobj.ml 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) open Misc open Primitive @@ -112,8 +112,8 @@ let transl_store_label_init glob size f arg = (size+1, Lsequence( Lprim(Psetfield(size, false), - [Lprim(Pgetglobal glob, []); - Lprim (Pccall prim_makearray, [int !method_count; int 0])]), + [Lprim(Pgetglobal glob, []); + Lprim (Pccall prim_makearray, [int !method_count; int 0])]), expr)) in (size, transl_label_init expr) @@ -157,4 +157,3 @@ let oo_wrap env req f x = wrapping := false; top_env := Env.empty; raise exn - diff --git a/bytecomp/translobj.mli b/bytecomp/translobj.mli index 7a0749b0..26fa504b 100644 --- a/bytecomp/translobj.mli +++ b/bytecomp/translobj.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translobj.mli 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) open Lambda diff --git a/bytecomp/typeopt.ml b/bytecomp/typeopt.ml index c7b90034..f8e43f0d 100644 --- a/bytecomp/typeopt.ml +++ b/bytecomp/typeopt.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typeopt.ml 9334 2009-09-16 09:44:33Z xleroy $ *) +(* $Id$ *) (* Auxiliaries for type-based optimizations, e.g. array kinds *) @@ -58,7 +58,7 @@ let array_element_kind env ty = else if Path.same p Predef.path_float then Pfloatarray else if Path.same p Predef.path_string - || Path.same p Predef.path_array + || Path.same p Predef.path_array || Path.same p Predef.path_nativeint || Path.same p Predef.path_int32 || Path.same p Predef.path_int64 then diff --git a/bytecomp/typeopt.mli b/bytecomp/typeopt.mli index e7d3a48d..811c2da3 100644 --- a/bytecomp/typeopt.mli +++ b/bytecomp/typeopt.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typeopt.mli 2873 2000-02-28 15:45:50Z xleroy $ *) +(* $Id$ *) (* Auxiliaries for type-based optimizations, e.g. array kinds *) diff --git a/byterun/Makefile b/byterun/Makefile index 47172726..15152945 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 9280 2009-05-25 12:25:25Z doligez $ +# $Id$ include Makefile.common diff --git a/byterun/Makefile.common b/byterun/Makefile.common index be957f04..db5a38c7 100755 --- a/byterun/Makefile.common +++ b/byterun/Makefile.common @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.common 9280 2009-05-25 12:25:25Z doligez $ +# $Id$ include ../config/Makefile diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index bc25e819..a633787d 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 9142 2008-11-26 13:26:53Z xleroy $ +# $Id$ include Makefile.common @@ -22,7 +22,7 @@ OBJS=$(COMMONOBJS:.o=.$(O)) win32.$(O) main.$(O) DOBJS=$(OBJS:.$(O)=.$(DBGO)) instrtrace.$(DBGO) ocamlrun$(EXE): libcamlrun.$(A) prims.$(O) - $(MKEXE) -o ocamlrun$(EXE) prims.$(O) $(call SYSLIB,ws2_32) $(EXTRALIBS) libcamlrun.$(A) + $(MKEXE) -o ocamlrun$(EXE) prims.$(O) $(call SYSLIB,ws2_32) $(EXTRALIBS) libcamlrun.$(A) ocamlrund$(EXE): libcamlrund.$(A) prims.$(O) main.$(O) $(MKEXE) -o ocamlrun$(EXE) $(BYTECCDBGCOMPOPTS) prims.$(O) $(call SYSLIB,ws2_32) $(EXTRALIBS) libcamlrund.$(A) diff --git a/byterun/alloc.c b/byterun/alloc.c index 1c1f11fa..cc19698a 100644 --- a/byterun/alloc.c +++ b/byterun/alloc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: alloc.c 7849 2007-02-09 13:31:15Z doligez $ */ +/* $Id$ */ /* 1. Allocation functions doing the same work as the macros in the case where [Setup_for_gc] and [Restore_after_gc] are no-ops. diff --git a/byterun/alloc.h b/byterun/alloc.h index af81bee7..66cab702 100644 --- a/byterun/alloc.h +++ b/byterun/alloc.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: alloc.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #ifndef CAML_ALLOC_H #define CAML_ALLOC_H diff --git a/byterun/array.c b/byterun/array.c index e6fe6f32..fc606595 100644 --- a/byterun/array.c +++ b/byterun/array.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: array.c 8995 2008-09-08 09:43:28Z frisch $ */ +/* $Id$ */ /* Operations on arrays */ @@ -34,7 +34,7 @@ CAMLprim value caml_array_get_float(value array, value index) double d; value res; - if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) + if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) caml_array_bound_error(); d = Double_field(array, idx); #define Setup_for_gc diff --git a/byterun/backtrace.c b/byterun/backtrace.c index 304fe44a..2b29c31d 100644 --- a/byterun/backtrace.c +++ b/byterun/backtrace.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: backtrace.c 9300 2009-06-18 11:17:16Z xclerc $ */ +/* $Id$ */ /* Stack backtrace for uncaught exceptions */ @@ -308,4 +308,3 @@ CAMLprim value caml_get_exception_backtrace(value unit) } CAMLreturn(res); } - diff --git a/byterun/backtrace.h b/byterun/backtrace.h index f3327d0d..2d9c202e 100644 --- a/byterun/backtrace.h +++ b/byterun/backtrace.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: backtrace.h 9300 2009-06-18 11:17:16Z xclerc $ */ +/* $Id$ */ #ifndef CAML_BACKTRACE_H #define CAML_BACKTRACE_H diff --git a/byterun/callback.c b/byterun/callback.c index c30716b3..d76cf108 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: callback.c 7596 2006-09-11 12:12:24Z doligez $ */ +/* $Id$ */ /* Callbacks from C to Caml */ diff --git a/byterun/callback.h b/byterun/callback.h index 9937832b..ffa6cf3b 100644 --- a/byterun/callback.h +++ b/byterun/callback.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: callback.h 7596 2006-09-11 12:12:24Z doligez $ */ +/* $Id$ */ /* Callbacks from C to Caml */ diff --git a/byterun/compact.c b/byterun/compact.c index b10b6353..ba1042fb 100644 --- a/byterun/compact.c +++ b/byterun/compact.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: compact.c 8822 2008-02-29 12:56:15Z doligez $ */ +/* $Id$ */ #include diff --git a/byterun/compact.h b/byterun/compact.h index 155e7ce8..a4ef4cb1 100644 --- a/byterun/compact.h +++ b/byterun/compact.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: compact.h 6044 2003-12-31 14:20:40Z doligez $ */ +/* $Id$ */ #ifndef CAML_COMPACT_H #define CAML_COMPACT_H diff --git a/byterun/compare.c b/byterun/compare.c index a383724e..35a7f66c 100644 --- a/byterun/compare.c +++ b/byterun/compare.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: compare.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ #include #include diff --git a/byterun/compare.h b/byterun/compare.h index 603d52bc..dc392ff3 100644 --- a/byterun/compare.h +++ b/byterun/compare.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: compare.h 6044 2003-12-31 14:20:40Z doligez $ */ +/* $Id$ */ #ifndef CAML_COMPARE_H #define CAML_COMPARE_H diff --git a/byterun/compatibility.h b/byterun/compatibility.h index fdc87b7c..5c21774e 100644 --- a/byterun/compatibility.h +++ b/byterun/compatibility.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: compatibility.h 8953 2008-07-28 11:59:55Z doligez $ */ +/* $Id$ */ /* definitions for compatibility with old identifiers */ diff --git a/byterun/config.h b/byterun/config.h index 4606261e..57d7947b 100644 --- a/byterun/config.h +++ b/byterun/config.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: config.h 9117 2008-11-02 14:30:05Z xleroy $ */ +/* $Id$ */ #ifndef CAML_CONFIG_H #define CAML_CONFIG_H diff --git a/byterun/custom.c b/byterun/custom.c index 44bb5535..24281db8 100644 --- a/byterun/custom.c +++ b/byterun/custom.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: custom.c 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #include diff --git a/byterun/custom.h b/byterun/custom.h index cddc6e96..a706857a 100644 --- a/byterun/custom.h +++ b/byterun/custom.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: custom.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #ifndef CAML_CUSTOM_H #define CAML_CUSTOM_H @@ -27,7 +27,7 @@ struct custom_operations { void (*finalize)(value v); int (*compare)(value v1, value v2); intnat (*hash)(value v); - void (*serialize)(value v, + void (*serialize)(value v, /*out*/ uintnat * wsize_32 /*size in bytes*/, /*out*/ uintnat * wsize_64 /*size in bytes*/); uintnat (*deserialize)(void * dst); diff --git a/byterun/debugger.c b/byterun/debugger.c index 378158d0..3639c43b 100644 --- a/byterun/debugger.c +++ b/byterun/debugger.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: debugger.c 8955 2008-07-29 08:31:41Z xleroy $ */ +/* $Id$ */ /* Interface with the debugger */ @@ -72,7 +72,7 @@ static union { /* Socket address for the debugger */ struct sockaddr s_gen; #ifndef _WIN32 struct sockaddr_un s_unix; -#endif +#endif struct sockaddr_in s_inet; } sock_addr; static int sock_addr_len; /* Length of sock_addr */ @@ -98,7 +98,7 @@ static void open_connection(void) setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *) &newvalue, sizeof(newvalue)); } -#endif +#endif dbg_socket = socket(sock_domain, SOCK_STREAM, 0); #ifdef _WIN32 if (retcode == 0) { @@ -106,7 +106,7 @@ static void open_connection(void) setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *) &oldvalue, oldvaluelen); } -#endif +#endif if (dbg_socket == -1 || connect(dbg_socket, &sock_addr.s_gen, sock_addr_len) == -1){ caml_fatal_error_arg2 ("cannot connect to debugger at %s", dbg_addr, @@ -181,7 +181,7 @@ void caml_debugger_init(void) + strlen(address); #else caml_fatal_error("Unix sockets not supported"); -#endif +#endif } else { /* Internet domain */ sock_domain = PF_INET; @@ -318,7 +318,7 @@ void caml_debugger(enum event_kind event) #else caml_fatal_error("error: REQ_CHECKPOINT command"); exit(-1); -#endif +#endif break; case REQ_GO: caml_event_count = caml_getword(dbg_in); @@ -332,7 +332,7 @@ void caml_debugger(enum event_kind event) #else caml_fatal_error("Fatal error: REQ_WAIT command"); exit(-1); -#endif +#endif break; case REQ_INITIAL_FRAME: frame = caml_extern_sp + 1; diff --git a/byterun/debugger.h b/byterun/debugger.h index 124a59b3..ce479d27 100644 --- a/byterun/debugger.h +++ b/byterun/debugger.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: debugger.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* Interface with the debugger */ @@ -46,7 +46,7 @@ enum debugger_request { REQ_RESET_INSTR = 'i', /* uint32 pos */ /* Clear an event or breapoint at position pos, restores initial instr. */ REQ_CHECKPOINT = 'c', /* no args */ - /* Checkpoint the runtime system by forking a child process. + /* Checkpoint the runtime system by forking a child process. Reply is pid of child process or -1 if checkpoint failed. */ REQ_GO = 'g', /* uint32 n */ /* Run the program for n events. diff --git a/byterun/dynlink.c b/byterun/dynlink.c index cd6e8f6b..7df594db 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dynlink.c 8873 2008-04-22 12:24:10Z frisch $ */ +/* $Id$ */ /* Dynamic loading of C primitives. */ @@ -94,7 +94,7 @@ static char * parse_ld_conf(void) ldconfname); config = caml_stat_alloc(st.st_size + 1); nread = read(ldconf, config, st.st_size); - if (nread == -1) + if (nread == -1) caml_fatal_error_arg ("Fatal error: error while reading loader config file %s\n", ldconfname); diff --git a/byterun/dynlink.h b/byterun/dynlink.h index aed9c03e..ad4bfbad 100644 --- a/byterun/dynlink.h +++ b/byterun/dynlink.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dynlink.h 6130 2004-02-22 15:07:51Z xleroy $ */ +/* $Id$ */ /* Dynamic loading of C primitives. */ diff --git a/byterun/exec.h b/byterun/exec.h index d126ea84..1abfa455 100644 --- a/byterun/exec.h +++ b/byterun/exec.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: exec.h 6359 2004-06-01 12:36:34Z xleroy $ */ +/* $Id$ */ /* exec.h : format of executable bytecode files */ diff --git a/byterun/extern.c b/byterun/extern.c index 0e7bc62e..89e89f00 100644 --- a/byterun/extern.c +++ b/byterun/extern.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: extern.c 8978 2008-08-04 11:45:58Z xleroy $ */ +/* $Id$ */ /* Structured output */ diff --git a/byterun/fail.c b/byterun/fail.c index 72af1f0e..b1a08c61 100644 --- a/byterun/fail.c +++ b/byterun/fail.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fail.c 9030 2008-09-18 11:23:28Z xleroy $ */ +/* $Id$ */ /* Raising exceptions from C. */ diff --git a/byterun/fail.h b/byterun/fail.h index 438728f9..f092c811 100644 --- a/byterun/fail.h +++ b/byterun/fail.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fail.h 9030 2008-09-18 11:23:28Z xleroy $ */ +/* $Id$ */ #ifndef CAML_FAIL_H #define CAML_FAIL_H diff --git a/byterun/finalise.c b/byterun/finalise.c index c0042b76..68515581 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: finalise.c 9259 2009-05-18 09:37:46Z doligez $ */ +/* $Id$ */ /* Handling of finalised values. */ diff --git a/byterun/finalise.h b/byterun/finalise.h index cca82a1f..ec656f4f 100644 --- a/byterun/finalise.h +++ b/byterun/finalise.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: finalise.h 6047 2004-01-02 19:23:29Z doligez $ */ +/* $Id$ */ #ifndef CAML_FINALISE_H #define CAML_FINALISE_H diff --git a/byterun/fix_code.c b/byterun/fix_code.c index ac6281f2..b252efd5 100644 --- a/byterun/fix_code.c +++ b/byterun/fix_code.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fix_code.c 6331 2004-05-26 11:10:52Z garrigue $ */ +/* $Id$ */ /* Handling of blocks of bytecode (endianness switch, threading). */ @@ -92,7 +92,7 @@ void caml_thread_code (code_t code, asize_t len) code_t p; int l [STOP + 1]; int i; - + for (i = 0; i <= STOP; i++) { l [i] = 0; } diff --git a/byterun/fix_code.h b/byterun/fix_code.h index 3a841bb9..f6e9e3b7 100644 --- a/byterun/fix_code.h +++ b/byterun/fix_code.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fix_code.h 6047 2004-01-02 19:23:29Z doligez $ */ +/* $Id$ */ /* Handling of blocks of bytecode (endianness switch, threading). */ diff --git a/byterun/floats.c b/byterun/floats.c index 86f027ee..d1d178a3 100644 --- a/byterun/floats.c +++ b/byterun/floats.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: floats.c 8976 2008-08-02 11:02:28Z xleroy $ */ +/* $Id$ */ /* The interface of this file is in "mlvalues.h" and "alloc.h" */ @@ -248,11 +248,8 @@ CAMLprim value caml_log10_float(value f) CAMLprim value caml_modf_float(value f) { -#if __SC__ - _float_eval frem; /* Problem with Apple's */ -#else double frem; -#endif + CAMLparam1 (f); CAMLlocal3 (res, quo, rem); @@ -329,6 +326,46 @@ CAMLprim value caml_ceil_float(value f) return caml_copy_double(ceil(Double_val(f))); } +/* These emulations of expm1() and log1p() are due to William Kahan. + See http://www.plunk.org/~hatch/rightway.php */ + +CAMLexport double caml_expm1(double x) +{ +#ifdef HAS_EXPM1_LOG1P + return expm1(x); +#else + double u = exp(x); + if (u == 1.) + return x; + if (u - 1. == -1.) + return -1.; + return (u - 1.) * x / log(u); +#endif +} + +CAMLexport double caml_log1p(double x) +{ +#ifdef HAS_EXPM1_LOG1P + return log1p(x); +#else + double u = 1. + x; + if (u == 1.) + return x; + else + return log(u) * x / (u - 1.); +#endif +} + +CAMLprim value caml_expm1_float(value f) +{ + return caml_copy_double(caml_expm1(Double_val(f))); +} + +CAMLprim value caml_log1p_float(value f) +{ + return caml_copy_double(caml_log1p(Double_val(f))); +} + CAMLprim value caml_eq_float(value f, value g) { return Val_bool(Double_val(f) == Double_val(g)); @@ -392,7 +429,7 @@ CAMLprim value caml_classify_float(value vd) return Val_int(FP_normal); } #else - union { + union { double d; #if defined(ARCH_BIG_ENDIAN) || (defined(__arm__) && !defined(__ARM_EABI__)) struct { uint32 h; uint32 l; } i; diff --git a/byterun/freelist.c b/byterun/freelist.c index 4201dfd9..ab1d458b 100644 --- a/byterun/freelist.c +++ b/byterun/freelist.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: freelist.c 9131 2008-11-18 10:24:43Z doligez $ */ +/* $Id$ */ #define FREELIST_DEBUG 0 #if FREELIST_DEBUG diff --git a/byterun/freelist.h b/byterun/freelist.h index 930f6894..8db168e9 100644 --- a/byterun/freelist.h +++ b/byterun/freelist.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: freelist.h 9131 2008-11-18 10:24:43Z doligez $ */ +/* $Id$ */ /* Free lists of heap blocks. */ diff --git a/byterun/gc.h b/byterun/gc.h index 7acaea82..50d9945a 100644 --- a/byterun/gc.h +++ b/byterun/gc.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gc.h 6557 2004-07-19 13:20:06Z xleroy $ */ +/* $Id$ */ #ifndef CAML_GC_H #define CAML_GC_H diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index d38c704e..0083f367 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gc_ctrl.c 9409 2009-11-04 12:24:35Z doligez $ */ +/* $Id$ */ #include "alloc.h" #include "compact.h" diff --git a/byterun/gc_ctrl.h b/byterun/gc_ctrl.h index 512f986f..205636d5 100644 --- a/byterun/gc_ctrl.h +++ b/byterun/gc_ctrl.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gc_ctrl.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #ifndef CAML_GC_CTRL_H #define CAML_GC_CTRL_H diff --git a/byterun/globroots.c b/byterun/globroots.c index 38aac416..acac1e21 100644 --- a/byterun/globroots.c +++ b/byterun/globroots.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: globroots.c 9195 2009-03-28 15:26:37Z xleroy $ */ +/* $Id$ */ /* Registration of global memory roots */ @@ -133,7 +133,7 @@ static void caml_delete_global_root(struct global_root_list * rootlist, /* Reclaim list element */ caml_stat_free(e); /* Down-correct list level */ - while (rootlist->level > 0 && + while (rootlist->level > 0 && rootlist->forward[rootlist->level] == NULL) rootlist->level--; } @@ -223,11 +223,11 @@ CAMLexport void caml_modify_generational_global_root(value *r, value newval) { value oldval = *r; - /* It is OK to have a root in roots_young that suddenly points to + /* It is OK to have a root in roots_young that suddenly points to the old generation -- the next minor GC will take care of that. What needs corrective action is a root in roots_old that suddenly points to the young generation. */ - if (Is_block(newval) && Is_young(newval) && + if (Is_block(newval) && Is_young(newval) && Is_block(oldval) && Is_in_heap(oldval)) { caml_delete_global_root(&caml_global_roots_old, r); caml_insert_global_root(&caml_global_roots_young, r); diff --git a/byterun/globroots.h b/byterun/globroots.h index 3f1e6c4b..4dee35f2 100644 --- a/byterun/globroots.h +++ b/byterun/globroots.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: globroots.h 8828 2008-03-10 19:56:39Z xleroy $ */ +/* $Id$ */ /* Registration of global memory roots */ diff --git a/byterun/hash.c b/byterun/hash.c index c25ffa98..c981768d 100644 --- a/byterun/hash.c +++ b/byterun/hash.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: hash.c 8970 2008-08-01 14:10:36Z xleroy $ */ +/* $Id$ */ /* The generic hashing primitive */ @@ -61,7 +61,7 @@ static void hash_aux(value obj) /* Pointers into the heap are well-structured blocks. So are atoms. We can inspect the block contents. */ - Assert (Is_block (obj)); + Assert (Is_block (obj)); if (Is_in_value_area(obj)) { tag = Tag_val(obj); switch (tag) { @@ -146,7 +146,7 @@ CAMLexport value caml_hash_variant(char const * tag) { value accu; /* Same hashing algorithm as in ../typing/btype.ml, function hash_variant */ - for (accu = Val_int(0); *tag != 0; tag++) + for (accu = Val_int(0); *tag != 0; tag++) accu = Val_int(223 * Int_val(accu) + *((unsigned char *) tag)); #ifdef ARCH_SIXTYFOUR accu = accu & Val_long(0x7FFFFFFFL); diff --git a/byterun/instrtrace.c b/byterun/instrtrace.c index b301c455..3afdc954 100644 --- a/byterun/instrtrace.c +++ b/byterun/instrtrace.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: instrtrace.c 8743 2008-01-03 09:37:10Z xleroy $ */ +/* $Id$ */ /* Trace the instructions executed */ @@ -59,7 +59,7 @@ void caml_disasm_instr(pc) /* Instructions with two operands */ case APPTERM: case CLOSURE: case CLOSUREREC: case PUSHGETGLOBALFIELD: case GETGLOBALFIELD: case MAKEBLOCK: - case BEQ: case BNEQ: case BLTINT: case BLEINT: case BGTINT: case BGEINT: + case BEQ: case BNEQ: case BLTINT: case BLEINT: case BGTINT: case BGEINT: case BULTINT: case BUGEINT: printf(" %d, %d\n", pc[0], pc[1]); break; /* Instructions with a C primitive as operand */ @@ -182,13 +182,13 @@ caml_trace_value_file (value v, code_t prog, int proglen, FILE * f) if (!v) return; if (prog && v % sizeof (int) == 0 - && (code_t) v >= prog - && (code_t) v < (code_t) ((char *) prog + proglen)) + && (code_t) v >= prog + && (code_t) v < (code_t) ((char *) prog + proglen)) fprintf (f, "=code@%d", (code_t) v - prog); else if (Is_long (v)) fprintf (f, "=long%" ARCH_INTNAT_PRINTF_FORMAT "d", Long_val (v)); - else if ((void*)v >= (void*)caml_stack_low - && (void*)v < (void*)caml_stack_high) + else if ((void*)v >= (void*)caml_stack_low + && (void*)v < (void*)caml_stack_high) fprintf (f, "=stack_%d", (intnat*)caml_stack_high - (intnat*)v); else if (Is_block (v)) { int s = Wosize_val (v); @@ -202,10 +202,10 @@ caml_trace_value_file (value v, code_t prog, int proglen, FILE * f) l = caml_string_length (v); fprintf (f, "=string[s%dL%d]'", s, l); for (i = 0; i < ((l>0x1f)?0x1f:l) ; i++) { - if (isprint (Byte (v, i))) - putc (Byte (v, i), f); - else - putc ('?', f); + if (isprint (Byte (v, i))) + putc (Byte (v, i), f); + else + putc ('?', f); }; fprintf (f, "'"); goto displayfields; @@ -215,7 +215,7 @@ caml_trace_value_file (value v, code_t prog, int proglen, FILE * f) case Double_array_tag: fprintf (f, "=floatarray[s%d]", s); for (i = 0; i < ((s>0xf)?0xf:s); i++) - fprintf (f, " %g", Double_field (v, i)); + fprintf (f, " %g", Double_field (v, i)); goto displayfields; case Abstract_tag: fprintf (f, "=abstract[s%d]", s); @@ -227,25 +227,25 @@ caml_trace_value_file (value v, code_t prog, int proglen, FILE * f) fprintf (f, "=block", tg, s); displayfields: if (s > 0) - fputs ("=(", f); + fputs ("=(", f); for (i = 0; i < s; i++) { - if (i > 20) { - fputs ("....", f); - break; - }; - if (i > 0) - putc (' ', f); - fprintf (f, "%#lx", Field (v, i)); + if (i > 20) { + fputs ("....", f); + break; + }; + if (i > 0) + putc (' ', f); + fprintf (f, "%#lx", Field (v, i)); }; if (s > 0) - putc (')', f); + putc (')', f); }; } } void caml_trace_accu_sp_file (value accu, value * sp, code_t prog, int proglen, - FILE * f) + FILE * f) { int i; value *p; diff --git a/byterun/instrtrace.h b/byterun/instrtrace.h index 1e7657bc..c1ca4a7e 100644 --- a/byterun/instrtrace.h +++ b/byterun/instrtrace.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: instrtrace.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* Trace the instructions executed */ diff --git a/byterun/instruct.h b/byterun/instruct.h index c684dcf9..c45d4ea2 100644 --- a/byterun/instruct.h +++ b/byterun/instruct.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: instruct.h 6331 2004-05-26 11:10:52Z garrigue $ */ +/* $Id$ */ /* The instruction set. */ @@ -27,7 +27,7 @@ enum instructions { ENVACC1, ENVACC2, ENVACC3, ENVACC4, ENVACC, PUSHENVACC1, PUSHENVACC2, PUSHENVACC3, PUSHENVACC4, PUSHENVACC, PUSH_RETADDR, APPLY, APPLY1, APPLY2, APPLY3, - APPTERM, APPTERM1, APPTERM2, APPTERM3, + APPTERM, APPTERM1, APPTERM2, APPTERM3, RETURN, RESTART, GRAB, CLOSURE, CLOSUREREC, OFFSETCLOSUREM2, OFFSETCLOSURE0, OFFSETCLOSURE2, OFFSETCLOSURE, @@ -48,7 +48,7 @@ enum instructions { NEGINT, ADDINT, SUBINT, MULINT, DIVINT, MODINT, ANDINT, ORINT, XORINT, LSLINT, LSRINT, ASRINT, EQ, NEQ, LTINT, LEINT, GTINT, GEINT, - OFFSETINT, OFFSETREF, ISINT, + OFFSETINT, OFFSETREF, ISINT, GETMETHOD, BEQ, BNEQ, BLTINT, BLEINT, BGTINT, BGEINT, ULTINT, UGEINT, diff --git a/byterun/int64_emul.h b/byterun/int64_emul.h index a5a5024e..ec4ed0be 100644 --- a/byterun/int64_emul.h +++ b/byterun/int64_emul.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: int64_emul.h 9202 2009-03-28 18:34:19Z xleroy $ */ +/* $Id$ */ /* Software emulation of 64-bit integer arithmetic, for C compilers that do not support it. */ @@ -97,7 +97,7 @@ static int64 I64_mul(int64 x, int64 y) #define I64_is_zero(x) (((x).l | (x).h) == 0) #define I64_is_negative(x) ((int32) (x).h < 0) -#define I64_is_min_int(x) ((x).l == 0 && (x).h = 0x80000000U) +#define I64_is_min_int(x) ((x).l == 0 && (x).h == 0x80000000U) #define I64_is_minus_one(x) (((x).l & (x).h) == 0xFFFFFFFFU) /* Bitwise operations */ diff --git a/byterun/int64_format.h b/byterun/int64_format.h index a0a4f256..b9ae9104 100644 --- a/byterun/int64_format.h +++ b/byterun/int64_format.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: int64_format.h 6021 2003-12-15 18:10:51Z doligez $ */ +/* $Id$ */ /* printf-like formatting of 64-bit integers, in case the C library printf() function does not support them. */ @@ -49,7 +49,7 @@ static void I64_format(char * buffer, char * fmt, int64 x) filler = '0'; break; case '#': alternate = 1; break; - case '1': case '2': case '3': case '4': case '5': + case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': width = atoi(p); while (*p >= '0' && *p <= '9') p++; diff --git a/byterun/int64_native.h b/byterun/int64_native.h index 3a437df3..9c079097 100644 --- a/byterun/int64_native.h +++ b/byterun/int64_native.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: int64_native.h 9202 2009-03-28 18:34:19Z xleroy $ */ +/* $Id$ */ /* Wrapper macros around native 64-bit integer arithmetic, so that it has the same interface as the software emulation diff --git a/byterun/intern.c b/byterun/intern.c index 78972f6a..f4421146 100644 --- a/byterun/intern.c +++ b/byterun/intern.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: intern.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ /* Structured input, compact format */ @@ -104,7 +104,7 @@ static void intern_cleanup(void) if (intern_obj_table != NULL) caml_stat_free(intern_obj_table); if (intern_extra_block != NULL) { /* free newly allocated heap chunk */ - caml_free_for_heap(intern_extra_block); + caml_free_for_heap(intern_extra_block); } else if (intern_block != 0) { /* restore original header for heap block, otherwise GC is confused */ Hd_val(intern_block) = intern_header; @@ -186,7 +186,7 @@ static void intern_rec(value *dest) read_shared: Assert (ofs > 0); Assert (ofs <= obj_counter); - Assert (intern_obj_table != NULL); + Assert (intern_obj_table != NULL); v = intern_obj_table[obj_counter - ofs]; break; case CODE_SHARED16: @@ -237,7 +237,7 @@ static void intern_rec(value *dest) Permute_64(v, ARCH_FLOAT_ENDIANNESS, v, 0x01234567) else Permute_64(v, ARCH_FLOAT_ENDIANNESS, v, 0x76543210); -#endif +#endif break; case CODE_DOUBLE_ARRAY8_LITTLE: case CODE_DOUBLE_ARRAY8_BIG: @@ -508,7 +508,7 @@ CAMLexport value caml_input_value_from_malloc(char * data, intnat ofs) intern_src = intern_input + ofs; intern_input_malloced = 1; magic = read32u(); - if (magic != Intext_magic_number) + if (magic != Intext_magic_number) caml_failwith("input_value_from_malloc: bad object"); block_len = read32u(); obj = input_val_from_block(); @@ -527,7 +527,7 @@ CAMLexport value caml_input_value_from_block(char * data, intnat len) intern_src = intern_input; intern_input_malloced = 0; magic = read32u(); - if (magic != Intext_magic_number) + if (magic != Intext_magic_number) caml_failwith("input_value_from_block: bad object"); block_len = read32u(); if (5*4 + block_len > len) diff --git a/byterun/interp.c b/byterun/interp.c index 0b00074a..7bcdf7ac 100644 --- a/byterun/interp.c +++ b/byterun/interp.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: interp.c 9513 2010-01-08 10:33:23Z xleroy $ */ +/* $Id$ */ /* The bytecode interpreter */ #include @@ -159,7 +159,7 @@ sp is a local copy of the global variable caml_extern_sp. */ #endif /* PR#4953: these specific registers not available in Thumb mode */ #if defined (__arm__) && !defined(__thumb__) -#define PC_REG asm("r9") +#define PC_REG asm("r6") #define SP_REG asm("r8") #define ACCU_REG asm("r7") #endif @@ -1024,14 +1024,14 @@ value caml_interprete(code_t prog, asize_t prog_size) Instruct(ISINT): accu = Val_long(accu & 1); Next; - + /* Object-oriented operations */ #define Lookup(obj, lab) Field (Field (obj, 0), Int_val(lab)) /* please don't forget to keep below code in sync with the - functions caml_cache_public_method and - caml_cache_public_method2 in obj.c */ + functions caml_cache_public_method and + caml_cache_public_method2 in obj.c */ Instruct(GETMETHOD): accu = Lookup(sp[0], accu); @@ -1137,7 +1137,7 @@ void caml_prepare_bytecode(code_t prog, asize_t prog_size) { Assert(prog); Assert(prog_size>0); /* actually, the threading of the bytecode might be done here */ -} +} void caml_release_bytecode(code_t prog, asize_t prog_size) { /* other implementations of the interpreter (such as an hypothetical diff --git a/byterun/interp.h b/byterun/interp.h index 8b83903c..9eb73394 100644 --- a/byterun/interp.h +++ b/byterun/interp.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: interp.h 6257 2004-04-26 14:08:22Z basile $ */ +/* $Id$ */ /* The bytecode interpreter */ diff --git a/byterun/intext.h b/byterun/intext.h index de0ef684..b757d171 100644 --- a/byterun/intext.h +++ b/byterun/intext.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: intext.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* Structured input/output */ diff --git a/byterun/ints.c b/byterun/ints.c index 268c6561..9fdaa180 100644 --- a/byterun/ints.c +++ b/byterun/ints.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: ints.c 9203 2009-03-28 18:43:08Z xleroy $ */ +/* $Id$ */ #include #include @@ -83,9 +83,12 @@ static intnat parse_intnat(value s, int nbits) caml_failwith("int_of_string"); } if (base == 10) { - /* Signed representation expected, allow -2^(nbits-1) to 2^(nbits - 1) */ - if (res > (uintnat)1 << (nbits - 1)) - caml_failwith("int_of_string"); + /* Signed representation expected, allow -2^(nbits-1) to 2^(nbits-1) - 1 */ + if (sign >= 0) { + if (res >= (uintnat)1 << (nbits - 1)) caml_failwith("int_of_string"); + } else { + if (res > (uintnat)1 << (nbits - 1)) caml_failwith("int_of_string"); + } } else { /* Unsigned representation expected, allow 0 to 2^nbits - 1 and tolerate -(2^nbits - 1) to 0 */ @@ -177,7 +180,7 @@ CAMLprim value caml_format_int(value fmt, value arg) value res; buffer = parse_format(fmt, ARCH_INTNAT_PRINTF_FORMAT, - format_string, default_format_buffer, &conv); + format_string, default_format_buffer, &conv); switch (conv) { case 'u': case 'x': case 'X': case 'o': sprintf(buffer, format_string, Unsigned_long_val(arg)); @@ -489,7 +492,7 @@ CAMLprim value caml_int64_of_float(value v) { return caml_copy_int64(I64_of_double(Double_val(v))); } CAMLprim value caml_int64_to_float(value v) -{ +{ int64 i = Int64_val(v); return caml_copy_double(I64_to_double(i)); } @@ -540,7 +543,8 @@ CAMLprim value caml_int64_of_string(value s) { char * p; uint64 max_uint64 = I64_literal(0xFFFFFFFF, 0xFFFFFFFF); - uint64 max_int64 = I64_literal(0x80000000, 0x00000000); + uint64 max_int64_pos = I64_literal(0x7FFFFFFF, 0xFFFFFFFF); + uint64 max_int64_neg = I64_literal(0x80000000, 0x00000000); uint64 res, threshold; int sign, base, d; @@ -563,7 +567,10 @@ CAMLprim value caml_int64_of_string(value s) if (p != String_val(s) + caml_string_length(s)){ caml_failwith("int_of_string"); } - if (base == 10 && I64_ult(max_int64, res)) caml_failwith("int_of_string"); + if (base == 10) { + if (I64_ult((sign >= 0 ? max_int64_pos : max_int64_neg), res)) + caml_failwith("int_of_string"); + } if (sign < 0) res = I64_neg(res); return caml_copy_int64(res); } diff --git a/byterun/io.c b/byterun/io.c index c72fc4d5..44d1f293 100644 --- a/byterun/io.c +++ b/byterun/io.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: io.c 7919 2007-02-25 12:38:36Z xleroy $ */ +/* $Id$ */ /* Buffered input/output. */ @@ -62,7 +62,9 @@ CAMLexport struct channel * caml_open_descriptor_in(int fd) channel = (struct channel *) caml_stat_alloc(sizeof(struct channel)); channel->fd = fd; - channel->offset = lseek (fd, 0, SEEK_CUR); + caml_enter_blocking_section(); + channel->offset = lseek(fd, 0, SEEK_CUR); + caml_leave_blocking_section(); channel->curr = channel->max = channel->buff; channel->end = channel->buff + IO_BUFFER_SIZE; channel->mutex = NULL; @@ -111,13 +113,21 @@ CAMLexport void caml_close_channel(struct channel *channel) CAMLexport file_offset caml_channel_size(struct channel *channel) { + file_offset offset; file_offset end; + int fd; - end = lseek(channel->fd, 0, SEEK_END); - if (end == -1 || - lseek(channel->fd, channel->offset, SEEK_SET) != channel->offset) { + /* We extract data from [channel] before dropping the Caml lock, in case + someone else touches the block. */ + fd = channel->fd; + offset = channel->offset; + caml_enter_blocking_section(); + end = lseek(fd, 0, SEEK_END); + if (end == -1 || lseek(fd, offset, SEEK_SET) != offset) { + caml_leave_blocking_section(); caml_sys_error(NO_ARG); } + caml_leave_blocking_section(); return end; } @@ -245,7 +255,12 @@ CAMLexport void caml_really_putblock(struct channel *channel, CAMLexport void caml_seek_out(struct channel *channel, file_offset dest) { caml_flush(channel); - if (lseek(channel->fd, dest, SEEK_SET) != dest) caml_sys_error(NO_ARG); + caml_enter_blocking_section(); + if (lseek(channel->fd, dest, SEEK_SET) != dest) { + caml_leave_blocking_section(); + caml_sys_error(NO_ARG); + } + caml_leave_blocking_section(); channel->offset = dest; } @@ -340,7 +355,12 @@ CAMLexport void caml_seek_in(struct channel *channel, file_offset dest) dest <= channel->offset) { channel->curr = channel->max - (channel->offset - dest); } else { - if (lseek(channel->fd, dest, SEEK_SET) != dest) caml_sys_error(NO_ARG); + caml_enter_blocking_section(); + if (lseek(channel->fd, dest, SEEK_SET) != dest) { + caml_leave_blocking_section(); + caml_sys_error(NO_ARG); + } + caml_leave_blocking_section(); channel->offset = dest; channel->curr = channel->max = channel->buff; } diff --git a/byterun/io.h b/byterun/io.h index e43d5ec3..d02a5a72 100644 --- a/byterun/io.h +++ b/byterun/io.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: io.h 9041 2008-09-27 21:16:29Z weis $ */ +/* $Id$ */ /* Buffered input/output */ diff --git a/byterun/lexing.c b/byterun/lexing.c index 4a6fd486..6e74795c 100644 --- a/byterun/lexing.c +++ b/byterun/lexing.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: lexing.c 6045 2004-01-01 16:42:43Z doligez $ */ +/* $Id$ */ /* The table-driven automaton for lexers generated by camllex. */ @@ -219,7 +219,7 @@ CAMLprim value caml_new_lex_engine(struct lexing_table *tbl, value start_state, pc_off = Short(tbl->lex_trans_code, base_code + c) ; else pc_off = Short(tbl->lex_default_code, pstate) ; - if (pc_off > 0) + if (pc_off > 0) run_mem(Bp_val(tbl->lex_code) + pc_off, lexbuf->lex_mem, lexbuf->lex_curr_pos) ; /* Erase the EOF condition only if the EOF pseudo-character was consumed by the automaton (i.e. there was no backtrack above) @@ -228,4 +228,3 @@ CAMLprim value caml_new_lex_engine(struct lexing_table *tbl, value start_state, } } } - diff --git a/byterun/main.c b/byterun/main.c index ad7f5c5a..e6afb1b3 100644 --- a/byterun/main.c +++ b/byterun/main.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: main.c 8822 2008-02-29 12:56:15Z doligez $ */ +/* $Id$ */ /* Main entry point (can be overridden by a user-provided main() function that calls caml_main() later). */ diff --git a/byterun/major_gc.c b/byterun/major_gc.c index db9fa8a3..b9ec8cbf 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: major_gc.c 9409 2009-11-04 12:24:35Z doligez $ */ +/* $Id$ */ #include diff --git a/byterun/major_gc.h b/byterun/major_gc.h index 588ea503..5e48e343 100644 --- a/byterun/major_gc.h +++ b/byterun/major_gc.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: major_gc.h 8766 2008-01-11 11:55:36Z doligez $ */ +/* $Id$ */ #ifndef CAML_MAJOR_GC_H #define CAML_MAJOR_GC_H diff --git a/byterun/md5.c b/byterun/md5.c index 5d1f7e96..d0b6e5e4 100644 --- a/byterun/md5.c +++ b/byterun/md5.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: md5.c 7382 2006-04-16 23:28:22Z doligez $ */ +/* $Id$ */ #include #include "alloc.h" @@ -308,4 +308,3 @@ CAMLexport void caml_MD5Transform(uint32 *buf, uint32 *in) buf[2] += c; buf[3] += d; } - diff --git a/byterun/md5.h b/byterun/md5.h index 6eff13a9..b92b02ad 100644 --- a/byterun/md5.h +++ b/byterun/md5.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: md5.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* MD5 message digest */ @@ -32,7 +32,7 @@ struct MD5Context { }; CAMLextern void caml_MD5Init (struct MD5Context *context); -CAMLextern void caml_MD5Update (struct MD5Context *context, unsigned char *buf, +CAMLextern void caml_MD5Update (struct MD5Context *context, unsigned char *buf, uintnat len); CAMLextern void caml_MD5Final (unsigned char *digest, struct MD5Context *ctx); CAMLextern void caml_MD5Transform (uint32 *buf, uint32 *in); diff --git a/byterun/memory.c b/byterun/memory.c index e609796f..bc4c88df 100644 --- a/byterun/memory.c +++ b/byterun/memory.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: memory.c 9117 2008-11-02 14:30:05Z xleroy $ */ +/* $Id$ */ #include #include @@ -175,7 +175,7 @@ static unsigned char caml_page_table_empty[Pagetable2_size] = { 0, }; int caml_page_table_initialize(mlsize_t bytesize) { int i; - for (i = 0; i < Pagetable1_size; i++) + for (i = 0; i < Pagetable1_size; i++) caml_page_table[i] = caml_page_table_empty; return 0; } diff --git a/byterun/memory.h b/byterun/memory.h index 1edab765..f8fb8ca2 100644 --- a/byterun/memory.h +++ b/byterun/memory.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: memory.h 9117 2008-11-02 14:30:05Z xleroy $ */ +/* $Id$ */ /* Allocation macros and functions */ diff --git a/byterun/meta.c b/byterun/meta.c index d28aa37e..1ed4fbdd 100644 --- a/byterun/meta.c +++ b/byterun/meta.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: meta.c 8800 2008-01-31 09:13:19Z frisch $ */ +/* $Id$ */ /* Primitives for the toplevel */ @@ -82,7 +82,7 @@ CAMLprim value caml_realloc_global(value size) } return Val_unit; } - + CAMLprim value caml_get_current_environment(value unit) { return *caml_extern_sp; @@ -148,7 +148,7 @@ value caml_realloc_global(value size) caml_invalid_argument("Meta.realloc_global"); return Val_unit; /* not reached */ } - + value caml_invoke_traced_function(value codeptr, value env, value arg) { caml_invalid_argument("Meta.invoke_traced_function"); diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index 84d51b20..91aa2979 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: minor_gc.c 8954 2008-07-28 12:03:55Z doligez $ */ +/* $Id$ */ #include #include "config.h" diff --git a/byterun/minor_gc.h b/byterun/minor_gc.h index c9751e0d..8e834129 100644 --- a/byterun/minor_gc.h +++ b/byterun/minor_gc.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: minor_gc.h 8211 2007-05-04 14:05:13Z doligez $ */ +/* $Id$ */ #ifndef CAML_MINOR_GC_H #define CAML_MINOR_GC_H diff --git a/byterun/misc.c b/byterun/misc.c index 8c25b75e..e8597ee3 100644 --- a/byterun/misc.c +++ b/byterun/misc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: misc.c 8822 2008-02-29 12:56:15Z doligez $ */ +/* $Id$ */ #include #include "config.h" diff --git a/byterun/misc.h b/byterun/misc.h index 336f7bb3..d0aaffd1 100644 --- a/byterun/misc.h +++ b/byterun/misc.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: misc.h 8822 2008-02-29 12:56:15Z doligez $ */ +/* $Id$ */ /* Miscellaneous macros and variables. */ diff --git a/byterun/mlvalues.h b/byterun/mlvalues.h index 8f97458f..d76c1f1d 100644 --- a/byterun/mlvalues.h +++ b/byterun/mlvalues.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mlvalues.h 8970 2008-08-01 14:10:36Z xleroy $ */ +/* $Id$ */ #ifndef CAML_MLVALUES_H #define CAML_MLVALUES_H diff --git a/byterun/obj.c b/byterun/obj.c index 5a5ae701..e085d672 100644 --- a/byterun/obj.c +++ b/byterun/obj.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: obj.c 9350 2009-09-24 09:12:51Z doligez $ */ +/* $Id$ */ /* Operations on objects */ @@ -167,7 +167,7 @@ CAMLprim value caml_obj_truncate (value v, value newsize) CAMLprim value caml_obj_add_offset (value v, value offset) { - return v + Int32_val (offset); + return v + (unsigned long) Int32_val (offset); } /* The following functions are used in stdlib/lazy.ml. diff --git a/byterun/osdeps.h b/byterun/osdeps.h index 3ad18e83..248b3f6a 100644 --- a/byterun/osdeps.h +++ b/byterun/osdeps.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: osdeps.h 8873 2008-04-22 12:24:10Z frisch $ */ +/* $Id$ */ /* Operating system - specific stuff */ @@ -69,4 +69,3 @@ extern int caml_executable_name(char * name, int name_len); #endif #endif /* CAML_OSDEPS_H */ - diff --git a/byterun/parsing.c b/byterun/parsing.c index 1816d5bb..bcb9e5fa 100644 --- a/byterun/parsing.c +++ b/byterun/parsing.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: parsing.c 8983 2008-08-06 09:38:25Z xleroy $ */ +/* $Id$ */ /* The PDA automaton for parsers generated by camlyacc */ @@ -83,7 +83,7 @@ int caml_parser_trace = 0; /* Output codes */ /* Mirrors parser_output in ../stdlib/parsing.ml */ -#define READ_TOKEN Val_int(0) +#define READ_TOKEN Val_int(0) #define RAISE_PARSE_ERROR Val_int(1) #define GROW_STACKS_1 Val_int(2) #define GROW_STACKS_2 Val_int(3) @@ -133,8 +133,8 @@ static void print_token(struct parser_tables *tables, int state, value tok) else fprintf(stderr, "_"); fprintf(stderr, ")\n"); - } -} + } +} /* The pushdown automata */ @@ -171,7 +171,7 @@ CAMLprim value caml_parse_engine(struct parser_tables *tables, caml_modify(&env->lval, Val_long(0)); } if (caml_parser_trace) print_token(tables, state, arg); - + testshift: n1 = Short(tables->sindex, state); n2 = n1 + Int_val(env->curr_char); @@ -199,7 +199,7 @@ CAMLprim value caml_parse_engine(struct parser_tables *tables, n2 = n1 + ERRCODE; if (n1 != 0 && n2 >= 0 && n2 <= Int_val(tables->tablesize) && Short(tables->check, n2) == ERRCODE) { - if (caml_parser_trace) + if (caml_parser_trace) fprintf(stderr, "Recovering in state %d\n", state1); goto shift_recover; } else { @@ -222,7 +222,7 @@ CAMLprim value caml_parse_engine(struct parser_tables *tables, env->curr_char = Val_int(-1); goto loop; } - + shift: env->curr_char = Val_int(-1); if (errflag > 0) errflag--; @@ -289,7 +289,7 @@ CAMLprim value caml_parse_engine(struct parser_tables *tables, Assert(0); return RAISE_PARSE_ERROR; /* Keeps gcc -Wall happy */ } - + } /* Control printing of debugging info */ diff --git a/byterun/prims.h b/byterun/prims.h index 0f4112ea..d8c1671e 100644 --- a/byterun/prims.h +++ b/byterun/prims.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: prims.h 6130 2004-02-22 15:07:51Z xleroy $ */ +/* $Id$ */ /* Interface with C primitives. */ diff --git a/byterun/printexc.c b/byterun/printexc.c index c2490f1c..f72157ff 100644 --- a/byterun/printexc.c +++ b/byterun/printexc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: printexc.c 7812 2007-01-29 12:11:18Z xleroy $ */ +/* $Id$ */ /* Print an uncaught exception and abort */ @@ -44,7 +44,7 @@ static void add_string(struct stringbuf *buf, char *s) if (len > 0) memmove(buf->ptr, s, len); buf->ptr += len; } - + CAMLexport char * caml_format_exception(value exn) { mlsize_t start, i; diff --git a/byterun/printexc.h b/byterun/printexc.h index cc48f4b2..e7d17688 100644 --- a/byterun/printexc.h +++ b/byterun/printexc.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: printexc.h 6045 2004-01-01 16:42:43Z doligez $ */ +/* $Id$ */ #ifndef CAML_PRINTEXC_H #define CAML_PRINTEXC_H diff --git a/byterun/reverse.h b/byterun/reverse.h index eaacf1bb..e80d1f7d 100644 --- a/byterun/reverse.h +++ b/byterun/reverse.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: reverse.h 6021 2003-12-15 18:10:51Z doligez $ */ +/* $Id$ */ /* Swap byte-order in 16, 32, and 64-bit integers or floats */ diff --git a/byterun/roots.c b/byterun/roots.c index d5ae3cb7..74fbb41e 100644 --- a/byterun/roots.c +++ b/byterun/roots.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: roots.c 8828 2008-03-10 19:56:39Z xleroy $ */ +/* $Id$ */ /* To walk the memory roots for garbage collection */ @@ -101,4 +101,3 @@ CAMLexport void caml_do_local_roots (scanning_action f, value *stack_low, } } } - diff --git a/byterun/roots.h b/byterun/roots.h index 4e02be2f..95c2f63f 100644 --- a/byterun/roots.h +++ b/byterun/roots.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: roots.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #ifndef CAML_ROOTS_H #define CAML_ROOTS_H diff --git a/byterun/signals.c b/byterun/signals.c index 1c001200..90fe8919 100644 --- a/byterun/signals.c +++ b/byterun/signals.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals.c 7904 2007-02-23 09:29:45Z xleroy $ */ +/* $Id$ */ /* Signal handling, code common to the bytecode and native systems */ @@ -267,7 +267,7 @@ CAMLprim value caml_install_signal_handler(value signal_number, value action) int sig, act, oldact; sig = caml_convert_signal_number(Int_val(signal_number)); - if (sig < 0 || sig >= NSIG) + if (sig < 0 || sig >= NSIG) caml_invalid_argument("Sys.signal: unavailable signal"); switch(action) { case Val_int(0): /* Signal_default */ diff --git a/byterun/signals.h b/byterun/signals.h index 96372b49..e5ba9877 100644 --- a/byterun/signals.h +++ b/byterun/signals.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals.h 7904 2007-02-23 09:29:45Z xleroy $ */ +/* $Id$ */ #ifndef CAML_SIGNALS_H #define CAML_SIGNALS_H diff --git a/byterun/signals_byt.c b/byterun/signals_byt.c index 13a1d04f..52381493 100644 --- a/byterun/signals_byt.c +++ b/byterun/signals_byt.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals_byt.c 7904 2007-02-23 09:29:45Z xleroy $ */ +/* $Id$ */ /* Signal handling, code specific to the bytecode interpreter */ diff --git a/byterun/signals_machdep.h b/byterun/signals_machdep.h index d96c0174..08c5f4cb 100644 --- a/byterun/signals_machdep.h +++ b/byterun/signals_machdep.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals_machdep.h 7905 2007-02-23 09:43:14Z xleroy $ */ +/* $Id$ */ /* Processor-specific operation: atomic "read and clear" */ diff --git a/byterun/stacks.c b/byterun/stacks.c index de562254..f43a4423 100644 --- a/byterun/stacks.c +++ b/byterun/stacks.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stacks.c 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* To initialize and resize the stacks */ diff --git a/byterun/stacks.h b/byterun/stacks.h index 6e8a2f5e..0c23a0a3 100644 --- a/byterun/stacks.h +++ b/byterun/stacks.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stacks.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* structure of the stacks */ diff --git a/byterun/startup.c b/byterun/startup.c index ecddfe40..f954e3ee 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: startup.c 9300 2009-06-18 11:17:16Z xclerc $ */ +/* $Id$ */ /* Start-up code */ @@ -176,7 +176,7 @@ int32 caml_seek_optional_section(int fd, struct exec_trailer *trail, char *name) int32 caml_seek_section(int fd, struct exec_trailer *trail, char *name) { int32 len = caml_seek_optional_section(fd, trail, name); - if (len == -1) + if (len == -1) caml_fatal_error_arg("Fatal_error: section `%s' is missing\n", name); return len; } diff --git a/byterun/startup.h b/byterun/startup.h index a3ffb8b6..0d1a5a60 100644 --- a/byterun/startup.h +++ b/byterun/startup.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: startup.h 6130 2004-02-22 15:07:51Z xleroy $ */ +/* $Id$ */ #ifndef CAML_STARTUP_H #define CAML_STARTUP_H diff --git a/byterun/str.c b/byterun/str.c index c2fb7d9c..760b154e 100644 --- a/byterun/str.c +++ b/byterun/str.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: str.c 7819 2007-01-30 09:52:08Z xleroy $ */ +/* $Id$ */ /* Operations on strings */ @@ -91,7 +91,7 @@ CAMLprim value caml_string_compare(value s1, value s2) if (s1 == s2) return Val_int(0); len1 = caml_string_length(s1); - len2 = caml_string_length(s2); + len2 = caml_string_length(s2); res = memcmp(String_val(s1), String_val(s2), len1 <= len2 ? len1 : len2); if (res < 0) return Val_int(-1); if (res > 0) return Val_int(1); @@ -104,22 +104,22 @@ CAMLprim value caml_string_lessthan(value s1, value s2) { return caml_string_compare(s1, s2) < Val_int(0) ? Val_true : Val_false; } - + CAMLprim value caml_string_lessequal(value s1, value s2) { return caml_string_compare(s1, s2) <= Val_int(0) ? Val_true : Val_false; } - + CAMLprim value caml_string_greaterthan(value s1, value s2) { return caml_string_compare(s1, s2) > Val_int(0) ? Val_true : Val_false; } - + CAMLprim value caml_string_greaterequal(value s1, value s2) { return caml_string_compare(s1, s2) >= Val_int(0) ? Val_true : Val_false; } - + CAMLprim value caml_blit_string(value s1, value ofs1, value s2, value ofs2, value n) { @@ -153,4 +153,3 @@ CAMLprim value caml_bitvect_test(value bv, value n) int pos = Int_val(n); return Val_int(Byte_u(bv, pos >> 3) & (1 << (pos & 7))); } - diff --git a/byterun/sys.c b/byterun/sys.c index 458d3172..bbc0e605 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sys.c 7944 2007-03-01 13:37:39Z xleroy $ */ +/* $Id$ */ /* Basic system calls */ diff --git a/byterun/sys.h b/byterun/sys.h index ef56d94a..4ad8011d 100644 --- a/byterun/sys.h +++ b/byterun/sys.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sys.h 7919 2007-02-25 12:38:36Z xleroy $ */ +/* $Id$ */ #ifndef CAML_SYS_H #define CAML_SYS_H diff --git a/byterun/terminfo.c b/byterun/terminfo.c index ac982d6e..e4502fb0 100644 --- a/byterun/terminfo.c +++ b/byterun/terminfo.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: terminfo.c 6045 2004-01-01 16:42:43Z doligez $ */ +/* $Id$ */ /* Read and output terminal commands */ diff --git a/byterun/ui.h b/byterun/ui.h index 2c213fdb..fcd9cd9f 100644 --- a/byterun/ui.h +++ b/byterun/ui.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: ui.h 6021 2003-12-15 18:10:51Z doligez $ */ +/* $Id$ */ /* Function declarations for non-Unix user interfaces */ diff --git a/byterun/unix.c b/byterun/unix.c index 77cb9e9d..89e0706e 100644 --- a/byterun/unix.c +++ b/byterun/unix.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unix.c 9147 2008-12-03 12:39:44Z xleroy $ */ +/* $Id$ */ /* Unix-specific stuff */ @@ -91,7 +91,7 @@ char * caml_search_in_path(struct ext_table * path, char * name) strcpy(fullname, name); return fullname; } - + #ifdef __CYGWIN32__ /* Cygwin needs special treatment because of the implicit ".exe" at the @@ -135,7 +135,7 @@ static char * cygwin_search_exe_in_path(struct ext_table * path, char * name) strcpy(fullname, name); return fullname; } - + #endif char * caml_search_exe_in_path(char * name) diff --git a/byterun/weak.c b/byterun/weak.c index 9661db61..c6c4a223 100644 --- a/byterun/weak.c +++ b/byterun/weak.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: weak.c 9028 2008-09-17 14:55:30Z doligez $ */ +/* $Id$ */ /* Operations on weak arrays */ diff --git a/byterun/weak.h b/byterun/weak.h index 5b4a02d0..270082db 100644 --- a/byterun/weak.h +++ b/byterun/weak.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: weak.h 6045 2004-01-01 16:42:43Z doligez $ */ +/* $Id$ */ /* Operations on weak arrays */ diff --git a/byterun/win32.c b/byterun/win32.c index 78bb8d67..866977b1 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: win32.c 8873 2008-04-22 12:24:10Z frisch $ */ +/* $Id$ */ /* Win32-specific stuff */ @@ -84,7 +84,7 @@ char * caml_search_in_path(struct ext_table * path, char * name) strcpy(fullname, name); return fullname; } - + CAMLexport char * caml_search_exe_in_path(char * name) { char * fullname, * filepart; @@ -95,14 +95,14 @@ CAMLexport char * caml_search_exe_in_path(char * name) while (1) { fullname = stat_alloc(pathlen); retcode = SearchPath(NULL, /* use system search path */ - name, - ".exe", /* add .exe extension if needed */ - pathlen, - fullname, - &filepart); + name, + ".exe", /* add .exe extension if needed */ + pathlen, + fullname, + &filepart); if (retcode == 0) { caml_gc_message(0x100, "%s not found in search path\n", - (uintnat) name); + (uintnat) name); strcpy(fullname, name); break; } @@ -406,7 +406,7 @@ void caml_signal_thread(void * lpParam) #if defined(NATIVE_CODE) && !defined(_WIN64) -/* Handling of system stack overflow. +/* Handling of system stack overflow. * Based on code provided by Olivier Andrieu. * An EXCEPTION_STACK_OVERFLOW is signaled when the guard page at the @@ -470,11 +470,11 @@ static void caml_reset_stack (void *faulting_address) /* restore the PAGE_GUARD protection on this page */ switch (osi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: - VirtualProtect (mbi.BaseAddress, page_size, + VirtualProtect (mbi.BaseAddress, page_size, mbi.Protect | PAGE_GUARD, &oldprot); break; case VER_PLATFORM_WIN32_WINDOWS: - VirtualProtect (mbi.BaseAddress, page_size, + VirtualProtect (mbi.BaseAddress, page_size, PAGE_NOACCESS, &oldprot); break; } diff --git a/camlp4/CHANGES b/camlp4/CHANGES index 571894b9..ef48fc42 100644 --- a/camlp4/CHANGES +++ b/camlp4/CHANGES @@ -160,8 +160,8 @@ Camlp4 Version 3.05 (Jacques Garrigue's idea): old syntax new syntax [| ... |] [ = ... ] - [| < ... |] [ < ... ] - [| > ... |] [ > ... ] + [| < ... |] [ < ... ] + [| > ... |] [ > ... ] This applies also in predefined quotations of syntax tree for types <:ctyp< ... >> - [05 Jun 02] Added option -ss in pr_o.cmo: print with double semicolons; @@ -600,7 +600,7 @@ Grammar interface is now: Grammar.tokens g "" -Missing features added +Missing features added * Added "lazy" statement (pa_r.cmo, pa_o.cmo, pr_r.cmo, pr_o.cmo) * Added print "assert" statement (pr_o.cmo, pr_r.cmo) * Added parsing of infix operators like in Ocaml (e.g. |||) in pa_o.cmo @@ -690,7 +690,7 @@ Errors and missings in normal and righteous syntaxes. Grammars, EXTEND, DELETE_RULE -* Added functorial version for grammars (started in version 1.07.1, +* Added functorial version for grammars (started in version 1.07.1, completed in this version). * Added statements GEXTEND and GDELETE_RULE in pa_extend.cmo for functorial version. diff --git a/camlp4/Camlp4/Camlp4Ast.partial.ml b/camlp4/Camlp4/Camlp4Ast.partial.ml index ba941d7a..19b5053b 100644 --- a/camlp4/Camlp4/Camlp4Ast.partial.ml +++ b/camlp4/Camlp4/Camlp4Ast.partial.ml @@ -160,7 +160,7 @@ (* sig sg end *) | MtSig of loc and sig_item (* mt with wc *) - | MtWit of loc and module_type and with_constr + | MtWit of loc and module_type and with_constr | MtAnt of loc and string (* $s$ *) ] and sig_item = [ SgNil of loc diff --git a/camlp4/Camlp4/Debug.ml b/camlp4/Camlp4/Debug.ml index e99ec9e1..cbd30922 100644 --- a/camlp4/Camlp4/Debug.ml +++ b/camlp4/Camlp4/Debug.ml @@ -29,7 +29,7 @@ value out_channel = open_out_gen [Open_wronly; Open_creat; Open_append; Open_text] 0o666 f with - [ Not_found -> stderr ]; + [ Not_found -> Pervasives.stderr ]; module StringSet = Set.Make String; @@ -45,7 +45,7 @@ value mode = StringSet.add (String.sub str i (String.length str - i)) acc ] in let sections = loop StringSet.empty 0 in if StringSet.mem "*" sections then fun _ -> True - else fun x -> StringSet.mem x sections + else fun x -> StringSet.mem x sections with [ Not_found -> fun _ -> False ]; value formatter = diff --git a/camlp4/Camlp4/PreCast.ml b/camlp4/Camlp4/PreCast.ml index 527c0c48..8e3da348 100644 --- a/camlp4/Camlp4/PreCast.ml +++ b/camlp4/Camlp4/PreCast.ml @@ -65,4 +65,3 @@ module Printers = struct module DumpCamlp4Ast = Printers.DumpCamlp4Ast.Make Syntax; module Null = Printers.Null.Make Syntax; end; - diff --git a/camlp4/Camlp4/Printers/Null.ml b/camlp4/Camlp4/Printers/Null.ml index d593f9ef..a9a2c486 100644 --- a/camlp4/Camlp4/Printers/Null.ml +++ b/camlp4/Camlp4/Printers/Null.ml @@ -24,7 +24,7 @@ end; module Make (Syntax : Sig.Syntax) = struct include Syntax; - + value print_interf ?input_file:(_) ?output_file:(_) _ = (); value print_implem ?input_file:(_) ?output_file:(_) _ = (); end; diff --git a/camlp4/Camlp4/Register.ml b/camlp4/Camlp4/Register.ml index 6044b0d9..4b681936 100644 --- a/camlp4/Camlp4/Register.ml +++ b/camlp4/Camlp4/Register.ml @@ -139,7 +139,7 @@ module CurrentParser = struct value parse_interf ?directive_handler loc strm = sig_item_parser.val ?directive_handler loc strm; value parse_implem ?directive_handler loc strm = - str_item_parser.val ?directive_handler loc strm; + str_item_parser.val ?directive_handler loc strm; end; module CurrentPrinter = struct @@ -147,7 +147,7 @@ module CurrentPrinter = struct value print_interf ?input_file ?output_file ast = sig_item_printer.val ?input_file ?output_file ast; value print_implem ?input_file ?output_file ast = - str_item_printer.val ?input_file ?output_file ast; + str_item_printer.val ?input_file ?output_file ast; end; value enable_ocaml_printer () = @@ -167,4 +167,3 @@ value enable_dump_camlp4_ast_printer () = value enable_null_printer () = let module M = Printer PP.Null.Id PP.Null.Make in (); - diff --git a/camlp4/Camlp4/Register.mli b/camlp4/Camlp4/Register.mli index df1180ff..51311439 100644 --- a/camlp4/Camlp4/Register.mli +++ b/camlp4/Camlp4/Register.mli @@ -91,4 +91,3 @@ value enable_ocamlr_printer : unit -> unit; value enable_null_printer : unit -> unit; value enable_dump_ocaml_ast_printer : unit -> unit; value enable_dump_camlp4_ast_printer : unit -> unit; - diff --git a/camlp4/Camlp4/Sig.ml b/camlp4/Camlp4/Sig.ml index 3e7106e7..f2df616b 100644 --- a/camlp4/Camlp4/Sig.ml +++ b/camlp4/Camlp4/Sig.ml @@ -247,7 +247,7 @@ module type Ast = sig (** This class is the base class for map traversal on the Ast. To make a custom traversal class one just extend it like that: - + This example swap pairs expression contents: open Camlp4.PreCast; [class swap = object @@ -744,7 +744,7 @@ module type Token = sig type t; value to_string : t -> string; - + value print : Format.formatter -> t -> unit; value match_keyword : string -> t -> bool; @@ -774,7 +774,7 @@ module type Token = sig function to produce token keywords instead. *) value filter : t -> token_filter; - (** Called by the grammar system when a keyword is used. + (** Called by the grammar system when a keyword is used. The boolean argument is True when it's the first time that keyword is used. If you do not care about this information just return [()]. *) value keyword_added : t -> string -> bool -> unit; @@ -955,10 +955,10 @@ module Grammar = struct (** The abstract type of grammar entries. The type parameter is the type of the semantic actions that are associated with this entry. *) type t 'a; - + (** Make a new entry from the given name. *) value mk : gram -> string -> t 'a; - + (** Make a new entry from a name and an hand made token parser. *) value of_parser : gram -> string -> (Stream.t (Token.t * Loc.t) -> 'a) -> t 'a; @@ -1367,4 +1367,3 @@ module type SyntaxExtension = functor (Syn : Syntax) and module Token = Syn.Token and module Gram = Syn.Gram and module Quotation = Syn.Quotation); - diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml index fa6deaaa..dc5192bf 100644 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +++ b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml @@ -490,7 +490,7 @@ module Make (Ast : Sig.Camlp4Ast) = struct mkrangepat loc c1 c2 | _ -> error loc "range pattern allowed only for characters" ] | PaRec loc p -> - mkpat loc (Ppat_record (List.map mklabpat (list_of_patt p []))) + mkpat loc (Ppat_record (List.map mklabpat (list_of_patt p []), Closed)) | PaStr loc s -> mkpat loc (Ppat_constant (Const_string (string_of_string_token loc s))) | <:patt@loc< ($p1$, $p2$) >> -> @@ -1009,8 +1009,8 @@ module Make (Ast : Sig.Camlp4Ast) = struct | CrCtr loc t1 t2 -> [Pcf_cstr (ctyp t1, ctyp t2, mkloc loc) :: l] | <:class_str_item< $cst1$; $cst2$ >> -> class_str_item cst1 (class_str_item cst2 l) - | CrInh _ ce "" -> [Pcf_inher (class_expr ce) None :: l] - | CrInh _ ce pb -> [Pcf_inher (class_expr ce) (Some pb) :: l] + | CrInh _ ce "" -> [Pcf_inher Fresh (class_expr ce) None :: l] + | CrInh _ ce pb -> [Pcf_inher Fresh (class_expr ce) (Some pb) :: l] | CrIni _ e -> [Pcf_init (expr e) :: l] | CrMth loc s b e t -> let t = @@ -1018,8 +1018,9 @@ module Make (Ast : Sig.Camlp4Ast) = struct [ <:ctyp<>> -> None | t -> Some (mkpolytype (ctyp t)) ] in let e = mkexp loc (Pexp_poly (expr e) t) in - [Pcf_meth (s, mkprivate b, e, mkloc loc) :: l] - | CrVal loc s b e -> [Pcf_val (s, mkmutable b, expr e, mkloc loc) :: l] + [Pcf_meth (s, mkprivate b, Fresh, e, mkloc loc) :: l] + | CrVal loc s b e -> + [Pcf_val (s, mkmutable b, Fresh, expr e, mkloc loc) :: l] | CrVir loc s b t -> [Pcf_virt (s, mkprivate b, mkpolytype (ctyp t), mkloc loc) :: l] | CrVvr loc s b t -> diff --git a/camlp4/Camlp4/Struct/CommentFilter.ml b/camlp4/Camlp4/Struct/CommentFilter.ml index 5867df40..9dac53fb 100644 --- a/camlp4/Camlp4/Struct/CommentFilter.ml +++ b/camlp4/Camlp4/Struct/CommentFilter.ml @@ -35,7 +35,7 @@ module Make (Token : Sig.Camlp4Token) = struct do { Queue.add (x, loc) q; debug comments "add: %S at %a@\n" x Loc.dump loc in self xs } - | [: ` x; xs :] -> + | [: ` x; xs :] -> (* debug comments "Found %a at %a@." Token.print x Loc.dump loc in *) [: ` x; self xs :] | [: :] -> [: :] ] diff --git a/camlp4/Camlp4/Struct/FreeVars.ml b/camlp4/Camlp4/Struct/FreeVars.ml index 66a9a8b0..7ce12e24 100644 --- a/camlp4/Camlp4/Struct/FreeVars.ml +++ b/camlp4/Camlp4/Struct/FreeVars.ml @@ -125,4 +125,3 @@ module Make (Ast : Sig.Camlp4Ast) = struct value free_vars env_init e = let fold = new fold_free_vars S.add ~env_init S.empty in (fold#expr e)#free; end; - diff --git a/camlp4/Camlp4/Struct/Grammar/Context.ml b/camlp4/Camlp4/Struct/Grammar/Context.ml index 75d731c6..b92c2915 100644 --- a/camlp4/Camlp4/Struct/Grammar/Context.ml +++ b/camlp4/Camlp4/Struct/Grammar/Context.ml @@ -38,7 +38,7 @@ module Make (Token : Sig.Token) : S with module Token = Token = struct type t = { strm : mutable Stream.t (Token.t * Loc.t); loc : mutable Loc.t }; - value loc_bp c = + value loc_bp c = match Stream.peek c.strm with [ None -> Loc.ghost | Some (_, loc) -> loc ]; diff --git a/camlp4/Camlp4/Struct/Grammar/Insert.ml b/camlp4/Camlp4/Struct/Grammar/Insert.ml index fc506a70..be57d0e9 100644 --- a/camlp4/Camlp4/Struct/Grammar/Insert.ml +++ b/camlp4/Camlp4/Struct/Grammar/Insert.ml @@ -63,7 +63,7 @@ module Make (Structure : Structure.S) = struct do { if a <> lev.assoc && entry.egram.warning_verbose.val then do { eprintf " Changing associativity of level \"%s\"\n" n; - flush stderr + flush Pervasives.stderr } else (); a @@ -73,7 +73,7 @@ module Make (Structure : Structure.S) = struct match lname with [ Some n -> if lname <> lev.lname && entry.egram.warning_verbose.val then do { - eprintf " Level label \"%s\" ignored\n" n; flush stderr + eprintf " Level label \"%s\" ignored\n" n; flush Pervasives.stderr } else () | None -> () ]; @@ -99,7 +99,7 @@ module Make (Structure : Structure.S) = struct do { eprintf "No level labelled \"%s\" in entry \"%s\"\n" n entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend" } | [lev :: levs] -> @@ -116,7 +116,7 @@ module Make (Structure : Structure.S) = struct do { eprintf "No level labelled \"%s\" in entry \"%s\"\n" n entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend" } | [lev :: levs] -> @@ -133,7 +133,7 @@ module Make (Structure : Structure.S) = struct do { eprintf "No level labelled \"%s\" in entry \"%s\"\n" n entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend" } | [lev :: levs] -> @@ -156,7 +156,7 @@ module Make (Structure : Structure.S) = struct eprintf "\ Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" entry.ename e.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend error" } else () @@ -165,7 +165,7 @@ module Make (Structure : Structure.S) = struct eprintf "\ Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" entry.ename e.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend error" } else () @@ -282,7 +282,7 @@ module Make (Structure : Structure.S) = struct | Dparser _ -> do { eprintf "Error: entry not extensible: \"%s\"\n" entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend" } ] in diff --git a/camlp4/Camlp4/Struct/Grammar/Parser.mli b/camlp4/Camlp4/Struct/Grammar/Parser.mli index 695982a3..e5a3faaa 100644 --- a/camlp4/Camlp4/Struct/Grammar/Parser.mli +++ b/camlp4/Camlp4/Struct/Grammar/Parser.mli @@ -65,4 +65,3 @@ module Make (Structure : Structure.S) : sig value continue_parser_of_entry : internal_entry -> int -> Loc.t -> Action.t -> Context.t -> Stream.t (Token.t * Loc.t) -> Action.t; end; - diff --git a/camlp4/Camlp4/Struct/Lexer.mll b/camlp4/Camlp4/Struct/Lexer.mll index f024fa43..40a08223 100644 --- a/camlp4/Camlp4/Struct/Lexer.mll +++ b/camlp4/Camlp4/Struct/Lexer.mll @@ -396,7 +396,7 @@ module Make (Token : Sig.Camlp4Token) SYMBOL(beginning ^ tok) } and maybe_quotation_at c = parse - | (ident as loc) '<' + | (ident as loc) '<' { mk_quotation quotation c "" loc (1 + String.length loc) } | symbolchar* as tok { SYMBOL("<@" ^ tok) } @@ -434,7 +434,7 @@ module Make (Token : Sig.Camlp4Token) | _ { store_parse (antiquot name) c } { - + let lexing_store s buff max = let rec self n s = if n >= max then n diff --git a/camlp4/Camlp4/Struct/Loc.ml b/camlp4/Camlp4/Struct/Loc.ml index 48974d82..ac42d4b1 100644 --- a/camlp4/Camlp4/Struct/Loc.ml +++ b/camlp4/Camlp4/Struct/Loc.ml @@ -25,32 +25,32 @@ open Format; handling: type pos = ... the same ... - + 1/ - + type loc = { file_name : string; start : pos; stop : pos }; - + type t = [ Nowhere | Ghost of loc (* the closest non ghost loc *) | Concrete of loc ]; - + 2/ - + type loc = { file_name : string; start : pos; stop : pos }; - + type t = option loc; - + 3/ - + type t = { file_name : option string; start : pos; @@ -195,7 +195,7 @@ value merge a b = debug loc "trivial merge@\n" in a else - let r = + let r = match (a.ghost, b.ghost) with [ (False, False) -> (* FIXME if a.file_name <> b.file_name then diff --git a/camlp4/Camlp4Bin.ml b/camlp4/Camlp4Bin.ml index 5a029b94..8658d9f8 100644 --- a/camlp4/Camlp4Bin.ml +++ b/camlp4/Camlp4Bin.ml @@ -171,10 +171,10 @@ value print_stdlib () = value usage ini_sl ext_sl = do { eprintf "\ -Usage: camlp4 [load-options] [--] [other-options] -Options: -.ml Parse this implementation file -.mli Parse this interface file +Usage: camlp4 [load-options] [--] [other-options]\n\ +Options:\n\ +.ml Parse this implementation file\n\ +.mli Parse this interface file\n\ .%s Load this module inside the Camlp4 core@." (if DynLoader.is_native then "cmxs " else "(cmo|cma)") ; @@ -194,7 +194,7 @@ Options: value warn_noassert () = do { eprintf "\ -camlp4 warning: option -noassert is obsolete +camlp4 warning: option -noassert is obsolete\n\ You should give the -noassert option to the ocaml compiler instead.@."; }; diff --git a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml index f5efd2c6..c0af8e53 100644 --- a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml +++ b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml @@ -56,22 +56,22 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct value exsk s k = <:expr< $lid:xsk s k$>>; value rec apply_expr accu = - fun - [ [] -> accu + fun + [ [] -> accu | [x :: xs] -> let _loc = Ast.loc_of_expr x in apply_expr <:expr< $accu$ $x$ >> xs ]; value rec apply_patt accu = - fun - [ [] -> accu + fun + [ [] -> accu | [x :: xs] -> let _loc = Ast.loc_of_patt x in apply_patt <:patt< $accu$ $x$ >> xs ]; value rec apply_ctyp accu = - fun - [ [] -> accu + fun + [ [] -> accu | [x :: xs] -> let _loc = Ast.loc_of_ctyp x in apply_ctyp <:ctyp< $accu$ $x$ >> xs ]; @@ -430,7 +430,7 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct let priv = if priv then Ast.BTrue else Ast.BFalse in <:class_str_item< method $private:priv$ $lid:id1$ : $ty$ = $funs$; $acc$ >> - and ctyp_name_of_name_params name params = + and ctyp_name_of_name_params name params = apply_ctyp <:ctyp< $id:name$ >> params and method_type_of_type_decl (_, name, params, ctyp, _) = diff --git a/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml b/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml index ea99c99e..6eb84999 100644 --- a/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml +++ b/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml @@ -151,7 +151,7 @@ value filter st = value meta_float _loc s = $m.flo$ _loc s; value meta_char _loc s = $m.chr$ _loc s; value meta_bool _loc = - fun + fun [ False -> $m_uid m "False"$ | True -> $m_uid m "True"$ ]; value rec meta_list mf_a _loc = diff --git a/camlp4/Camlp4Parsers/Camlp4DebugParser.ml b/camlp4/Camlp4Parsers/Camlp4DebugParser.ml index a815a96a..7e722818 100644 --- a/camlp4/Camlp4Parsers/Camlp4DebugParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4DebugParser.ml @@ -40,7 +40,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct StringSet.add (String.sub str i (String.length str - i)) acc ] in let sections = loop StringSet.empty 0 in if StringSet.mem "*" sections then fun _ -> True - else fun x -> StringSet.mem x sections + else fun x -> StringSet.mem x sections with [ Not_found -> fun _ -> False ]; value rec apply accu = diff --git a/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml b/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml index 50cbdb2b..2aa43345 100644 --- a/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml @@ -531,7 +531,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct [ <:expr< $lid:i$ >> -> i | _ -> failwith "internal error in the Grammar extension" ] in <:binding< $lid:i$ = - (grammar_entry_create $str:i$ : $uid:gm$.Entry.t '$x$) >> in + (grammar_entry_create $str:i$ : $uid:gm$.Entry.t '$x$) >> in let expr_of_name {expr = e; tvar = x; loc = _loc} = <:expr< ($e$ : $uid:gm$.Entry.t '$x$) >> in let e = @@ -710,7 +710,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct ; rule_list: [ [ "["; "]" -> [] - | "["; rules = LIST1 rule SEP "|"; "]" -> + | "["; rules = LIST1 rule SEP "|"; "]" -> retype_rule_list_without_patterns _loc rules ] ] ; rule: diff --git a/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml b/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml index 05cfab47..23db8685 100644 --- a/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml +++ b/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml @@ -45,21 +45,21 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct [ Some (KEYWORD "<-") -> n | Some (KEYWORD ("[" | "[<")) -> skip_patt (ignore_upto "]" (n + 1) + 1) - | Some (KEYWORD "(") -> + | Some (KEYWORD "(") -> skip_patt (ignore_upto ")" (n + 1) + 1) - | Some (KEYWORD "{") -> + | Some (KEYWORD "{") -> skip_patt (ignore_upto "}" (n + 1) + 1) | Some (KEYWORD ("as" | "::" | "," | "_")) | Some (LIDENT _ | UIDENT _) -> skip_patt (n + 1) | Some _ | None -> raise Stream.Failure ] and ignore_upto end_kwd n = match stream_peek_nth n strm with - [ Some (KEYWORD prm) when prm = end_kwd -> n + [ Some (KEYWORD prm) when prm = end_kwd -> n | Some (KEYWORD ("[" | "[<")) -> ignore_upto end_kwd (ignore_upto "]" (n + 1) + 1) | Some (KEYWORD "(") -> ignore_upto end_kwd (ignore_upto ")" (n + 1) + 1) - | Some (KEYWORD "{") -> + | Some (KEYWORD "{") -> ignore_upto end_kwd (ignore_upto "}" (n + 1) + 1) | Some _ -> ignore_upto end_kwd (n + 1) | None -> raise Stream.Failure ] @@ -69,7 +69,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct value map _loc p e l = match (p, e) with [ (<:patt< $lid:x$ >>, <:expr< $lid:y$ >>) when x = y -> l - | _ -> + | _ -> if Ast.is_irrefut_patt p then <:expr< List.map (fun $p$ -> $e$) $l$ >> else @@ -92,8 +92,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct [ [`gen (p, l)] -> map _loc p e l | [`gen (p, l); `cond b :: items] -> compr _loc e [`gen (p, filter _loc p b l) :: items] - | [`gen (p, l) :: ([ `gen (_, _) :: _ ] as is )] -> - concat _loc (map _loc p (compr _loc e is) l) + | [`gen (p, l) :: ([ `gen (_, _) :: _ ] as is )] -> + concat _loc (map _loc p (compr _loc e is) l) | _ -> raise Stream.Failure ]; DELETE_RULE Gram expr: "["; sem_expr_for_list; "]" END; @@ -122,8 +122,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | e = expr LEVEL "top" -> <:expr< [$e$] >> ] ] ; - item: - [ [ test_patt_lessminus; + item: + [ [ test_patt_lessminus; p = patt; "<-" ; e = expr LEVEL "top" -> `gen (p, e) | e = expr LEVEL "top" -> `cond e ] ] ; diff --git a/camlp4/Camlp4Parsers/Camlp4MacroParser.ml b/camlp4/Camlp4Parsers/Camlp4MacroParser.ml index ea359152..57f660da 100644 --- a/camlp4/Camlp4Parsers/Camlp4MacroParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4MacroParser.ml @@ -316,9 +316,9 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct [ [ "DEFINE"; i = uident; def = opt_macro_value -> SdDef i def | "UNDEF"; i = uident -> SdUnd i | "IFDEF"; uident_eval_ifdef; "THEN"; st1 = smlist_then; st2 = else_macro_def -> - make_SdITE_result st1 st2 + make_SdITE_result st1 st2 | "IFNDEF"; uident_eval_ifndef; "THEN"; st1 = smlist_then; st2 = else_macro_def -> - make_SdITE_result st1 st2 + make_SdITE_result st1 st2 | "INCLUDE"; fname = STRING -> SdLazy (lazy (parse_include_file str_items fname)) ] ] ; @@ -352,23 +352,23 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct ; smlist_then: [ [ sml = LIST1 [ d = macro_def; semi -> - execute_macro_if_active_branch _loc <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) Then d - | si = str_item; semi -> SdStr si ] -> sml ] ] + execute_macro_if_active_branch _loc <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) Then d + | si = str_item; semi -> SdStr si ] -> sml ] ] ; smlist_else: [ [ sml = LIST1 [ d = macro_def; semi -> - execute_macro_if_active_branch _loc <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) Else d - | si = str_item; semi -> SdStr si ] -> sml ] ] + execute_macro_if_active_branch _loc <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) Else d + | si = str_item; semi -> SdStr si ] -> sml ] ] ; sglist_then: [ [ sgl = LIST1 [ d = macro_def_sig; semi -> - execute_macro_if_active_branch _loc <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) Then d - | si = sig_item; semi -> SdStr si ] -> sgl ] ] + execute_macro_if_active_branch _loc <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) Then d + | si = sig_item; semi -> SdStr si ] -> sgl ] ] ; sglist_else: [ [ sgl = LIST1 [ d = macro_def_sig; semi -> - execute_macro_if_active_branch _loc <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) Else d - | si = sig_item; semi -> SdStr si ] -> sgl ] ] + execute_macro_if_active_branch _loc <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) Else d + | si = sig_item; semi -> SdStr si ] -> sgl ] ] ; endif: [ [ "END" -> () diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml index 8a1b53c0..fa550bac 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml @@ -449,7 +449,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct [ [ i = lident_colon; t = ctyp LEVEL "star"; "->"; ct = SELF -> <:class_type< [ ~ $i$ : $t$ ] -> $ct$ >> | "?"; i = a_LIDENT; ":"; t = ctyp LEVEL "star"; "->"; ct = SELF -> - <:class_type< [ ? $i$ : $t$ ] -> $ct$ >> + <:class_type< [ ? $i$ : $t$ ] -> $ct$ >> | i = OPTLABEL (* FIXME inline a_OPTLABEL *); t = ctyp LEVEL "star"; "->"; ct = SELF -> <:class_type< [ ? $i$ : $t$ ] -> $ct$ >> | test_ctyp_minusgreater; t = ctyp LEVEL "star"; "->"; ct = SELF -> diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml index dc3f3af3..9dab8bd7 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml @@ -33,18 +33,18 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct value help_sequences () = do { Printf.eprintf "\ -New syntax: - (e1; e2; ... ; en) OR begin e1; e2; ... ; en end - while e do e1; e2; ... ; en done - for v = v1 to/downto v2 do e1; e2; ... ; en done -Old syntax (still supported): - do {e1; e2; ... ; en} - while e do {e1; e2; ... ; en} - for v = v1 to/downto v2 do {e1; e2; ... ; en} -Very old (no more supported) syntax: - do e1; e2; ... ; en-1; return en - while e do e1; e2; ... ; en; done - for v = v1 to/downto v2 do e1; e2; ... ; en; done +New syntax:\n\ + (e1; e2; ... ; en) OR begin e1; e2; ... ; en end\n\ + while e do e1; e2; ... ; en done\n\ + for v = v1 to/downto v2 do e1; e2; ... ; en done\n\ +Old syntax (still supported):\n\ + do {e1; e2; ... ; en}\n\ + while e do {e1; e2; ... ; en}\n\ + for v = v1 to/downto v2 do {e1; e2; ... ; en}\n\ +Very old (no more supported) syntax:\n\ + do e1; e2; ... ; en-1; return en\n\ + while e do e1; e2; ... ; en; done\n\ + for v = v1 to/downto v2 do e1; e2; ... ; en; done\n\ "; flush stderr; exit 1 @@ -328,7 +328,7 @@ Very old (no more supported) syntax: <:expr< $lid:x$ >>) ; - let list_ok = ["<"; ">"; "<="; ">="; "="; "<>"; "=="; "!="; "$"] in + let list_ok = ["<"; ">"; "<="; ">="; "="; "<>"; "=="; "!="; "$"] in let list_first_char_ok = ['='; '<'; '>'; '|'; '&'; '$'; '!'] in let excl = ["<-"; "||"; "&&"] in Gram.Entry.setup_parser infixop0 @@ -776,7 +776,7 @@ Very old (no more supported) syntax: [ p = labeled_ipatt; e = SELF -> <:expr< fun $p$ -> $e$ >> | "="; e = expr -> <:expr< $e$ >> - | ":"; t = ctyp; "="; e = expr -> <:expr< ($e$ : $t$) >> + | ":"; t = ctyp; "="; e = expr -> <:expr< ($e$ : $t$) >> | ":>"; t = ctyp; "="; e = expr -> <:expr< ($e$ :> $t$) >> ] ] ; match_case: diff --git a/camlp4/Camlp4Top/Rprint.ml b/camlp4/Camlp4Top/Rprint.ml index ff2a7e58..978397d8 100644 --- a/camlp4/Camlp4Top/Rprint.ml +++ b/camlp4/Camlp4Top/Rprint.ml @@ -230,7 +230,7 @@ and print_simple_out_type ppf = (print_list print_out_label (fun ppf -> fprintf ppf ";@ ")) lbls | Otyp_abstract -> fprintf ppf "" | Otyp_alias _ _ | Otyp_poly _ _ - | Otyp_arrow _ _ _ | Otyp_constr _ [_ :: _] as ty -> + | Otyp_arrow _ _ _ | Otyp_constr _ [_ :: _] | Otyp_module _ as ty -> fprintf ppf "@[<1>(%a)@]" print_out_type ty ] in print_tkind ppf diff --git a/camlp4/Camlp4Top/Top.ml b/camlp4/Camlp4Top/Top.ml index 4bb92bdc..dcd3aa46 100644 --- a/camlp4/Camlp4Top/Top.ml +++ b/camlp4/Camlp4Top/Top.ml @@ -88,7 +88,7 @@ value wrap parse_fun = | x -> let x = match x with - [ Loc.Exc_located loc x -> do { + [ Loc.Exc_located loc x -> do { Toploop.print_location Format.err_formatter (Loc.to_ocaml_location loc); x } @@ -103,10 +103,10 @@ value wrap parse_fun = value toplevel_phrase token_stream = match Gram.parse_tokens_after_filter Syntax.top_phrase token_stream with [ Some str_item -> - let str_item = - AstFilters.fold_topphrase_filters (fun t filter -> filter t) str_item - in - Ast2pt.phrase str_item + let str_item = + AstFilters.fold_topphrase_filters (fun t filter -> filter t) str_item + in + Ast2pt.phrase str_item | None -> raise End_of_file ]; diff --git a/camlp4/Camlp4_config.ml b/camlp4/Camlp4_config.ml index 8eb19151..745930b7 100644 --- a/camlp4/Camlp4_config.ml +++ b/camlp4/Camlp4_config.ml @@ -21,7 +21,7 @@ let ocaml_standard_library = Camlp4_import.Config.standard_library;; let camlp4_standard_library = try Sys.getenv "CAMLP4LIB" - with Not_found -> + with Not_found -> Filename.concat ocaml_standard_library "camlp4";; let version = Sys.ocaml_version;; diff --git a/camlp4/Makefile.ml b/camlp4/Makefile.ml index 32d212be..eefedf14 100644 --- a/camlp4/Makefile.ml +++ b/camlp4/Makefile.ml @@ -89,7 +89,7 @@ let windows = Sys.os_type = "Win32" let may_define_unix = if windows then [] else ["-D UNIX"] let () = - !options.ocaml_Flags ^= "-w Ale -warn-error Ale"^^ + !options.ocaml_Flags ^= "-w Aler -warn-error Aler"^^ (if getenv "DTYPES" "" <> "" then "-annot" else ""); !options.ocaml_P4 := camlp4boot_may_debug may_define_unix; @@ -275,8 +275,8 @@ let file ppf f = loop () in try loop () with End_of_file -> () let ext_split f = split '.' f - - + + let print_packed_sources ppf ?(skip = fun _ -> false) package_dir = let _ = fold_units_sources [package_dir] (fun name sources k (skip, inside) -> @@ -356,4 +356,3 @@ let just_doc () = let doc () = pack (); just_doc () - diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml index 828ee061..b2ae399f 100644 --- a/camlp4/boot/Camlp4.ml +++ b/camlp4/boot/Camlp4.ml @@ -57,7 +57,7 @@ module Debug : in open_out_gen [ Open_wronly; Open_creat; Open_append; Open_text ] 0o666 f - with | Not_found -> stderr + with | Not_found -> Pervasives.stderr module StringSet = Set.Make(String) @@ -13890,7 +13890,7 @@ module Struct = error loc "range pattern allowed only for characters") | PaRec (loc, p) -> mkpat loc - (Ppat_record (List.map mklabpat (list_of_patt p []))) + (Ppat_record (List.map mklabpat (list_of_patt p []), Closed)) | PaStr (loc, s) -> mkpat loc (Ppat_constant @@ -14539,9 +14539,9 @@ module Struct = (Pcf_cstr (((ctyp t1), (ctyp t2), (mkloc loc)))) :: l | Ast.CrSem (_, cst1, cst2) -> class_str_item cst1 (class_str_item cst2 l) - | CrInh (_, ce, "") -> (Pcf_inher (class_expr ce, None)) :: l + | CrInh (_, ce, "") -> (Pcf_inher (Fresh, class_expr ce, None)) :: l | CrInh (_, ce, pb) -> - (Pcf_inher (class_expr ce, Some pb)) :: l + (Pcf_inher (Fresh, class_expr ce, Some pb)) :: l | CrIni (_, e) -> (Pcf_init (expr e)) :: l | CrMth (loc, s, b, e, t) -> let t = @@ -14549,9 +14549,9 @@ module Struct = | Ast.TyNil _ -> None | t -> Some (mkpolytype (ctyp t))) in let e = mkexp loc (Pexp_poly (expr e, t)) - in (Pcf_meth ((s, (mkprivate b), e, (mkloc loc)))) :: l + in (Pcf_meth ((s, (mkprivate b), Fresh, e, (mkloc loc)))) :: l | CrVal (loc, s, b, e) -> - (Pcf_val ((s, (mkmutable b), (expr e), (mkloc loc)))) :: l + (Pcf_val ((s, (mkmutable b), Fresh, (expr e), (mkloc loc)))) :: l | CrVir (loc, s, b, t) -> (Pcf_virt ((s, (mkprivate b), (mkpolytype (ctyp t)), (mkloc loc)))) :: @@ -16597,7 +16597,7 @@ module Struct = (eprintf " Changing associativity of level \"%s\"\n" n; - flush stderr) + flush Pervasives.stderr) else (); a) in @@ -16608,7 +16608,7 @@ module Struct = !(entry.egram.warning_verbose) then (eprintf " Level label \"%s\" ignored\n" n; - flush stderr) + flush Pervasives.stderr) else () | None -> ()); { @@ -16632,7 +16632,7 @@ module Struct = (eprintf "No level labelled \"%s\" in entry \"%s\"\n" n entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend") | lev :: levs -> if Tools.is_level_labelled n lev @@ -16648,7 +16648,7 @@ module Struct = (eprintf "No level labelled \"%s\" in entry \"%s\"\n" n entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend") | lev :: levs -> if Tools.is_level_labelled n lev @@ -16664,7 +16664,7 @@ module Struct = (eprintf "No level labelled \"%s\" in entry \"%s\"\n" n entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend") | lev :: levs -> if Tools.is_level_labelled n lev @@ -16688,7 +16688,7 @@ module Struct = "\ Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" entry.ename e.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend error") else () | Snterml (e, _) -> @@ -16698,7 +16698,7 @@ module Struct = "\ Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" entry.ename e.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend error") else () | Smeta (_, sl, _) -> List.iter (check_gram entry) sl @@ -16852,7 +16852,7 @@ module Struct = | Dparser _ -> (eprintf "Error: entry not extensible: \"%s\"\n" entry.ename; - flush stderr; + flush Pervasives.stderr; failwith "Grammar.extend") in if rules = [] diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml index e5f75862..8b5537a5 100644 --- a/camlp4/boot/camlp4boot.ml +++ b/camlp4/boot/camlp4boot.ml @@ -40,18 +40,18 @@ module R = let help_sequences () = (Printf.eprintf "\ -New syntax: - (e1; e2; ... ; en) OR begin e1; e2; ... ; en end - while e do e1; e2; ... ; en done - for v = v1 to/downto v2 do e1; e2; ... ; en done -Old syntax (still supported): - do {e1; e2; ... ; en} - while e do {e1; e2; ... ; en} - for v = v1 to/downto v2 do {e1; e2; ... ; en} -Very old (no more supported) syntax: - do e1; e2; ... ; en-1; return en - while e do e1; e2; ... ; en; done - for v = v1 to/downto v2 do e1; e2; ... ; en; done +New syntax:\n\ + (e1; e2; ... ; en) OR begin e1; e2; ... ; en end\n\ + while e do e1; e2; ... ; en done\n\ + for v = v1 to/downto v2 do e1; e2; ... ; en done\n\ +Old syntax (still supported):\n\ + do {e1; e2; ... ; en}\n\ + while e do {e1; e2; ... ; en}\n\ + for v = v1 to/downto v2 do {e1; e2; ... ; en}\n\ +Very old (no more supported) syntax:\n\ + do e1; e2; ... ; en-1; return en\n\ + while e do e1; e2; ... ; en; done\n\ + for v = v1 to/downto v2 do e1; e2; ... ; en; done\n\ "; flush stderr; exit 1) @@ -14449,10 +14449,10 @@ module B = let usage ini_sl ext_sl = (eprintf "\ -Usage: camlp4 [load-options] [--] [other-options] -Options: -.ml Parse this implementation file -.mli Parse this interface file +Usage: camlp4 [load-options] [--] [other-options]\n\ +Options:\n\ +.ml Parse this implementation file\n\ +.mli Parse this interface file\n\ .%s Load this module inside the Camlp4 core@." (if DynLoader.is_native then "cmxs " else "(cmo|cma)"); Options.print_usage_list ini_sl; @@ -14470,7 +14470,7 @@ Options: let warn_noassert () = eprintf "\ -camlp4 warning: option -noassert is obsolete +camlp4 warning: option -noassert is obsolete\n\ You should give the -noassert option to the ocaml compiler instead.@." type file_kind = diff --git a/camlp4/examples/expression_closure.ml b/camlp4/examples/expression_closure.ml index 58f15448..cfc47454 100644 --- a/camlp4/examples/expression_closure.ml +++ b/camlp4/examples/expression_closure.ml @@ -21,4 +21,3 @@ value f e = value print_expr = (new PP.printer ())#expr; printf "%a@." print_expr (f <>); - diff --git a/camlp4/examples/fancy_lambda_quot_test.ml b/camlp4/examples/fancy_lambda_quot_test.ml index 32009828..5ff348c9 100644 --- a/camlp4/examples/fancy_lambda_quot_test.ml +++ b/camlp4/examples/fancy_lambda_quot_test.ml @@ -3,7 +3,7 @@ let _loc = Camlp4.PreCast.Loc.ghost;; let rec propagate = function | << $f$ $x$ $y$ >> -> begin match propagate f, propagate x, propagate y with - | f, << $int:i$ >>, << $int:j$ >> -> + | f, << $int:i$ >>, << $int:j$ >> -> begin match f with | << plus >> -> << $int:i + j$ >> | << minus >> -> << $int:i - j$ >> diff --git a/camlp4/examples/global_handler.ml b/camlp4/examples/global_handler.ml index 758e4f96..e2da5287 100644 --- a/camlp4/examples/global_handler.ml +++ b/camlp4/examples/global_handler.ml @@ -17,4 +17,3 @@ AstFilters.register_str_item_filter begin fun st -> <:str_item@ghost< try let module Main = struct $st$ end in () with e -> $global_handler_ref.val$ e >> end; - diff --git a/camlp4/examples/lambda_test.ml b/camlp4/examples/lambda_test.ml index 408461a5..e2603259 100644 --- a/camlp4/examples/lambda_test.ml +++ b/camlp4/examples/lambda_test.ml @@ -10,4 +10,3 @@ let rec_nat = let plus = << fun n -> fun m -> $rec_nat$ n (fun n -> fun p -> $succ$ p) m >> let times = << fun n -> fun m -> $rec_nat$ n (fun n -> fun p -> $plus$ m p) $zero$ >> let fact = << fun n -> $rec_nat$ n (fun n -> fun p -> $times$ ($succ$ n) p) $one$ >> - diff --git a/camlp4/man/Makefile b/camlp4/man/Makefile index bf33c7a0..381bdcc5 100644 --- a/camlp4/man/Makefile +++ b/camlp4/man/Makefile @@ -12,9 +12,9 @@ install-local: $(MKDIR) $(MANDIR)/man1 ; \ cp $(TARGET) $(MANDIR)/man1/. ; \ for i in $(ALIASES); do \ - rm -f $(MANDIR)/man1/$$i; \ - echo '.so man1/$(TARGET)' > $(MANDIR)/man1/$$i; \ - done; \ + rm -f $(MANDIR)/man1/$$i; \ + echo '.so man1/$(TARGET)' > $(MANDIR)/man1/$$i; \ + done; \ fi camlp4.1: camlp4.1.tpl diff --git a/camlp4/man/camlp4.help.tpl b/camlp4/man/camlp4.help.tpl deleted file mode 100644 index 8b137891..00000000 --- a/camlp4/man/camlp4.help.tpl +++ /dev/null @@ -1 +0,0 @@ - diff --git a/camlp4/test/fixtures/assert.ml b/camlp4/test/fixtures/assert.ml new file mode 100644 index 00000000..8d9ea499 --- /dev/null +++ b/camlp4/test/fixtures/assert.ml @@ -0,0 +1,3 @@ +module MySet = Set.Make(String);; +let set = MySet.empty;; +assert (MySet.is_empty set);; diff --git a/camlp4/test/fixtures/backquoted_irrefutable_tuple.ml b/camlp4/test/fixtures/backquoted_irrefutable_tuple.ml new file mode 100644 index 00000000..f6764cb2 --- /dev/null +++ b/camlp4/test/fixtures/backquoted_irrefutable_tuple.ml @@ -0,0 +1,3 @@ +EXTEND Gram + abc: [ [ `(x,y) -> x + y ] ]; +END; diff --git a/camlp4/test/fixtures/backquoted_record.ml b/camlp4/test/fixtures/backquoted_record.ml new file mode 100644 index 00000000..e056f731 --- /dev/null +++ b/camlp4/test/fixtures/backquoted_record.ml @@ -0,0 +1,4 @@ +EXTEND Gram + raw_string: + [[ `QUOTATION { Sig.Quotation.q_contents = c; q_name = n } -> (c, n) ]]; +END; diff --git a/camlp4/test/fixtures/backquoted_tuple.ml b/camlp4/test/fixtures/backquoted_tuple.ml new file mode 100644 index 00000000..72ae1a6b --- /dev/null +++ b/camlp4/test/fixtures/backquoted_tuple.ml @@ -0,0 +1,3 @@ +EXTEND Gram + abc: [ [ `(A,y) -> y ] ]; +END; diff --git a/camlp4/test/fixtures/big-tab1.ml b/camlp4/test/fixtures/big-tab1.ml new file mode 100644 index 00000000..254da825 --- /dev/null +++ b/camlp4/test/fixtures/big-tab1.ml @@ -0,0 +1,704 @@ +[| +aaa; +aab; +aac; +aad; +aae; +aaf; +aag; +aah; +aai; +aaj; +aak; +aal; +aam; +aan; +aao; +aap; +aaq; +aar; +aas; +aat; +aau; +aav; +aaw; +aax; +aay; +aaz; +aba; +abb; +abc; +abd; +abe; +abf; +abg; +abh; +abi; +abj; +abk; +abl; +abm; +abn; +abo; +abp; +abq; +abr; +abs; +abt; +abu; +abv; +abw; +abx; +aby; +abz; +aca; +acb; +acc; +acd; +ace; +acf; +acg; +ach; +aci; +acj; +ack; +acl; +acm; +acn; +aco; +acp; +acq; +acr; +acs; +act; +acu; +acv; +acw; +acx; +acy; +acz; +ada; +adb; +adc; +add; +ade; +adf; +adg; +adh; +adi; +adj; +adk; +adl; +adm; +adn; +ado; +adp; +adq; +adr; +ads; +adt; +adu; +adv; +adw; +adx; +ady; +adz; +aea; +aeb; +aec; +aed; +aee; +aef; +aeg; +aeh; +aei; +aej; +aek; +ael; +aem; +aen; +aeo; +aep; +aeq; +aer; +aes; +aet; +aeu; +aev; +aew; +aex; +aey; +aez; +afa; +afb; +afc; +afd; +afe; +aff; +afg; +afh; +afi; +afj; +afk; +afl; +afm; +afn; +afo; +afp; +afq; +afr; +afs; +aft; +afu; +afv; +afw; +afx; +afy; +afz; +aga; +agb; +agc; +agd; +age; +agf; +agg; +agh; +agi; +agj; +agk; +agl; +agm; +agn; +ago; +agp; +agq; +agr; +ags; +agt; +agu; +agv; +agw; +agx; +agy; +agz; +aha; +ahb; +ahc; +ahd; +ahe; +ahf; +ahg; +ahh; +ahi; +ahj; +ahk; +ahl; +ahm; +ahn; +aho; +ahp; +ahq; +ahr; +ahs; +aht; +ahu; +ahv; +ahw; +ahx; +ahy; +ahz; +aia; +aib; +aic; +aid; +aie; +aif; +aig; +aih; +aii; +aij; +aik; +ail; +aim; +ain; +aio; +aip; +aiq; +air; +ais; +ait; +aiu; +aiv; +aiw; +aix; +aiy; +aiz; +aja; +ajb; +ajc; +ajd; +aje; +ajf; +ajg; +ajh; +aji; +ajj; +ajk; +ajl; +ajm; +ajn; +ajo; +ajp; +ajq; +ajr; +ajs; +ajt; +aju; +ajv; +ajw; +ajx; +ajy; +ajz; +aka; +akb; +akc; +akd; +ake; +akf; +akg; +akh; +aki; +akj; +akk; +akl; +akm; +akn; +ako; +akp; +akq; +akr; +aks; +akt; +aku; +akv; +akw; +akx; +aky; +akz; +ala; +alb; +alc; +ald; +ale; +alf; +alg; +alh; +ali; +alj; +alk; +all; +alm; +aln; +alo; +alp; +alq; +alr; +als; +alt; +alu; +alv; +alw; +alx; +aly; +alz; +ama; +amb; +amc; +amd; +ame; +amf; +amg; +amh; +ami; +amj; +amk; +aml; +amm; +amn; +amo; +amp; +amq; +amr; +ams; +amt; +amu; +amv; +amw; +amx; +amy; +amz; +ana; +anb; +anc; +ane; +anf; +ang; +anh; +ani; +anj; +ank; +anl; +anm; +ann; +ano; +anp; +anq; +anr; +ans; +ant; +anu; +anv; +anw; +anx; +any; +anz; +aoa; +aob; +aoc; +aod; +aoe; +aof; +aog; +aoh; +aoi; +aoj; +aok; +aol; +aom; +aon; +aoo; +aop; +aoq; +aor; +aos; +aot; +aou; +aov; +aow; +aox; +aoy; +aoz; +apa; +apb; +apc; +apd; +ape; +apf; +apg; +aph; +api; +apj; +apk; +apl; +apm; +apn; +apo; +app; +apq; +apr; +aps; +apt; +apu; +apv; +apw; +apx; +apy; +apz; +aqa; +aqb; +aqc; +aqd; +aqe; +aqf; +aqg; +aqh; +aqi; +aqj; +aqk; +aql; +aqm; +aqn; +aqo; +aqp; +aqq; +aqr; +aqs; +aqt; +aqu; +aqv; +aqw; +aqx; +aqy; +aqz; +ara; +arb; +arc; +ard; +are; +arf; +arg; +arh; +ari; +arj; +ark; +arl; +arm; +arn; +aro; +arp; +arq; +arr; +ars; +art; +aru; +arv; +arw; +arx; +ary; +arz; +asa; +asb; +asc; +asd; +ase; +asf; +asg; +ash; +asi; +asj; +ask; +asl; +asm; +asn; +aso; +asp; +asq; +ass; +ast; +asu; +asv; +asw; +asx; +asy; +asz; +ata; +atb; +atc; +atd; +ate; +atf; +atg; +ath; +ati; +atj; +atk; +atl; +atm; +atn; +ato; +atp; +atq; +atr; +ats; +att; +atu; +atv; +atw; +atx; +aty; +atz; +aua; +aub; +auc; +aud; +aue; +auf; +aug; +auh; +aui; +auj; +auk; +aul; +aum; +aun; +auo; +aup; +auq; +aur; +aus; +aut; +auu; +auv; +auw; +aux; +auy; +auz; +ava; +avb; +avc; +avd; +ave; +avf; +avg; +avh; +avi; +avj; +avk; +avl; +avm; +avn; +avo; +avp; +avq; +avr; +avs; +avt; +avu; +avv; +avw; +avx; +avy; +avz; +awa; +awb; +awc; +awd; +awe; +awf; +awg; +awh; +awi; +awj; +awk; +awl; +awm; +awn; +awo; +awp; +awq; +awr; +aws; +awt; +awu; +awv; +aww; +awx; +awy; +awz; +axa; +axb; +axc; +axd; +axe; +axf; +axg; +axh; +axi; +axj; +axk; +axl; +axm; +axn; +axo; +axp; +axq; +axr; +axs; +axt; +axu; +axv; +axw; +axx; +axy; +axz; +aya; +ayb; +ayc; +ayd; +aye; +ayf; +ayg; +ayh; +ayi; +ayj; +ayk; +ayl; +aym; +ayn; +ayo; +ayp; +ayq; +ayr; +ays; +ayt; +ayu; +ayv; +ayw; +ayx; +ayy; +ayz; +aza; +azb; +azc; +azd; +aze; +azf; +azg; +azh; +azi; +azj; +azk; +azl; +azm; +azn; +azo; +azp; +azq; +azr; +azs; +azt; +azu; +azv; +azw; +azx; +azy; +azz; +baa; +bab; +bac; +bad; +bae; +baf; +bag; +bah; +bai; +baj; +bak; +bal; +bam; +ban; +bao; +bap; +baq; +bar; +bas; +bat; +bau; +bav; +baw; +bax; +bay; +baz; +bba; +bbb +|]; diff --git a/camlp4/test/fixtures/big-tab2.ml b/camlp4/test/fixtures/big-tab2.ml new file mode 100644 index 00000000..e640f34d --- /dev/null +++ b/camlp4/test/fixtures/big-tab2.ml @@ -0,0 +1,18282 @@ +[| +aaaa; +aaab; +aaac; +aaad; +aaae; +aaaf; +aaag; +aaah; +aaai; +aaaj; +aaak; +aaal; +aaam; +aaan; +aaao; +aaap; +aaaq; +aaar; +aaas; +aaat; +aaau; +aaav; +aaaw; +aaax; +aaay; +aaaz; +aaba; +aabb; +aabc; +aabd; +aabe; +aabf; +aabg; +aabh; +aabi; +aabj; +aabk; +aabl; +aabm; +aabn; +aabo; +aabp; +aabq; +aabr; +aabs; +aabt; +aabu; +aabv; +aabw; +aabx; +aaby; +aabz; +aaca; +aacb; +aacc; +aacd; +aace; +aacf; +aacg; +aach; +aaci; +aacj; +aack; +aacl; +aacm; +aacn; +aaco; +aacp; +aacq; +aacr; +aacs; +aact; +aacu; +aacv; +aacw; +aacx; +aacy; +aacz; +aada; +aadb; +aadc; +aadd; +aade; +aadf; +aadg; +aadh; +aadi; +aadj; +aadk; +aadl; +aadm; +aadn; +aado; +aadp; +aadq; +aadr; +aads; +aadt; +aadu; +aadv; +aadw; +aadx; +aady; +aadz; +aaea; +aaeb; +aaec; +aaed; +aaee; +aaef; +aaeg; +aaeh; +aaei; +aaej; +aaek; +aael; +aaem; +aaen; +aaeo; +aaep; +aaeq; +aaer; +aaes; +aaet; +aaeu; +aaev; +aaew; +aaex; +aaey; +aaez; +aafa; +aafb; +aafc; +aafd; +aafe; +aaff; +aafg; +aafh; +aafi; +aafj; +aafk; +aafl; +aafm; +aafn; +aafo; +aafp; +aafq; +aafr; +aafs; +aaft; +aafu; +aafv; +aafw; +aafx; +aafy; +aafz; +aaga; +aagb; +aagc; +aagd; +aage; +aagf; +aagg; +aagh; +aagi; +aagj; +aagk; +aagl; +aagm; +aagn; +aago; +aagp; +aagq; +aagr; +aags; +aagt; +aagu; +aagv; +aagw; +aagx; +aagy; +aagz; +aaha; +aahb; +aahc; +aahd; +aahe; +aahf; +aahg; +aahh; +aahi; +aahj; +aahk; +aahl; +aahm; +aahn; +aaho; +aahp; +aahq; +aahr; +aahs; +aaht; +aahu; +aahv; +aahw; +aahx; +aahy; +aahz; +aaia; +aaib; +aaic; +aaid; +aaie; +aaif; +aaig; +aaih; +aaii; +aaij; +aaik; +aail; +aaim; +aain; +aaio; +aaip; +aaiq; +aair; +aais; +aait; +aaiu; +aaiv; +aaiw; +aaix; +aaiy; +aaiz; +aaja; +aajb; +aajc; +aajd; +aaje; +aajf; +aajg; +aajh; +aaji; +aajj; +aajk; +aajl; +aajm; +aajn; +aajo; +aajp; +aajq; +aajr; +aajs; +aajt; +aaju; +aajv; +aajw; +aajx; +aajy; +aajz; +aaka; +aakb; +aakc; +aakd; +aake; +aakf; +aakg; +aakh; +aaki; +aakj; +aakk; +aakl; +aakm; +aakn; +aako; +aakp; +aakq; +aakr; +aaks; +aakt; +aaku; +aakv; +aakw; +aakx; +aaky; +aakz; +aala; +aalb; +aalc; +aald; +aale; +aalf; +aalg; +aalh; +aali; +aalj; +aalk; +aall; +aalm; +aaln; +aalo; +aalp; +aalq; +aalr; +aals; +aalt; +aalu; +aalv; +aalw; +aalx; +aaly; +aalz; +aama; +aamb; +aamc; +aamd; +aame; +aamf; +aamg; +aamh; +aami; +aamj; +aamk; +aaml; +aamm; +aamn; +aamo; +aamp; +aamq; +aamr; +aams; +aamt; +aamu; +aamv; +aamw; +aamx; +aamy; +aamz; +aana; +aanb; +aanc; +aand; +aane; +aanf; +aang; +aanh; +aani; +aanj; +aank; +aanl; +aanm; +aann; +aano; +aanp; +aanq; +aanr; +aans; +aant; +aanu; +aanv; +aanw; +aanx; +aany; +aanz; +aaoa; +aaob; +aaoc; +aaod; +aaoe; +aaof; +aaog; +aaoh; +aaoi; +aaoj; +aaok; +aaol; +aaom; +aaon; +aaoo; +aaop; +aaoq; +aaor; +aaos; +aaot; +aaou; +aaov; +aaow; +aaox; +aaoy; +aaoz; +aapa; +aapb; +aapc; +aapd; +aape; +aapf; +aapg; +aaph; +aapi; +aapj; +aapk; +aapl; +aapm; +aapn; +aapo; +aapp; +aapq; +aapr; +aaps; +aapt; +aapu; +aapv; +aapw; +aapx; +aapy; +aapz; +aaqa; +aaqb; +aaqc; +aaqd; +aaqe; +aaqf; +aaqg; +aaqh; +aaqi; +aaqj; +aaqk; +aaql; +aaqm; +aaqn; +aaqo; +aaqp; +aaqq; +aaqr; +aaqs; +aaqt; +aaqu; +aaqv; +aaqw; +aaqx; +aaqy; +aaqz; +aara; +aarb; +aarc; +aard; +aare; +aarf; +aarg; +aarh; +aari; +aarj; +aark; +aarl; +aarm; +aarn; +aaro; +aarp; +aarq; +aarr; +aars; +aart; +aaru; +aarv; +aarw; +aarx; +aary; +aarz; +aasa; +aasb; +aasc; +aasd; +aase; +aasf; +aasg; +aash; +aasi; +aasj; +aask; +aasl; +aasm; +aasn; +aaso; +aasp; +aasq; +aasr; +aass; +aast; +aasu; +aasv; +aasw; +aasx; +aasy; +aasz; +aata; +aatb; +aatc; +aatd; +aate; +aatf; +aatg; +aath; +aati; +aatj; +aatk; +aatl; +aatm; +aatn; +aato; +aatp; +aatq; +aatr; +aats; +aatt; +aatu; +aatv; +aatw; +aatx; +aaty; +aatz; +aaua; +aaub; +aauc; +aaud; +aaue; +aauf; +aaug; +aauh; +aaui; +aauj; +aauk; +aaul; +aaum; +aaun; +aauo; +aaup; +aauq; +aaur; +aaus; +aaut; +aauu; +aauv; +aauw; +aaux; +aauy; +aauz; +aava; +aavb; +aavc; +aavd; +aave; +aavf; +aavg; +aavh; +aavi; +aavj; +aavk; +aavl; +aavm; +aavn; +aavo; +aavp; +aavq; +aavr; +aavs; +aavt; +aavu; +aavv; +aavw; +aavx; +aavy; +aavz; +aawa; +aawb; +aawc; +aawd; +aawe; +aawf; +aawg; +aawh; +aawi; +aawj; +aawk; +aawl; +aawm; +aawn; +aawo; +aawp; +aawq; +aawr; +aaws; +aawt; +aawu; +aawv; +aaww; +aawx; +aawy; +aawz; +aaxa; +aaxb; +aaxc; +aaxd; +aaxe; +aaxf; +aaxg; +aaxh; +aaxi; +aaxj; +aaxk; +aaxl; +aaxm; +aaxn; +aaxo; +aaxp; +aaxq; +aaxr; +aaxs; +aaxt; +aaxu; +aaxv; +aaxw; +aaxx; +aaxy; +aaxz; +aaya; +aayb; +aayc; +aayd; +aaye; +aayf; +aayg; +aayh; +aayi; +aayj; +aayk; +aayl; +aaym; +aayn; +aayo; +aayp; +aayq; +aayr; +aays; +aayt; +aayu; +aayv; +aayw; +aayx; +aayy; +aayz; +aaza; +aazb; +aazc; +aazd; +aaze; +aazf; +aazg; +aazh; +aazi; +aazj; +aazk; +aazl; +aazm; +aazn; +aazo; +aazp; +aazq; +aazr; +aazs; +aazt; +aazu; +aazv; +aazw; +aazx; +aazy; +aazz; +abaa; +abab; +abac; +abad; +abae; +abaf; +abag; +abah; +abai; +abaj; +abak; +abal; +abam; +aban; +abao; +abap; +abaq; +abar; +abas; +abat; +abau; +abav; +abaw; +abax; +abay; +abaz; +abba; +abbb; +abbc; +abbd; +abbe; +abbf; +abbg; +abbh; +abbi; +abbj; +abbk; +abbl; +abbm; +abbn; +abbo; +abbp; +abbq; +abbr; +abbs; +abbt; +abbu; +abbv; +abbw; +abbx; +abby; +abbz; +abca; +abcb; +abcc; +abcd; +abce; +abcf; +abcg; +abch; +abci; +abcj; +abck; +abcl; +abcm; +abcn; +abco; +abcp; +abcq; +abcr; +abcs; +abct; +abcu; +abcv; +abcw; +abcx; +abcy; +abcz; +abda; +abdb; +abdc; +abdd; +abde; +abdf; +abdg; +abdh; +abdi; +abdj; +abdk; +abdl; +abdm; +abdn; +abdo; +abdp; +abdq; +abdr; +abds; +abdt; +abdu; +abdv; +abdw; +abdx; +abdy; +abdz; +abea; +abeb; +abec; +abed; +abee; +abef; +abeg; +abeh; +abei; +abej; +abek; +abel; +abem; +aben; +abeo; +abep; +abeq; +aber; +abes; +abet; +abeu; +abev; +abew; +abex; +abey; +abez; +abfa; +abfb; +abfc; +abfd; +abfe; +abff; +abfg; +abfh; +abfi; +abfj; +abfk; +abfl; +abfm; +abfn; +abfo; +abfp; +abfq; +abfr; +abfs; +abft; +abfu; +abfv; +abfw; +abfx; +abfy; +abfz; +abga; +abgb; +abgc; +abgd; +abge; +abgf; +abgg; +abgh; +abgi; +abgj; +abgk; +abgl; +abgm; +abgn; +abgo; +abgp; +abgq; +abgr; +abgs; +abgt; +abgu; +abgv; +abgw; +abgx; +abgy; +abgz; +abha; +abhb; +abhc; +abhd; +abhe; +abhf; +abhg; +abhh; +abhi; +abhj; +abhk; +abhl; +abhm; +abhn; +abho; +abhp; +abhq; +abhr; +abhs; +abht; +abhu; +abhv; +abhw; +abhx; +abhy; +abhz; +abia; +abib; +abic; +abid; +abie; +abif; +abig; +abih; +abii; +abij; +abik; +abil; +abim; +abin; +abio; +abip; +abiq; +abir; +abis; +abit; +abiu; +abiv; +abiw; +abix; +abiy; +abiz; +abja; +abjb; +abjc; +abjd; +abje; +abjf; +abjg; +abjh; +abji; +abjj; +abjk; +abjl; +abjm; +abjn; +abjo; +abjp; +abjq; +abjr; +abjs; +abjt; +abju; +abjv; +abjw; +abjx; +abjy; +abjz; +abka; +abkb; +abkc; +abkd; +abke; +abkf; +abkg; +abkh; +abki; +abkj; +abkk; +abkl; +abkm; +abkn; +abko; +abkp; +abkq; +abkr; +abks; +abkt; +abku; +abkv; +abkw; +abkx; +abky; +abkz; +abla; +ablb; +ablc; +abld; +able; +ablf; +ablg; +ablh; +abli; +ablj; +ablk; +abll; +ablm; +abln; +ablo; +ablp; +ablq; +ablr; +abls; +ablt; +ablu; +ablv; +ablw; +ablx; +ably; +ablz; +abma; +abmb; +abmc; +abmd; +abme; +abmf; +abmg; +abmh; +abmi; +abmj; +abmk; +abml; +abmm; +abmn; +abmo; +abmp; +abmq; +abmr; +abms; +abmt; +abmu; +abmv; +abmw; +abmx; +abmy; +abmz; +abna; +abnb; +abnc; +abnd; +abne; +abnf; +abng; +abnh; +abni; +abnj; +abnk; +abnl; +abnm; +abnn; +abno; +abnp; +abnq; +abnr; +abns; +abnt; +abnu; +abnv; +abnw; +abnx; +abny; +abnz; +aboa; +abob; +aboc; +abod; +aboe; +abof; +abog; +aboh; +aboi; +aboj; +abok; +abol; +abom; +abon; +aboo; +abop; +aboq; +abor; +abos; +abot; +abou; +abov; +abow; +abox; +aboy; +aboz; +abpa; +abpb; +abpc; +abpd; +abpe; +abpf; +abpg; +abph; +abpi; +abpj; +abpk; +abpl; +abpm; +abpn; +abpo; +abpp; +abpq; +abpr; +abps; +abpt; +abpu; +abpv; +abpw; +abpx; +abpy; +abpz; +abqa; +abqb; +abqc; +abqd; +abqe; +abqf; +abqg; +abqh; +abqi; +abqj; +abqk; +abql; +abqm; +abqn; +abqo; +abqp; +abqq; +abqr; +abqs; +abqt; +abqu; +abqv; +abqw; +abqx; +abqy; +abqz; +abra; +abrb; +abrc; +abrd; +abre; +abrf; +abrg; +abrh; +abri; +abrj; +abrk; +abrl; +abrm; +abrn; +abro; +abrp; +abrq; +abrr; +abrs; +abrt; +abru; +abrv; +abrw; +abrx; +abry; +abrz; +absa; +absb; +absc; +absd; +abse; +absf; +absg; +absh; +absi; +absj; +absk; +absl; +absm; +absn; +abso; +absp; +absq; +absr; +abss; +abst; +absu; +absv; +absw; +absx; +absy; +absz; +abta; +abtb; +abtc; +abtd; +abte; +abtf; +abtg; +abth; +abti; +abtj; +abtk; +abtl; +abtm; +abtn; +abto; +abtp; +abtq; +abtr; +abts; +abtt; +abtu; +abtv; +abtw; +abtx; +abty; +abtz; +abua; +abub; +abuc; +abud; +abue; +abuf; +abug; +abuh; +abui; +abuj; +abuk; +abul; +abum; +abun; +abuo; +abup; +abuq; +abur; +abus; +abut; +abuu; +abuv; +abuw; +abux; +abuy; +abuz; +abva; +abvb; +abvc; +abvd; +abve; +abvf; +abvg; +abvh; +abvi; +abvj; +abvk; +abvl; +abvm; +abvn; +abvo; +abvp; +abvq; +abvr; +abvs; +abvt; +abvu; +abvv; +abvw; +abvx; +abvy; +abvz; +abwa; +abwb; +abwc; +abwd; +abwe; +abwf; +abwg; +abwh; +abwi; +abwj; +abwk; +abwl; +abwm; +abwn; +abwo; +abwp; +abwq; +abwr; +abws; +abwt; +abwu; +abwv; +abww; +abwx; +abwy; +abwz; +abxa; +abxb; +abxc; +abxd; +abxe; +abxf; +abxg; +abxh; +abxi; +abxj; +abxk; +abxl; +abxm; +abxn; +abxo; +abxp; +abxq; +abxr; +abxs; +abxt; +abxu; +abxv; +abxw; +abxx; +abxy; +abxz; +abya; +abyb; +abyc; +abyd; +abye; +abyf; +abyg; +abyh; +abyi; +abyj; +abyk; +abyl; +abym; +abyn; +abyo; +abyp; +abyq; +abyr; +abys; +abyt; +abyu; +abyv; +abyw; +abyx; +abyy; +abyz; +abza; +abzb; +abzc; +abzd; +abze; +abzf; +abzg; +abzh; +abzi; +abzj; +abzk; +abzl; +abzm; +abzn; +abzo; +abzp; +abzq; +abzr; +abzs; +abzt; +abzu; +abzv; +abzw; +abzx; +abzy; +abzz; +acaa; +acab; +acac; +acad; +acae; +acaf; +acag; +acah; +acai; +acaj; +acak; +acal; +acam; +acan; +acao; +acap; +acaq; +acar; +acas; +acat; +acau; +acav; +acaw; +acax; +acay; +acaz; +acba; +acbb; +acbc; +acbd; +acbe; +acbf; +acbg; +acbh; +acbi; +acbj; +acbk; +acbl; +acbm; +acbn; +acbo; +acbp; +acbq; +acbr; +acbs; +acbt; +acbu; +acbv; +acbw; +acbx; +acby; +acbz; +acca; +accb; +accc; +accd; +acce; +accf; +accg; +acch; +acci; +accj; +acck; +accl; +accm; +accn; +acco; +accp; +accq; +accr; +accs; +acct; +accu; +accv; +accw; +accx; +accy; +accz; +acda; +acdb; +acdc; +acdd; +acde; +acdf; +acdg; +acdh; +acdi; +acdj; +acdk; +acdl; +acdm; +acdn; +acdo; +acdp; +acdq; +acdr; +acds; +acdt; +acdu; +acdv; +acdw; +acdx; +acdy; +acdz; +acea; +aceb; +acec; +aced; +acee; +acef; +aceg; +aceh; +acei; +acej; +acek; +acel; +acem; +acen; +aceo; +acep; +aceq; +acer; +aces; +acet; +aceu; +acev; +acew; +acex; +acey; +acez; +acfa; +acfb; +acfc; +acfd; +acfe; +acff; +acfg; +acfh; +acfi; +acfj; +acfk; +acfl; +acfm; +acfn; +acfo; +acfp; +acfq; +acfr; +acfs; +acft; +acfu; +acfv; +acfw; +acfx; +acfy; +acfz; +acga; +acgb; +acgc; +acgd; +acge; +acgf; +acgg; +acgh; +acgi; +acgj; +acgk; +acgl; +acgm; +acgn; +acgo; +acgp; +acgq; +acgr; +acgs; +acgt; +acgu; +acgv; +acgw; +acgx; +acgy; +acgz; +acha; +achb; +achc; +achd; +ache; +achf; +achg; +achh; +achi; +achj; +achk; +achl; +achm; +achn; +acho; +achp; +achq; +achr; +achs; +acht; +achu; +achv; +achw; +achx; +achy; +achz; +acia; +acib; +acic; +acid; +acie; +acif; +acig; +acih; +acii; +acij; +acik; +acil; +acim; +acin; +acio; +acip; +aciq; +acir; +acis; +acit; +aciu; +aciv; +aciw; +acix; +aciy; +aciz; +acja; +acjb; +acjc; +acjd; +acje; +acjf; +acjg; +acjh; +acji; +acjj; +acjk; +acjl; +acjm; +acjn; +acjo; +acjp; +acjq; +acjr; +acjs; +acjt; +acju; +acjv; +acjw; +acjx; +acjy; +acjz; +acka; +ackb; +ackc; +ackd; +acke; +ackf; +ackg; +ackh; +acki; +ackj; +ackk; +ackl; +ackm; +ackn; +acko; +ackp; +ackq; +ackr; +acks; +ackt; +acku; +ackv; +ackw; +ackx; +acky; +ackz; +acla; +aclb; +aclc; +acld; +acle; +aclf; +aclg; +aclh; +acli; +aclj; +aclk; +acll; +aclm; +acln; +aclo; +aclp; +aclq; +aclr; +acls; +aclt; +aclu; +aclv; +aclw; +aclx; +acly; +aclz; +acma; +acmb; +acmc; +acmd; +acme; +acmf; +acmg; +acmh; +acmi; +acmj; +acmk; +acml; +acmm; +acmn; +acmo; +acmp; +acmq; +acmr; +acms; +acmt; +acmu; +acmv; +acmw; +acmx; +acmy; +acmz; +acna; +acnb; +acnc; +acnd; +acne; +acnf; +acng; +acnh; +acni; +acnj; +acnk; +acnl; +acnm; +acnn; +acno; +acnp; +acnq; +acnr; +acns; +acnt; +acnu; +acnv; +acnw; +acnx; +acny; +acnz; +acoa; +acob; +acoc; +acod; +acoe; +acof; +acog; +acoh; +acoi; +acoj; +acok; +acol; +acom; +acon; +acoo; +acop; +acoq; +acor; +acos; +acot; +acou; +acov; +acow; +acox; +acoy; +acoz; +acpa; +acpb; +acpc; +acpd; +acpe; +acpf; +acpg; +acph; +acpi; +acpj; +acpk; +acpl; +acpm; +acpn; +acpo; +acpp; +acpq; +acpr; +acps; +acpt; +acpu; +acpv; +acpw; +acpx; +acpy; +acpz; +acqa; +acqb; +acqc; +acqd; +acqe; +acqf; +acqg; +acqh; +acqi; +acqj; +acqk; +acql; +acqm; +acqn; +acqo; +acqp; +acqq; +acqr; +acqs; +acqt; +acqu; +acqv; +acqw; +acqx; +acqy; +acqz; +acra; +acrb; +acrc; +acrd; +acre; +acrf; +acrg; +acrh; +acri; +acrj; +acrk; +acrl; +acrm; +acrn; +acro; +acrp; +acrq; +acrr; +acrs; +acrt; +acru; +acrv; +acrw; +acrx; +acry; +acrz; +acsa; +acsb; +acsc; +acsd; +acse; +acsf; +acsg; +acsh; +acsi; +acsj; +acsk; +acsl; +acsm; +acsn; +acso; +acsp; +acsq; +acsr; +acss; +acst; +acsu; +acsv; +acsw; +acsx; +acsy; +acsz; +acta; +actb; +actc; +actd; +acte; +actf; +actg; +acth; +acti; +actj; +actk; +actl; +actm; +actn; +acto; +actp; +actq; +actr; +acts; +actt; +actu; +actv; +actw; +actx; +acty; +actz; +acua; +acub; +acuc; +acud; +acue; +acuf; +acug; +acuh; +acui; +acuj; +acuk; +acul; +acum; +acun; +acuo; +acup; +acuq; +acur; +acus; +acut; +acuu; +acuv; +acuw; +acux; +acuy; +acuz; +acva; +acvb; +acvc; +acvd; +acve; +acvf; +acvg; +acvh; +acvi; +acvj; +acvk; +acvl; +acvm; +acvn; +acvo; +acvp; +acvq; +acvr; +acvs; +acvt; +acvu; +acvv; +acvw; +acvx; +acvy; +acvz; +acwa; +acwb; +acwc; +acwd; +acwe; +acwf; +acwg; +acwh; +acwi; +acwj; +acwk; +acwl; +acwm; +acwn; +acwo; +acwp; +acwq; +acwr; +acws; +acwt; +acwu; +acwv; +acww; +acwx; +acwy; +acwz; +acxa; +acxb; +acxc; +acxd; +acxe; +acxf; +acxg; +acxh; +acxi; +acxj; +acxk; +acxl; +acxm; +acxn; +acxo; +acxp; +acxq; +acxr; +acxs; +acxt; +acxu; +acxv; +acxw; +acxx; +acxy; +acxz; +acya; +acyb; +acyc; +acyd; +acye; +acyf; +acyg; +acyh; +acyi; +acyj; +acyk; +acyl; +acym; +acyn; +acyo; +acyp; +acyq; +acyr; +acys; +acyt; +acyu; +acyv; +acyw; +acyx; +acyy; +acyz; +acza; +aczb; +aczc; +aczd; +acze; +aczf; +aczg; +aczh; +aczi; +aczj; +aczk; +aczl; +aczm; +aczn; +aczo; +aczp; +aczq; +aczr; +aczs; +aczt; +aczu; +aczv; +aczw; +aczx; +aczy; +aczz; +adaa; +adab; +adac; +adad; +adae; +adaf; +adag; +adah; +adai; +adaj; +adak; +adal; +adam; +adan; +adao; +adap; +adaq; +adar; +adas; +adat; +adau; +adav; +adaw; +adax; +aday; +adaz; +adba; +adbb; +adbc; +adbd; +adbe; +adbf; +adbg; +adbh; +adbi; +adbj; +adbk; +adbl; +adbm; +adbn; +adbo; +adbp; +adbq; +adbr; +adbs; +adbt; +adbu; +adbv; +adbw; +adbx; +adby; +adbz; +adca; +adcb; +adcc; +adcd; +adce; +adcf; +adcg; +adch; +adci; +adcj; +adck; +adcl; +adcm; +adcn; +adco; +adcp; +adcq; +adcr; +adcs; +adct; +adcu; +adcv; +adcw; +adcx; +adcy; +adcz; +adda; +addb; +addc; +addd; +adde; +addf; +addg; +addh; +addi; +addj; +addk; +addl; +addm; +addn; +addo; +addp; +addq; +addr; +adds; +addt; +addu; +addv; +addw; +addx; +addy; +addz; +adea; +adeb; +adec; +aded; +adee; +adef; +adeg; +adeh; +adei; +adej; +adek; +adel; +adem; +aden; +adeo; +adep; +adeq; +ader; +ades; +adet; +adeu; +adev; +adew; +adex; +adey; +adez; +adfa; +adfb; +adfc; +adfd; +adfe; +adff; +adfg; +adfh; +adfi; +adfj; +adfk; +adfl; +adfm; +adfn; +adfo; +adfp; +adfq; +adfr; +adfs; +adft; +adfu; +adfv; +adfw; +adfx; +adfy; +adfz; +adga; +adgb; +adgc; +adgd; +adge; +adgf; +adgg; +adgh; +adgi; +adgj; +adgk; +adgl; +adgm; +adgn; +adgo; +adgp; +adgq; +adgr; +adgs; +adgt; +adgu; +adgv; +adgw; +adgx; +adgy; +adgz; +adha; +adhb; +adhc; +adhd; +adhe; +adhf; +adhg; +adhh; +adhi; +adhj; +adhk; +adhl; +adhm; +adhn; +adho; +adhp; +adhq; +adhr; +adhs; +adht; +adhu; +adhv; +adhw; +adhx; +adhy; +adhz; +adia; +adib; +adic; +adid; +adie; +adif; +adig; +adih; +adii; +adij; +adik; +adil; +adim; +adin; +adio; +adip; +adiq; +adir; +adis; +adit; +adiu; +adiv; +adiw; +adix; +adiy; +adiz; +adja; +adjb; +adjc; +adjd; +adje; +adjf; +adjg; +adjh; +adji; +adjj; +adjk; +adjl; +adjm; +adjn; +adjo; +adjp; +adjq; +adjr; +adjs; +adjt; +adju; +adjv; +adjw; +adjx; +adjy; +adjz; +adka; +adkb; +adkc; +adkd; +adke; +adkf; +adkg; +adkh; +adki; +adkj; +adkk; +adkl; +adkm; +adkn; +adko; +adkp; +adkq; +adkr; +adks; +adkt; +adku; +adkv; +adkw; +adkx; +adky; +adkz; +adla; +adlb; +adlc; +adld; +adle; +adlf; +adlg; +adlh; +adli; +adlj; +adlk; +adll; +adlm; +adln; +adlo; +adlp; +adlq; +adlr; +adls; +adlt; +adlu; +adlv; +adlw; +adlx; +adly; +adlz; +adma; +admb; +admc; +admd; +adme; +admf; +admg; +admh; +admi; +admj; +admk; +adml; +admm; +admn; +admo; +admp; +admq; +admr; +adms; +admt; +admu; +admv; +admw; +admx; +admy; +admz; +adna; +adnb; +adnc; +adnd; +adne; +adnf; +adng; +adnh; +adni; +adnj; +adnk; +adnl; +adnm; +adnn; +adno; +adnp; +adnq; +adnr; +adns; +adnt; +adnu; +adnv; +adnw; +adnx; +adny; +adnz; +adoa; +adob; +adoc; +adod; +adoe; +adof; +adog; +adoh; +adoi; +adoj; +adok; +adol; +adom; +adon; +adoo; +adop; +adoq; +ador; +ados; +adot; +adou; +adov; +adow; +adox; +adoy; +adoz; +adpa; +adpb; +adpc; +adpd; +adpe; +adpf; +adpg; +adph; +adpi; +adpj; +adpk; +adpl; +adpm; +adpn; +adpo; +adpp; +adpq; +adpr; +adps; +adpt; +adpu; +adpv; +adpw; +adpx; +adpy; +adpz; +adqa; +adqb; +adqc; +adqd; +adqe; +adqf; +adqg; +adqh; +adqi; +adqj; +adqk; +adql; +adqm; +adqn; +adqo; +adqp; +adqq; +adqr; +adqs; +adqt; +adqu; +adqv; +adqw; +adqx; +adqy; +adqz; +adra; +adrb; +adrc; +adrd; +adre; +adrf; +adrg; +adrh; +adri; +adrj; +adrk; +adrl; +adrm; +adrn; +adro; +adrp; +adrq; +adrr; +adrs; +adrt; +adru; +adrv; +adrw; +adrx; +adry; +adrz; +adsa; +adsb; +adsc; +adsd; +adse; +adsf; +adsg; +adsh; +adsi; +adsj; +adsk; +adsl; +adsm; +adsn; +adso; +adsp; +adsq; +adsr; +adss; +adst; +adsu; +adsv; +adsw; +adsx; +adsy; +adsz; +adta; +adtb; +adtc; +adtd; +adte; +adtf; +adtg; +adth; +adti; +adtj; +adtk; +adtl; +adtm; +adtn; +adto; +adtp; +adtq; +adtr; +adts; +adtt; +adtu; +adtv; +adtw; +adtx; +adty; +adtz; +adua; +adub; +aduc; +adud; +adue; +aduf; +adug; +aduh; +adui; +aduj; +aduk; +adul; +adum; +adun; +aduo; +adup; +aduq; +adur; +adus; +adut; +aduu; +aduv; +aduw; +adux; +aduy; +aduz; +adva; +advb; +advc; +advd; +adve; +advf; +advg; +advh; +advi; +advj; +advk; +advl; +advm; +advn; +advo; +advp; +advq; +advr; +advs; +advt; +advu; +advv; +advw; +advx; +advy; +advz; +adwa; +adwb; +adwc; +adwd; +adwe; +adwf; +adwg; +adwh; +adwi; +adwj; +adwk; +adwl; +adwm; +adwn; +adwo; +adwp; +adwq; +adwr; +adws; +adwt; +adwu; +adwv; +adww; +adwx; +adwy; +adwz; +adxa; +adxb; +adxc; +adxd; +adxe; +adxf; +adxg; +adxh; +adxi; +adxj; +adxk; +adxl; +adxm; +adxn; +adxo; +adxp; +adxq; +adxr; +adxs; +adxt; +adxu; +adxv; +adxw; +adxx; +adxy; +adxz; +adya; +adyb; +adyc; +adyd; +adye; +adyf; +adyg; +adyh; +adyi; +adyj; +adyk; +adyl; +adym; +adyn; +adyo; +adyp; +adyq; +adyr; +adys; +adyt; +adyu; +adyv; +adyw; +adyx; +adyy; +adyz; +adza; +adzb; +adzc; +adzd; +adze; +adzf; +adzg; +adzh; +adzi; +adzj; +adzk; +adzl; +adzm; +adzn; +adzo; +adzp; +adzq; +adzr; +adzs; +adzt; +adzu; +adzv; +adzw; +adzx; +adzy; +adzz; +aeaa; +aeab; +aeac; +aead; +aeae; +aeaf; +aeag; +aeah; +aeai; +aeaj; +aeak; +aeal; +aeam; +aean; +aeao; +aeap; +aeaq; +aear; +aeas; +aeat; +aeau; +aeav; +aeaw; +aeax; +aeay; +aeaz; +aeba; +aebb; +aebc; +aebd; +aebe; +aebf; +aebg; +aebh; +aebi; +aebj; +aebk; +aebl; +aebm; +aebn; +aebo; +aebp; +aebq; +aebr; +aebs; +aebt; +aebu; +aebv; +aebw; +aebx; +aeby; +aebz; +aeca; +aecb; +aecc; +aecd; +aece; +aecf; +aecg; +aech; +aeci; +aecj; +aeck; +aecl; +aecm; +aecn; +aeco; +aecp; +aecq; +aecr; +aecs; +aect; +aecu; +aecv; +aecw; +aecx; +aecy; +aecz; +aeda; +aedb; +aedc; +aedd; +aede; +aedf; +aedg; +aedh; +aedi; +aedj; +aedk; +aedl; +aedm; +aedn; +aedo; +aedp; +aedq; +aedr; +aeds; +aedt; +aedu; +aedv; +aedw; +aedx; +aedy; +aedz; +aeea; +aeeb; +aeec; +aeed; +aeee; +aeef; +aeeg; +aeeh; +aeei; +aeej; +aeek; +aeel; +aeem; +aeen; +aeeo; +aeep; +aeeq; +aeer; +aees; +aeet; +aeeu; +aeev; +aeew; +aeex; +aeey; +aeez; +aefa; +aefb; +aefc; +aefd; +aefe; +aeff; +aefg; +aefh; +aefi; +aefj; +aefk; +aefl; +aefm; +aefn; +aefo; +aefp; +aefq; +aefr; +aefs; +aeft; +aefu; +aefv; +aefw; +aefx; +aefy; +aefz; +aega; +aegb; +aegc; +aegd; +aege; +aegf; +aegg; +aegh; +aegi; +aegj; +aegk; +aegl; +aegm; +aegn; +aego; +aegp; +aegq; +aegr; +aegs; +aegt; +aegu; +aegv; +aegw; +aegx; +aegy; +aegz; +aeha; +aehb; +aehc; +aehd; +aehe; +aehf; +aehg; +aehh; +aehi; +aehj; +aehk; +aehl; +aehm; +aehn; +aeho; +aehp; +aehq; +aehr; +aehs; +aeht; +aehu; +aehv; +aehw; +aehx; +aehy; +aehz; +aeia; +aeib; +aeic; +aeid; +aeie; +aeif; +aeig; +aeih; +aeii; +aeij; +aeik; +aeil; +aeim; +aein; +aeio; +aeip; +aeiq; +aeir; +aeis; +aeit; +aeiu; +aeiv; +aeiw; +aeix; +aeiy; +aeiz; +aeja; +aejb; +aejc; +aejd; +aeje; +aejf; +aejg; +aejh; +aeji; +aejj; +aejk; +aejl; +aejm; +aejn; +aejo; +aejp; +aejq; +aejr; +aejs; +aejt; +aeju; +aejv; +aejw; +aejx; +aejy; +aejz; +aeka; +aekb; +aekc; +aekd; +aeke; +aekf; +aekg; +aekh; +aeki; +aekj; +aekk; +aekl; +aekm; +aekn; +aeko; +aekp; +aekq; +aekr; +aeks; +aekt; +aeku; +aekv; +aekw; +aekx; +aeky; +aekz; +aela; +aelb; +aelc; +aeld; +aele; +aelf; +aelg; +aelh; +aeli; +aelj; +aelk; +aell; +aelm; +aeln; +aelo; +aelp; +aelq; +aelr; +aels; +aelt; +aelu; +aelv; +aelw; +aelx; +aely; +aelz; +aema; +aemb; +aemc; +aemd; +aeme; +aemf; +aemg; +aemh; +aemi; +aemj; +aemk; +aeml; +aemm; +aemn; +aemo; +aemp; +aemq; +aemr; +aems; +aemt; +aemu; +aemv; +aemw; +aemx; +aemy; +aemz; +aena; +aenb; +aenc; +aend; +aene; +aenf; +aeng; +aenh; +aeni; +aenj; +aenk; +aenl; +aenm; +aenn; +aeno; +aenp; +aenq; +aenr; +aens; +aent; +aenu; +aenv; +aenw; +aenx; +aeny; +aenz; +aeoa; +aeob; +aeoc; +aeod; +aeoe; +aeof; +aeog; +aeoh; +aeoi; +aeoj; +aeok; +aeol; +aeom; +aeon; +aeoo; +aeop; +aeoq; +aeor; +aeos; +aeot; +aeou; +aeov; +aeow; +aeox; +aeoy; +aeoz; +aepa; +aepb; +aepc; +aepd; +aepe; +aepf; +aepg; +aeph; +aepi; +aepj; +aepk; +aepl; +aepm; +aepn; +aepo; +aepp; +aepq; +aepr; +aeps; +aept; +aepu; +aepv; +aepw; +aepx; +aepy; +aepz; +aeqa; +aeqb; +aeqc; +aeqd; +aeqe; +aeqf; +aeqg; +aeqh; +aeqi; +aeqj; +aeqk; +aeql; +aeqm; +aeqn; +aeqo; +aeqp; +aeqq; +aeqr; +aeqs; +aeqt; +aequ; +aeqv; +aeqw; +aeqx; +aeqy; +aeqz; +aera; +aerb; +aerc; +aerd; +aere; +aerf; +aerg; +aerh; +aeri; +aerj; +aerk; +aerl; +aerm; +aern; +aero; +aerp; +aerq; +aerr; +aers; +aert; +aeru; +aerv; +aerw; +aerx; +aery; +aerz; +aesa; +aesb; +aesc; +aesd; +aese; +aesf; +aesg; +aesh; +aesi; +aesj; +aesk; +aesl; +aesm; +aesn; +aeso; +aesp; +aesq; +aesr; +aess; +aest; +aesu; +aesv; +aesw; +aesx; +aesy; +aesz; +aeta; +aetb; +aetc; +aetd; +aete; +aetf; +aetg; +aeth; +aeti; +aetj; +aetk; +aetl; +aetm; +aetn; +aeto; +aetp; +aetq; +aetr; +aets; +aett; +aetu; +aetv; +aetw; +aetx; +aety; +aetz; +aeua; +aeub; +aeuc; +aeud; +aeue; +aeuf; +aeug; +aeuh; +aeui; +aeuj; +aeuk; +aeul; +aeum; +aeun; +aeuo; +aeup; +aeuq; +aeur; +aeus; +aeut; +aeuu; +aeuv; +aeuw; +aeux; +aeuy; +aeuz; +aeva; +aevb; +aevc; +aevd; +aeve; +aevf; +aevg; +aevh; +aevi; +aevj; +aevk; +aevl; +aevm; +aevn; +aevo; +aevp; +aevq; +aevr; +aevs; +aevt; +aevu; +aevv; +aevw; +aevx; +aevy; +aevz; +aewa; +aewb; +aewc; +aewd; +aewe; +aewf; +aewg; +aewh; +aewi; +aewj; +aewk; +aewl; +aewm; +aewn; +aewo; +aewp; +aewq; +aewr; +aews; +aewt; +aewu; +aewv; +aeww; +aewx; +aewy; +aewz; +aexa; +aexb; +aexc; +aexd; +aexe; +aexf; +aexg; +aexh; +aexi; +aexj; +aexk; +aexl; +aexm; +aexn; +aexo; +aexp; +aexq; +aexr; +aexs; +aext; +aexu; +aexv; +aexw; +aexx; +aexy; +aexz; +aeya; +aeyb; +aeyc; +aeyd; +aeye; +aeyf; +aeyg; +aeyh; +aeyi; +aeyj; +aeyk; +aeyl; +aeym; +aeyn; +aeyo; +aeyp; +aeyq; +aeyr; +aeys; +aeyt; +aeyu; +aeyv; +aeyw; +aeyx; +aeyy; +aeyz; +aeza; +aezb; +aezc; +aezd; +aeze; +aezf; +aezg; +aezh; +aezi; +aezj; +aezk; +aezl; +aezm; +aezn; +aezo; +aezp; +aezq; +aezr; +aezs; +aezt; +aezu; +aezv; +aezw; +aezx; +aezy; +aezz; +afaa; +afab; +afac; +afad; +afae; +afaf; +afag; +afah; +afai; +afaj; +afak; +afal; +afam; +afan; +afao; +afap; +afaq; +afar; +afas; +afat; +afau; +afav; +afaw; +afax; +afay; +afaz; +afba; +afbb; +afbc; +afbd; +afbe; +afbf; +afbg; +afbh; +afbi; +afbj; +afbk; +afbl; +afbm; +afbn; +afbo; +afbp; +afbq; +afbr; +afbs; +afbt; +afbu; +afbv; +afbw; +afbx; +afby; +afbz; +afca; +afcb; +afcc; +afcd; +afce; +afcf; +afcg; +afch; +afci; +afcj; +afck; +afcl; +afcm; +afcn; +afco; +afcp; +afcq; +afcr; +afcs; +afct; +afcu; +afcv; +afcw; +afcx; +afcy; +afcz; +afda; +afdb; +afdc; +afdd; +afde; +afdf; +afdg; +afdh; +afdi; +afdj; +afdk; +afdl; +afdm; +afdn; +afdo; +afdp; +afdq; +afdr; +afds; +afdt; +afdu; +afdv; +afdw; +afdx; +afdy; +afdz; +afea; +afeb; +afec; +afed; +afee; +afef; +afeg; +afeh; +afei; +afej; +afek; +afel; +afem; +afen; +afeo; +afep; +afeq; +afer; +afes; +afet; +afeu; +afev; +afew; +afex; +afey; +afez; +affa; +affb; +affc; +affd; +affe; +afff; +affg; +affh; +affi; +affj; +affk; +affl; +affm; +affn; +affo; +affp; +affq; +affr; +affs; +afft; +affu; +affv; +affw; +affx; +affy; +affz; +afga; +afgb; +afgc; +afgd; +afge; +afgf; +afgg; +afgh; +afgi; +afgj; +afgk; +afgl; +afgm; +afgn; +afgo; +afgp; +afgq; +afgr; +afgs; +afgt; +afgu; +afgv; +afgw; +afgx; +afgy; +afgz; +afha; +afhb; +afhc; +afhd; +afhe; +afhf; +afhg; +afhh; +afhi; +afhj; +afhk; +afhl; +afhm; +afhn; +afho; +afhp; +afhq; +afhr; +afhs; +afht; +afhu; +afhv; +afhw; +afhx; +afhy; +afhz; +afia; +afib; +afic; +afid; +afie; +afif; +afig; +afih; +afii; +afij; +afik; +afil; +afim; +afin; +afio; +afip; +afiq; +afir; +afis; +afit; +afiu; +afiv; +afiw; +afix; +afiy; +afiz; +afja; +afjb; +afjc; +afjd; +afje; +afjf; +afjg; +afjh; +afji; +afjj; +afjk; +afjl; +afjm; +afjn; +afjo; +afjp; +afjq; +afjr; +afjs; +afjt; +afju; +afjv; +afjw; +afjx; +afjy; +afjz; +afka; +afkb; +afkc; +afkd; +afke; +afkf; +afkg; +afkh; +afki; +afkj; +afkk; +afkl; +afkm; +afkn; +afko; +afkp; +afkq; +afkr; +afks; +afkt; +afku; +afkv; +afkw; +afkx; +afky; +afkz; +afla; +aflb; +aflc; +afld; +afle; +aflf; +aflg; +aflh; +afli; +aflj; +aflk; +afll; +aflm; +afln; +aflo; +aflp; +aflq; +aflr; +afls; +aflt; +aflu; +aflv; +aflw; +aflx; +afly; +aflz; +afma; +afmb; +afmc; +afmd; +afme; +afmf; +afmg; +afmh; +afmi; +afmj; +afmk; +afml; +afmm; +afmn; +afmo; +afmp; +afmq; +afmr; +afms; +afmt; +afmu; +afmv; +afmw; +afmx; +afmy; +afmz; +afna; +afnb; +afnc; +afnd; +afne; +afnf; +afng; +afnh; +afni; +afnj; +afnk; +afnl; +afnm; +afnn; +afno; +afnp; +afnq; +afnr; +afns; +afnt; +afnu; +afnv; +afnw; +afnx; +afny; +afnz; +afoa; +afob; +afoc; +afod; +afoe; +afof; +afog; +afoh; +afoi; +afoj; +afok; +afol; +afom; +afon; +afoo; +afop; +afoq; +afor; +afos; +afot; +afou; +afov; +afow; +afox; +afoy; +afoz; +afpa; +afpb; +afpc; +afpd; +afpe; +afpf; +afpg; +afph; +afpi; +afpj; +afpk; +afpl; +afpm; +afpn; +afpo; +afpp; +afpq; +afpr; +afps; +afpt; +afpu; +afpv; +afpw; +afpx; +afpy; +afpz; +afqa; +afqb; +afqc; +afqd; +afqe; +afqf; +afqg; +afqh; +afqi; +afqj; +afqk; +afql; +afqm; +afqn; +afqo; +afqp; +afqq; +afqr; +afqs; +afqt; +afqu; +afqv; +afqw; +afqx; +afqy; +afqz; +afra; +afrb; +afrc; +afrd; +afre; +afrf; +afrg; +afrh; +afri; +afrj; +afrk; +afrl; +afrm; +afrn; +afro; +afrp; +afrq; +afrr; +afrs; +afrt; +afru; +afrv; +afrw; +afrx; +afry; +afrz; +afsa; +afsb; +afsc; +afsd; +afse; +afsf; +afsg; +afsh; +afsi; +afsj; +afsk; +afsl; +afsm; +afsn; +afso; +afsp; +afsq; +afsr; +afss; +afst; +afsu; +afsv; +afsw; +afsx; +afsy; +afsz; +afta; +aftb; +aftc; +aftd; +afte; +aftf; +aftg; +afth; +afti; +aftj; +aftk; +aftl; +aftm; +aftn; +afto; +aftp; +aftq; +aftr; +afts; +aftt; +aftu; +aftv; +aftw; +aftx; +afty; +aftz; +afua; +afub; +afuc; +afud; +afue; +afuf; +afug; +afuh; +afui; +afuj; +afuk; +aful; +afum; +afun; +afuo; +afup; +afuq; +afur; +afus; +afut; +afuu; +afuv; +afuw; +afux; +afuy; +afuz; +afva; +afvb; +afvc; +afvd; +afve; +afvf; +afvg; +afvh; +afvi; +afvj; +afvk; +afvl; +afvm; +afvn; +afvo; +afvp; +afvq; +afvr; +afvs; +afvt; +afvu; +afvv; +afvw; +afvx; +afvy; +afvz; +afwa; +afwb; +afwc; +afwd; +afwe; +afwf; +afwg; +afwh; +afwi; +afwj; +afwk; +afwl; +afwm; +afwn; +afwo; +afwp; +afwq; +afwr; +afws; +afwt; +afwu; +afwv; +afww; +afwx; +afwy; +afwz; +afxa; +afxb; +afxc; +afxd; +afxe; +afxf; +afxg; +afxh; +afxi; +afxj; +afxk; +afxl; +afxm; +afxn; +afxo; +afxp; +afxq; +afxr; +afxs; +afxt; +afxu; +afxv; +afxw; +afxx; +afxy; +afxz; +afya; +afyb; +afyc; +afyd; +afye; +afyf; +afyg; +afyh; +afyi; +afyj; +afyk; +afyl; +afym; +afyn; +afyo; +afyp; +afyq; +afyr; +afys; +afyt; +afyu; +afyv; +afyw; +afyx; +afyy; +afyz; +afza; +afzb; +afzc; +afzd; +afze; +afzf; +afzg; +afzh; +afzi; +afzj; +afzk; +afzl; +afzm; +afzn; +afzo; +afzp; +afzq; +afzr; +afzs; +afzt; +afzu; +afzv; +afzw; +afzx; +afzy; +afzz; +agaa; +agab; +agac; +agad; +agae; +agaf; +agag; +agah; +agai; +agaj; +agak; +agal; +agam; +agan; +agao; +agap; +agaq; +agar; +agas; +agat; +agau; +agav; +agaw; +agax; +agay; +agaz; +agba; +agbb; +agbc; +agbd; +agbe; +agbf; +agbg; +agbh; +agbi; +agbj; +agbk; +agbl; +agbm; +agbn; +agbo; +agbp; +agbq; +agbr; +agbs; +agbt; +agbu; +agbv; +agbw; +agbx; +agby; +agbz; +agca; +agcb; +agcc; +agcd; +agce; +agcf; +agcg; +agch; +agci; +agcj; +agck; +agcl; +agcm; +agcn; +agco; +agcp; +agcq; +agcr; +agcs; +agct; +agcu; +agcv; +agcw; +agcx; +agcy; +agcz; +agda; +agdb; +agdc; +agdd; +agde; +agdf; +agdg; +agdh; +agdi; +agdj; +agdk; +agdl; +agdm; +agdn; +agdo; +agdp; +agdq; +agdr; +agds; +agdt; +agdu; +agdv; +agdw; +agdx; +agdy; +agdz; +agea; +ageb; +agec; +aged; +agee; +agef; +ageg; +ageh; +agei; +agej; +agek; +agel; +agem; +agen; +ageo; +agep; +ageq; +ager; +ages; +aget; +ageu; +agev; +agew; +agex; +agey; +agez; +agfa; +agfb; +agfc; +agfd; +agfe; +agff; +agfg; +agfh; +agfi; +agfj; +agfk; +agfl; +agfm; +agfn; +agfo; +agfp; +agfq; +agfr; +agfs; +agft; +agfu; +agfv; +agfw; +agfx; +agfy; +agfz; +agga; +aggb; +aggc; +aggd; +agge; +aggf; +aggg; +aggh; +aggi; +aggj; +aggk; +aggl; +aggm; +aggn; +aggo; +aggp; +aggq; +aggr; +aggs; +aggt; +aggu; +aggv; +aggw; +aggx; +aggy; +aggz; +agha; +aghb; +aghc; +aghd; +aghe; +aghf; +aghg; +aghh; +aghi; +aghj; +aghk; +aghl; +aghm; +aghn; +agho; +aghp; +aghq; +aghr; +aghs; +aght; +aghu; +aghv; +aghw; +aghx; +aghy; +aghz; +agia; +agib; +agic; +agid; +agie; +agif; +agig; +agih; +agii; +agij; +agik; +agil; +agim; +agin; +agio; +agip; +agiq; +agir; +agis; +agit; +agiu; +agiv; +agiw; +agix; +agiy; +agiz; +agja; +agjb; +agjc; +agjd; +agje; +agjf; +agjg; +agjh; +agji; +agjj; +agjk; +agjl; +agjm; +agjn; +agjo; +agjp; +agjq; +agjr; +agjs; +agjt; +agju; +agjv; +agjw; +agjx; +agjy; +agjz; +agka; +agkb; +agkc; +agkd; +agke; +agkf; +agkg; +agkh; +agki; +agkj; +agkk; +agkl; +agkm; +agkn; +agko; +agkp; +agkq; +agkr; +agks; +agkt; +agku; +agkv; +agkw; +agkx; +agky; +agkz; +agla; +aglb; +aglc; +agld; +agle; +aglf; +aglg; +aglh; +agli; +aglj; +aglk; +agll; +aglm; +agln; +aglo; +aglp; +aglq; +aglr; +agls; +aglt; +aglu; +aglv; +aglw; +aglx; +agly; +aglz; +agma; +agmb; +agmc; +agmd; +agme; +agmf; +agmg; +agmh; +agmi; +agmj; +agmk; +agml; +agmm; +agmn; +agmo; +agmp; +agmq; +agmr; +agms; +agmt; +agmu; +agmv; +agmw; +agmx; +agmy; +agmz; +agna; +agnb; +agnc; +agnd; +agne; +agnf; +agng; +agnh; +agni; +agnj; +agnk; +agnl; +agnm; +agnn; +agno; +agnp; +agnq; +agnr; +agns; +agnt; +agnu; +agnv; +agnw; +agnx; +agny; +agnz; +agoa; +agob; +agoc; +agod; +agoe; +agof; +agog; +agoh; +agoi; +agoj; +agok; +agol; +agom; +agon; +agoo; +agop; +agoq; +agor; +agos; +agot; +agou; +agov; +agow; +agox; +agoy; +agoz; +agpa; +agpb; +agpc; +agpd; +agpe; +agpf; +agpg; +agph; +agpi; +agpj; +agpk; +agpl; +agpm; +agpn; +agpo; +agpp; +agpq; +agpr; +agps; +agpt; +agpu; +agpv; +agpw; +agpx; +agpy; +agpz; +agqa; +agqb; +agqc; +agqd; +agqe; +agqf; +agqg; +agqh; +agqi; +agqj; +agqk; +agql; +agqm; +agqn; +agqo; +agqp; +agqq; +agqr; +agqs; +agqt; +agqu; +agqv; +agqw; +agqx; +agqy; +agqz; +agra; +agrb; +agrc; +agrd; +agre; +agrf; +agrg; +agrh; +agri; +agrj; +agrk; +agrl; +agrm; +agrn; +agro; +agrp; +agrq; +agrr; +agrs; +agrt; +agru; +agrv; +agrw; +agrx; +agry; +agrz; +agsa; +agsb; +agsc; +agsd; +agse; +agsf; +agsg; +agsh; +agsi; +agsj; +agsk; +agsl; +agsm; +agsn; +agso; +agsp; +agsq; +agsr; +agss; +agst; +agsu; +agsv; +agsw; +agsx; +agsy; +agsz; +agta; +agtb; +agtc; +agtd; +agte; +agtf; +agtg; +agth; +agti; +agtj; +agtk; +agtl; +agtm; +agtn; +agto; +agtp; +agtq; +agtr; +agts; +agtt; +agtu; +agtv; +agtw; +agtx; +agty; +agtz; +agua; +agub; +aguc; +agud; +ague; +aguf; +agug; +aguh; +agui; +aguj; +aguk; +agul; +agum; +agun; +aguo; +agup; +aguq; +agur; +agus; +agut; +aguu; +aguv; +aguw; +agux; +aguy; +aguz; +agva; +agvb; +agvc; +agvd; +agve; +agvf; +agvg; +agvh; +agvi; +agvj; +agvk; +agvl; +agvm; +agvn; +agvo; +agvp; +agvq; +agvr; +agvs; +agvt; +agvu; +agvv; +agvw; +agvx; +agvy; +agvz; +agwa; +agwb; +agwc; +agwd; +agwe; +agwf; +agwg; +agwh; +agwi; +agwj; +agwk; +agwl; +agwm; +agwn; +agwo; +agwp; +agwq; +agwr; +agws; +agwt; +agwu; +agwv; +agww; +agwx; +agwy; +agwz; +agxa; +agxb; +agxc; +agxd; +agxe; +agxf; +agxg; +agxh; +agxi; +agxj; +agxk; +agxl; +agxm; +agxn; +agxo; +agxp; +agxq; +agxr; +agxs; +agxt; +agxu; +agxv; +agxw; +agxx; +agxy; +agxz; +agya; +agyb; +agyc; +agyd; +agye; +agyf; +agyg; +agyh; +agyi; +agyj; +agyk; +agyl; +agym; +agyn; +agyo; +agyp; +agyq; +agyr; +agys; +agyt; +agyu; +agyv; +agyw; +agyx; +agyy; +agyz; +agza; +agzb; +agzc; +agzd; +agze; +agzf; +agzg; +agzh; +agzi; +agzj; +agzk; +agzl; +agzm; +agzn; +agzo; +agzp; +agzq; +agzr; +agzs; +agzt; +agzu; +agzv; +agzw; +agzx; +agzy; +agzz; +ahaa; +ahab; +ahac; +ahad; +ahae; +ahaf; +ahag; +ahah; +ahai; +ahaj; +ahak; +ahal; +aham; +ahan; +ahao; +ahap; +ahaq; +ahar; +ahas; +ahat; +ahau; +ahav; +ahaw; +ahax; +ahay; +ahaz; +ahba; +ahbb; +ahbc; +ahbd; +ahbe; +ahbf; +ahbg; +ahbh; +ahbi; +ahbj; +ahbk; +ahbl; +ahbm; +ahbn; +ahbo; +ahbp; +ahbq; +ahbr; +ahbs; +ahbt; +ahbu; +ahbv; +ahbw; +ahbx; +ahby; +ahbz; +ahca; +ahcb; +ahcc; +ahcd; +ahce; +ahcf; +ahcg; +ahch; +ahci; +ahcj; +ahck; +ahcl; +ahcm; +ahcn; +ahco; +ahcp; +ahcq; +ahcr; +ahcs; +ahct; +ahcu; +ahcv; +ahcw; +ahcx; +ahcy; +ahcz; +ahda; +ahdb; +ahdc; +ahdd; +ahde; +ahdf; +ahdg; +ahdh; +ahdi; +ahdj; +ahdk; +ahdl; +ahdm; +ahdn; +ahdo; +ahdp; +ahdq; +ahdr; +ahds; +ahdt; +ahdu; +ahdv; +ahdw; +ahdx; +ahdy; +ahdz; +ahea; +aheb; +ahec; +ahed; +ahee; +ahef; +aheg; +aheh; +ahei; +ahej; +ahek; +ahel; +ahem; +ahen; +aheo; +ahep; +aheq; +aher; +ahes; +ahet; +aheu; +ahev; +ahew; +ahex; +ahey; +ahez; +ahfa; +ahfb; +ahfc; +ahfd; +ahfe; +ahff; +ahfg; +ahfh; +ahfi; +ahfj; +ahfk; +ahfl; +ahfm; +ahfn; +ahfo; +ahfp; +ahfq; +ahfr; +ahfs; +ahft; +ahfu; +ahfv; +ahfw; +ahfx; +ahfy; +ahfz; +ahga; +ahgb; +ahgc; +ahgd; +ahge; +ahgf; +ahgg; +ahgh; +ahgi; +ahgj; +ahgk; +ahgl; +ahgm; +ahgn; +ahgo; +ahgp; +ahgq; +ahgr; +ahgs; +ahgt; +ahgu; +ahgv; +ahgw; +ahgx; +ahgy; +ahgz; +ahha; +ahhb; +ahhc; +ahhd; +ahhe; +ahhf; +ahhg; +ahhh; +ahhi; +ahhj; +ahhk; +ahhl; +ahhm; +ahhn; +ahho; +ahhp; +ahhq; +ahhr; +ahhs; +ahht; +ahhu; +ahhv; +ahhw; +ahhx; +ahhy; +ahhz; +ahia; +ahib; +ahic; +ahid; +ahie; +ahif; +ahig; +ahih; +ahii; +ahij; +ahik; +ahil; +ahim; +ahin; +ahio; +ahip; +ahiq; +ahir; +ahis; +ahit; +ahiu; +ahiv; +ahiw; +ahix; +ahiy; +ahiz; +ahja; +ahjb; +ahjc; +ahjd; +ahje; +ahjf; +ahjg; +ahjh; +ahji; +ahjj; +ahjk; +ahjl; +ahjm; +ahjn; +ahjo; +ahjp; +ahjq; +ahjr; +ahjs; +ahjt; +ahju; +ahjv; +ahjw; +ahjx; +ahjy; +ahjz; +ahka; +ahkb; +ahkc; +ahkd; +ahke; +ahkf; +ahkg; +ahkh; +ahki; +ahkj; +ahkk; +ahkl; +ahkm; +ahkn; +ahko; +ahkp; +ahkq; +ahkr; +ahks; +ahkt; +ahku; +ahkv; +ahkw; +ahkx; +ahky; +ahkz; +ahla; +ahlb; +ahlc; +ahld; +ahle; +ahlf; +ahlg; +ahlh; +ahli; +ahlj; +ahlk; +ahll; +ahlm; +ahln; +ahlo; +ahlp; +ahlq; +ahlr; +ahls; +ahlt; +ahlu; +ahlv; +ahlw; +ahlx; +ahly; +ahlz; +ahma; +ahmb; +ahmc; +ahmd; +ahme; +ahmf; +ahmg; +ahmh; +ahmi; +ahmj; +ahmk; +ahml; +ahmm; +ahmn; +ahmo; +ahmp; +ahmq; +ahmr; +ahms; +ahmt; +ahmu; +ahmv; +ahmw; +ahmx; +ahmy; +ahmz; +ahna; +ahnb; +ahnc; +ahnd; +ahne; +ahnf; +ahng; +ahnh; +ahni; +ahnj; +ahnk; +ahnl; +ahnm; +ahnn; +ahno; +ahnp; +ahnq; +ahnr; +ahns; +ahnt; +ahnu; +ahnv; +ahnw; +ahnx; +ahny; +ahnz; +ahoa; +ahob; +ahoc; +ahod; +ahoe; +ahof; +ahog; +ahoh; +ahoi; +ahoj; +ahok; +ahol; +ahom; +ahon; +ahoo; +ahop; +ahoq; +ahor; +ahos; +ahot; +ahou; +ahov; +ahow; +ahox; +ahoy; +ahoz; +ahpa; +ahpb; +ahpc; +ahpd; +ahpe; +ahpf; +ahpg; +ahph; +ahpi; +ahpj; +ahpk; +ahpl; +ahpm; +ahpn; +ahpo; +ahpp; +ahpq; +ahpr; +ahps; +ahpt; +ahpu; +ahpv; +ahpw; +ahpx; +ahpy; +ahpz; +ahqa; +ahqb; +ahqc; +ahqd; +ahqe; +ahqf; +ahqg; +ahqh; +ahqi; +ahqj; +ahqk; +ahql; +ahqm; +ahqn; +ahqo; +ahqp; +ahqq; +ahqr; +ahqs; +ahqt; +ahqu; +ahqv; +ahqw; +ahqx; +ahqy; +ahqz; +ahra; +ahrb; +ahrc; +ahrd; +ahre; +ahrf; +ahrg; +ahrh; +ahri; +ahrj; +ahrk; +ahrl; +ahrm; +ahrn; +ahro; +ahrp; +ahrq; +ahrr; +ahrs; +ahrt; +ahru; +ahrv; +ahrw; +ahrx; +ahry; +ahrz; +ahsa; +ahsb; +ahsc; +ahsd; +ahse; +ahsf; +ahsg; +ahsh; +ahsi; +ahsj; +ahsk; +ahsl; +ahsm; +ahsn; +ahso; +ahsp; +ahsq; +ahsr; +ahss; +ahst; +ahsu; +ahsv; +ahsw; +ahsx; +ahsy; +ahsz; +ahta; +ahtb; +ahtc; +ahtd; +ahte; +ahtf; +ahtg; +ahth; +ahti; +ahtj; +ahtk; +ahtl; +ahtm; +ahtn; +ahto; +ahtp; +ahtq; +ahtr; +ahts; +ahtt; +ahtu; +ahtv; +ahtw; +ahtx; +ahty; +ahtz; +ahua; +ahub; +ahuc; +ahud; +ahue; +ahuf; +ahug; +ahuh; +ahui; +ahuj; +ahuk; +ahul; +ahum; +ahun; +ahuo; +ahup; +ahuq; +ahur; +ahus; +ahut; +ahuu; +ahuv; +ahuw; +ahux; +ahuy; +ahuz; +ahva; +ahvb; +ahvc; +ahvd; +ahve; +ahvf; +ahvg; +ahvh; +ahvi; +ahvj; +ahvk; +ahvl; +ahvm; +ahvn; +ahvo; +ahvp; +ahvq; +ahvr; +ahvs; +ahvt; +ahvu; +ahvv; +ahvw; +ahvx; +ahvy; +ahvz; +ahwa; +ahwb; +ahwc; +ahwd; +ahwe; +ahwf; +ahwg; +ahwh; +ahwi; +ahwj; +ahwk; +ahwl; +ahwm; +ahwn; +ahwo; +ahwp; +ahwq; +ahwr; +ahws; +ahwt; +ahwu; +ahwv; +ahww; +ahwx; +ahwy; +ahwz; +ahxa; +ahxb; +ahxc; +ahxd; +ahxe; +ahxf; +ahxg; +ahxh; +ahxi; +ahxj; +ahxk; +ahxl; +ahxm; +ahxn; +ahxo; +ahxp; +ahxq; +ahxr; +ahxs; +ahxt; +ahxu; +ahxv; +ahxw; +ahxx; +ahxy; +ahxz; +ahya; +ahyb; +ahyc; +ahyd; +ahye; +ahyf; +ahyg; +ahyh; +ahyi; +ahyj; +ahyk; +ahyl; +ahym; +ahyn; +ahyo; +ahyp; +ahyq; +ahyr; +ahys; +ahyt; +ahyu; +ahyv; +ahyw; +ahyx; +ahyy; +ahyz; +ahza; +ahzb; +ahzc; +ahzd; +ahze; +ahzf; +ahzg; +ahzh; +ahzi; +ahzj; +ahzk; +ahzl; +ahzm; +ahzn; +ahzo; +ahzp; +ahzq; +ahzr; +ahzs; +ahzt; +ahzu; +ahzv; +ahzw; +ahzx; +ahzy; +ahzz; +aiaa; +aiab; +aiac; +aiad; +aiae; +aiaf; +aiag; +aiah; +aiai; +aiaj; +aiak; +aial; +aiam; +aian; +aiao; +aiap; +aiaq; +aiar; +aias; +aiat; +aiau; +aiav; +aiaw; +aiax; +aiay; +aiaz; +aiba; +aibb; +aibc; +aibd; +aibe; +aibf; +aibg; +aibh; +aibi; +aibj; +aibk; +aibl; +aibm; +aibn; +aibo; +aibp; +aibq; +aibr; +aibs; +aibt; +aibu; +aibv; +aibw; +aibx; +aiby; +aibz; +aica; +aicb; +aicc; +aicd; +aice; +aicf; +aicg; +aich; +aici; +aicj; +aick; +aicl; +aicm; +aicn; +aico; +aicp; +aicq; +aicr; +aics; +aict; +aicu; +aicv; +aicw; +aicx; +aicy; +aicz; +aida; +aidb; +aidc; +aidd; +aide; +aidf; +aidg; +aidh; +aidi; +aidj; +aidk; +aidl; +aidm; +aidn; +aido; +aidp; +aidq; +aidr; +aids; +aidt; +aidu; +aidv; +aidw; +aidx; +aidy; +aidz; +aiea; +aieb; +aiec; +aied; +aiee; +aief; +aieg; +aieh; +aiei; +aiej; +aiek; +aiel; +aiem; +aien; +aieo; +aiep; +aieq; +aier; +aies; +aiet; +aieu; +aiev; +aiew; +aiex; +aiey; +aiez; +aifa; +aifb; +aifc; +aifd; +aife; +aiff; +aifg; +aifh; +aifi; +aifj; +aifk; +aifl; +aifm; +aifn; +aifo; +aifp; +aifq; +aifr; +aifs; +aift; +aifu; +aifv; +aifw; +aifx; +aify; +aifz; +aiga; +aigb; +aigc; +aigd; +aige; +aigf; +aigg; +aigh; +aigi; +aigj; +aigk; +aigl; +aigm; +aign; +aigo; +aigp; +aigq; +aigr; +aigs; +aigt; +aigu; +aigv; +aigw; +aigx; +aigy; +aigz; +aiha; +aihb; +aihc; +aihd; +aihe; +aihf; +aihg; +aihh; +aihi; +aihj; +aihk; +aihl; +aihm; +aihn; +aiho; +aihp; +aihq; +aihr; +aihs; +aiht; +aihu; +aihv; +aihw; +aihx; +aihy; +aihz; +aiia; +aiib; +aiic; +aiid; +aiie; +aiif; +aiig; +aiih; +aiii; +aiij; +aiik; +aiil; +aiim; +aiin; +aiio; +aiip; +aiiq; +aiir; +aiis; +aiit; +aiiu; +aiiv; +aiiw; +aiix; +aiiy; +aiiz; +aija; +aijb; +aijc; +aijd; +aije; +aijf; +aijg; +aijh; +aiji; +aijj; +aijk; +aijl; +aijm; +aijn; +aijo; +aijp; +aijq; +aijr; +aijs; +aijt; +aiju; +aijv; +aijw; +aijx; +aijy; +aijz; +aika; +aikb; +aikc; +aikd; +aike; +aikf; +aikg; +aikh; +aiki; +aikj; +aikk; +aikl; +aikm; +aikn; +aiko; +aikp; +aikq; +aikr; +aiks; +aikt; +aiku; +aikv; +aikw; +aikx; +aiky; +aikz; +aila; +ailb; +ailc; +aild; +aile; +ailf; +ailg; +ailh; +aili; +ailj; +ailk; +aill; +ailm; +ailn; +ailo; +ailp; +ailq; +ailr; +ails; +ailt; +ailu; +ailv; +ailw; +ailx; +aily; +ailz; +aima; +aimb; +aimc; +aimd; +aime; +aimf; +aimg; +aimh; +aimi; +aimj; +aimk; +aiml; +aimm; +aimn; +aimo; +aimp; +aimq; +aimr; +aims; +aimt; +aimu; +aimv; +aimw; +aimx; +aimy; +aimz; +aina; +ainb; +ainc; +aind; +aine; +ainf; +aing; +ainh; +aini; +ainj; +aink; +ainl; +ainm; +ainn; +aino; +ainp; +ainq; +ainr; +ains; +aint; +ainu; +ainv; +ainw; +ainx; +ainy; +ainz; +aioa; +aiob; +aioc; +aiod; +aioe; +aiof; +aiog; +aioh; +aioi; +aioj; +aiok; +aiol; +aiom; +aion; +aioo; +aiop; +aioq; +aior; +aios; +aiot; +aiou; +aiov; +aiow; +aiox; +aioy; +aioz; +aipa; +aipb; +aipc; +aipd; +aipe; +aipf; +aipg; +aiph; +aipi; +aipj; +aipk; +aipl; +aipm; +aipn; +aipo; +aipp; +aipq; +aipr; +aips; +aipt; +aipu; +aipv; +aipw; +aipx; +aipy; +aipz; +aiqa; +aiqb; +aiqc; +aiqd; +aiqe; +aiqf; +aiqg; +aiqh; +aiqi; +aiqj; +aiqk; +aiql; +aiqm; +aiqn; +aiqo; +aiqp; +aiqq; +aiqr; +aiqs; +aiqt; +aiqu; +aiqv; +aiqw; +aiqx; +aiqy; +aiqz; +aira; +airb; +airc; +aird; +aire; +airf; +airg; +airh; +airi; +airj; +airk; +airl; +airm; +airn; +airo; +airp; +airq; +airr; +airs; +airt; +airu; +airv; +airw; +airx; +airy; +airz; +aisa; +aisb; +aisc; +aisd; +aise; +aisf; +aisg; +aish; +aisi; +aisj; +aisk; +aisl; +aism; +aisn; +aiso; +aisp; +aisq; +aisr; +aiss; +aist; +aisu; +aisv; +aisw; +aisx; +aisy; +aisz; +aita; +aitb; +aitc; +aitd; +aite; +aitf; +aitg; +aith; +aiti; +aitj; +aitk; +aitl; +aitm; +aitn; +aito; +aitp; +aitq; +aitr; +aits; +aitt; +aitu; +aitv; +aitw; +aitx; +aity; +aitz; +aiua; +aiub; +aiuc; +aiud; +aiue; +aiuf; +aiug; +aiuh; +aiui; +aiuj; +aiuk; +aiul; +aium; +aiun; +aiuo; +aiup; +aiuq; +aiur; +aius; +aiut; +aiuu; +aiuv; +aiuw; +aiux; +aiuy; +aiuz; +aiva; +aivb; +aivc; +aivd; +aive; +aivf; +aivg; +aivh; +aivi; +aivj; +aivk; +aivl; +aivm; +aivn; +aivo; +aivp; +aivq; +aivr; +aivs; +aivt; +aivu; +aivv; +aivw; +aivx; +aivy; +aivz; +aiwa; +aiwb; +aiwc; +aiwd; +aiwe; +aiwf; +aiwg; +aiwh; +aiwi; +aiwj; +aiwk; +aiwl; +aiwm; +aiwn; +aiwo; +aiwp; +aiwq; +aiwr; +aiws; +aiwt; +aiwu; +aiwv; +aiww; +aiwx; +aiwy; +aiwz; +aixa; +aixb; +aixc; +aixd; +aixe; +aixf; +aixg; +aixh; +aixi; +aixj; +aixk; +aixl; +aixm; +aixn; +aixo; +aixp; +aixq; +aixr; +aixs; +aixt; +aixu; +aixv; +aixw; +aixx; +aixy; +aixz; +aiya; +aiyb; +aiyc; +aiyd; +aiye; +aiyf; +aiyg; +aiyh; +aiyi; +aiyj; +aiyk; +aiyl; +aiym; +aiyn; +aiyo; +aiyp; +aiyq; +aiyr; +aiys; +aiyt; +aiyu; +aiyv; +aiyw; +aiyx; +aiyy; +aiyz; +aiza; +aizb; +aizc; +aizd; +aize; +aizf; +aizg; +aizh; +aizi; +aizj; +aizk; +aizl; +aizm; +aizn; +aizo; +aizp; +aizq; +aizr; +aizs; +aizt; +aizu; +aizv; +aizw; +aizx; +aizy; +aizz; +ajaa; +ajab; +ajac; +ajad; +ajae; +ajaf; +ajag; +ajah; +ajai; +ajaj; +ajak; +ajal; +ajam; +ajan; +ajao; +ajap; +ajaq; +ajar; +ajas; +ajat; +ajau; +ajav; +ajaw; +ajax; +ajay; +ajaz; +ajba; +ajbb; +ajbc; +ajbd; +ajbe; +ajbf; +ajbg; +ajbh; +ajbi; +ajbj; +ajbk; +ajbl; +ajbm; +ajbn; +ajbo; +ajbp; +ajbq; +ajbr; +ajbs; +ajbt; +ajbu; +ajbv; +ajbw; +ajbx; +ajby; +ajbz; +ajca; +ajcb; +ajcc; +ajcd; +ajce; +ajcf; +ajcg; +ajch; +ajci; +ajcj; +ajck; +ajcl; +ajcm; +ajcn; +ajco; +ajcp; +ajcq; +ajcr; +ajcs; +ajct; +ajcu; +ajcv; +ajcw; +ajcx; +ajcy; +ajcz; +ajda; +ajdb; +ajdc; +ajdd; +ajde; +ajdf; +ajdg; +ajdh; +ajdi; +ajdj; +ajdk; +ajdl; +ajdm; +ajdn; +ajdo; +ajdp; +ajdq; +ajdr; +ajds; +ajdt; +ajdu; +ajdv; +ajdw; +ajdx; +ajdy; +ajdz; +ajea; +ajeb; +ajec; +ajed; +ajee; +ajef; +ajeg; +ajeh; +ajei; +ajej; +ajek; +ajel; +ajem; +ajen; +ajeo; +ajep; +ajeq; +ajer; +ajes; +ajet; +ajeu; +ajev; +ajew; +ajex; +ajey; +ajez; +ajfa; +ajfb; +ajfc; +ajfd; +ajfe; +ajff; +ajfg; +ajfh; +ajfi; +ajfj; +ajfk; +ajfl; +ajfm; +ajfn; +ajfo; +ajfp; +ajfq; +ajfr; +ajfs; +ajft; +ajfu; +ajfv; +ajfw; +ajfx; +ajfy; +ajfz; +ajga; +ajgb; +ajgc; +ajgd; +ajge; +ajgf; +ajgg; +ajgh; +ajgi; +ajgj; +ajgk; +ajgl; +ajgm; +ajgn; +ajgo; +ajgp; +ajgq; +ajgr; +ajgs; +ajgt; +ajgu; +ajgv; +ajgw; +ajgx; +ajgy; +ajgz; +ajha; +ajhb; +ajhc; +ajhd; +ajhe; +ajhf; +ajhg; +ajhh; +ajhi; +ajhj; +ajhk; +ajhl; +ajhm; +ajhn; +ajho; +ajhp; +ajhq; +ajhr; +ajhs; +ajht; +ajhu; +ajhv; +ajhw; +ajhx; +ajhy; +ajhz; +ajia; +ajib; +ajic; +ajid; +ajie; +ajif; +ajig; +ajih; +ajii; +ajij; +ajik; +ajil; +ajim; +ajin; +ajio; +ajip; +ajiq; +ajir; +ajis; +ajit; +ajiu; +ajiv; +ajiw; +ajix; +ajiy; +ajiz; +ajja; +ajjb; +ajjc; +ajjd; +ajje; +ajjf; +ajjg; +ajjh; +ajji; +ajjj; +ajjk; +ajjl; +ajjm; +ajjn; +ajjo; +ajjp; +ajjq; +ajjr; +ajjs; +ajjt; +ajju; +ajjv; +ajjw; +ajjx; +ajjy; +ajjz; +ajka; +ajkb; +ajkc; +ajkd; +ajke; +ajkf; +ajkg; +ajkh; +ajki; +ajkj; +ajkk; +ajkl; +ajkm; +ajkn; +ajko; +ajkp; +ajkq; +ajkr; +ajks; +ajkt; +ajku; +ajkv; +ajkw; +ajkx; +ajky; +ajkz; +ajla; +ajlb; +ajlc; +ajld; +ajle; +ajlf; +ajlg; +ajlh; +ajli; +ajlj; +ajlk; +ajll; +ajlm; +ajln; +ajlo; +ajlp; +ajlq; +ajlr; +ajls; +ajlt; +ajlu; +ajlv; +ajlw; +ajlx; +ajly; +ajlz; +ajma; +ajmb; +ajmc; +ajmd; +ajme; +ajmf; +ajmg; +ajmh; +ajmi; +ajmj; +ajmk; +ajml; +ajmm; +ajmn; +ajmo; +ajmp; +ajmq; +ajmr; +ajms; +ajmt; +ajmu; +ajmv; +ajmw; +ajmx; +ajmy; +ajmz; +ajna; +ajnb; +ajnc; +ajnd; +ajne; +ajnf; +ajng; +ajnh; +ajni; +ajnj; +ajnk; +ajnl; +ajnm; +ajnn; +ajno; +ajnp; +ajnq; +ajnr; +ajns; +ajnt; +ajnu; +ajnv; +ajnw; +ajnx; +ajny; +ajnz; +ajoa; +ajob; +ajoc; +ajod; +ajoe; +ajof; +ajog; +ajoh; +ajoi; +ajoj; +ajok; +ajol; +ajom; +ajon; +ajoo; +ajop; +ajoq; +ajor; +ajos; +ajot; +ajou; +ajov; +ajow; +ajox; +ajoy; +ajoz; +ajpa; +ajpb; +ajpc; +ajpd; +ajpe; +ajpf; +ajpg; +ajph; +ajpi; +ajpj; +ajpk; +ajpl; +ajpm; +ajpn; +ajpo; +ajpp; +ajpq; +ajpr; +ajps; +ajpt; +ajpu; +ajpv; +ajpw; +ajpx; +ajpy; +ajpz; +ajqa; +ajqb; +ajqc; +ajqd; +ajqe; +ajqf; +ajqg; +ajqh; +ajqi; +ajqj; +ajqk; +ajql; +ajqm; +ajqn; +ajqo; +ajqp; +ajqq; +ajqr; +ajqs; +ajqt; +ajqu; +ajqv; +ajqw; +ajqx; +ajqy; +ajqz; +ajra; +ajrb; +ajrc; +ajrd; +ajre; +ajrf; +ajrg; +ajrh; +ajri; +ajrj; +ajrk; +ajrl; +ajrm; +ajrn; +ajro; +ajrp; +ajrq; +ajrr; +ajrs; +ajrt; +ajru; +ajrv; +ajrw; +ajrx; +ajry; +ajrz; +ajsa; +ajsb; +ajsc; +ajsd; +ajse; +ajsf; +ajsg; +ajsh; +ajsi; +ajsj; +ajsk; +ajsl; +ajsm; +ajsn; +ajso; +ajsp; +ajsq; +ajsr; +ajss; +ajst; +ajsu; +ajsv; +ajsw; +ajsx; +ajsy; +ajsz; +ajta; +ajtb; +ajtc; +ajtd; +ajte; +ajtf; +ajtg; +ajth; +ajti; +ajtj; +ajtk; +ajtl; +ajtm; +ajtn; +ajto; +ajtp; +ajtq; +ajtr; +ajts; +ajtt; +ajtu; +ajtv; +ajtw; +ajtx; +ajty; +ajtz; +ajua; +ajub; +ajuc; +ajud; +ajue; +ajuf; +ajug; +ajuh; +ajui; +ajuj; +ajuk; +ajul; +ajum; +ajun; +ajuo; +ajup; +ajuq; +ajur; +ajus; +ajut; +ajuu; +ajuv; +ajuw; +ajux; +ajuy; +ajuz; +ajva; +ajvb; +ajvc; +ajvd; +ajve; +ajvf; +ajvg; +ajvh; +ajvi; +ajvj; +ajvk; +ajvl; +ajvm; +ajvn; +ajvo; +ajvp; +ajvq; +ajvr; +ajvs; +ajvt; +ajvu; +ajvv; +ajvw; +ajvx; +ajvy; +ajvz; +ajwa; +ajwb; +ajwc; +ajwd; +ajwe; +ajwf; +ajwg; +ajwh; +ajwi; +ajwj; +ajwk; +ajwl; +ajwm; +ajwn; +ajwo; +ajwp; +ajwq; +ajwr; +ajws; +ajwt; +ajwu; +ajwv; +ajww; +ajwx; +ajwy; +ajwz; +ajxa; +ajxb; +ajxc; +ajxd; +ajxe; +ajxf; +ajxg; +ajxh; +ajxi; +ajxj; +ajxk; +ajxl; +ajxm; +ajxn; +ajxo; +ajxp; +ajxq; +ajxr; +ajxs; +ajxt; +ajxu; +ajxv; +ajxw; +ajxx; +ajxy; +ajxz; +ajya; +ajyb; +ajyc; +ajyd; +ajye; +ajyf; +ajyg; +ajyh; +ajyi; +ajyj; +ajyk; +ajyl; +ajym; +ajyn; +ajyo; +ajyp; +ajyq; +ajyr; +ajys; +ajyt; +ajyu; +ajyv; +ajyw; +ajyx; +ajyy; +ajyz; +ajza; +ajzb; +ajzc; +ajzd; +ajze; +ajzf; +ajzg; +ajzh; +ajzi; +ajzj; +ajzk; +ajzl; +ajzm; +ajzn; +ajzo; +ajzp; +ajzq; +ajzr; +ajzs; +ajzt; +ajzu; +ajzv; +ajzw; +ajzx; +ajzy; +ajzz; +akaa; +akab; +akac; +akad; +akae; +akaf; +akag; +akah; +akai; +akaj; +akak; +akal; +akam; +akan; +akao; +akap; +akaq; +akar; +akas; +akat; +akau; +akav; +akaw; +akax; +akay; +akaz; +akba; +akbb; +akbc; +akbd; +akbe; +akbf; +akbg; +akbh; +akbi; +akbj; +akbk; +akbl; +akbm; +akbn; +akbo; +akbp; +akbq; +akbr; +akbs; +akbt; +akbu; +akbv; +akbw; +akbx; +akby; +akbz; +akca; +akcb; +akcc; +akcd; +akce; +akcf; +akcg; +akch; +akci; +akcj; +akck; +akcl; +akcm; +akcn; +akco; +akcp; +akcq; +akcr; +akcs; +akct; +akcu; +akcv; +akcw; +akcx; +akcy; +akcz; +akda; +akdb; +akdc; +akdd; +akde; +akdf; +akdg; +akdh; +akdi; +akdj; +akdk; +akdl; +akdm; +akdn; +akdo; +akdp; +akdq; +akdr; +akds; +akdt; +akdu; +akdv; +akdw; +akdx; +akdy; +akdz; +akea; +akeb; +akec; +aked; +akee; +akef; +akeg; +akeh; +akei; +akej; +akek; +akel; +akem; +aken; +akeo; +akep; +akeq; +aker; +akes; +aket; +akeu; +akev; +akew; +akex; +akey; +akez; +akfa; +akfb; +akfc; +akfd; +akfe; +akff; +akfg; +akfh; +akfi; +akfj; +akfk; +akfl; +akfm; +akfn; +akfo; +akfp; +akfq; +akfr; +akfs; +akft; +akfu; +akfv; +akfw; +akfx; +akfy; +akfz; +akga; +akgb; +akgc; +akgd; +akge; +akgf; +akgg; +akgh; +akgi; +akgj; +akgk; +akgl; +akgm; +akgn; +akgo; +akgp; +akgq; +akgr; +akgs; +akgt; +akgu; +akgv; +akgw; +akgx; +akgy; +akgz; +akha; +akhb; +akhc; +akhd; +akhe; +akhf; +akhg; +akhh; +akhi; +akhj; +akhk; +akhl; +akhm; +akhn; +akho; +akhp; +akhq; +akhr; +akhs; +akht; +akhu; +akhv; +akhw; +akhx; +akhy; +akhz; +akia; +akib; +akic; +akid; +akie; +akif; +akig; +akih; +akii; +akij; +akik; +akil; +akim; +akin; +akio; +akip; +akiq; +akir; +akis; +akit; +akiu; +akiv; +akiw; +akix; +akiy; +akiz; +akja; +akjb; +akjc; +akjd; +akje; +akjf; +akjg; +akjh; +akji; +akjj; +akjk; +akjl; +akjm; +akjn; +akjo; +akjp; +akjq; +akjr; +akjs; +akjt; +akju; +akjv; +akjw; +akjx; +akjy; +akjz; +akka; +akkb; +akkc; +akkd; +akke; +akkf; +akkg; +akkh; +akki; +akkj; +akkk; +akkl; +akkm; +akkn; +akko; +akkp; +akkq; +akkr; +akks; +akkt; +akku; +akkv; +akkw; +akkx; +akky; +akkz; +akla; +aklb; +aklc; +akld; +akle; +aklf; +aklg; +aklh; +akli; +aklj; +aklk; +akll; +aklm; +akln; +aklo; +aklp; +aklq; +aklr; +akls; +aklt; +aklu; +aklv; +aklw; +aklx; +akly; +aklz; +akma; +akmb; +akmc; +akmd; +akme; +akmf; +akmg; +akmh; +akmi; +akmj; +akmk; +akml; +akmm; +akmn; +akmo; +akmp; +akmq; +akmr; +akms; +akmt; +akmu; +akmv; +akmw; +akmx; +akmy; +akmz; +akna; +aknb; +aknc; +aknd; +akne; +aknf; +akng; +aknh; +akni; +aknj; +aknk; +aknl; +aknm; +aknn; +akno; +aknp; +aknq; +aknr; +akns; +aknt; +aknu; +aknv; +aknw; +aknx; +akny; +aknz; +akoa; +akob; +akoc; +akod; +akoe; +akof; +akog; +akoh; +akoi; +akoj; +akok; +akol; +akom; +akon; +akoo; +akop; +akoq; +akor; +akos; +akot; +akou; +akov; +akow; +akox; +akoy; +akoz; +akpa; +akpb; +akpc; +akpd; +akpe; +akpf; +akpg; +akph; +akpi; +akpj; +akpk; +akpl; +akpm; +akpn; +akpo; +akpp; +akpq; +akpr; +akps; +akpt; +akpu; +akpv; +akpw; +akpx; +akpy; +akpz; +akqa; +akqb; +akqc; +akqd; +akqe; +akqf; +akqg; +akqh; +akqi; +akqj; +akqk; +akql; +akqm; +akqn; +akqo; +akqp; +akqq; +akqr; +akqs; +akqt; +akqu; +akqv; +akqw; +akqx; +akqy; +akqz; +akra; +akrb; +akrc; +akrd; +akre; +akrf; +akrg; +akrh; +akri; +akrj; +akrk; +akrl; +akrm; +akrn; +akro; +akrp; +akrq; +akrr; +akrs; +akrt; +akru; +akrv; +akrw; +akrx; +akry; +akrz; +aksa; +aksb; +aksc; +aksd; +akse; +aksf; +aksg; +aksh; +aksi; +aksj; +aksk; +aksl; +aksm; +aksn; +akso; +aksp; +aksq; +aksr; +akss; +akst; +aksu; +aksv; +aksw; +aksx; +aksy; +aksz; +akta; +aktb; +aktc; +aktd; +akte; +aktf; +aktg; +akth; +akti; +aktj; +aktk; +aktl; +aktm; +aktn; +akto; +aktp; +aktq; +aktr; +akts; +aktt; +aktu; +aktv; +aktw; +aktx; +akty; +aktz; +akua; +akub; +akuc; +akud; +akue; +akuf; +akug; +akuh; +akui; +akuj; +akuk; +akul; +akum; +akun; +akuo; +akup; +akuq; +akur; +akus; +akut; +akuu; +akuv; +akuw; +akux; +akuy; +akuz; +akva; +akvb; +akvc; +akvd; +akve; +akvf; +akvg; +akvh; +akvi; +akvj; +akvk; +akvl; +akvm; +akvn; +akvo; +akvp; +akvq; +akvr; +akvs; +akvt; +akvu; +akvv; +akvw; +akvx; +akvy; +akvz; +akwa; +akwb; +akwc; +akwd; +akwe; +akwf; +akwg; +akwh; +akwi; +akwj; +akwk; +akwl; +akwm; +akwn; +akwo; +akwp; +akwq; +akwr; +akws; +akwt; +akwu; +akwv; +akww; +akwx; +akwy; +akwz; +akxa; +akxb; +akxc; +akxd; +akxe; +akxf; +akxg; +akxh; +akxi; +akxj; +akxk; +akxl; +akxm; +akxn; +akxo; +akxp; +akxq; +akxr; +akxs; +akxt; +akxu; +akxv; +akxw; +akxx; +akxy; +akxz; +akya; +akyb; +akyc; +akyd; +akye; +akyf; +akyg; +akyh; +akyi; +akyj; +akyk; +akyl; +akym; +akyn; +akyo; +akyp; +akyq; +akyr; +akys; +akyt; +akyu; +akyv; +akyw; +akyx; +akyy; +akyz; +akza; +akzb; +akzc; +akzd; +akze; +akzf; +akzg; +akzh; +akzi; +akzj; +akzk; +akzl; +akzm; +akzn; +akzo; +akzp; +akzq; +akzr; +akzs; +akzt; +akzu; +akzv; +akzw; +akzx; +akzy; +akzz; +alaa; +alab; +alac; +alad; +alae; +alaf; +alag; +alah; +alai; +alaj; +alak; +alal; +alam; +alan; +alao; +alap; +alaq; +alar; +alas; +alat; +alau; +alav; +alaw; +alax; +alay; +alaz; +alba; +albb; +albc; +albd; +albe; +albf; +albg; +albh; +albi; +albj; +albk; +albl; +albm; +albn; +albo; +albp; +albq; +albr; +albs; +albt; +albu; +albv; +albw; +albx; +alby; +albz; +alca; +alcb; +alcc; +alcd; +alce; +alcf; +alcg; +alch; +alci; +alcj; +alck; +alcl; +alcm; +alcn; +alco; +alcp; +alcq; +alcr; +alcs; +alct; +alcu; +alcv; +alcw; +alcx; +alcy; +alcz; +alda; +aldb; +aldc; +aldd; +alde; +aldf; +aldg; +aldh; +aldi; +aldj; +aldk; +aldl; +aldm; +aldn; +aldo; +aldp; +aldq; +aldr; +alds; +aldt; +aldu; +aldv; +aldw; +aldx; +aldy; +aldz; +alea; +aleb; +alec; +aled; +alee; +alef; +aleg; +aleh; +alei; +alej; +alek; +alel; +alem; +alen; +aleo; +alep; +aleq; +aler; +ales; +alet; +aleu; +alev; +alew; +alex; +aley; +alez; +alfa; +alfb; +alfc; +alfd; +alfe; +alff; +alfg; +alfh; +alfi; +alfj; +alfk; +alfl; +alfm; +alfn; +alfo; +alfp; +alfq; +alfr; +alfs; +alft; +alfu; +alfv; +alfw; +alfx; +alfy; +alfz; +alga; +algb; +algc; +algd; +alge; +algf; +algg; +algh; +algi; +algj; +algk; +algl; +algm; +algn; +algo; +algp; +algq; +algr; +algs; +algt; +algu; +algv; +algw; +algx; +algy; +algz; +alha; +alhb; +alhc; +alhd; +alhe; +alhf; +alhg; +alhh; +alhi; +alhj; +alhk; +alhl; +alhm; +alhn; +alho; +alhp; +alhq; +alhr; +alhs; +alht; +alhu; +alhv; +alhw; +alhx; +alhy; +alhz; +alia; +alib; +alic; +alid; +alie; +alif; +alig; +alih; +alii; +alij; +alik; +alil; +alim; +alin; +alio; +alip; +aliq; +alir; +alis; +alit; +aliu; +aliv; +aliw; +alix; +aliy; +aliz; +alja; +aljb; +aljc; +aljd; +alje; +aljf; +aljg; +aljh; +alji; +aljj; +aljk; +aljl; +aljm; +aljn; +aljo; +aljp; +aljq; +aljr; +aljs; +aljt; +alju; +aljv; +aljw; +aljx; +aljy; +aljz; +alka; +alkb; +alkc; +alkd; +alke; +alkf; +alkg; +alkh; +alki; +alkj; +alkk; +alkl; +alkm; +alkn; +alko; +alkp; +alkq; +alkr; +alks; +alkt; +alku; +alkv; +alkw; +alkx; +alky; +alkz; +alla; +allb; +allc; +alld; +alle; +allf; +allg; +allh; +alli; +allj; +allk; +alll; +allm; +alln; +allo; +allp; +allq; +allr; +alls; +allt; +allu; +allv; +allw; +allx; +ally; +allz; +alma; +almb; +almc; +almd; +alme; +almf; +almg; +almh; +almi; +almj; +almk; +alml; +almm; +almn; +almo; +almp; +almq; +almr; +alms; +almt; +almu; +almv; +almw; +almx; +almy; +almz; +alna; +alnb; +alnc; +alnd; +alne; +alnf; +alng; +alnh; +alni; +alnj; +alnk; +alnl; +alnm; +alnn; +alno; +alnp; +alnq; +alnr; +alns; +alnt; +alnu; +alnv; +alnw; +alnx; +alny; +alnz; +aloa; +alob; +aloc; +alod; +aloe; +alof; +alog; +aloh; +aloi; +aloj; +alok; +alol; +alom; +alon; +aloo; +alop; +aloq; +alor; +alos; +alot; +alou; +alov; +alow; +alox; +aloy; +aloz; +alpa; +alpb; +alpc; +alpd; +alpe; +alpf; +alpg; +alph; +alpi; +alpj; +alpk; +alpl; +alpm; +alpn; +alpo; +alpp; +alpq; +alpr; +alps; +alpt; +alpu; +alpv; +alpw; +alpx; +alpy; +alpz; +alqa; +alqb; +alqc; +alqd; +alqe; +alqf; +alqg; +alqh; +alqi; +alqj; +alqk; +alql; +alqm; +alqn; +alqo; +alqp; +alqq; +alqr; +alqs; +alqt; +alqu; +alqv; +alqw; +alqx; +alqy; +alqz; +alra; +alrb; +alrc; +alrd; +alre; +alrf; +alrg; +alrh; +alri; +alrj; +alrk; +alrl; +alrm; +alrn; +alro; +alrp; +alrq; +alrr; +alrs; +alrt; +alru; +alrv; +alrw; +alrx; +alry; +alrz; +alsa; +alsb; +alsc; +alsd; +alse; +alsf; +alsg; +alsh; +alsi; +alsj; +alsk; +alsl; +alsm; +alsn; +also; +alsp; +alsq; +alsr; +alss; +alst; +alsu; +alsv; +alsw; +alsx; +alsy; +alsz; +alta; +altb; +altc; +altd; +alte; +altf; +altg; +alth; +alti; +altj; +altk; +altl; +altm; +altn; +alto; +altp; +altq; +altr; +alts; +altt; +altu; +altv; +altw; +altx; +alty; +altz; +alua; +alub; +aluc; +alud; +alue; +aluf; +alug; +aluh; +alui; +aluj; +aluk; +alul; +alum; +alun; +aluo; +alup; +aluq; +alur; +alus; +alut; +aluu; +aluv; +aluw; +alux; +aluy; +aluz; +alva; +alvb; +alvc; +alvd; +alve; +alvf; +alvg; +alvh; +alvi; +alvj; +alvk; +alvl; +alvm; +alvn; +alvo; +alvp; +alvq; +alvr; +alvs; +alvt; +alvu; +alvv; +alvw; +alvx; +alvy; +alvz; +alwa; +alwb; +alwc; +alwd; +alwe; +alwf; +alwg; +alwh; +alwi; +alwj; +alwk; +alwl; +alwm; +alwn; +alwo; +alwp; +alwq; +alwr; +alws; +alwt; +alwu; +alwv; +alww; +alwx; +alwy; +alwz; +alxa; +alxb; +alxc; +alxd; +alxe; +alxf; +alxg; +alxh; +alxi; +alxj; +alxk; +alxl; +alxm; +alxn; +alxo; +alxp; +alxq; +alxr; +alxs; +alxt; +alxu; +alxv; +alxw; +alxx; +alxy; +alxz; +alya; +alyb; +alyc; +alyd; +alye; +alyf; +alyg; +alyh; +alyi; +alyj; +alyk; +alyl; +alym; +alyn; +alyo; +alyp; +alyq; +alyr; +alys; +alyt; +alyu; +alyv; +alyw; +alyx; +alyy; +alyz; +alza; +alzb; +alzc; +alzd; +alze; +alzf; +alzg; +alzh; +alzi; +alzj; +alzk; +alzl; +alzm; +alzn; +alzo; +alzp; +alzq; +alzr; +alzs; +alzt; +alzu; +alzv; +alzw; +alzx; +alzy; +alzz; +amaa; +amab; +amac; +amad; +amae; +amaf; +amag; +amah; +amai; +amaj; +amak; +amal; +amam; +aman; +amao; +amap; +amaq; +amar; +amas; +amat; +amau; +amav; +amaw; +amax; +amay; +amaz; +amba; +ambb; +ambc; +ambd; +ambe; +ambf; +ambg; +ambh; +ambi; +ambj; +ambk; +ambl; +ambm; +ambn; +ambo; +ambp; +ambq; +ambr; +ambs; +ambt; +ambu; +ambv; +ambw; +ambx; +amby; +ambz; +amca; +amcb; +amcc; +amcd; +amce; +amcf; +amcg; +amch; +amci; +amcj; +amck; +amcl; +amcm; +amcn; +amco; +amcp; +amcq; +amcr; +amcs; +amct; +amcu; +amcv; +amcw; +amcx; +amcy; +amcz; +amda; +amdb; +amdc; +amdd; +amde; +amdf; +amdg; +amdh; +amdi; +amdj; +amdk; +amdl; +amdm; +amdn; +amdo; +amdp; +amdq; +amdr; +amds; +amdt; +amdu; +amdv; +amdw; +amdx; +amdy; +amdz; +amea; +ameb; +amec; +amed; +amee; +amef; +ameg; +ameh; +amei; +amej; +amek; +amel; +amem; +amen; +ameo; +amep; +ameq; +amer; +ames; +amet; +ameu; +amev; +amew; +amex; +amey; +amez; +amfa; +amfb; +amfc; +amfd; +amfe; +amff; +amfg; +amfh; +amfi; +amfj; +amfk; +amfl; +amfm; +amfn; +amfo; +amfp; +amfq; +amfr; +amfs; +amft; +amfu; +amfv; +amfw; +amfx; +amfy; +amfz; +amga; +amgb; +amgc; +amgd; +amge; +amgf; +amgg; +amgh; +amgi; +amgj; +amgk; +amgl; +amgm; +amgn; +amgo; +amgp; +amgq; +amgr; +amgs; +amgt; +amgu; +amgv; +amgw; +amgx; +amgy; +amgz; +amha; +amhb; +amhc; +amhd; +amhe; +amhf; +amhg; +amhh; +amhi; +amhj; +amhk; +amhl; +amhm; +amhn; +amho; +amhp; +amhq; +amhr; +amhs; +amht; +amhu; +amhv; +amhw; +amhx; +amhy; +amhz; +amia; +amib; +amic; +amid; +amie; +amif; +amig; +amih; +amii; +amij; +amik; +amil; +amim; +amin; +amio; +amip; +amiq; +amir; +amis; +amit; +amiu; +amiv; +amiw; +amix; +amiy; +amiz; +amja; +amjb; +amjc; +amjd; +amje; +amjf; +amjg; +amjh; +amji; +amjj; +amjk; +amjl; +amjm; +amjn; +amjo; +amjp; +amjq; +amjr; +amjs; +amjt; +amju; +amjv; +amjw; +amjx; +amjy; +amjz; +amka; +amkb; +amkc; +amkd; +amke; +amkf; +amkg; +amkh; +amki; +amkj; +amkk; +amkl; +amkm; +amkn; +amko; +amkp; +amkq; +amkr; +amks; +amkt; +amku; +amkv; +amkw; +amkx; +amky; +amkz; +amla; +amlb; +amlc; +amld; +amle; +amlf; +amlg; +amlh; +amli; +amlj; +amlk; +amll; +amlm; +amln; +amlo; +amlp; +amlq; +amlr; +amls; +amlt; +amlu; +amlv; +amlw; +amlx; +amly; +amlz; +amma; +ammb; +ammc; +ammd; +amme; +ammf; +ammg; +ammh; +ammi; +ammj; +ammk; +amml; +ammm; +ammn; +ammo; +ammp; +ammq; +ammr; +amms; +ammt; +ammu; +ammv; +ammw; +ammx; +ammy; +ammz; +amna; +amnb; +amnc; +amnd; +amne; +amnf; +amng; +amnh; +amni; +amnj; +amnk; +amnl; +amnm; +amnn; +amno; +amnp; +amnq; +amnr; +amns; +amnt; +amnu; +amnv; +amnw; +amnx; +amny; +amnz; +amoa; +amob; +amoc; +amod; +amoe; +amof; +amog; +amoh; +amoi; +amoj; +amok; +amol; +amom; +amon; +amoo; +amop; +amoq; +amor; +amos; +amot; +amou; +amov; +amow; +amox; +amoy; +amoz; +ampa; +ampb; +ampc; +ampd; +ampe; +ampf; +ampg; +amph; +ampi; +ampj; +ampk; +ampl; +ampm; +ampn; +ampo; +ampp; +ampq; +ampr; +amps; +ampt; +ampu; +ampv; +ampw; +ampx; +ampy; +ampz; +amqa; +amqb; +amqc; +amqd; +amqe; +amqf; +amqg; +amqh; +amqi; +amqj; +amqk; +amql; +amqm; +amqn; +amqo; +amqp; +amqq; +amqr; +amqs; +amqt; +amqu; +amqv; +amqw; +amqx; +amqy; +amqz; +amra; +amrb; +amrc; +amrd; +amre; +amrf; +amrg; +amrh; +amri; +amrj; +amrk; +amrl; +amrm; +amrn; +amro; +amrp; +amrq; +amrr; +amrs; +amrt; +amru; +amrv; +amrw; +amrx; +amry; +amrz; +amsa; +amsb; +amsc; +amsd; +amse; +amsf; +amsg; +amsh; +amsi; +amsj; +amsk; +amsl; +amsm; +amsn; +amso; +amsp; +amsq; +amsr; +amss; +amst; +amsu; +amsv; +amsw; +amsx; +amsy; +amsz; +amta; +amtb; +amtc; +amtd; +amte; +amtf; +amtg; +amth; +amti; +amtj; +amtk; +amtl; +amtm; +amtn; +amto; +amtp; +amtq; +amtr; +amts; +amtt; +amtu; +amtv; +amtw; +amtx; +amty; +amtz; +amua; +amub; +amuc; +amud; +amue; +amuf; +amug; +amuh; +amui; +amuj; +amuk; +amul; +amum; +amun; +amuo; +amup; +amuq; +amur; +amus; +amut; +amuu; +amuv; +amuw; +amux; +amuy; +amuz; +amva; +amvb; +amvc; +amvd; +amve; +amvf; +amvg; +amvh; +amvi; +amvj; +amvk; +amvl; +amvm; +amvn; +amvo; +amvp; +amvq; +amvr; +amvs; +amvt; +amvu; +amvv; +amvw; +amvx; +amvy; +amvz; +amwa; +amwb; +amwc; +amwd; +amwe; +amwf; +amwg; +amwh; +amwi; +amwj; +amwk; +amwl; +amwm; +amwn; +amwo; +amwp; +amwq; +amwr; +amws; +amwt; +amwu; +amwv; +amww; +amwx; +amwy; +amwz; +amxa; +amxb; +amxc; +amxd; +amxe; +amxf; +amxg; +amxh; +amxi; +amxj; +amxk; +amxl; +amxm; +amxn; +amxo; +amxp; +amxq; +amxr; +amxs; +amxt; +amxu; +amxv; +amxw; +amxx; +amxy; +amxz; +amya; +amyb; +amyc; +amyd; +amye; +amyf; +amyg; +amyh; +amyi; +amyj; +amyk; +amyl; +amym; +amyn; +amyo; +amyp; +amyq; +amyr; +amys; +amyt; +amyu; +amyv; +amyw; +amyx; +amyy; +amyz; +amza; +amzb; +amzc; +amzd; +amze; +amzf; +amzg; +amzh; +amzi; +amzj; +amzk; +amzl; +amzm; +amzn; +amzo; +amzp; +amzq; +amzr; +amzs; +amzt; +amzu; +amzv; +amzw; +amzx; +amzy; +amzz; +anaa; +anab; +anac; +anad; +anae; +anaf; +anag; +anah; +anai; +anaj; +anak; +anal; +anam; +anan; +anao; +anap; +anaq; +anar; +anas; +anat; +anau; +anav; +anaw; +anax; +anay; +anaz; +anba; +anbb; +anbc; +anbd; +anbe; +anbf; +anbg; +anbh; +anbi; +anbj; +anbk; +anbl; +anbm; +anbn; +anbo; +anbp; +anbq; +anbr; +anbs; +anbt; +anbu; +anbv; +anbw; +anbx; +anby; +anbz; +anca; +ancb; +ancc; +ancd; +ance; +ancf; +ancg; +anch; +anci; +ancj; +anck; +ancl; +ancm; +ancn; +anco; +ancp; +ancq; +ancr; +ancs; +anct; +ancu; +ancv; +ancw; +ancx; +ancy; +ancz; +anda; +andb; +andc; +andd; +ande; +andf; +andg; +andh; +andi; +andj; +andk; +andl; +andm; +andn; +ando; +andp; +andq; +andr; +ands; +andt; +andu; +andv; +andw; +andx; +andy; +andz; +anea; +aneb; +anec; +aned; +anee; +anef; +aneg; +aneh; +anei; +anej; +anek; +anel; +anem; +anen; +aneo; +anep; +aneq; +aner; +anes; +anet; +aneu; +anev; +anew; +anex; +aney; +anez; +anfa; +anfb; +anfc; +anfd; +anfe; +anff; +anfg; +anfh; +anfi; +anfj; +anfk; +anfl; +anfm; +anfn; +anfo; +anfp; +anfq; +anfr; +anfs; +anft; +anfu; +anfv; +anfw; +anfx; +anfy; +anfz; +anga; +angb; +angc; +angd; +ange; +angf; +angg; +angh; +angi; +angj; +angk; +angl; +angm; +angn; +ango; +angp; +angq; +angr; +angs; +angt; +angu; +angv; +angw; +angx; +angy; +angz; +anha; +anhb; +anhc; +anhd; +anhe; +anhf; +anhg; +anhh; +anhi; +anhj; +anhk; +anhl; +anhm; +anhn; +anho; +anhp; +anhq; +anhr; +anhs; +anht; +anhu; +anhv; +anhw; +anhx; +anhy; +anhz; +ania; +anib; +anic; +anid; +anie; +anif; +anig; +anih; +anii; +anij; +anik; +anil; +anim; +anin; +anio; +anip; +aniq; +anir; +anis; +anit; +aniu; +aniv; +aniw; +anix; +aniy; +aniz; +anja; +anjb; +anjc; +anjd; +anje; +anjf; +anjg; +anjh; +anji; +anjj; +anjk; +anjl; +anjm; +anjn; +anjo; +anjp; +anjq; +anjr; +anjs; +anjt; +anju; +anjv; +anjw; +anjx; +anjy; +anjz; +anka; +ankb; +ankc; +ankd; +anke; +ankf; +ankg; +ankh; +anki; +ankj; +ankk; +ankl; +ankm; +ankn; +anko; +ankp; +ankq; +ankr; +anks; +ankt; +anku; +ankv; +ankw; +ankx; +anky; +ankz; +anla; +anlb; +anlc; +anld; +anle; +anlf; +anlg; +anlh; +anli; +anlj; +anlk; +anll; +anlm; +anln; +anlo; +anlp; +anlq; +anlr; +anls; +anlt; +anlu; +anlv; +anlw; +anlx; +anly; +anlz; +anma; +anmb; +anmc; +anmd; +anme; +anmf; +anmg; +anmh; +anmi; +anmj; +anmk; +anml; +anmm; +anmn; +anmo; +anmp; +anmq; +anmr; +anms; +anmt; +anmu; +anmv; +anmw; +anmx; +anmy; +anmz; +anna; +annb; +annc; +annd; +anne; +annf; +anng; +annh; +anni; +annj; +annk; +annl; +annm; +annn; +anno; +annp; +annq; +annr; +anns; +annt; +annu; +annv; +annw; +annx; +anny; +annz; +anoa; +anob; +anoc; +anod; +anoe; +anof; +anog; +anoh; +anoi; +anoj; +anok; +anol; +anom; +anon; +anoo; +anop; +anoq; +anor; +anos; +anot; +anou; +anov; +anow; +anox; +anoy; +anoz; +anpa; +anpb; +anpc; +anpd; +anpe; +anpf; +anpg; +anph; +anpi; +anpj; +anpk; +anpl; +anpm; +anpn; +anpo; +anpp; +anpq; +anpr; +anps; +anpt; +anpu; +anpv; +anpw; +anpx; +anpy; +anpz; +anqa; +anqb; +anqc; +anqd; +anqe; +anqf; +anqg; +anqh; +anqi; +anqj; +anqk; +anql; +anqm; +anqn; +anqo; +anqp; +anqq; +anqr; +anqs; +anqt; +anqu; +anqv; +anqw; +anqx; +anqy; +anqz; +anra; +anrb; +anrc; +anrd; +anre; +anrf; +anrg; +anrh; +anri; +anrj; +anrk; +anrl; +anrm; +anrn; +anro; +anrp; +anrq; +anrr; +anrs; +anrt; +anru; +anrv; +anrw; +anrx; +anry; +anrz; +ansa; +ansb; +ansc; +ansd; +anse; +ansf; +ansg; +ansh; +ansi; +ansj; +ansk; +ansl; +ansm; +ansn; +anso; +ansp; +ansq; +ansr; +anss; +anst; +ansu; +ansv; +answ; +ansx; +ansy; +ansz; +anta; +antb; +antc; +antd; +ante; +antf; +antg; +anth; +anti; +antj; +antk; +antl; +antm; +antn; +anto; +antp; +antq; +antr; +ants; +antt; +antu; +antv; +antw; +antx; +anty; +antz; +anua; +anub; +anuc; +anud; +anue; +anuf; +anug; +anuh; +anui; +anuj; +anuk; +anul; +anum; +anun; +anuo; +anup; +anuq; +anur; +anus; +anut; +anuu; +anuv; +anuw; +anux; +anuy; +anuz; +anva; +anvb; +anvc; +anvd; +anve; +anvf; +anvg; +anvh; +anvi; +anvj; +anvk; +anvl; +anvm; +anvn; +anvo; +anvp; +anvq; +anvr; +anvs; +anvt; +anvu; +anvv; +anvw; +anvx; +anvy; +anvz; +anwa; +anwb; +anwc; +anwd; +anwe; +anwf; +anwg; +anwh; +anwi; +anwj; +anwk; +anwl; +anwm; +anwn; +anwo; +anwp; +anwq; +anwr; +anws; +anwt; +anwu; +anwv; +anww; +anwx; +anwy; +anwz; +anxa; +anxb; +anxc; +anxd; +anxe; +anxf; +anxg; +anxh; +anxi; +anxj; +anxk; +anxl; +anxm; +anxn; +anxo; +anxp; +anxq; +anxr; +anxs; +anxt; +anxu; +anxv; +anxw; +anxx; +anxy; +anxz; +anya; +anyb; +anyc; +anyd; +anye; +anyf; +anyg; +anyh; +anyi; +anyj; +anyk; +anyl; +anym; +anyn; +anyo; +anyp; +anyq; +anyr; +anys; +anyt; +anyu; +anyv; +anyw; +anyx; +anyy; +anyz; +anza; +anzb; +anzc; +anzd; +anze; +anzf; +anzg; +anzh; +anzi; +anzj; +anzk; +anzl; +anzm; +anzn; +anzo; +anzp; +anzq; +anzr; +anzs; +anzt; +anzu; +anzv; +anzw; +anzx; +anzy; +anzz; +aoaa; +aoab; +aoac; +aoad; +aoae; +aoaf; +aoag; +aoah; +aoai; +aoaj; +aoak; +aoal; +aoam; +aoan; +aoao; +aoap; +aoaq; +aoar; +aoas; +aoat; +aoau; +aoav; +aoaw; +aoax; +aoay; +aoaz; +aoba; +aobb; +aobc; +aobd; +aobe; +aobf; +aobg; +aobh; +aobi; +aobj; +aobk; +aobl; +aobm; +aobn; +aobo; +aobp; +aobq; +aobr; +aobs; +aobt; +aobu; +aobv; +aobw; +aobx; +aoby; +aobz; +aoca; +aocb; +aocc; +aocd; +aoce; +aocf; +aocg; +aoch; +aoci; +aocj; +aock; +aocl; +aocm; +aocn; +aoco; +aocp; +aocq; +aocr; +aocs; +aoct; +aocu; +aocv; +aocw; +aocx; +aocy; +aocz; +aoda; +aodb; +aodc; +aodd; +aode; +aodf; +aodg; +aodh; +aodi; +aodj; +aodk; +aodl; +aodm; +aodn; +aodo; +aodp; +aodq; +aodr; +aods; +aodt; +aodu; +aodv; +aodw; +aodx; +aody; +aodz; +aoea; +aoeb; +aoec; +aoed; +aoee; +aoef; +aoeg; +aoeh; +aoei; +aoej; +aoek; +aoel; +aoem; +aoen; +aoeo; +aoep; +aoeq; +aoer; +aoes; +aoet; +aoeu; +aoev; +aoew; +aoex; +aoey; +aoez; +aofa; +aofb; +aofc; +aofd; +aofe; +aoff; +aofg; +aofh; +aofi; +aofj; +aofk; +aofl; +aofm; +aofn; +aofo; +aofp; +aofq; +aofr; +aofs; +aoft; +aofu; +aofv; +aofw; +aofx; +aofy; +aofz; +aoga; +aogb; +aogc; +aogd; +aoge; +aogf; +aogg; +aogh; +aogi; +aogj; +aogk; +aogl; +aogm; +aogn; +aogo; +aogp; +aogq; +aogr; +aogs; +aogt; +aogu; +aogv; +aogw; +aogx; +aogy; +aogz; +aoha; +aohb; +aohc; +aohd; +aohe; +aohf; +aohg; +aohh; +aohi; +aohj; +aohk; +aohl; +aohm; +aohn; +aoho; +aohp; +aohq; +aohr; +aohs; +aoht; +aohu; +aohv; +aohw; +aohx; +aohy; +aohz; +aoia; +aoib; +aoic; +aoid; +aoie; +aoif; +aoig; +aoih; +aoii; +aoij; +aoik; +aoil; +aoim; +aoin; +aoio; +aoip; +aoiq; +aoir; +aois; +aoit; +aoiu; +aoiv; +aoiw; +aoix; +aoiy; +aoiz; +aoja; +aojb; +aojc; +aojd; +aoje; +aojf; +aojg; +aojh; +aoji; +aojj; +aojk; +aojl; +aojm; +aojn; +aojo; +aojp; +aojq; +aojr; +aojs; +aojt; +aoju; +aojv; +aojw; +aojx; +aojy; +aojz; +aoka; +aokb; +aokc; +aokd; +aoke; +aokf; +aokg; +aokh; +aoki; +aokj; +aokk; +aokl; +aokm; +aokn; +aoko; +aokp; +aokq; +aokr; +aoks; +aokt; +aoku; +aokv; +aokw; +aokx; +aoky; +aokz; +aola; +aolb; +aolc; +aold; +aole; +aolf; +aolg; +aolh; +aoli; +aolj; +aolk; +aoll; +aolm; +aoln; +aolo; +aolp; +aolq; +aolr; +aols; +aolt; +aolu; +aolv; +aolw; +aolx; +aoly; +aolz; +aoma; +aomb; +aomc; +aomd; +aome; +aomf; +aomg; +aomh; +aomi; +aomj; +aomk; +aoml; +aomm; +aomn; +aomo; +aomp; +aomq; +aomr; +aoms; +aomt; +aomu; +aomv; +aomw; +aomx; +aomy; +aomz; +aona; +aonb; +aonc; +aond; +aone; +aonf; +aong; +aonh; +aoni; +aonj; +aonk; +aonl; +aonm; +aonn; +aono; +aonp; +aonq; +aonr; +aons; +aont; +aonu; +aonv; +aonw; +aonx; +aony; +aonz; +aooa; +aoob; +aooc; +aood; +aooe; +aoof; +aoog; +aooh; +aooi; +aooj; +aook; +aool; +aoom; +aoon; +aooo; +aoop; +aooq; +aoor; +aoos; +aoot; +aoou; +aoov; +aoow; +aoox; +aooy; +aooz; +aopa; +aopb; +aopc; +aopd; +aope; +aopf; +aopg; +aoph; +aopi; +aopj; +aopk; +aopl; +aopm; +aopn; +aopo; +aopp; +aopq; +aopr; +aops; +aopt; +aopu; +aopv; +aopw; +aopx; +aopy; +aopz; +aoqa; +aoqb; +aoqc; +aoqd; +aoqe; +aoqf; +aoqg; +aoqh; +aoqi; +aoqj; +aoqk; +aoql; +aoqm; +aoqn; +aoqo; +aoqp; +aoqq; +aoqr; +aoqs; +aoqt; +aoqu; +aoqv; +aoqw; +aoqx; +aoqy; +aoqz; +aora; +aorb; +aorc; +aord; +aore; +aorf; +aorg; +aorh; +aori; +aorj; +aork; +aorl; +aorm; +aorn; +aoro; +aorp; +aorq; +aorr; +aors; +aort; +aoru; +aorv; +aorw; +aorx; +aory; +aorz; +aosa; +aosb; +aosc; +aosd; +aose; +aosf; +aosg; +aosh; +aosi; +aosj; +aosk; +aosl; +aosm; +aosn; +aoso; +aosp; +aosq; +aosr; +aoss; +aost; +aosu; +aosv; +aosw; +aosx; +aosy; +aosz; +aota; +aotb; +aotc; +aotd; +aote; +aotf; +aotg; +aoth; +aoti; +aotj; +aotk; +aotl; +aotm; +aotn; +aoto; +aotp; +aotq; +aotr; +aots; +aott; +aotu; +aotv; +aotw; +aotx; +aoty; +aotz; +aoua; +aoub; +aouc; +aoud; +aoue; +aouf; +aoug; +aouh; +aoui; +aouj; +aouk; +aoul; +aoum; +aoun; +aouo; +aoup; +aouq; +aour; +aous; +aout; +aouu; +aouv; +aouw; +aoux; +aouy; +aouz; +aova; +aovb; +aovc; +aovd; +aove; +aovf; +aovg; +aovh; +aovi; +aovj; +aovk; +aovl; +aovm; +aovn; +aovo; +aovp; +aovq; +aovr; +aovs; +aovt; +aovu; +aovv; +aovw; +aovx; +aovy; +aovz; +aowa; +aowb; +aowc; +aowd; +aowe; +aowf; +aowg; +aowh; +aowi; +aowj; +aowk; +aowl; +aowm; +aown; +aowo; +aowp; +aowq; +aowr; +aows; +aowt; +aowu; +aowv; +aoww; +aowx; +aowy; +aowz; +aoxa; +aoxb; +aoxc; +aoxd; +aoxe; +aoxf; +aoxg; +aoxh; +aoxi; +aoxj; +aoxk; +aoxl; +aoxm; +aoxn; +aoxo; +aoxp; +aoxq; +aoxr; +aoxs; +aoxt; +aoxu; +aoxv; +aoxw; +aoxx; +aoxy; +aoxz; +aoya; +aoyb; +aoyc; +aoyd; +aoye; +aoyf; +aoyg; +aoyh; +aoyi; +aoyj; +aoyk; +aoyl; +aoym; +aoyn; +aoyo; +aoyp; +aoyq; +aoyr; +aoys; +aoyt; +aoyu; +aoyv; +aoyw; +aoyx; +aoyy; +aoyz; +aoza; +aozb; +aozc; +aozd; +aoze; +aozf; +aozg; +aozh; +aozi; +aozj; +aozk; +aozl; +aozm; +aozn; +aozo; +aozp; +aozq; +aozr; +aozs; +aozt; +aozu; +aozv; +aozw; +aozx; +aozy; +aozz; +apaa; +apab; +apac; +apad; +apae; +apaf; +apag; +apah; +apai; +apaj; +apak; +apal; +apam; +apan; +apao; +apap; +apaq; +apar; +apas; +apat; +apau; +apav; +apaw; +apax; +apay; +apaz; +apba; +apbb; +apbc; +apbd; +apbe; +apbf; +apbg; +apbh; +apbi; +apbj; +apbk; +apbl; +apbm; +apbn; +apbo; +apbp; +apbq; +apbr; +apbs; +apbt; +apbu; +apbv; +apbw; +apbx; +apby; +apbz; +apca; +apcb; +apcc; +apcd; +apce; +apcf; +apcg; +apch; +apci; +apcj; +apck; +apcl; +apcm; +apcn; +apco; +apcp; +apcq; +apcr; +apcs; +apct; +apcu; +apcv; +apcw; +apcx; +apcy; +apcz; +apda; +apdb; +apdc; +apdd; +apde; +apdf; +apdg; +apdh; +apdi; +apdj; +apdk; +apdl; +apdm; +apdn; +apdo; +apdp; +apdq; +apdr; +apds; +apdt; +apdu; +apdv; +apdw; +apdx; +apdy; +apdz; +apea; +apeb; +apec; +aped; +apee; +apef; +apeg; +apeh; +apei; +apej; +apek; +apel; +apem; +apen; +apeo; +apep; +apeq; +aper; +apes; +apet; +apeu; +apev; +apew; +apex; +apey; +apez; +apfa; +apfb; +apfc; +apfd; +apfe; +apff; +apfg; +apfh; +apfi; +apfj; +apfk; +apfl; +apfm; +apfn; +apfo; +apfp; +apfq; +apfr; +apfs; +apft; +apfu; +apfv; +apfw; +apfx; +apfy; +apfz; +apga; +apgb; +apgc; +apgd; +apge; +apgf; +apgg; +apgh; +apgi; +apgj; +apgk; +apgl; +apgm; +apgn; +apgo; +apgp; +apgq; +apgr; +apgs; +apgt; +apgu; +apgv; +apgw; +apgx; +apgy; +apgz; +apha; +aphb; +aphc; +aphd; +aphe; +aphf; +aphg; +aphh; +aphi; +aphj; +aphk; +aphl; +aphm; +aphn; +apho; +aphp; +aphq; +aphr; +aphs; +apht; +aphu; +aphv; +aphw; +aphx; +aphy; +aphz; +apia; +apib; +apic; +apid; +apie; +apif; +apig; +apih; +apii; +apij; +apik; +apil; +apim; +apin; +apio; +apip; +apiq; +apir; +apis; +apit; +apiu; +apiv; +apiw; +apix; +apiy; +apiz; +apja; +apjb; +apjc; +apjd; +apje; +apjf; +apjg; +apjh; +apji; +apjj; +apjk; +apjl; +apjm; +apjn; +apjo; +apjp; +apjq; +apjr; +apjs; +apjt; +apju; +apjv; +apjw; +apjx; +apjy; +apjz; +apka; +apkb; +apkc; +apkd; +apke; +apkf; +apkg; +apkh; +apki; +apkj; +apkk; +apkl; +apkm; +apkn; +apko; +apkp; +apkq; +apkr; +apks; +apkt; +apku; +apkv; +apkw; +apkx; +apky; +apkz; +apla; +aplb; +aplc; +apld; +aple; +aplf; +aplg; +aplh; +apli; +aplj; +aplk; +apll; +aplm; +apln; +aplo; +aplp; +aplq; +aplr; +apls; +aplt; +aplu; +aplv; +aplw; +aplx; +aply; +aplz; +apma; +apmb; +apmc; +apmd; +apme; +apmf; +apmg; +apmh; +apmi; +apmj; +apmk; +apml; +apmm; +apmn; +apmo; +apmp; +apmq; +apmr; +apms; +apmt; +apmu; +apmv; +apmw; +apmx; +apmy; +apmz; +apna; +apnb; +apnc; +apnd; +apne; +apnf; +apng; +apnh; +apni; +apnj; +apnk; +apnl; +apnm; +apnn; +apno; +apnp; +apnq; +apnr; +apns; +apnt; +apnu; +apnv; +apnw; +apnx; +apny; +apnz; +apoa; +apob; +apoc; +apod; +apoe; +apof; +apog; +apoh; +apoi; +apoj; +apok; +apol; +apom; +apon; +apoo; +apop; +apoq; +apor; +apos; +apot; +apou; +apov; +apow; +apox; +apoy; +apoz; +appa; +appb; +appc; +appd; +appe; +appf; +appg; +apph; +appi; +appj; +appk; +appl; +appm; +appn; +appo; +appp; +appq; +appr; +apps; +appt; +appu; +appv; +appw; +appx; +appy; +appz; +apqa; +apqb; +apqc; +apqd; +apqe; +apqf; +apqg; +apqh; +apqi; +apqj; +apqk; +apql; +apqm; +apqn; +apqo; +apqp; +apqq; +apqr; +apqs; +apqt; +apqu; +apqv; +apqw; +apqx; +apqy; +apqz; +apra; +aprb; +aprc; +aprd; +apre; +aprf; +aprg; +aprh; +apri; +aprj; +aprk; +aprl; +aprm; +aprn; +apro; +aprp; +aprq; +aprr; +aprs; +aprt; +apru; +aprv; +aprw; +aprx; +apry; +aprz; +apsa; +apsb; +apsc; +apsd; +apse; +apsf; +apsg; +apsh; +apsi; +apsj; +apsk; +apsl; +apsm; +apsn; +apso; +apsp; +apsq; +apsr; +apss; +apst; +apsu; +apsv; +apsw; +apsx; +apsy; +apsz; +apta; +aptb; +aptc; +aptd; +apte; +aptf; +aptg; +apth; +apti; +aptj; +aptk; +aptl; +aptm; +aptn; +apto; +aptp; +aptq; +aptr; +apts; +aptt; +aptu; +aptv; +aptw; +aptx; +apty; +aptz; +apua; +apub; +apuc; +apud; +apue; +apuf; +apug; +apuh; +apui; +apuj; +apuk; +apul; +apum; +apun; +apuo; +apup; +apuq; +apur; +apus; +aput; +apuu; +apuv; +apuw; +apux; +apuy; +apuz; +apva; +apvb; +apvc; +apvd; +apve; +apvf; +apvg; +apvh; +apvi; +apvj; +apvk; +apvl; +apvm; +apvn; +apvo; +apvp; +apvq; +apvr; +apvs; +apvt; +apvu; +apvv; +apvw; +apvx; +apvy; +apvz; +apwa; +apwb; +apwc; +apwd; +apwe; +apwf; +apwg; +apwh; +apwi; +apwj; +apwk; +apwl; +apwm; +apwn; +apwo; +apwp; +apwq; +apwr; +apws; +apwt; +apwu; +apwv; +apww; +apwx; +apwy; +apwz; +apxa; +apxb; +apxc; +apxd; +apxe; +apxf; +apxg; +apxh; +apxi; +apxj; +apxk; +apxl; +apxm; +apxn; +apxo; +apxp; +apxq; +apxr; +apxs; +apxt; +apxu; +apxv; +apxw; +apxx; +apxy; +apxz; +apya; +apyb; +apyc; +apyd; +apye; +apyf; +apyg; +apyh; +apyi; +apyj; +apyk; +apyl; +apym; +apyn; +apyo; +apyp; +apyq; +apyr; +apys; +apyt; +apyu; +apyv; +apyw; +apyx; +apyy; +apyz; +apza; +apzb; +apzc; +apzd; +apze; +apzf; +apzg; +apzh; +apzi; +apzj; +apzk; +apzl; +apzm; +apzn; +apzo; +apzp; +apzq; +apzr; +apzs; +apzt; +apzu; +apzv; +apzw; +apzx; +apzy; +apzz; +aqaa; +aqab; +aqac; +aqad; +aqae; +aqaf; +aqag; +aqah; +aqai; +aqaj; +aqak; +aqal; +aqam; +aqan; +aqao; +aqap; +aqaq; +aqar; +aqas; +aqat; +aqau; +aqav; +aqaw; +aqax; +aqay; +aqaz; +aqba; +aqbb; +aqbc; +aqbd; +aqbe; +aqbf; +aqbg; +aqbh; +aqbi; +aqbj; +aqbk; +aqbl; +aqbm; +aqbn; +aqbo; +aqbp; +aqbq; +aqbr; +aqbs; +aqbt; +aqbu; +aqbv; +aqbw; +aqbx; +aqby; +aqbz; +aqca; +aqcb; +aqcc; +aqcd; +aqce; +aqcf; +aqcg; +aqch; +aqci; +aqcj; +aqck; +aqcl; +aqcm; +aqcn; +aqco; +aqcp; +aqcq; +aqcr; +aqcs; +aqct; +aqcu; +aqcv; +aqcw; +aqcx; +aqcy; +aqcz; +aqda; +aqdb; +aqdc; +aqdd; +aqde; +aqdf; +aqdg; +aqdh; +aqdi; +aqdj; +aqdk; +aqdl; +aqdm; +aqdn; +aqdo; +aqdp; +aqdq; +aqdr; +aqds; +aqdt; +aqdu; +aqdv; +aqdw; +aqdx; +aqdy; +aqdz; +aqea; +aqeb; +aqec; +aqed; +aqee; +aqef; +aqeg; +aqeh; +aqei; +aqej; +aqek; +aqel; +aqem; +aqen; +aqeo; +aqep; +aqeq; +aqer; +aqes; +aqet; +aqeu; +aqev; +aqew; +aqex; +aqey; +aqez; +aqfa; +aqfb; +aqfc; +aqfd; +aqfe; +aqff; +aqfg; +aqfh; +aqfi; +aqfj; +aqfk; +aqfl; +aqfm; +aqfn; +aqfo; +aqfp; +aqfq; +aqfr; +aqfs; +aqft; +aqfu; +aqfv; +aqfw; +aqfx; +aqfy; +aqfz; +aqga; +aqgb; +aqgc; +aqgd; +aqge; +aqgf; +aqgg; +aqgh; +aqgi; +aqgj; +aqgk; +aqgl; +aqgm; +aqgn; +aqgo; +aqgp; +aqgq; +aqgr; +aqgs; +aqgt; +aqgu; +aqgv; +aqgw; +aqgx; +aqgy; +aqgz; +aqha; +aqhb; +aqhc; +aqhd; +aqhe; +aqhf; +aqhg; +aqhh; +aqhi; +aqhj; +aqhk; +aqhl; +aqhm; +aqhn; +aqho; +aqhp; +aqhq; +aqhr; +aqhs; +aqht; +aqhu; +aqhv; +aqhw; +aqhx; +aqhy; +aqhz; +aqia; +aqib; +aqic; +aqid; +aqie; +aqif; +aqig; +aqih; +aqii; +aqij; +aqik; +aqil; +aqim; +aqin; +aqio; +aqip; +aqiq; +aqir; +aqis; +aqit; +aqiu; +aqiv; +aqiw; +aqix; +aqiy; +aqiz; +aqja; +aqjb; +aqjc; +aqjd; +aqje; +aqjf; +aqjg; +aqjh; +aqji; +aqjj; +aqjk; +aqjl; +aqjm; +aqjn; +aqjo; +aqjp; +aqjq; +aqjr; +aqjs; +aqjt; +aqju; +aqjv; +aqjw; +aqjx; +aqjy; +aqjz; +aqka; +aqkb; +aqkc; +aqkd; +aqke; +aqkf; +aqkg; +aqkh; +aqki; +aqkj; +aqkk; +aqkl; +aqkm; +aqkn; +aqko; +aqkp; +aqkq; +aqkr; +aqks; +aqkt; +aqku; +aqkv; +aqkw; +aqkx; +aqky; +aqkz; +aqla; +aqlb; +aqlc; +aqld; +aqle; +aqlf; +aqlg; +aqlh; +aqli; +aqlj; +aqlk; +aqll; +aqlm; +aqln; +aqlo; +aqlp; +aqlq; +aqlr; +aqls; +aqlt; +aqlu; +aqlv; +aqlw; +aqlx; +aqly; +aqlz; +aqma; +aqmb; +aqmc; +aqmd; +aqme; +aqmf; +aqmg; +aqmh; +aqmi; +aqmj; +aqmk; +aqml; +aqmm; +aqmn; +aqmo; +aqmp; +aqmq; +aqmr; +aqms; +aqmt; +aqmu; +aqmv; +aqmw; +aqmx; +aqmy; +aqmz; +aqna; +aqnb; +aqnc; +aqnd; +aqne; +aqnf; +aqng; +aqnh; +aqni; +aqnj; +aqnk; +aqnl; +aqnm; +aqnn; +aqno; +aqnp; +aqnq; +aqnr; +aqns; +aqnt; +aqnu; +aqnv; +aqnw; +aqnx; +aqny; +aqnz; +aqoa; +aqob; +aqoc; +aqod; +aqoe; +aqof; +aqog; +aqoh; +aqoi; +aqoj; +aqok; +aqol; +aqom; +aqon; +aqoo; +aqop; +aqoq; +aqor; +aqos; +aqot; +aqou; +aqov; +aqow; +aqox; +aqoy; +aqoz; +aqpa; +aqpb; +aqpc; +aqpd; +aqpe; +aqpf; +aqpg; +aqph; +aqpi; +aqpj; +aqpk; +aqpl; +aqpm; +aqpn; +aqpo; +aqpp; +aqpq; +aqpr; +aqps; +aqpt; +aqpu; +aqpv; +aqpw; +aqpx; +aqpy; +aqpz; +aqqa; +aqqb; +aqqc; +aqqd; +aqqe; +aqqf; +aqqg; +aqqh; +aqqi; +aqqj; +aqqk; +aqql; +aqqm; +aqqn; +aqqo; +aqqp; +aqqq; +aqqr; +aqqs; +aqqt; +aqqu; +aqqv; +aqqw; +aqqx; +aqqy; +aqqz; +aqra; +aqrb; +aqrc; +aqrd; +aqre; +aqrf; +aqrg; +aqrh; +aqri; +aqrj; +aqrk; +aqrl; +aqrm; +aqrn; +aqro; +aqrp; +aqrq; +aqrr; +aqrs; +aqrt; +aqru; +aqrv; +aqrw; +aqrx; +aqry; +aqrz; +aqsa; +aqsb; +aqsc; +aqsd; +aqse; +aqsf; +aqsg; +aqsh; +aqsi; +aqsj; +aqsk; +aqsl; +aqsm; +aqsn; +aqso; +aqsp; +aqsq; +aqsr; +aqss; +aqst; +aqsu; +aqsv; +aqsw; +aqsx; +aqsy; +aqsz; +aqta; +aqtb; +aqtc; +aqtd; +aqte; +aqtf; +aqtg; +aqth; +aqti; +aqtj; +aqtk; +aqtl; +aqtm; +aqtn; +aqto; +aqtp; +aqtq; +aqtr; +aqts; +aqtt; +aqtu; +aqtv; +aqtw; +aqtx; +aqty; +aqtz; +aqua; +aqub; +aquc; +aqud; +aque; +aquf; +aqug; +aquh; +aqui; +aquj; +aquk; +aqul; +aqum; +aqun; +aquo; +aqup; +aquq; +aqur; +aqus; +aqut; +aquu; +aquv; +aquw; +aqux; +aquy; +aquz; +aqva; +aqvb; +aqvc; +aqvd; +aqve; +aqvf; +aqvg; +aqvh; +aqvi; +aqvj; +aqvk; +aqvl; +aqvm; +aqvn; +aqvo; +aqvp; +aqvq; +aqvr; +aqvs; +aqvt; +aqvu; +aqvv; +aqvw; +aqvx; +aqvy; +aqvz; +aqwa; +aqwb; +aqwc; +aqwd; +aqwe; +aqwf; +aqwg; +aqwh; +aqwi; +aqwj; +aqwk; +aqwl; +aqwm; +aqwn; +aqwo; +aqwp; +aqwq; +aqwr; +aqws; +aqwt; +aqwu; +aqwv; +aqww; +aqwx; +aqwy; +aqwz; +aqxa; +aqxb; +aqxc; +aqxd; +aqxe; +aqxf; +aqxg; +aqxh; +aqxi; +aqxj; +aqxk; +aqxl; +aqxm; +aqxn; +aqxo; +aqxp; +aqxq; +aqxr; +aqxs; +aqxt; +aqxu; +aqxv; +aqxw; +aqxx; +aqxy; +aqxz; +aqya; +aqyb; +aqyc; +aqyd; +aqye; +aqyf; +aqyg; +aqyh; +aqyi; +aqyj; +aqyk; +aqyl; +aqym; +aqyn; +aqyo; +aqyp; +aqyq; +aqyr; +aqys; +aqyt; +aqyu; +aqyv; +aqyw; +aqyx; +aqyy; +aqyz; +aqza; +aqzb; +aqzc; +aqzd; +aqze; +aqzf; +aqzg; +aqzh; +aqzi; +aqzj; +aqzk; +aqzl; +aqzm; +aqzn; +aqzo; +aqzp; +aqzq; +aqzr; +aqzs; +aqzt; +aqzu; +aqzv; +aqzw; +aqzx; +aqzy; +aqzz; +araa; +arab; +arac; +arad; +arae; +araf; +arag; +arah; +arai; +araj; +arak; +aral; +aram; +aran; +arao; +arap; +araq; +arar; +aras; +arat; +arau; +arav; +araw; +arax; +aray; +araz; +arba; +arbb; +arbc; +arbd; +arbe; +arbf; +arbg; +arbh; +arbi; +arbj; +arbk; +arbl; +arbm; +arbn; +arbo; +arbp; +arbq; +arbr; +arbs; +arbt; +arbu; +arbv; +arbw; +arbx; +arby; +arbz; +arca; +arcb; +arcc; +arcd; +arce; +arcf; +arcg; +arch; +arci; +arcj; +arck; +arcl; +arcm; +arcn; +arco; +arcp; +arcq; +arcr; +arcs; +arct; +arcu; +arcv; +arcw; +arcx; +arcy; +arcz; +arda; +ardb; +ardc; +ardd; +arde; +ardf; +ardg; +ardh; +ardi; +ardj; +ardk; +ardl; +ardm; +ardn; +ardo; +ardp; +ardq; +ardr; +ards; +ardt; +ardu; +ardv; +ardw; +ardx; +ardy; +ardz; +area; +areb; +arec; +ared; +aree; +aref; +areg; +areh; +arei; +arej; +arek; +arel; +arem; +aren; +areo; +arep; +areq; +arer; +ares; +aret; +areu; +arev; +arew; +arex; +arey; +arez; +arfa; +arfb; +arfc; +arfd; +arfe; +arff; +arfg; +arfh; +arfi; +arfj; +arfk; +arfl; +arfm; +arfn; +arfo; +arfp; +arfq; +arfr; +arfs; +arft; +arfu; +arfv; +arfw; +arfx; +arfy; +arfz; +arga; +argb; +argc; +argd; +arge; +argf; +argg; +argh; +argi; +argj; +argk; +argl; +argm; +argn; +argo; +argp; +argq; +argr; +args; +argt; +argu; +argv; +argw; +argx; +argy; +argz; +arha; +arhb; +arhc; +arhd; +arhe; +arhf; +arhg; +arhh; +arhi; +arhj; +arhk; +arhl; +arhm; +arhn; +arho; +arhp; +arhq; +arhr; +arhs; +arht; +arhu; +arhv; +arhw; +arhx; +arhy; +arhz; +aria; +arib; +aric; +arid; +arie; +arif; +arig; +arih; +arii; +arij; +arik; +aril; +arim; +arin; +ario; +arip; +ariq; +arir; +aris; +arit; +ariu; +ariv; +ariw; +arix; +ariy; +ariz; +arja; +arjb; +arjc; +arjd; +arje; +arjf; +arjg; +arjh; +arji; +arjj; +arjk; +arjl; +arjm; +arjn; +arjo; +arjp; +arjq; +arjr; +arjs; +arjt; +arju; +arjv; +arjw; +arjx; +arjy; +arjz; +arka; +arkb; +arkc; +arkd; +arke; +arkf; +arkg; +arkh; +arki; +arkj; +arkk; +arkl; +arkm; +arkn; +arko; +arkp; +arkq; +arkr; +arks; +arkt; +arku; +arkv; +arkw; +arkx; +arky; +arkz; +arla; +arlb; +arlc; +arld; +arle; +arlf; +arlg; +arlh; +arli; +arlj; +arlk; +arll; +arlm; +arln; +arlo; +arlp; +arlq; +arlr; +arls; +arlt; +arlu; +arlv; +arlw; +arlx; +arly; +arlz; +arma; +armb; +armc; +armd; +arme; +armf; +armg; +armh; +armi; +armj; +armk; +arml; +armm; +armn; +armo; +armp; +armq; +armr; +arms; +armt; +armu; +armv; +armw; +armx; +army; +armz; +arna; +arnb; +arnc; +arnd; +arne; +arnf; +arng; +arnh; +arni; +arnj; +arnk; +arnl; +arnm; +arnn; +arno; +arnp; +arnq; +arnr; +arns; +arnt; +arnu; +arnv; +arnw; +arnx; +arny; +arnz; +aroa; +arob; +aroc; +arod; +aroe; +arof; +arog; +aroh; +aroi; +aroj; +arok; +arol; +arom; +aron; +aroo; +arop; +aroq; +aror; +aros; +arot; +arou; +arov; +arow; +arox; +aroy; +aroz; +arpa; +arpb; +arpc; +arpd; +arpe; +arpf; +arpg; +arph; +arpi; +arpj; +arpk; +arpl; +arpm; +arpn; +arpo; +arpp; +arpq; +arpr; +arps; +arpt; +arpu; +arpv; +arpw; +arpx; +arpy; +arpz; +arqa; +arqb; +arqc; +arqd; +arqe; +arqf; +arqg; +arqh; +arqi; +arqj; +arqk; +arql; +arqm; +arqn; +arqo; +arqp; +arqq; +arqr; +arqs; +arqt; +arqu; +arqv; +arqw; +arqx; +arqy; +arqz; +arra; +arrb; +arrc; +arrd; +arre; +arrf; +arrg; +arrh; +arri; +arrj; +arrk; +arrl; +arrm; +arrn; +arro; +arrp; +arrq; +arrr; +arrs; +arrt; +arru; +arrv; +arrw; +arrx; +arry; +arrz; +arsa; +arsb; +arsc; +arsd; +arse; +arsf; +arsg; +arsh; +arsi; +arsj; +arsk; +arsl; +arsm; +arsn; +arso; +arsp; +arsq; +arsr; +arss; +arst; +arsu; +arsv; +arsw; +arsx; +arsy; +arsz; +arta; +artb; +artc; +artd; +arte; +artf; +artg; +arth; +arti; +artj; +artk; +artl; +artm; +artn; +arto; +artp; +artq; +artr; +arts; +artt; +artu; +artv; +artw; +artx; +arty; +artz; +arua; +arub; +aruc; +arud; +arue; +aruf; +arug; +aruh; +arui; +aruj; +aruk; +arul; +arum; +arun; +aruo; +arup; +aruq; +arur; +arus; +arut; +aruu; +aruv; +aruw; +arux; +aruy; +aruz; +arva; +arvb; +arvc; +arvd; +arve; +arvf; +arvg; +arvh; +arvi; +arvj; +arvk; +arvl; +arvm; +arvn; +arvo; +arvp; +arvq; +arvr; +arvs; +arvt; +arvu; +arvv; +arvw; +arvx; +arvy; +arvz; +arwa; +arwb; +arwc; +arwd; +arwe; +arwf; +arwg; +arwh; +arwi; +arwj; +arwk; +arwl; +arwm; +arwn; +arwo; +arwp; +arwq; +arwr; +arws; +arwt; +arwu; +arwv; +arww; +arwx; +arwy; +arwz; +arxa; +arxb; +arxc; +arxd; +arxe; +arxf; +arxg; +arxh; +arxi; +arxj; +arxk; +arxl; +arxm; +arxn; +arxo; +arxp; +arxq; +arxr; +arxs; +arxt; +arxu; +arxv; +arxw; +arxx; +arxy; +arxz; +arya; +aryb; +aryc; +aryd; +arye; +aryf; +aryg; +aryh; +aryi; +aryj; +aryk; +aryl; +arym; +aryn; +aryo; +aryp; +aryq; +aryr; +arys; +aryt; +aryu; +aryv; +aryw; +aryx; +aryy; +aryz; +arza; +arzb; +arzc; +arzd; +arze; +arzf; +arzg; +arzh; +arzi; +arzj; +arzk; +arzl; +arzm; +arzn; +arzo; +arzp; +arzq; +arzr; +arzs; +arzt; +arzu; +arzv; +arzw; +arzx; +arzy; +arzz; +asaa; +asab; +asac; +asad; +asae; +asaf; +asag; +asah; +asai; +asaj; +asak; +asal; +asam; +asan; +asao; +asap; +asaq; +asar; +asas; +asat; +asau; +asav; +asaw; +asax; +asay; +asaz; +asba; +asbb; +asbc; +asbd; +asbe; +asbf; +asbg; +asbh; +asbi; +asbj; +asbk; +asbl; +asbm; +asbn; +asbo; +asbp; +asbq; +asbr; +asbs; +asbt; +asbu; +asbv; +asbw; +asbx; +asby; +asbz; +asca; +ascb; +ascc; +ascd; +asce; +ascf; +ascg; +asch; +asci; +ascj; +asck; +ascl; +ascm; +ascn; +asco; +ascp; +ascq; +ascr; +ascs; +asct; +ascu; +ascv; +ascw; +ascx; +ascy; +ascz; +asda; +asdb; +asdc; +asdd; +asde; +asdf; +asdg; +asdh; +asdi; +asdj; +asdk; +asdl; +asdm; +asdn; +asdo; +asdp; +asdq; +asdr; +asds; +asdt; +asdu; +asdv; +asdw; +asdx; +asdy; +asdz; +asea; +aseb; +asec; +ased; +asee; +asef; +aseg; +aseh; +asei; +asej; +asek; +asel; +asem; +asen; +aseo; +asep; +aseq; +aser; +ases; +aset; +aseu; +asev; +asew; +asex; +asey; +asez; +asfa; +asfb; +asfc; +asfd; +asfe; +asff; +asfg; +asfh; +asfi; +asfj; +asfk; +asfl; +asfm; +asfn; +asfo; +asfp; +asfq; +asfr; +asfs; +asft; +asfu; +asfv; +asfw; +asfx; +asfy; +asfz; +asga; +asgb; +asgc; +asgd; +asge; +asgf; +asgg; +asgh; +asgi; +asgj; +asgk; +asgl; +asgm; +asgn; +asgo; +asgp; +asgq; +asgr; +asgs; +asgt; +asgu; +asgv; +asgw; +asgx; +asgy; +asgz; +asha; +ashb; +ashc; +ashd; +ashe; +ashf; +ashg; +ashh; +ashi; +ashj; +ashk; +ashl; +ashm; +ashn; +asho; +ashp; +ashq; +ashr; +ashs; +asht; +ashu; +ashv; +ashw; +ashx; +ashy; +ashz; +asia; +asib; +asic; +asid; +asie; +asif; +asig; +asih; +asii; +asij; +asik; +asil; +asim; +asin; +asio; +asip; +asiq; +asir; +asis; +asit; +asiu; +asiv; +asiw; +asix; +asiy; +asiz; +asja; +asjb; +asjc; +asjd; +asje; +asjf; +asjg; +asjh; +asji; +asjj; +asjk; +asjl; +asjm; +asjn; +asjo; +asjp; +asjq; +asjr; +asjs; +asjt; +asju; +asjv; +asjw; +asjx; +asjy; +asjz; +aska; +askb; +askc; +askd; +aske; +askf; +askg; +askh; +aski; +askj; +askk; +askl; +askm; +askn; +asko; +askp; +askq; +askr; +asks; +askt; +asku; +askv; +askw; +askx; +asky; +askz; +asla; +aslb; +aslc; +asld; +asle; +aslf; +aslg; +aslh; +asli; +aslj; +aslk; +asll; +aslm; +asln; +aslo; +aslp; +aslq; +aslr; +asls; +aslt; +aslu; +aslv; +aslw; +aslx; +asly; +aslz; +asma; +asmb; +asmc; +asmd; +asme; +asmf; +asmg; +asmh; +asmi; +asmj; +asmk; +asml; +asmm; +asmn; +asmo; +asmp; +asmq; +asmr; +asms; +asmt; +asmu; +asmv; +asmw; +asmx; +asmy; +asmz; +asna; +asnb; +asnc; +asnd; +asne; +asnf; +asng; +asnh; +asni; +asnj; +asnk; +asnl; +asnm; +asnn; +asno; +asnp; +asnq; +asnr; +asns; +asnt; +asnu; +asnv; +asnw; +asnx; +asny; +asnz; +asoa; +asob; +asoc; +asod; +asoe; +asof; +asog; +asoh; +asoi; +asoj; +asok; +asol; +asom; +ason; +asoo; +asop; +asoq; +asor; +asos; +asot; +asou; +asov; +asow; +asox; +asoy; +asoz; +aspa; +aspb; +aspc; +aspd; +aspe; +aspf; +aspg; +asph; +aspi; +aspj; +aspk; +aspl; +aspm; +aspn; +aspo; +aspp; +aspq; +aspr; +asps; +aspt; +aspu; +aspv; +aspw; +aspx; +aspy; +aspz; +asqa; +asqb; +asqc; +asqd; +asqe; +asqf; +asqg; +asqh; +asqi; +asqj; +asqk; +asql; +asqm; +asqn; +asqo; +asqp; +asqq; +asqr; +asqs; +asqt; +asqu; +asqv; +asqw; +asqx; +asqy; +asqz; +asra; +asrb; +asrc; +asrd; +asre; +asrf; +asrg; +asrh; +asri; +asrj; +asrk; +asrl; +asrm; +asrn; +asro; +asrp; +asrq; +asrr; +asrs; +asrt; +asru; +asrv; +asrw; +asrx; +asry; +asrz; +assa; +assb; +assc; +assd; +asse; +assf; +assg; +assh; +assi; +assj; +assk; +assl; +assm; +assn; +asso; +assp; +assq; +assr; +asss; +asst; +assu; +assv; +assw; +assx; +assy; +assz; +asta; +astb; +astc; +astd; +aste; +astf; +astg; +asth; +asti; +astj; +astk; +astl; +astm; +astn; +asto; +astp; +astq; +astr; +asts; +astt; +astu; +astv; +astw; +astx; +asty; +astz; +asua; +asub; +asuc; +asud; +asue; +asuf; +asug; +asuh; +asui; +asuj; +asuk; +asul; +asum; +asun; +asuo; +asup; +asuq; +asur; +asus; +asut; +asuu; +asuv; +asuw; +asux; +asuy; +asuz; +asva; +asvb; +asvc; +asvd; +asve; +asvf; +asvg; +asvh; +asvi; +asvj; +asvk; +asvl; +asvm; +asvn; +asvo; +asvp; +asvq; +asvr; +asvs; +asvt; +asvu; +asvv; +asvw; +asvx; +asvy; +asvz; +aswa; +aswb; +aswc; +aswd; +aswe; +aswf; +aswg; +aswh; +aswi; +aswj; +aswk; +aswl; +aswm; +aswn; +aswo; +aswp; +aswq; +aswr; +asws; +aswt; +aswu; +aswv; +asww; +aswx; +aswy; +aswz; +asxa; +asxb; +asxc; +asxd; +asxe; +asxf; +asxg; +asxh; +asxi; +asxj; +asxk; +asxl; +asxm; +asxn; +asxo; +asxp; +asxq; +asxr; +asxs; +asxt; +asxu; +asxv; +asxw; +asxx; +asxy; +asxz; +asya; +asyb; +asyc; +asyd; +asye; +asyf; +asyg; +asyh; +asyi; +asyj; +asyk; +asyl; +asym; +asyn; +asyo; +asyp; +asyq; +asyr; +asys; +asyt; +asyu; +asyv; +asyw; +asyx; +asyy; +asyz; +asza; +aszb; +aszc; +aszd; +asze; +aszf; +aszg; +aszh; +aszi; +aszj; +aszk; +aszl; +aszm; +aszn; +aszo; +aszp; +aszq; +aszr; +aszs; +aszt; +aszu; +aszv; +aszw; +aszx; +aszy; +aszz; +ataa; +atab; +atac; +atad; +atae; +ataf; +atag; +atah; +atai; +ataj; +atak; +atal; +atam; +atan; +atao; +atap; +ataq; +atar; +atas; +atat; +atau; +atav; +ataw; +atax; +atay; +ataz; +atba; +atbb; +atbc; +atbd; +atbe; +atbf; +atbg; +atbh; +atbi; +atbj; +atbk; +atbl; +atbm; +atbn; +atbo; +atbp; +atbq; +atbr; +atbs; +atbt; +atbu; +atbv; +atbw; +atbx; +atby; +atbz; +atca; +atcb; +atcc; +atcd; +atce; +atcf; +atcg; +atch; +atci; +atcj; +atck; +atcl; +atcm; +atcn; +atco; +atcp; +atcq; +atcr; +atcs; +atct; +atcu; +atcv; +atcw; +atcx; +atcy; +atcz; +atda; +atdb; +atdc; +atdd; +atde; +atdf; +atdg; +atdh; +atdi; +atdj; +atdk; +atdl; +atdm; +atdn; +atdo; +atdp; +atdq; +atdr; +atds; +atdt; +atdu; +atdv; +atdw; +atdx; +atdy; +atdz; +atea; +ateb; +atec; +ated; +atee; +atef; +ateg; +ateh; +atei; +atej; +atek; +atel; +atem; +aten; +ateo; +atep; +ateq; +ater; +ates; +atet; +ateu; +atev; +atew; +atex; +atey; +atez; +atfa; +atfb; +atfc; +atfd; +atfe; +atff; +atfg; +atfh; +atfi; +atfj; +atfk; +atfl; +atfm; +atfn; +atfo; +atfp; +atfq; +atfr; +atfs; +atft; +atfu; +atfv; +atfw; +atfx; +atfy; +atfz; +atga; +atgb; +atgc; +atgd; +atge; +atgf; +atgg; +atgh; +atgi; +atgj; +atgk; +atgl; +atgm; +atgn; +atgo; +atgp; +atgq; +atgr; +atgs; +atgt; +atgu; +atgv; +atgw; +atgx; +atgy; +atgz; +atha; +athb; +athc; +athd; +athe; +athf; +athg; +athh; +athi; +athj; +athk; +athl; +athm; +athn; +atho; +athp; +athq; +athr; +aths; +atht; +athu; +athv; +athw; +athx; +athy; +athz; +atia; +atib; +atic; +atid; +atie; +atif; +atig; +atih; +atii; +atij; +atik; +atil; +atim; +atin; +atio; +atip; +atiq; +atir; +atis; +atit; +atiu; +ativ; +atiw; +atix; +atiy; +atiz; +atja; +atjb; +atjc; +atjd; +atje; +atjf; +atjg; +atjh; +atji; +atjj; +atjk; +atjl; +atjm; +atjn; +atjo; +atjp; +atjq; +atjr; +atjs; +atjt; +atju; +atjv; +atjw; +atjx; +atjy; +atjz; +atka; +atkb; +atkc; +atkd; +atke; +atkf; +atkg; +atkh; +atki; +atkj; +atkk; +atkl; +atkm; +atkn; +atko; +atkp; +atkq; +atkr; +atks; +atkt; +atku; +atkv; +atkw; +atkx; +atky; +atkz; +atla; +atlb; +atlc; +atld; +atle; +atlf; +atlg; +atlh; +atli; +atlj; +atlk; +atll; +atlm; +atln; +atlo; +atlp; +atlq; +atlr; +atls; +atlt; +atlu; +atlv; +atlw; +atlx; +atly; +atlz; +atma; +atmb; +atmc; +atmd; +atme; +atmf; +atmg; +atmh; +atmi; +atmj; +atmk; +atml; +atmm; +atmn; +atmo; +atmp; +atmq; +atmr; +atms; +atmt; +atmu; +atmv; +atmw; +atmx; +atmy; +atmz; +atna; +atnb; +atnc; +atnd; +atne; +atnf; +atng; +atnh; +atni; +atnj; +atnk; +atnl; +atnm; +atnn; +atno; +atnp; +atnq; +atnr; +atns; +atnt; +atnu; +atnv; +atnw; +atnx; +atny; +atnz; +atoa; +atob; +atoc; +atod; +atoe; +atof; +atog; +atoh; +atoi; +atoj; +atok; +atol; +atom; +aton; +atoo; +atop; +atoq; +ator; +atos; +atot; +atou; +atov; +atow; +atox; +atoy; +atoz; +atpa; +atpb; +atpc; +atpd; +atpe; +atpf; +atpg; +atph; +atpi; +atpj; +atpk; +atpl; +atpm; +atpn; +atpo; +atpp; +atpq; +atpr; +atps; +atpt; +atpu; +atpv; +atpw; +atpx; +atpy; +atpz; +atqa; +atqb; +atqc; +atqd; +atqe; +atqf; +atqg; +atqh; +atqi; +atqj; +atqk; +atql; +atqm; +atqn; +atqo; +atqp; +atqq; +atqr; +atqs; +atqt; +atqu; +atqv; +atqw; +atqx; +atqy; +atqz; +atra; +atrb; +atrc; +atrd; +atre; +atrf; +atrg; +atrh; +atri; +atrj; +atrk; +atrl; +atrm; +atrn; +atro; +atrp; +atrq; +atrr; +atrs; +atrt; +atru; +atrv; +atrw; +atrx; +atry; +atrz; +atsa; +atsb; +atsc; +atsd; +atse; +atsf; +atsg; +atsh; +atsi; +atsj; +atsk; +atsl; +atsm; +atsn; +atso; +atsp; +atsq; +atsr; +atss; +atst; +atsu; +atsv; +atsw; +atsx; +atsy; +atsz; +atta; +attb; +attc; +attd; +atte; +attf; +attg; +atth; +atti; +attj; +attk; +attl; +attm; +attn; +atto; +attp; +attq; +attr; +atts; +attt; +attu; +attv; +attw; +attx; +atty; +attz; +atua; +atub; +atuc; +atud; +atue; +atuf; +atug; +atuh; +atui; +atuj; +atuk; +atul; +atum; +atun; +atuo; +atup; +atuq; +atur; +atus; +atut; +atuu; +atuv; +atuw; +atux; +atuy; +atuz; +atva; +atvb; +atvc; +atvd; +atve; +atvf; +atvg; +atvh; +atvi; +atvj; +atvk; +atvl; +atvm; +atvn; +atvo; +atvp; +atvq; +atvr; +atvs; +atvt; +atvu; +atvv; +atvw; +atvx; +atvy; +atvz; +atwa; +atwb; +atwc; +atwd; +atwe; +atwf; +atwg; +atwh; +atwi; +atwj; +atwk; +atwl; +atwm; +atwn; +atwo; +atwp; +atwq; +atwr; +atws; +atwt; +atwu; +atwv; +atww; +atwx; +atwy; +atwz; +atxa; +atxb; +atxc; +atxd; +atxe; +atxf; +atxg; +atxh; +atxi; +atxj; +atxk; +atxl; +atxm; +atxn; +atxo; +atxp; +atxq; +atxr; +atxs; +atxt; +atxu; +atxv; +atxw; +atxx; +atxy; +atxz; +atya; +atyb; +atyc; +atyd; +atye; +atyf; +atyg; +atyh; +atyi; +atyj; +atyk; +atyl; +atym; +atyn; +atyo; +atyp; +atyq; +atyr; +atys; +atyt; +atyu; +atyv; +atyw; +atyx; +atyy; +atyz; +atza; +atzb; +atzc; +atzd; +atze; +atzf; +atzg; +atzh; +atzi; +atzj; +atzk; +atzl; +atzm; +atzn; +atzo; +atzp; +atzq; +atzr; +atzs; +atzt; +atzu; +atzv; +atzw; +atzx; +atzy; +atzz; +auaa; +auab; +auac; +auad; +auae; +auaf; +auag; +auah; +auai; +auaj; +auak; +aual; +auam; +auan; +auao; +auap; +auaq; +auar; +auas; +auat; +auau; +auav; +auaw; +auax; +auay; +auaz; +auba; +aubb; +aubc; +aubd; +aube; +aubf; +aubg; +aubh; +aubi; +aubj; +aubk; +aubl; +aubm; +aubn; +aubo; +aubp; +aubq; +aubr; +aubs; +aubt; +aubu; +aubv; +aubw; +aubx; +auby; +aubz; +auca; +aucb; +aucc; +aucd; +auce; +aucf; +aucg; +auch; +auci; +aucj; +auck; +aucl; +aucm; +aucn; +auco; +aucp; +aucq; +aucr; +aucs; +auct; +aucu; +aucv; +aucw; +aucx; +aucy; +aucz; +auda; +audb; +audc; +audd; +aude; +audf; +audg; +audh; +audi; +audj; +audk; +audl; +audm; +audn; +audo; +audp; +audq; +audr; +auds; +audt; +audu; +audv; +audw; +audx; +audy; +audz; +auea; +aueb; +auec; +aued; +auee; +auef; +aueg; +aueh; +auei; +auej; +auek; +auel; +auem; +auen; +aueo; +auep; +aueq; +auer; +aues; +auet; +aueu; +auev; +auew; +auex; +auey; +auez; +aufa; +aufb; +aufc; +aufd; +aufe; +auff; +aufg; +aufh; +aufi; +aufj; +aufk; +aufl; +aufm; +aufn; +aufo; +aufp; +aufq; +aufr; +aufs; +auft; +aufu; +aufv; +aufw; +aufx; +aufy; +aufz; +auga; +augb; +augc; +augd; +auge; +augf; +augg; +augh; +augi; +augj; +augk; +augl; +augm; +augn; +augo; +augp; +augq; +augr; +augs; +augt; +augu; +augv; +augw; +augx; +augy; +augz; +auha; +auhb; +auhc; +auhd; +auhe; +auhf; +auhg; +auhh; +auhi; +auhj; +auhk; +auhl; +auhm; +auhn; +auho; +auhp; +auhq; +auhr; +auhs; +auht; +auhu; +auhv; +auhw; +auhx; +auhy; +auhz; +auia; +auib; +auic; +auid; +auie; +auif; +auig; +auih; +auii; +auij; +auik; +auil; +auim; +auin; +auio; +auip; +auiq; +auir; +auis; +auit; +auiu; +auiv; +auiw; +auix; +auiy; +auiz; +auja; +aujb; +aujc; +aujd; +auje; +aujf; +aujg; +aujh; +auji; +aujj; +aujk; +aujl; +aujm; +aujn; +aujo; +aujp; +aujq; +aujr; +aujs; +aujt; +auju; +aujv; +aujw; +aujx; +aujy; +aujz; +auka; +aukb; +aukc; +aukd; +auke; +aukf; +aukg; +aukh; +auki; +aukj; +aukk; +aukl; +aukm; +aukn; +auko; +aukp; +aukq; +aukr; +auks; +aukt; +auku; +aukv; +aukw; +aukx; +auky; +aukz; +aula; +aulb; +aulc; +auld; +aule; +aulf; +aulg; +aulh; +auli; +aulj; +aulk; +aull; +aulm; +auln; +aulo; +aulp; +aulq; +aulr; +auls; +ault; +aulu; +aulv; +aulw; +aulx; +auly; +aulz; +auma; +aumb; +aumc; +aumd; +aume; +aumf; +aumg; +aumh; +aumi; +aumj; +aumk; +auml; +aumm; +aumn; +aumo; +aump; +aumq; +aumr; +aums; +aumt; +aumu; +aumv; +aumw; +aumx; +aumy; +aumz; +auna; +aunb; +aunc; +aund; +aune; +aunf; +aung; +aunh; +auni; +aunj; +aunk; +aunl; +aunm; +aunn; +auno; +aunp; +aunq; +aunr; +auns; +aunt; +aunu; +aunv; +aunw; +aunx; +auny; +aunz; +auoa; +auob; +auoc; +auod; +auoe; +auof; +auog; +auoh; +auoi; +auoj; +auok; +auol; +auom; +auon; +auoo; +auop; +auoq; +auor; +auos; +auot; +auou; +auov; +auow; +auox; +auoy; +auoz; +aupa; +aupb; +aupc; +aupd; +aupe; +aupf; +aupg; +auph; +aupi; +aupj; +aupk; +aupl; +aupm; +aupn; +aupo; +aupp; +aupq; +aupr; +aups; +aupt; +aupu; +aupv; +aupw; +aupx; +aupy; +aupz; +auqa; +auqb; +auqc; +auqd; +auqe; +auqf; +auqg; +auqh; +auqi; +auqj; +auqk; +auql; +auqm; +auqn; +auqo; +auqp; +auqq; +auqr; +auqs; +auqt; +auqu; +auqv; +auqw; +auqx; +auqy; +auqz; +aura; +aurb; +aurc; +aurd; +aure; +aurf; +aurg; +aurh; +auri; +aurj; +aurk; +aurl; +aurm; +aurn; +auro; +aurp; +aurq; +aurr; +aurs; +aurt; +auru; +aurv; +aurw; +aurx; +aury; +aurz; +ausa; +ausb; +ausc; +ausd; +ause; +ausf; +ausg; +aush; +ausi; +ausj; +ausk; +ausl; +ausm; +ausn; +auso; +ausp; +ausq; +ausr; +auss; +aust; +ausu; +ausv; +ausw; +ausx; +ausy; +ausz; +auta; +autb; +autc; +autd; +aute; +autf; +autg; +auth; +auti; +autj; +autk; +autl; +autm; +autn; +auto; +autp; +autq; +autr; +auts; +autt; +autu; +autv; +autw; +autx; +auty; +autz; +auua; +auub; +auuc; +auud; +auue; +auuf; +auug; +auuh; +auui; +auuj; +auuk; +auul; +auum; +auun; +auuo; +auup; +auuq; +auur; +auus; +auut; +auuu; +auuv; +auuw; +auux; +auuy; +auuz; +auva; +auvb; +auvc; +auvd; +auve; +auvf; +auvg; +auvh; +auvi; +auvj; +auvk; +auvl; +auvm; +auvn; +auvo; +auvp; +auvq; +auvr; +auvs; +auvt; +auvu; +auvv; +auvw; +auvx; +auvy; +auvz; +auwa; +auwb; +auwc; +auwd; +auwe; +auwf; +auwg; +auwh; +auwi; +auwj; +auwk; +auwl; +auwm; +auwn; +auwo; +auwp; +auwq; +auwr; +auws; +auwt; +auwu; +auwv; +auww; +auwx; +auwy; +auwz; +auxa; +auxb; +auxc; +auxd; +auxe; +auxf; +auxg; +auxh; +auxi; +auxj; +auxk; +auxl; +auxm; +auxn; +auxo; +auxp; +auxq; +auxr; +auxs; +auxt; +auxu; +auxv; +auxw; +auxx; +auxy; +auxz; +auya; +auyb; +auyc; +auyd; +auye; +auyf; +auyg; +auyh; +auyi; +auyj; +auyk; +auyl; +auym; +auyn; +auyo; +auyp; +auyq; +auyr; +auys; +auyt; +auyu; +auyv; +auyw; +auyx; +auyy; +auyz; +auza; +auzb; +auzc; +auzd; +auze; +auzf; +auzg; +auzh; +auzi; +auzj; +auzk; +auzl; +auzm; +auzn; +auzo; +auzp; +auzq; +auzr; +auzs; +auzt; +auzu; +auzv; +auzw; +auzx; +auzy; +auzz; +avaa; +avab; +avac; +avad; +avae; +avaf; +avag; +avah; +avai; +avaj; +avak; +aval; +avam; +avan; +avao; +avap; +avaq; +avar; +avas; +avat; +avau; +avav; +avaw; +avax; +avay; +avaz; +avba; +avbb; +avbc; +avbd; +avbe; +avbf; +avbg; +avbh; +avbi; +avbj; +avbk; +avbl; +avbm; +avbn; +avbo; +avbp; +avbq; +avbr; +avbs; +avbt; +avbu; +avbv; +avbw; +avbx; +avby; +avbz; +avca; +avcb; +avcc; +avcd; +avce; +avcf; +avcg; +avch; +avci; +avcj; +avck; +avcl; +avcm; +avcn; +avco; +avcp; +avcq; +avcr; +avcs; +avct; +avcu; +avcv; +avcw; +avcx; +avcy; +avcz; +avda; +avdb; +avdc; +avdd; +avde; +avdf; +avdg; +avdh; +avdi; +avdj; +avdk; +avdl; +avdm; +avdn; +avdo; +avdp; +avdq; +avdr; +avds; +avdt; +avdu; +avdv; +avdw; +avdx; +avdy; +avdz; +avea; +aveb; +avec; +aved; +avee; +avef; +aveg; +aveh; +avei; +avej; +avek; +avel; +avem; +aven; +aveo; +avep; +aveq; +aver; +aves; +avet; +aveu; +avev; +avew; +avex; +avey; +avez; +avfa; +avfb; +avfc; +avfd; +avfe; +avff; +avfg; +avfh; +avfi; +avfj; +avfk; +avfl; +avfm; +avfn; +avfo; +avfp; +avfq; +avfr; +avfs; +avft; +avfu; +avfv; +avfw; +avfx; +avfy; +avfz; +avga; +avgb; +avgc; +avgd; +avge; +avgf; +avgg; +avgh; +avgi; +avgj; +avgk; +avgl; +avgm; +avgn; +avgo; +avgp; +avgq; +avgr; +avgs; +avgt; +avgu; +avgv; +avgw; +avgx; +avgy; +avgz; +avha; +avhb; +avhc; +avhd; +avhe; +avhf; +avhg; +avhh; +avhi; +avhj; +avhk; +avhl; +avhm; +avhn; +avho; +avhp; +avhq; +avhr; +avhs; +avht; +avhu; +avhv; +avhw; +avhx; +avhy; +avhz; +avia; +avib; +avic; +avid; +avie; +avif; +avig; +avih; +avii; +avij; +avik; +avil; +avim; +avin; +avio; +avip; +aviq; +avir; +avis; +avit; +aviu; +aviv; +aviw; +avix; +aviy; +aviz; +avja; +avjb; +avjc; +avjd; +avje; +avjf; +avjg; +avjh; +avji; +avjj; +avjk; +avjl; +avjm; +avjn; +avjo; +avjp; +avjq; +avjr; +avjs; +avjt; +avju; +avjv; +avjw; +avjx; +avjy; +avjz; +avka; +avkb; +avkc; +avkd; +avke; +avkf; +avkg; +avkh; +avki; +avkj; +avkk; +avkl; +avkm; +avkn; +avko; +avkp; +avkq; +avkr; +avks; +avkt; +avku; +avkv; +avkw; +avkx; +avky; +avkz; +avla; +avlb; +avlc; +avld; +avle; +avlf; +avlg; +avlh; +avli; +avlj; +avlk; +avll; +avlm; +avln; +avlo; +avlp; +avlq; +avlr; +avls; +avlt; +avlu; +avlv; +avlw; +avlx; +avly; +avlz; +avma; +avmb; +avmc; +avmd; +avme; +avmf; +avmg; +avmh; +avmi; +avmj; +avmk; +avml; +avmm; +avmn; +avmo; +avmp; +avmq; +avmr; +avms; +avmt; +avmu; +avmv; +avmw; +avmx; +avmy; +avmz; +avna; +avnb; +avnc; +avnd; +avne; +avnf; +avng; +avnh; +avni; +avnj; +avnk; +avnl; +avnm; +avnn; +avno; +avnp; +avnq; +avnr; +avns; +avnt; +avnu; +avnv; +avnw; +avnx; +avny; +avnz; +avoa; +avob; +avoc; +avod; +avoe; +avof; +avog; +avoh; +avoi; +avoj; +avok; +avol; +avom; +avon; +avoo; +avop; +avoq; +avor; +avos; +avot; +avou; +avov; +avow; +avox; +avoy; +avoz; +avpa; +avpb; +avpc; +avpd; +avpe; +avpf; +avpg; +avph; +avpi; +avpj; +avpk; +avpl; +avpm; +avpn; +avpo; +avpp; +avpq; +avpr; +avps; +avpt; +avpu; +avpv; +avpw; +avpx; +avpy; +avpz; +avqa; +avqb; +avqc; +avqd; +avqe; +avqf; +avqg; +avqh; +avqi; +avqj; +avqk; +avql; +avqm; +avqn; +avqo; +avqp; +avqq; +avqr; +avqs; +avqt; +avqu; +avqv; +avqw; +avqx; +avqy; +avqz; +avra; +avrb; +avrc; +avrd; +avre; +avrf; +avrg; +avrh; +avri; +avrj; +avrk; +avrl; +avrm; +avrn; +avro; +avrp; +avrq; +avrr; +avrs; +avrt; +avru; +avrv; +avrw; +avrx; +avry; +avrz; +avsa; +avsb; +avsc; +avsd; +avse; +avsf; +avsg; +avsh; +avsi; +avsj; +avsk; +avsl; +avsm; +avsn; +avso; +avsp; +avsq; +avsr; +avss; +avst; +avsu; +avsv; +avsw; +avsx; +avsy; +avsz; +avta; +avtb; +avtc; +avtd; +avte; +avtf; +avtg; +avth; +avti; +avtj; +avtk; +avtl; +avtm; +avtn; +avto; +avtp; +avtq; +avtr; +avts; +avtt; +avtu; +avtv; +avtw; +avtx; +avty; +avtz; +avua; +avub; +avuc; +avud; +avue; +avuf; +avug; +avuh; +avui; +avuj; +avuk; +avul; +avum; +avun; +avuo; +avup; +avuq; +avur; +avus; +avut; +avuu; +avuv; +avuw; +avux; +avuy; +avuz; +avva; +avvb; +avvc; +avvd; +avve; +avvf; +avvg; +avvh; +avvi; +avvj; +avvk; +avvl; +avvm; +avvn; +avvo; +avvp; +avvq; +avvr; +avvs; +avvt; +avvu; +avvv; +avvw; +avvx; +avvy; +avvz; +avwa; +avwb; +avwc; +avwd; +avwe; +avwf; +avwg; +avwh; +avwi; +avwj; +avwk; +avwl; +avwm; +avwn; +avwo; +avwp; +avwq; +avwr; +avws; +avwt; +avwu; +avwv; +avww; +avwx; +avwy; +avwz; +avxa; +avxb; +avxc; +avxd; +avxe; +avxf; +avxg; +avxh; +avxi; +avxj; +avxk; +avxl; +avxm; +avxn; +avxo; +avxp; +avxq; +avxr; +avxs; +avxt; +avxu; +avxv; +avxw; +avxx; +avxy; +avxz; +avya; +avyb; +avyc; +avyd; +avye; +avyf; +avyg; +avyh; +avyi; +avyj; +avyk; +avyl; +avym; +avyn; +avyo; +avyp; +avyq; +avyr; +avys; +avyt; +avyu; +avyv; +avyw; +avyx; +avyy; +avyz; +avza; +avzb; +avzc; +avzd; +avze; +avzf; +avzg; +avzh; +avzi; +avzj; +avzk; +avzl; +avzm; +avzn; +avzo; +avzp; +avzq; +avzr; +avzs; +avzt; +avzu; +avzv; +avzw; +avzx; +avzy; +avzz; +awaa; +awab; +awac; +awad; +awae; +awaf; +awag; +awah; +awai; +awaj; +awak; +awal; +awam; +awan; +awao; +awap; +awaq; +awar; +awas; +awat; +awau; +awav; +awaw; +awax; +away; +awaz; +awba; +awbb; +awbc; +awbd; +awbe; +awbf; +awbg; +awbh; +awbi; +awbj; +awbk; +awbl; +awbm; +awbn; +awbo; +awbp; +awbq; +awbr; +awbs; +awbt; +awbu; +awbv; +awbw; +awbx; +awby; +awbz; +awca; +awcb; +awcc; +awcd; +awce; +awcf; +awcg; +awch; +awci; +awcj; +awck; +awcl; +awcm; +awcn; +awco; +awcp; +awcq; +awcr; +awcs; +awct; +awcu; +awcv; +awcw; +awcx; +awcy; +awcz; +awda; +awdb; +awdc; +awdd; +awde; +awdf; +awdg; +awdh; +awdi; +awdj; +awdk; +awdl; +awdm; +awdn; +awdo; +awdp; +awdq; +awdr; +awds; +awdt; +awdu; +awdv; +awdw; +awdx; +awdy; +awdz; +awea; +aweb; +awec; +awed; +awee; +awef; +aweg; +aweh; +awei; +awej; +awek; +awel; +awem; +awen; +aweo; +awep; +aweq; +awer; +awes; +awet; +aweu; +awev; +awew; +awex; +awey; +awez; +awfa; +awfb; +awfc; +awfd; +awfe; +awff; +awfg; +awfh; +awfi; +awfj; +awfk; +awfl; +awfm; +awfn; +awfo; +awfp; +awfq; +awfr; +awfs; +awft; +awfu; +awfv; +awfw; +awfx; +awfy; +awfz; +awga; +awgb; +awgc; +awgd; +awge; +awgf; +awgg; +awgh; +awgi; +awgj; +awgk; +awgl; +awgm; +awgn; +awgo; +awgp; +awgq; +awgr; +awgs; +awgt; +awgu; +awgv; +awgw; +awgx; +awgy; +awgz; +awha; +awhb; +awhc; +awhd; +awhe; +awhf; +awhg; +awhh; +awhi; +awhj; +awhk; +awhl; +awhm; +awhn; +awho; +awhp; +awhq; +awhr; +awhs; +awht; +awhu; +awhv; +awhw; +awhx; +awhy; +awhz; +awia; +awib; +awic; +awid; +awie; +awif; +awig; +awih; +awii; +awij; +awik; +awil; +awim; +awin; +awio; +awip; +awiq; +awir; +awis; +awit; +awiu; +awiv; +awiw; +awix; +awiy; +awiz; +awja; +awjb; +awjc; +awjd; +awje; +awjf; +awjg; +awjh; +awji; +awjj; +awjk; +awjl; +awjm; +awjn; +awjo; +awjp; +awjq; +awjr; +awjs; +awjt; +awju; +awjv; +awjw; +awjx; +awjy; +awjz; +awka; +awkb; +awkc; +awkd; +awke; +awkf; +awkg; +awkh; +awki; +awkj; +awkk; +awkl; +awkm; +awkn; +awko; +awkp; +awkq; +awkr; +awks; +awkt; +awku; +awkv; +awkw; +awkx; +awky; +awkz; +awla; +awlb; +awlc; +awld; +awle; +awlf; +awlg; +awlh; +awli; +awlj; +awlk; +awll; +awlm; +awln; +awlo; +awlp; +awlq; +awlr; +awls; +awlt; +awlu; +awlv; +awlw; +awlx; +awly; +awlz; +awma; +awmb; +awmc; +awmd; +awme; +awmf; +awmg; +awmh; +awmi; +awmj; +awmk; +awml; +awmm; +awmn; +awmo; +awmp; +awmq; +awmr; +awms; +awmt; +awmu; +awmv; +awmw; +awmx; +awmy; +awmz; +awna; +awnb; +awnc; +awnd; +awne; +awnf; +awng; +awnh; +awni; +awnj; +awnk; +awnl; +awnm; +awnn; +awno; +awnp; +awnq; +awnr; +awns; +awnt; +awnu; +awnv; +awnw; +awnx; +awny; +awnz; +awoa; +awob; +awoc; +awod; +awoe; +awof; +awog; +awoh; +awoi; +awoj; +awok; +awol; +awom; +awon; +awoo; +awop; +awoq; +awor; +awos; +awot; +awou; +awov; +awow; +awox; +awoy; +awoz; +awpa; +awpb; +awpc; +awpd; +awpe; +awpf; +awpg; +awph; +awpi; +awpj; +awpk; +awpl; +awpm; +awpn; +awpo; +awpp; +awpq; +awpr; +awps; +awpt; +awpu; +awpv; +awpw; +awpx; +awpy; +awpz; +awqa; +awqb; +awqc; +awqd; +awqe; +awqf; +awqg; +awqh; +awqi; +awqj; +awqk; +awql; +awqm; +awqn; +awqo; +awqp; +awqq; +awqr; +awqs; +awqt; +awqu; +awqv; +awqw; +awqx; +awqy; +awqz; +awra; +awrb; +awrc; +awrd; +awre; +awrf; +awrg; +awrh; +awri; +awrj; +awrk; +awrl; +awrm; +awrn; +awro; +awrp; +awrq; +awrr; +awrs; +awrt; +awru; +awrv; +awrw; +awrx; +awry; +awrz; +awsa; +awsb; +awsc; +awsd; +awse; +awsf; +awsg; +awsh; +awsi; +awsj; +awsk; +awsl; +awsm; +awsn; +awso; +awsp; +awsq; +awsr; +awss; +awst; +awsu; +awsv; +awsw; +awsx; +awsy; +awsz; +awta; +awtb; +awtc; +awtd; +awte; +awtf; +awtg; +awth; +awti; +awtj; +awtk; +awtl; +awtm; +awtn; +awto; +awtp; +awtq; +awtr; +awts; +awtt; +awtu; +awtv; +awtw; +awtx; +awty; +awtz; +awua; +awub; +awuc; +awud; +awue; +awuf; +awug; +awuh; +awui; +awuj; +awuk; +awul; +awum; +awun; +awuo; +awup; +awuq; +awur; +awus; +awut; +awuu; +awuv; +awuw; +awux; +awuy; +awuz; +awva; +awvb; +awvc; +awvd; +awve; +awvf; +awvg; +awvh; +awvi; +awvj; +awvk; +awvl; +awvm; +awvn; +awvo; +awvp; +awvq; +awvr; +awvs; +awvt; +awvu; +awvv; +awvw; +awvx; +awvy; +awvz; +awwa; +awwb; +awwc; +awwd; +awwe; +awwf; +awwg; +awwh; +awwi; +awwj; +awwk; +awwl; +awwm; +awwn; +awwo; +awwp; +awwq; +awwr; +awws; +awwt; +awwu; +awwv; +awww; +awwx; +awwy; +awwz; +awxa; +awxb; +awxc; +awxd; +awxe; +awxf; +awxg; +awxh; +awxi; +awxj; +awxk; +awxl; +awxm; +awxn; +awxo; +awxp; +awxq; +awxr; +awxs; +awxt; +awxu; +awxv; +awxw; +awxx; +awxy; +awxz; +awya; +awyb; +awyc; +awyd; +awye; +awyf; +awyg; +awyh; +awyi; +awyj; +awyk; +awyl; +awym; +awyn; +awyo; +awyp; +awyq; +awyr; +awys; +awyt; +awyu; +awyv; +awyw; +awyx; +awyy; +awyz; +awza; +awzb; +awzc; +awzd; +awze; +awzf; +awzg; +awzh; +awzi; +awzj; +awzk; +awzl; +awzm; +awzn; +awzo; +awzp; +awzq; +awzr; +awzs; +awzt; +awzu; +awzv; +awzw; +awzx; +awzy; +awzz; +axaa; +axab; +axac; +axad; +axae; +axaf; +axag; +axah; +axai; +axaj; +axak; +axal; +axam; +axan; +axao; +axap; +axaq; +axar; +axas; +axat; +axau; +axav; +axaw; +axax; +axay; +axaz; +axba; +axbb; +axbc; +axbd; +axbe; +axbf; +axbg; +axbh; +axbi; +axbj; +axbk; +axbl; +axbm; +axbn; +axbo; +axbp; +axbq; +axbr; +axbs; +axbt; +axbu; +axbv; +axbw; +axbx; +axby; +axbz; +axca; +axcb; +axcc; +axcd; +axce; +axcf; +axcg; +axch; +axci; +axcj; +axck; +axcl; +axcm; +axcn; +axco; +axcp; +axcq; +axcr; +axcs; +axct; +axcu; +axcv; +axcw; +axcx; +axcy; +axcz; +axda; +axdb; +axdc; +axdd; +axde; +axdf; +axdg; +axdh; +axdi; +axdj; +axdk; +axdl; +axdm; +axdn; +axdo; +axdp; +axdq; +axdr; +axds; +axdt; +axdu; +axdv; +axdw; +axdx; +axdy; +axdz; +axea; +axeb; +axec; +axed; +axee; +axef; +axeg; +axeh; +axei; +axej; +axek; +axel; +axem; +axen; +axeo; +axep; +axeq; +axer; +axes; +axet; +axeu; +axev; +axew; +axex; +axey; +axez; +axfa; +axfb; +axfc; +axfd; +axfe; +axff; +axfg; +axfh; +axfi; +axfj; +axfk; +axfl; +axfm; +axfn; +axfo; +axfp; +axfq; +axfr; +axfs; +axft; +axfu; +axfv; +axfw; +axfx; +axfy; +axfz; +axga; +axgb; +axgc; +axgd; +axge; +axgf; +axgg; +axgh; +axgi; +axgj; +axgk; +axgl; +axgm; +axgn; +axgo; +axgp; +axgq; +axgr; +axgs; +axgt; +axgu; +axgv; +axgw; +axgx; +axgy; +axgz; +axha; +axhb; +axhc; +axhd; +axhe; +axhf; +axhg; +axhh; +axhi; +axhj; +axhk; +axhl; +axhm; +axhn; +axho; +axhp; +axhq; +axhr; +axhs; +axht; +axhu; +axhv; +axhw; +axhx; +axhy; +axhz; +axia; +axib; +axic; +axid; +axie; +axif; +axig; +axih; +axii; +axij; +axik; +axil; +axim; +axin; +axio; +axip; +axiq; +axir; +axis; +axit; +axiu; +axiv; +axiw; +axix; +axiy; +axiz; +axja; +axjb; +axjc; +axjd; +axje; +axjf; +axjg; +axjh; +axji; +axjj; +axjk; +axjl; +axjm; +axjn; +axjo; +axjp; +axjq; +axjr; +axjs; +axjt; +axju; +axjv; +axjw; +axjx; +axjy; +axjz; +axka; +axkb; +axkc; +axkd; +axke; +axkf; +axkg; +axkh; +axki; +axkj; +axkk; +axkl; +axkm; +axkn; +axko; +axkp; +axkq; +axkr; +axks; +axkt; +axku; +axkv; +axkw; +axkx; +axky; +axkz; +axla; +axlb; +axlc; +axld; +axle; +axlf; +axlg; +axlh; +axli; +axlj; +axlk; +axll; +axlm; +axln; +axlo; +axlp; +axlq; +axlr; +axls; +axlt; +axlu; +axlv; +axlw; +axlx; +axly; +axlz; +axma; +axmb; +axmc; +axmd; +axme; +axmf; +axmg; +axmh; +axmi; +axmj; +axmk; +axml; +axmm; +axmn; +axmo; +axmp; +axmq; +axmr; +axms; +axmt; +axmu; +axmv; +axmw; +axmx; +axmy; +axmz; +axna; +axnb; +axnc; +axnd; +axne; +axnf; +axng; +axnh; +axni; +axnj; +axnk; +axnl; +axnm; +axnn; +axno; +axnp; +axnq; +axnr; +axns; +axnt; +axnu; +axnv; +axnw; +axnx; +axny; +axnz; +axoa; +axob; +axoc; +axod; +axoe; +axof; +axog; +axoh; +axoi; +axoj; +axok; +axol; +axom; +axon; +axoo; +axop; +axoq; +axor; +axos; +axot; +axou; +axov; +axow; +axox; +axoy; +axoz; +axpa; +axpb; +axpc; +axpd; +axpe; +axpf; +axpg; +axph; +axpi; +axpj; +axpk; +axpl; +axpm; +axpn; +axpo; +axpp; +axpq; +axpr; +axps; +axpt; +axpu; +axpv; +axpw; +axpx; +axpy; +axpz; +axqa; +axqb; +axqc; +axqd; +axqe; +axqf; +axqg; +axqh; +axqi; +axqj; +axqk; +axql; +axqm; +axqn; +axqo; +axqp; +axqq; +axqr; +axqs; +axqt; +axqu; +axqv; +axqw; +axqx; +axqy; +axqz; +axra; +axrb; +axrc; +axrd; +axre; +axrf; +axrg; +axrh; +axri; +axrj; +axrk; +axrl; +axrm; +axrn; +axro; +axrp; +axrq; +axrr; +axrs; +axrt; +axru; +axrv; +axrw; +axrx; +axry; +axrz; +axsa; +axsb; +axsc; +axsd; +axse; +axsf; +axsg; +axsh; +axsi; +axsj; +axsk; +axsl; +axsm; +axsn; +axso; +axsp; +axsq; +axsr; +axss; +axst; +axsu; +axsv; +axsw; +axsx; +axsy; +axsz; +axta; +axtb; +axtc; +axtd; +axte; +axtf; +axtg; +axth; +axti; +axtj; +axtk; +axtl; +axtm; +axtn; +axto; +axtp; +axtq; +axtr; +axts; +axtt; +axtu; +axtv; +axtw; +axtx; +axty; +axtz; +axua; +axub; +axuc; +axud; +axue; +axuf; +axug; +axuh; +axui; +axuj; +axuk; +axul; +axum; +axun; +axuo; +axup; +axuq; +axur; +axus; +axut; +axuu; +axuv; +axuw; +axux; +axuy; +axuz; +axva; +axvb; +axvc; +axvd; +axve; +axvf; +axvg; +axvh; +axvi; +axvj; +axvk; +axvl; +axvm; +axvn; +axvo; +axvp; +axvq; +axvr; +axvs; +axvt; +axvu; +axvv; +axvw; +axvx; +axvy; +axvz; +axwa; +axwb; +axwc; +axwd; +axwe; +axwf; +axwg; +axwh; +axwi; +axwj; +axwk; +axwl; +axwm; +axwn; +axwo; +axwp; +axwq; +axwr; +axws; +axwt; +axwu; +axwv; +axww; +axwx; +axwy; +axwz; +axxa; +axxb; +axxc; +axxd; +axxe; +axxf; +axxg; +axxh; +axxi; +axxj; +axxk; +axxl; +axxm; +axxn; +axxo; +axxp; +axxq; +axxr; +axxs; +axxt; +axxu; +axxv; +axxw; +axxx; +axxy; +axxz; +axya; +axyb; +axyc; +axyd; +axye; +axyf; +axyg; +axyh; +axyi; +axyj; +axyk; +axyl; +axym; +axyn; +axyo; +axyp; +axyq; +axyr; +axys; +axyt; +axyu; +axyv; +axyw; +axyx; +axyy; +axyz; +axza; +axzb; +axzc; +axzd; +axze; +axzf; +axzg; +axzh; +axzi; +axzj; +axzk; +axzl; +axzm; +axzn; +axzo; +axzp; +axzq; +axzr; +axzs; +axzt; +axzu; +axzv; +axzw; +axzx; +axzy; +axzz; +ayaa; +ayab; +ayac; +ayad; +ayae; +ayaf; +ayag; +ayah; +ayai; +ayaj; +ayak; +ayal; +ayam; +ayan; +ayao; +ayap; +ayaq; +ayar; +ayas; +ayat; +ayau; +ayav; +ayaw; +ayax; +ayay; +ayaz; +ayba; +aybb; +aybc; +aybd; +aybe; +aybf; +aybg; +aybh; +aybi; +aybj; +aybk; +aybl; +aybm; +aybn; +aybo; +aybp; +aybq; +aybr; +aybs; +aybt; +aybu; +aybv; +aybw; +aybx; +ayby; +aybz; +ayca; +aycb; +aycc; +aycd; +ayce; +aycf; +aycg; +aych; +ayci; +aycj; +ayck; +aycl; +aycm; +aycn; +ayco; +aycp; +aycq; +aycr; +aycs; +ayct; +aycu; +aycv; +aycw; +aycx; +aycy; +aycz; +ayda; +aydb; +aydc; +aydd; +ayde; +aydf; +aydg; +aydh; +aydi; +aydj; +aydk; +aydl; +aydm; +aydn; +aydo; +aydp; +aydq; +aydr; +ayds; +aydt; +aydu; +aydv; +aydw; +aydx; +aydy; +aydz; +ayea; +ayeb; +ayec; +ayed; +ayee; +ayef; +ayeg; +ayeh; +ayei; +ayej; +ayek; +ayel; +ayem; +ayen; +ayeo; +ayep; +ayeq; +ayer; +ayes; +ayet; +ayeu; +ayev; +ayew; +ayex; +ayey; +ayez; +ayfa; +ayfb; +ayfc; +ayfd; +ayfe; +ayff; +ayfg; +ayfh; +ayfi; +ayfj; +ayfk; +ayfl; +ayfm; +ayfn; +ayfo; +ayfp; +ayfq; +ayfr; +ayfs; +ayft; +ayfu; +ayfv; +ayfw; +ayfx; +ayfy; +ayfz; +ayga; +aygb; +aygc; +aygd; +ayge; +aygf; +aygg; +aygh; +aygi; +aygj; +aygk; +aygl; +aygm; +aygn; +aygo; +aygp; +aygq; +aygr; +aygs; +aygt; +aygu; +aygv; +aygw; +aygx; +aygy; +aygz; +ayha; +ayhb; +ayhc; +ayhd; +ayhe; +ayhf; +ayhg; +ayhh; +ayhi; +ayhj; +ayhk; +ayhl; +ayhm; +ayhn; +ayho; +ayhp; +ayhq; +ayhr; +ayhs; +ayht; +ayhu; +ayhv; +ayhw; +ayhx; +ayhy; +ayhz; +ayia; +ayib; +ayic; +ayid; +ayie; +ayif; +ayig; +ayih; +ayii; +ayij; +ayik; +ayil; +ayim; +ayin; +ayio; +ayip; +ayiq; +ayir; +ayis; +ayit; +ayiu; +ayiv; +ayiw; +ayix; +ayiy; +ayiz; +ayja; +ayjb; +ayjc; +ayjd; +ayje; +ayjf; +ayjg; +ayjh; +ayji; +ayjj; +ayjk; +ayjl; +ayjm; +ayjn; +ayjo; +ayjp; +ayjq; +ayjr; +ayjs; +ayjt; +ayju; +ayjv; +ayjw; +ayjx; +ayjy; +ayjz; +ayka; +aykb; +aykc; +aykd; +ayke; +aykf; +aykg; +aykh; +ayki; +aykj; +aykk; +aykl; +aykm; +aykn; +ayko; +aykp; +aykq; +aykr; +ayks; +aykt; +ayku; +aykv; +aykw; +aykx; +ayky; +aykz; +ayla; +aylb; +aylc; +ayld; +ayle; +aylf; +aylg; +aylh; +ayli; +aylj; +aylk; +ayll; +aylm; +ayln; +aylo; +aylp; +aylq; +aylr; +ayls; +aylt; +aylu; +aylv; +aylw; +aylx; +ayly; +aylz; +ayma; +aymb; +aymc; +aymd; +ayme; +aymf; +aymg; +aymh; +aymi; +aymj; +aymk; +ayml; +aymm; +aymn; +aymo; +aymp; +aymq; +aymr; +ayms; +aymt; +aymu; +aymv; +aymw; +aymx; +aymy; +aymz; +ayna; +aynb; +aync; +aynd; +ayne; +aynf; +ayng; +aynh; +ayni; +aynj; +aynk; +aynl; +aynm; +aynn; +ayno; +aynp; +aynq; +aynr; +ayns; +aynt; +aynu; +aynv; +aynw; +aynx; +ayny; +aynz; +ayoa; +ayob; +ayoc; +ayod; +ayoe; +ayof; +ayog; +ayoh; +ayoi; +ayoj; +ayok; +ayol; +ayom; +ayon; +ayoo; +ayop; +ayoq; +ayor; +ayos; +ayot; +ayou; +ayov; +ayow; +ayox; +ayoy; +ayoz; +aypa; +aypb; +aypc; +aypd; +aype; +aypf; +aypg; +ayph; +aypi; +aypj; +aypk; +aypl; +aypm; +aypn; +aypo; +aypp; +aypq; +aypr; +ayps; +aypt; +aypu; +aypv; +aypw; +aypx; +aypy; +aypz; +ayqa; +ayqb; +ayqc; +ayqd; +ayqe; +ayqf; +ayqg; +ayqh; +ayqi; +ayqj; +ayqk; +ayql; +ayqm; +ayqn; +ayqo; +ayqp; +ayqq; +ayqr; +ayqs; +ayqt; +ayqu; +ayqv; +ayqw; +ayqx; +ayqy; +ayqz; +ayra; +ayrb; +ayrc; +ayrd; +ayre; +ayrf; +ayrg; +ayrh; +ayri; +ayrj; +ayrk; +ayrl; +ayrm; +ayrn; +ayro; +ayrp; +ayrq; +ayrr; +ayrs; +ayrt; +ayru; +ayrv; +ayrw; +ayrx; +ayry; +ayrz; +aysa; +aysb; +aysc; +aysd; +ayse; +aysf; +aysg; +aysh; +aysi; +aysj; +aysk; +aysl; +aysm; +aysn; +ayso; +aysp; +aysq; +aysr; +ayss; +ayst; +aysu; +aysv; +aysw; +aysx; +aysy; +aysz; +ayta; +aytb; +aytc; +aytd; +ayte; +aytf; +aytg; +ayth; +ayti; +aytj; +aytk; +aytl; +aytm; +aytn; +ayto; +aytp; +aytq; +aytr; +ayts; +aytt; +aytu; +aytv; +aytw; +aytx; +ayty; +aytz; +ayua; +ayub; +ayuc; +ayud; +ayue; +ayuf; +ayug; +ayuh; +ayui; +ayuj; +ayuk; +ayul; +ayum; +ayun; +ayuo; +ayup; +ayuq; +ayur; +ayus; +ayut; +ayuu; +ayuv; +ayuw; +ayux; +ayuy; +ayuz; +ayva; +ayvb; +ayvc; +ayvd; +ayve; +ayvf; +ayvg; +ayvh; +ayvi; +ayvj; +ayvk; +ayvl; +ayvm; +ayvn; +ayvo; +ayvp; +ayvq; +ayvr; +ayvs; +ayvt; +ayvu; +ayvv; +ayvw; +ayvx; +ayvy; +ayvz; +aywa; +aywb; +aywc; +aywd; +aywe; +aywf; +aywg; +aywh; +aywi; +aywj; +aywk; +aywl; +aywm; +aywn; +aywo; +aywp; +aywq; +aywr; +ayws; +aywt; +aywu; +aywv; +ayww; +aywx; +aywy; +aywz; +ayxa; +ayxb; +ayxc; +ayxd; +ayxe; +ayxf; +ayxg; +ayxh; +ayxi; +ayxj; +ayxk; +ayxl; +ayxm; +ayxn; +ayxo; +ayxp; +ayxq; +ayxr; +ayxs; +ayxt; +ayxu; +ayxv; +ayxw; +ayxx; +ayxy; +ayxz; +ayya; +ayyb; +ayyc; +ayyd; +ayye; +ayyf; +ayyg; +ayyh; +ayyi; +ayyj; +ayyk; +ayyl; +ayym; +ayyn; +ayyo; +ayyp; +ayyq; +ayyr; +ayys; +ayyt; +ayyu; +ayyv; +ayyw; +ayyx; +ayyy; +ayyz; +ayza; +ayzb; +ayzc; +ayzd; +ayze; +ayzf; +ayzg; +ayzh; +ayzi; +ayzj; +ayzk; +ayzl; +ayzm; +ayzn; +ayzo; +ayzp; +ayzq; +ayzr; +ayzs; +ayzt; +ayzu; +ayzv; +ayzw; +ayzx; +ayzy; +ayzz; +azaa; +azab; +azac; +azad; +azae; +azaf; +azag; +azah; +azai; +azaj; +azak; +azal; +azam; +azan; +azao; +azap; +azaq; +azar; +azas; +azat; +azau; +azav; +azaw; +azax; +azay; +azaz; +azba; +azbb; +azbc; +azbd; +azbe; +azbf; +azbg; +azbh; +azbi; +azbj; +azbk; +azbl; +azbm; +azbn; +azbo; +azbp; +azbq; +azbr; +azbs; +azbt; +azbu; +azbv; +azbw; +azbx; +azby; +azbz; +azca; +azcb; +azcc; +azcd; +azce; +azcf; +azcg; +azch; +azci; +azcj; +azck; +azcl; +azcm; +azcn; +azco; +azcp; +azcq; +azcr; +azcs; +azct; +azcu; +azcv; +azcw; +azcx; +azcy; +azcz; +azda; +azdb; +azdc; +azdd; +azde; +azdf; +azdg; +azdh; +azdi; +azdj; +azdk; +azdl; +azdm; +azdn; +azdo; +azdp; +azdq; +azdr; +azds; +azdt; +azdu; +azdv; +azdw; +azdx; +azdy; +azdz; +azea; +azeb; +azec; +azed; +azee; +azef; +azeg; +azeh; +azei; +azej; +azek; +azel; +azem; +azen; +azeo; +azep; +azeq; +azer; +azes; +azet; +azeu; +azev; +azew; +azex; +azey; +azez; +azfa; +azfb; +azfc; +azfd; +azfe; +azff; +azfg; +azfh; +azfi; +azfj; +azfk; +azfl; +azfm; +azfn; +azfo; +azfp; +azfq; +azfr; +azfs; +azft; +azfu; +azfv; +azfw; +azfx; +azfy; +azfz; +azga; +azgb; +azgc; +azgd; +azge; +azgf; +azgg; +azgh; +azgi; +azgj; +azgk; +azgl; +azgm; +azgn; +azgo; +azgp; +azgq; +azgr; +azgs; +azgt; +azgu; +azgv; +azgw; +azgx; +azgy; +azgz; +azha; +azhb; +azhc; +azhd; +azhe; +azhf; +azhg; +azhh; +azhi; +azhj; +azhk; +azhl; +azhm; +azhn; +azho; +azhp; +azhq; +azhr; +azhs; +azht; +azhu; +azhv; +azhw; +azhx; +azhy; +azhz; +azia; +azib; +azic; +azid; +azie; +azif; +azig; +azih; +azii; +azij; +azik; +azil; +azim; +azin; +azio; +azip; +aziq; +azir; +azis; +azit; +aziu; +aziv; +aziw; +azix; +aziy; +aziz; +azja; +azjb; +azjc; +azjd; +azje; +azjf; +azjg; +azjh; +azji; +azjj; +azjk; +azjl; +azjm; +azjn; +azjo; +azjp; +azjq; +azjr; +azjs; +azjt; +azju; +azjv; +azjw; +azjx; +azjy; +azjz; +azka; +azkb; +azkc; +azkd; +azke; +azkf; +azkg; +azkh; +azki; +azkj; +azkk; +azkl; +azkm; +azkn; +azko; +azkp; +azkq; +azkr; +azks; +azkt; +azku; +azkv; +azkw; +azkx; +azky; +azkz; +azla; +azlb; +azlc; +azld; +azle; +azlf; +azlg; +azlh; +azli; +azlj; +azlk; +azll; +azlm; +azln; +azlo; +azlp; +azlq; +azlr; +azls; +azlt; +azlu; +azlv; +azlw; +azlx; +azly; +azlz; +azma; +azmb; +azmc; +azmd; +azme; +azmf; +azmg; +azmh; +azmi; +azmj; +azmk; +azml; +azmm; +azmn; +azmo; +azmp; +azmq; +azmr; +azms; +azmt; +azmu; +azmv; +azmw; +azmx; +azmy; +azmz; +azna; +aznb; +aznc; +aznd; +azne; +aznf; +azng; +aznh; +azni; +aznj; +aznk; +aznl; +aznm; +aznn; +azno; +aznp; +aznq; +aznr; +azns; +aznt; +aznu; +aznv; +aznw; +aznx; +azny; +aznz; +azoa; +azob; +azoc; +azod; +azoe; +azof; +azog; +azoh; +azoi; +azoj; +azok; +azol; +azom; +azon; +azoo; +azop; +azoq; +azor; +azos; +azot; +azou; +azov; +azow; +azox; +azoy; +azoz; +azpa; +azpb; +azpc; +azpd; +azpe; +azpf; +azpg; +azph; +azpi; +azpj; +azpk; +azpl; +azpm; +azpn; +azpo; +azpp; +azpq; +azpr; +azps; +azpt; +azpu; +azpv; +azpw; +azpx; +azpy; +azpz; +azqa; +azqb; +azqc; +azqd; +azqe; +azqf; +azqg; +azqh; +azqi; +azqj; +azqk; +azql; +azqm; +azqn; +azqo; +azqp; +azqq; +azqr; +azqs; +azqt; +azqu; +azqv; +azqw; +azqx; +azqy; +azqz; +azra; +azrb; +azrc; +azrd; +azre; +azrf; +azrg; +azrh; +azri; +azrj; +azrk; +azrl; +azrm; +azrn; +azro; +azrp; +azrq; +azrr; +azrs; +azrt; +azru; +azrv; +azrw; +azrx; +azry; +azrz; +azsa; +azsb; +azsc; +azsd; +azse; +azsf; +azsg; +azsh; +azsi; +azsj; +azsk; +azsl; +azsm; +azsn; +azso; +azsp; +azsq; +azsr; +azss; +azst; +azsu; +azsv; +azsw; +azsx; +azsy; +azsz; +azta; +aztb; +aztc; +aztd; +azte; +aztf; +aztg; +azth; +azti; +aztj; +aztk; +aztl; +aztm; +aztn; +azto; +aztp; +aztq; +aztr; +azts; +aztt; +aztu; +aztv; +aztw; +aztx; +azty; +aztz; +azua; +azub; +azuc; +azud; +azue; +azuf; +azug; +azuh; +azui; +azuj; +azuk; +azul; +azum; +azun; +azuo; +azup; +azuq; +azur; +azus; +azut; +azuu; +azuv; +azuw; +azux; +azuy; +azuz; +azva; +azvb; +azvc; +azvd; +azve; +azvf; +azvg; +azvh; +azvi; +azvj; +azvk; +azvl; +azvm; +azvn; +azvo; +azvp; +azvq; +azvr; +azvs; +azvt; +azvu; +azvv; +azvw; +azvx; +azvy; +azvz; +azwa; +azwb; +azwc; +azwd; +azwe; +azwf; +azwg; +azwh; +azwi; +azwj; +azwk; +azwl; +azwm; +azwn; +azwo; +azwp; +azwq; +azwr; +azws; +azwt; +azwu; +azwv; +azww; +azwx; +azwy; +azwz; +azxa; +azxb; +azxc; +azxd; +azxe; +azxf; +azxg; +azxh; +azxi; +azxj; +azxk; +azxl; +azxm; +azxn; +azxo; +azxp; +azxq; +azxr; +azxs; +azxt; +azxu; +azxv; +azxw; +azxx; +azxy; +azxz; +azya; +azyb; +azyc; +azyd; +azye; +azyf; +azyg; +azyh; +azyi; +azyj; +azyk; +azyl; +azym; +azyn; +azyo; +azyp; +azyq; +azyr; +azys; +azyt; +azyu; +azyv; +azyw; +azyx; +azyy; +azyz; +azza; +azzb; +azzc; +azzd; +azze; +azzf; +azzg; +azzh; +azzi; +azzj; +azzk; +azzl; +azzm; +azzn; +azzo; +azzp; +azzq; +azzr; +azzs; +azzt; +azzu; +azzv; +azzw; +azzx; +azzy; +azzz; +baaa; +baab; +baac; +baad; +baae; +baaf; +baag; +baah; +baai; +baaj; +baak; +baal; +baam; +baan; +baao; +baap; +baaq; +baar; +baas; +baat; +baau; +baav; +baaw; +baax; +baay; +baaz; +baba; +babb; +babc; +babd; +babe; +babf; +babg; +babh; +babi; +babj; +babk; +babl; +babm; +babn; +babo; +babp; +babq; +babr; +babs; +babt; +babu; +babv; +babw; +babx; +baby; +babz; +baca; +bacb; +bacc; +bacd; +bace; +bacf; +bacg; +bach; +baci; +bacj; +back; +bacl; +bacm; +bacn; +baco; +bacp; +bacq; +bacr; +bacs; +bact; +bacu; +bacv; +bacw; +bacx; +bacy; +bacz; +bada; +badb; +badc; +badd; +bade; +badf; +badg; +badh; +badi; +badj; +badk; +badl; +badm; +badn; +bado; +badp; +badq; +badr; +bads; +badt; +badu; +badv; +badw; +badx; +bady; +badz; +baea; +baeb; +baec; +baed; +baee; +baef; +baeg; +baeh; +baei; +baej; +baek; +bael; +baem; +baen; +baeo; +baep; +baeq; +baer; +baes; +baet; +baeu; +baev; +baew; +baex; +baey; +baez; +bafa; +bafb; +bafc; +bafd; +bafe; +baff; +bafg; +bafh; +bafi; +bafj; +bafk; +bafl; +bafm; +bafn; +bafo; +bafp; +bafq; +bafr; +bafs; +baft; +bafu; +bafv; +bafw; +bafx; +bafy; +bafz; +baga; +bagb; +bagc; +bagd; +bage; +bagf; +bagg; +bagh; +bagi; +bagj; +bagk; +bagl; +bagm; +bagn; +bago; +bagp; +bagq; +bagr; +bags; +bagt; +bagu; +bagv; +bagw; +bagx; +bagy; +bagz; +baha; +bahb; +bahc; +bahd; +bahe; +bahf; +bahg; +bahh; +bahi; +bahj; +bahk; +bahl; +bahm; +bahn; +baho; +bahp; +bahq; +bahr; +bahs; +baht; +bahu; +bahv; +bahw; +bahx; +bahy; +bahz; +baia; +baib; +baic; +baid; +baie; +baif; +baig; +baih; +baii; +baij; +baik; +bail; +baim; +bain; +baio; +baip; +baiq; +bair; +bais; +bait; +baiu; +baiv; +baiw; +baix; +baiy; +baiz; +baja; +bajb; +bajc; +bajd; +baje; +bajf; +bajg; +bajh; +baji; +bajj; +bajk; +bajl; +bajm; +bajn; +bajo; +bajp; +bajq; +bajr; +bajs; +bajt; +baju; +bajv; +bajw; +bajx; +bajy; +bajz; +baka; +bakb; +bakc; +bakd; +bake; +bakf; +bakg; +bakh; +baki; +bakj; +bakk; +bakl; +bakm; +bakn; +bako; +bakp; +bakq; +bakr; +baks; +bakt; +baku; +bakv; +bakw; +bakx; +baky; +bakz; +bala; +balb; +balc; +bald; +bale; +balf; +balg; +balh; +bali; +balj; +balk; +ball; +balm; +baln; +balo; +balp; +balq; +balr; +bals; +balt; +balu; +balv; +balw; +balx; +baly; +balz; +bama; +bamb; +bamc; +bamd; +bame; +bamf; +bamg; +bamh; +bami; +bamj; +bamk; +baml; +bamm; +bamn; +bamo; +bamp; +bamq; +bamr; +bams; +bamt; +bamu; +bamv; +bamw; +bamx; +bamy; +bamz; +bana; +banb; +banc; +band; +bane; +banf; +bang; +banh; +bani; +banj; +bank; +banl; +banm; +bann; +bano; +banp; +banq; +banr; +bans; +bant; +banu; +banv; +banw; +banx; +bany; +banz; +baoa; +baob; +baoc; +baod; +baoe; +baof; +baog; +baoh; +baoi; +baoj; +baok; +baol; +baom; +baon; +baoo; +baop; +baoq; +baor; +baos; +baot; +baou; +baov; +baow; +baox; +baoy; +baoz; +bapa; +bapb; +bapc; +bapd; +bape; +bapf; +bapg; +baph; +bapi; +bapj; +bapk; +bapl; +bapm; +bapn; +bapo; +bapp; +bapq; +bapr; +baps; +bapt; +bapu; +bapv; +bapw; +bapx; +bapy; +bapz; +baqa; +baqb; +baqc; +baqd; +baqe; +baqf; +baqg; +baqh; +baqi; +baqj; +baqk; +baql; +baqm; +baqn; +baqo; +baqp; +baqq; +baqr; +baqs; +baqt; +baqu; +baqv; +baqw; +baqx; +baqy; +baqz; +bara; +barb; +barc; +bard; +bare; +barf; +barg; +barh; +bari; +barj; +bark; +barl; +barm; +barn; +baro; +barp; +barq; +barr; +bars; +bart; +baru; +barv; +barw; +barx; +bary; +barz; +basa; +basb; +basc; +basd; +base; +basf; +basg; +bash; +basi; +basj; +bask; +basl; +basm; +basn; +baso; +basp; +basq; +basr; +bass; +bast; +basu; +basv; +basw; +basx; +basy; +basz; +bata; +batb; +batc; +batd; +bate; +batf; +batg; +bath; +bati; +batj; +batk; +batl; +batm; +batn; +bato; +batp; +batq; +batr; +bats; +batt; +batu; +batv; +batw; +batx; +baty; +batz; +baua; +baub; +bauc; +baud; +baue; +bauf; +baug; +bauh; +baui; +bauj; +bauk; +baul; +baum; +baun; +bauo; +baup; +bauq; +baur; +baus; +baut; +bauu; +bauv; +bauw; +baux; +bauy; +bauz; +bava; +bavb; +bavc; +bavd; +bave; +bavf; +bavg; +bavh; +bavi; +bavj; +bavk; +bavl; +bavm; +bavn; +bavo; +bavp; +bavq; +bavr; +bavs; +bavt; +bavu; +bavv; +bavw; +bavx; +bavy; +bavz; +bawa; +bawb; +bawc; +bawd; +bawe; +bawf; +bawg; +bawh; +bawi; +bawj; +bawk; +bawl; +bawm; +bawn; +bawo; +bawp; +bawq; +bawr; +baws; +bawt; +bawu; +bawv; +baww; +bawx; +bawy; +bawz; +baxa; +baxb; +baxc; +baxd; +baxe; +baxf; +baxg; +baxh; +baxi; +baxj; +baxk; +baxl; +baxm; +baxn; +baxo; +baxp; +baxq; +baxr; +baxs; +baxt; +baxu; +baxv; +baxw; +baxx; +baxy; +baxz; +baya; +bayb; +bayc; +bayd; +baye; +bayf; +bayg; +bayh; +bayi; +bayj; +bayk; +bayl; +baym; +bayn; +bayo; +bayp; +bayq; +bayr; +bays; +bayt; +bayu; +bayv; +bayw; +bayx; +bayy; +bayz; +baza; +bazb; +bazc; +bazd; +baze; +bazf; +bazg; +bazh; +bazi; +bazj; +bazk; +bazl; +bazm; +bazn; +bazo; +bazp; +bazq; +bazr; +bazs; +bazt; +bazu; +bazv; +bazw; +bazx; +bazy; +bazz; +bbaa; +bbab; +bbac; +bbad; +bbae; +bbaf; +bbag; +bbah; +bbai; +bbaj; +bbak; +bbal; +bbam; +bban; +bbao; +bbap; +bbaq; +bbar; +bbas; +bbat; +bbau; +bbav; +bbaw; +bbax; +bbay; +bbaz; +bbba; +bbbb +|]; diff --git a/camlp4/test/fixtures/big-tab3.ml b/camlp4/test/fixtures/big-tab3.ml new file mode 100644 index 00000000..a597031a --- /dev/null +++ b/camlp4/test/fixtures/big-tab3.ml @@ -0,0 +1,20001 @@ +[| +aaaaa; +aaaab; +aaaac; +aaaad; +aaaae; +aaaaf; +aaaag; +aaaah; +aaaai; +aaaaj; +aaaak; +aaaal; +aaaam; +aaaan; +aaaao; +aaaap; +aaaaq; +aaaar; +aaaas; +aaaat; +aaaau; +aaaav; +aaaaw; +aaaax; +aaaay; +aaaaz; +aaaba; +aaabb; +aaabc; +aaabd; +aaabe; +aaabf; +aaabg; +aaabh; +aaabi; +aaabj; +aaabk; +aaabl; +aaabm; +aaabn; +aaabo; +aaabp; +aaabq; +aaabr; +aaabs; +aaabt; +aaabu; +aaabv; +aaabw; +aaabx; +aaaby; +aaabz; +aaaca; +aaacb; +aaacc; +aaacd; +aaace; +aaacf; +aaacg; +aaach; +aaaci; +aaacj; +aaack; +aaacl; +aaacm; +aaacn; +aaaco; +aaacp; +aaacq; +aaacr; +aaacs; +aaact; +aaacu; +aaacv; +aaacw; +aaacx; +aaacy; +aaacz; +aaada; +aaadb; +aaadc; +aaadd; +aaade; +aaadf; +aaadg; +aaadh; +aaadi; +aaadj; +aaadk; +aaadl; +aaadm; +aaadn; +aaado; +aaadp; +aaadq; +aaadr; +aaads; +aaadt; +aaadu; +aaadv; +aaadw; +aaadx; +aaady; +aaadz; +aaaea; +aaaeb; +aaaec; +aaaed; +aaaee; +aaaef; +aaaeg; +aaaeh; +aaaei; +aaaej; +aaaek; +aaael; +aaaem; +aaaen; +aaaeo; +aaaep; +aaaeq; +aaaer; +aaaes; +aaaet; +aaaeu; +aaaev; +aaaew; +aaaex; +aaaey; +aaaez; +aaafa; +aaafb; +aaafc; +aaafd; +aaafe; +aaaff; +aaafg; +aaafh; +aaafi; +aaafj; +aaafk; +aaafl; +aaafm; +aaafn; +aaafo; +aaafp; +aaafq; +aaafr; +aaafs; +aaaft; +aaafu; +aaafv; +aaafw; +aaafx; +aaafy; +aaafz; +aaaga; +aaagb; +aaagc; +aaagd; +aaage; +aaagf; +aaagg; +aaagh; +aaagi; +aaagj; +aaagk; +aaagl; +aaagm; +aaagn; +aaago; +aaagp; +aaagq; +aaagr; +aaags; +aaagt; +aaagu; +aaagv; +aaagw; +aaagx; +aaagy; +aaagz; +aaaha; +aaahb; +aaahc; +aaahd; +aaahe; +aaahf; +aaahg; +aaahh; +aaahi; +aaahj; +aaahk; +aaahl; +aaahm; +aaahn; +aaaho; +aaahp; +aaahq; +aaahr; +aaahs; +aaaht; +aaahu; +aaahv; +aaahw; +aaahx; +aaahy; +aaahz; +aaaia; +aaaib; +aaaic; +aaaid; +aaaie; +aaaif; +aaaig; +aaaih; +aaaii; +aaaij; +aaaik; +aaail; +aaaim; +aaain; +aaaio; +aaaip; +aaaiq; +aaair; +aaais; +aaait; +aaaiu; +aaaiv; +aaaiw; +aaaix; +aaaiy; +aaaiz; +aaaja; +aaajb; +aaajc; +aaajd; +aaaje; +aaajf; +aaajg; +aaajh; +aaaji; +aaajj; +aaajk; +aaajl; +aaajm; +aaajn; +aaajo; +aaajp; +aaajq; +aaajr; +aaajs; +aaajt; +aaaju; +aaajv; +aaajw; +aaajx; +aaajy; +aaajz; +aaaka; +aaakb; +aaakc; +aaakd; +aaake; +aaakf; +aaakg; +aaakh; +aaaki; +aaakj; +aaakk; +aaakl; +aaakm; +aaakn; +aaako; +aaakp; +aaakq; +aaakr; +aaaks; +aaakt; +aaaku; +aaakv; +aaakw; +aaakx; +aaaky; +aaakz; +aaala; +aaalb; +aaalc; +aaald; +aaale; +aaalf; +aaalg; +aaalh; +aaali; +aaalj; +aaalk; +aaall; +aaalm; +aaaln; +aaalo; +aaalp; +aaalq; +aaalr; +aaals; +aaalt; +aaalu; +aaalv; +aaalw; +aaalx; +aaaly; +aaalz; +aaama; +aaamb; +aaamc; +aaamd; +aaame; +aaamf; +aaamg; +aaamh; +aaami; +aaamj; +aaamk; +aaaml; +aaamm; +aaamn; +aaamo; +aaamp; +aaamq; +aaamr; +aaams; +aaamt; +aaamu; +aaamv; +aaamw; +aaamx; +aaamy; +aaamz; +aaana; +aaanb; +aaanc; +aaand; +aaane; +aaanf; +aaang; +aaanh; +aaani; +aaanj; +aaank; +aaanl; +aaanm; +aaann; +aaano; +aaanp; +aaanq; +aaanr; +aaans; +aaant; +aaanu; +aaanv; +aaanw; +aaanx; +aaany; +aaanz; +aaaoa; +aaaob; +aaaoc; +aaaod; +aaaoe; +aaaof; +aaaog; +aaaoh; +aaaoi; +aaaoj; +aaaok; +aaaol; +aaaom; +aaaon; +aaaoo; +aaaop; +aaaoq; +aaaor; +aaaos; +aaaot; +aaaou; +aaaov; +aaaow; +aaaox; +aaaoy; +aaaoz; +aaapa; +aaapb; +aaapc; +aaapd; +aaape; +aaapf; +aaapg; +aaaph; +aaapi; +aaapj; +aaapk; +aaapl; +aaapm; +aaapn; +aaapo; +aaapp; +aaapq; +aaapr; +aaaps; +aaapt; +aaapu; +aaapv; +aaapw; +aaapx; +aaapy; +aaapz; +aaaqa; +aaaqb; +aaaqc; +aaaqd; +aaaqe; +aaaqf; +aaaqg; +aaaqh; +aaaqi; +aaaqj; +aaaqk; +aaaql; +aaaqm; +aaaqn; +aaaqo; +aaaqp; +aaaqq; +aaaqr; +aaaqs; +aaaqt; +aaaqu; +aaaqv; +aaaqw; +aaaqx; +aaaqy; +aaaqz; +aaara; +aaarb; +aaarc; +aaard; +aaare; +aaarf; +aaarg; +aaarh; +aaari; +aaarj; +aaark; +aaarl; +aaarm; +aaarn; +aaaro; +aaarp; +aaarq; +aaarr; +aaars; +aaart; +aaaru; +aaarv; +aaarw; +aaarx; +aaary; +aaarz; +aaasa; +aaasb; +aaasc; +aaasd; +aaase; +aaasf; +aaasg; +aaash; +aaasi; +aaasj; +aaask; +aaasl; +aaasm; +aaasn; +aaaso; +aaasp; +aaasq; +aaasr; +aaass; +aaast; +aaasu; +aaasv; +aaasw; +aaasx; +aaasy; +aaasz; +aaata; +aaatb; +aaatc; +aaatd; +aaate; +aaatf; +aaatg; +aaath; +aaati; +aaatj; +aaatk; +aaatl; +aaatm; +aaatn; +aaato; +aaatp; +aaatq; +aaatr; +aaats; +aaatt; +aaatu; +aaatv; +aaatw; +aaatx; +aaaty; +aaatz; +aaaua; +aaaub; +aaauc; +aaaud; +aaaue; +aaauf; +aaaug; +aaauh; +aaaui; +aaauj; +aaauk; +aaaul; +aaaum; +aaaun; +aaauo; +aaaup; +aaauq; +aaaur; +aaaus; +aaaut; +aaauu; +aaauv; +aaauw; +aaaux; +aaauy; +aaauz; +aaava; +aaavb; +aaavc; +aaavd; +aaave; +aaavf; +aaavg; +aaavh; +aaavi; +aaavj; +aaavk; +aaavl; +aaavm; +aaavn; +aaavo; +aaavp; +aaavq; +aaavr; +aaavs; +aaavt; +aaavu; +aaavv; +aaavw; +aaavx; +aaavy; +aaavz; +aaawa; +aaawb; +aaawc; +aaawd; +aaawe; +aaawf; +aaawg; +aaawh; +aaawi; +aaawj; +aaawk; +aaawl; +aaawm; +aaawn; +aaawo; +aaawp; +aaawq; +aaawr; +aaaws; +aaawt; +aaawu; +aaawv; +aaaww; +aaawx; +aaawy; +aaawz; +aaaxa; +aaaxb; +aaaxc; +aaaxd; +aaaxe; +aaaxf; +aaaxg; +aaaxh; +aaaxi; +aaaxj; +aaaxk; +aaaxl; +aaaxm; +aaaxn; +aaaxo; +aaaxp; +aaaxq; +aaaxr; +aaaxs; +aaaxt; +aaaxu; +aaaxv; +aaaxw; +aaaxx; +aaaxy; +aaaxz; +aaaya; +aaayb; +aaayc; +aaayd; +aaaye; +aaayf; +aaayg; +aaayh; +aaayi; +aaayj; +aaayk; +aaayl; +aaaym; +aaayn; +aaayo; +aaayp; +aaayq; +aaayr; +aaays; +aaayt; +aaayu; +aaayv; +aaayw; +aaayx; +aaayy; +aaayz; +aaaza; +aaazb; +aaazc; +aaazd; +aaaze; +aaazf; +aaazg; +aaazh; +aaazi; +aaazj; +aaazk; +aaazl; +aaazm; +aaazn; +aaazo; +aaazp; +aaazq; +aaazr; +aaazs; +aaazt; +aaazu; +aaazv; +aaazw; +aaazx; +aaazy; +aaazz; +aabaa; +aabab; +aabac; +aabad; +aabae; +aabaf; +aabag; +aabah; +aabai; +aabaj; +aabak; +aabal; +aabam; +aaban; +aabao; +aabap; +aabaq; +aabar; +aabas; +aabat; +aabau; +aabav; +aabaw; +aabax; +aabay; +aabaz; +aabba; +aabbb; +aabbc; +aabbd; +aabbe; +aabbf; +aabbg; +aabbh; +aabbi; +aabbj; +aabbk; +aabbl; +aabbm; +aabbn; +aabbo; +aabbp; +aabbq; +aabbr; +aabbs; +aabbt; +aabbu; +aabbv; +aabbw; +aabbx; +aabby; +aabbz; +aabca; +aabcb; +aabcc; +aabcd; +aabce; +aabcf; +aabcg; +aabch; +aabci; +aabcj; +aabck; +aabcl; +aabcm; +aabcn; +aabco; +aabcp; +aabcq; +aabcr; +aabcs; +aabct; +aabcu; +aabcv; +aabcw; +aabcx; +aabcy; +aabcz; +aabda; +aabdb; +aabdc; +aabdd; +aabde; +aabdf; +aabdg; +aabdh; +aabdi; +aabdj; +aabdk; +aabdl; +aabdm; +aabdn; +aabdo; +aabdp; +aabdq; +aabdr; +aabds; +aabdt; +aabdu; +aabdv; +aabdw; +aabdx; +aabdy; +aabdz; +aabea; +aabeb; +aabec; +aabed; +aabee; +aabef; +aabeg; +aabeh; +aabei; +aabej; +aabek; +aabel; +aabem; +aaben; +aabeo; +aabep; +aabeq; +aaber; +aabes; +aabet; +aabeu; +aabev; +aabew; +aabex; +aabey; +aabez; +aabfa; +aabfb; +aabfc; +aabfd; +aabfe; +aabff; +aabfg; +aabfh; +aabfi; +aabfj; +aabfk; +aabfl; +aabfm; +aabfn; +aabfo; +aabfp; +aabfq; +aabfr; +aabfs; +aabft; +aabfu; +aabfv; +aabfw; +aabfx; +aabfy; +aabfz; +aabga; +aabgb; +aabgc; +aabgd; +aabge; +aabgf; +aabgg; +aabgh; +aabgi; +aabgj; +aabgk; +aabgl; +aabgm; +aabgn; +aabgo; +aabgp; +aabgq; +aabgr; +aabgs; +aabgt; +aabgu; +aabgv; +aabgw; +aabgx; +aabgy; +aabgz; +aabha; +aabhb; +aabhc; +aabhd; +aabhe; +aabhf; +aabhg; +aabhh; +aabhi; +aabhj; +aabhk; +aabhl; +aabhm; +aabhn; +aabho; +aabhp; +aabhq; +aabhr; +aabhs; +aabht; +aabhu; +aabhv; +aabhw; +aabhx; +aabhy; +aabhz; +aabia; +aabib; +aabic; +aabid; +aabie; +aabif; +aabig; +aabih; +aabii; +aabij; +aabik; +aabil; +aabim; +aabin; +aabio; +aabip; +aabiq; +aabir; +aabis; +aabit; +aabiu; +aabiv; +aabiw; +aabix; +aabiy; +aabiz; +aabja; +aabjb; +aabjc; +aabjd; +aabje; +aabjf; +aabjg; +aabjh; +aabji; +aabjj; +aabjk; +aabjl; +aabjm; +aabjn; +aabjo; +aabjp; +aabjq; +aabjr; +aabjs; +aabjt; +aabju; +aabjv; +aabjw; +aabjx; +aabjy; +aabjz; +aabka; +aabkb; +aabkc; +aabkd; +aabke; +aabkf; +aabkg; +aabkh; +aabki; +aabkj; +aabkk; +aabkl; +aabkm; +aabkn; +aabko; +aabkp; +aabkq; +aabkr; +aabks; +aabkt; +aabku; +aabkv; +aabkw; +aabkx; +aabky; +aabkz; +aabla; +aablb; +aablc; +aabld; +aable; +aablf; +aablg; +aablh; +aabli; +aablj; +aablk; +aabll; +aablm; +aabln; +aablo; +aablp; +aablq; +aablr; +aabls; +aablt; +aablu; +aablv; +aablw; +aablx; +aably; +aablz; +aabma; +aabmb; +aabmc; +aabmd; +aabme; +aabmf; +aabmg; +aabmh; +aabmi; +aabmj; +aabmk; +aabml; +aabmm; +aabmn; +aabmo; +aabmp; +aabmq; +aabmr; +aabms; +aabmt; +aabmu; +aabmv; +aabmw; +aabmx; +aabmy; +aabmz; +aabna; +aabnb; +aabnc; +aabnd; +aabne; +aabnf; +aabng; +aabnh; +aabni; +aabnj; +aabnk; +aabnl; +aabnm; +aabnn; +aabno; +aabnp; +aabnq; +aabnr; +aabns; +aabnt; +aabnu; +aabnv; +aabnw; +aabnx; +aabny; +aabnz; +aaboa; +aabob; +aaboc; +aabod; +aaboe; +aabof; +aabog; +aaboh; +aaboi; +aaboj; +aabok; +aabol; +aabom; +aabon; +aaboo; +aabop; +aaboq; +aabor; +aabos; +aabot; +aabou; +aabov; +aabow; +aabox; +aaboy; +aaboz; +aabpa; +aabpb; +aabpc; +aabpd; +aabpe; +aabpf; +aabpg; +aabph; +aabpi; +aabpj; +aabpk; +aabpl; +aabpm; +aabpn; +aabpo; +aabpp; +aabpq; +aabpr; +aabps; +aabpt; +aabpu; +aabpv; +aabpw; +aabpx; +aabpy; +aabpz; +aabqa; +aabqb; +aabqc; +aabqd; +aabqe; +aabqf; +aabqg; +aabqh; +aabqi; +aabqj; +aabqk; +aabql; +aabqm; +aabqn; +aabqo; +aabqp; +aabqq; +aabqr; +aabqs; +aabqt; +aabqu; +aabqv; +aabqw; +aabqx; +aabqy; +aabqz; +aabra; +aabrb; +aabrc; +aabrd; +aabre; +aabrf; +aabrg; +aabrh; +aabri; +aabrj; +aabrk; +aabrl; +aabrm; +aabrn; +aabro; +aabrp; +aabrq; +aabrr; +aabrs; +aabrt; +aabru; +aabrv; +aabrw; +aabrx; +aabry; +aabrz; +aabsa; +aabsb; +aabsc; +aabsd; +aabse; +aabsf; +aabsg; +aabsh; +aabsi; +aabsj; +aabsk; +aabsl; +aabsm; +aabsn; +aabso; +aabsp; +aabsq; +aabsr; +aabss; +aabst; +aabsu; +aabsv; +aabsw; +aabsx; +aabsy; +aabsz; +aabta; +aabtb; +aabtc; +aabtd; +aabte; +aabtf; +aabtg; +aabth; +aabti; +aabtj; +aabtk; +aabtl; +aabtm; +aabtn; +aabto; +aabtp; +aabtq; +aabtr; +aabts; +aabtt; +aabtu; +aabtv; +aabtw; +aabtx; +aabty; +aabtz; +aabua; +aabub; +aabuc; +aabud; +aabue; +aabuf; +aabug; +aabuh; +aabui; +aabuj; +aabuk; +aabul; +aabum; +aabun; +aabuo; +aabup; +aabuq; +aabur; +aabus; +aabut; +aabuu; +aabuv; +aabuw; +aabux; +aabuy; +aabuz; +aabva; +aabvb; +aabvc; +aabvd; +aabve; +aabvf; +aabvg; +aabvh; +aabvi; +aabvj; +aabvk; +aabvl; +aabvm; +aabvn; +aabvo; +aabvp; +aabvq; +aabvr; +aabvs; +aabvt; +aabvu; +aabvv; +aabvw; +aabvx; +aabvy; +aabvz; +aabwa; +aabwb; +aabwc; +aabwd; +aabwe; +aabwf; +aabwg; +aabwh; +aabwi; +aabwj; +aabwk; +aabwl; +aabwm; +aabwn; +aabwo; +aabwp; +aabwq; +aabwr; +aabws; +aabwt; +aabwu; +aabwv; +aabww; +aabwx; +aabwy; +aabwz; +aabxa; +aabxb; +aabxc; +aabxd; +aabxe; +aabxf; +aabxg; +aabxh; +aabxi; +aabxj; +aabxk; +aabxl; +aabxm; +aabxn; +aabxo; +aabxp; +aabxq; +aabxr; +aabxs; +aabxt; +aabxu; +aabxv; +aabxw; +aabxx; +aabxy; +aabxz; +aabya; +aabyb; +aabyc; +aabyd; +aabye; +aabyf; +aabyg; +aabyh; +aabyi; +aabyj; +aabyk; +aabyl; +aabym; +aabyn; +aabyo; +aabyp; +aabyq; +aabyr; +aabys; +aabyt; +aabyu; +aabyv; +aabyw; +aabyx; +aabyy; +aabyz; +aabza; +aabzb; +aabzc; +aabzd; +aabze; +aabzf; +aabzg; +aabzh; +aabzi; +aabzj; +aabzk; +aabzl; +aabzm; +aabzn; +aabzo; +aabzp; +aabzq; +aabzr; +aabzs; +aabzt; +aabzu; +aabzv; +aabzw; +aabzx; +aabzy; +aabzz; +aacaa; +aacab; +aacac; +aacad; +aacae; +aacaf; +aacag; +aacah; +aacai; +aacaj; +aacak; +aacal; +aacam; +aacan; +aacao; +aacap; +aacaq; +aacar; +aacas; +aacat; +aacau; +aacav; +aacaw; +aacax; +aacay; +aacaz; +aacba; +aacbb; +aacbc; +aacbd; +aacbe; +aacbf; +aacbg; +aacbh; +aacbi; +aacbj; +aacbk; +aacbl; +aacbm; +aacbn; +aacbo; +aacbp; +aacbq; +aacbr; +aacbs; +aacbt; +aacbu; +aacbv; +aacbw; +aacbx; +aacby; +aacbz; +aacca; +aaccb; +aaccc; +aaccd; +aacce; +aaccf; +aaccg; +aacch; +aacci; +aaccj; +aacck; +aaccl; +aaccm; +aaccn; +aacco; +aaccp; +aaccq; +aaccr; +aaccs; +aacct; +aaccu; +aaccv; +aaccw; +aaccx; +aaccy; +aaccz; +aacda; +aacdb; +aacdc; +aacdd; +aacde; +aacdf; +aacdg; +aacdh; +aacdi; +aacdj; +aacdk; +aacdl; +aacdm; +aacdn; +aacdo; +aacdp; +aacdq; +aacdr; +aacds; +aacdt; +aacdu; +aacdv; +aacdw; +aacdx; +aacdy; +aacdz; +aacea; +aaceb; +aacec; +aaced; +aacee; +aacef; +aaceg; +aaceh; +aacei; +aacej; +aacek; +aacel; +aacem; +aacen; +aaceo; +aacep; +aaceq; +aacer; +aaces; +aacet; +aaceu; +aacev; +aacew; +aacex; +aacey; +aacez; +aacfa; +aacfb; +aacfc; +aacfd; +aacfe; +aacff; +aacfg; +aacfh; +aacfi; +aacfj; +aacfk; +aacfl; +aacfm; +aacfn; +aacfo; +aacfp; +aacfq; +aacfr; +aacfs; +aacft; +aacfu; +aacfv; +aacfw; +aacfx; +aacfy; +aacfz; +aacga; +aacgb; +aacgc; +aacgd; +aacge; +aacgf; +aacgg; +aacgh; +aacgi; +aacgj; +aacgk; +aacgl; +aacgm; +aacgn; +aacgo; +aacgp; +aacgq; +aacgr; +aacgs; +aacgt; +aacgu; +aacgv; +aacgw; +aacgx; +aacgy; +aacgz; +aacha; +aachb; +aachc; +aachd; +aache; +aachf; +aachg; +aachh; +aachi; +aachj; +aachk; +aachl; +aachm; +aachn; +aacho; +aachp; +aachq; +aachr; +aachs; +aacht; +aachu; +aachv; +aachw; +aachx; +aachy; +aachz; +aacia; +aacib; +aacic; +aacid; +aacie; +aacif; +aacig; +aacih; +aacii; +aacij; +aacik; +aacil; +aacim; +aacin; +aacio; +aacip; +aaciq; +aacir; +aacis; +aacit; +aaciu; +aaciv; +aaciw; +aacix; +aaciy; +aaciz; +aacja; +aacjb; +aacjc; +aacjd; +aacje; +aacjf; +aacjg; +aacjh; +aacji; +aacjj; +aacjk; +aacjl; +aacjm; +aacjn; +aacjo; +aacjp; +aacjq; +aacjr; +aacjs; +aacjt; +aacju; +aacjv; +aacjw; +aacjx; +aacjy; +aacjz; +aacka; +aackb; +aackc; +aackd; +aacke; +aackf; +aackg; +aackh; +aacki; +aackj; +aackk; +aackl; +aackm; +aackn; +aacko; +aackp; +aackq; +aackr; +aacks; +aackt; +aacku; +aackv; +aackw; +aackx; +aacky; +aackz; +aacla; +aaclb; +aaclc; +aacld; +aacle; +aaclf; +aaclg; +aaclh; +aacli; +aaclj; +aaclk; +aacll; +aaclm; +aacln; +aaclo; +aaclp; +aaclq; +aaclr; +aacls; +aaclt; +aaclu; +aaclv; +aaclw; +aaclx; +aacly; +aaclz; +aacma; +aacmb; +aacmc; +aacmd; +aacme; +aacmf; +aacmg; +aacmh; +aacmi; +aacmj; +aacmk; +aacml; +aacmm; +aacmn; +aacmo; +aacmp; +aacmq; +aacmr; +aacms; +aacmt; +aacmu; +aacmv; +aacmw; +aacmx; +aacmy; +aacmz; +aacna; +aacnb; +aacnc; +aacnd; +aacne; +aacnf; +aacng; +aacnh; +aacni; +aacnj; +aacnk; +aacnl; +aacnm; +aacnn; +aacno; +aacnp; +aacnq; +aacnr; +aacns; +aacnt; +aacnu; +aacnv; +aacnw; +aacnx; +aacny; +aacnz; +aacoa; +aacob; +aacoc; +aacod; +aacoe; +aacof; +aacog; +aacoh; +aacoi; +aacoj; +aacok; +aacol; +aacom; +aacon; +aacoo; +aacop; +aacoq; +aacor; +aacos; +aacot; +aacou; +aacov; +aacow; +aacox; +aacoy; +aacoz; +aacpa; +aacpb; +aacpc; +aacpd; +aacpe; +aacpf; +aacpg; +aacph; +aacpi; +aacpj; +aacpk; +aacpl; +aacpm; +aacpn; +aacpo; +aacpp; +aacpq; +aacpr; +aacps; +aacpt; +aacpu; +aacpv; +aacpw; +aacpx; +aacpy; +aacpz; +aacqa; +aacqb; +aacqc; +aacqd; +aacqe; +aacqf; +aacqg; +aacqh; +aacqi; +aacqj; +aacqk; +aacql; +aacqm; +aacqn; +aacqo; +aacqp; +aacqq; +aacqr; +aacqs; +aacqt; +aacqu; +aacqv; +aacqw; +aacqx; +aacqy; +aacqz; +aacra; +aacrb; +aacrc; +aacrd; +aacre; +aacrf; +aacrg; +aacrh; +aacri; +aacrj; +aacrk; +aacrl; +aacrm; +aacrn; +aacro; +aacrp; +aacrq; +aacrr; +aacrs; +aacrt; +aacru; +aacrv; +aacrw; +aacrx; +aacry; +aacrz; +aacsa; +aacsb; +aacsc; +aacsd; +aacse; +aacsf; +aacsg; +aacsh; +aacsi; +aacsj; +aacsk; +aacsl; +aacsm; +aacsn; +aacso; +aacsp; +aacsq; +aacsr; +aacss; +aacst; +aacsu; +aacsv; +aacsw; +aacsx; +aacsy; +aacsz; +aacta; +aactb; +aactc; +aactd; +aacte; +aactf; +aactg; +aacth; +aacti; +aactj; +aactk; +aactl; +aactm; +aactn; +aacto; +aactp; +aactq; +aactr; +aacts; +aactt; +aactu; +aactv; +aactw; +aactx; +aacty; +aactz; +aacua; +aacub; +aacuc; +aacud; +aacue; +aacuf; +aacug; +aacuh; +aacui; +aacuj; +aacuk; +aacul; +aacum; +aacun; +aacuo; +aacup; +aacuq; +aacur; +aacus; +aacut; +aacuu; +aacuv; +aacuw; +aacux; +aacuy; +aacuz; +aacva; +aacvb; +aacvc; +aacvd; +aacve; +aacvf; +aacvg; +aacvh; +aacvi; +aacvj; +aacvk; +aacvl; +aacvm; +aacvn; +aacvo; +aacvp; +aacvq; +aacvr; +aacvs; +aacvt; +aacvu; +aacvv; +aacvw; +aacvx; +aacvy; +aacvz; +aacwa; +aacwb; +aacwc; +aacwd; +aacwe; +aacwf; +aacwg; +aacwh; +aacwi; +aacwj; +aacwk; +aacwl; +aacwm; +aacwn; +aacwo; +aacwp; +aacwq; +aacwr; +aacws; +aacwt; +aacwu; +aacwv; +aacww; +aacwx; +aacwy; +aacwz; +aacxa; +aacxb; +aacxc; +aacxd; +aacxe; +aacxf; +aacxg; +aacxh; +aacxi; +aacxj; +aacxk; +aacxl; +aacxm; +aacxn; +aacxo; +aacxp; +aacxq; +aacxr; +aacxs; +aacxt; +aacxu; +aacxv; +aacxw; +aacxx; +aacxy; +aacxz; +aacya; +aacyb; +aacyc; +aacyd; +aacye; +aacyf; +aacyg; +aacyh; +aacyi; +aacyj; +aacyk; +aacyl; +aacym; +aacyn; +aacyo; +aacyp; +aacyq; +aacyr; +aacys; +aacyt; +aacyu; +aacyv; +aacyw; +aacyx; +aacyy; +aacyz; +aacza; +aaczb; +aaczc; +aaczd; +aacze; +aaczf; +aaczg; +aaczh; +aaczi; +aaczj; +aaczk; +aaczl; +aaczm; +aaczn; +aaczo; +aaczp; +aaczq; +aaczr; +aaczs; +aaczt; +aaczu; +aaczv; +aaczw; +aaczx; +aaczy; +aaczz; +aadaa; +aadab; +aadac; +aadad; +aadae; +aadaf; +aadag; +aadah; +aadai; +aadaj; +aadak; +aadal; +aadam; +aadan; +aadao; +aadap; +aadaq; +aadar; +aadas; +aadat; +aadau; +aadav; +aadaw; +aadax; +aaday; +aadaz; +aadba; +aadbb; +aadbc; +aadbd; +aadbe; +aadbf; +aadbg; +aadbh; +aadbi; +aadbj; +aadbk; +aadbl; +aadbm; +aadbn; +aadbo; +aadbp; +aadbq; +aadbr; +aadbs; +aadbt; +aadbu; +aadbv; +aadbw; +aadbx; +aadby; +aadbz; +aadca; +aadcb; +aadcc; +aadcd; +aadce; +aadcf; +aadcg; +aadch; +aadci; +aadcj; +aadck; +aadcl; +aadcm; +aadcn; +aadco; +aadcp; +aadcq; +aadcr; +aadcs; +aadct; +aadcu; +aadcv; +aadcw; +aadcx; +aadcy; +aadcz; +aadda; +aaddb; +aaddc; +aaddd; +aadde; +aaddf; +aaddg; +aaddh; +aaddi; +aaddj; +aaddk; +aaddl; +aaddm; +aaddn; +aaddo; +aaddp; +aaddq; +aaddr; +aadds; +aaddt; +aaddu; +aaddv; +aaddw; +aaddx; +aaddy; +aaddz; +aadea; +aadeb; +aadec; +aaded; +aadee; +aadef; +aadeg; +aadeh; +aadei; +aadej; +aadek; +aadel; +aadem; +aaden; +aadeo; +aadep; +aadeq; +aader; +aades; +aadet; +aadeu; +aadev; +aadew; +aadex; +aadey; +aadez; +aadfa; +aadfb; +aadfc; +aadfd; +aadfe; +aadff; +aadfg; +aadfh; +aadfi; +aadfj; +aadfk; +aadfl; +aadfm; +aadfn; +aadfo; +aadfp; +aadfq; +aadfr; +aadfs; +aadft; +aadfu; +aadfv; +aadfw; +aadfx; +aadfy; +aadfz; +aadga; +aadgb; +aadgc; +aadgd; +aadge; +aadgf; +aadgg; +aadgh; +aadgi; +aadgj; +aadgk; +aadgl; +aadgm; +aadgn; +aadgo; +aadgp; +aadgq; +aadgr; +aadgs; +aadgt; +aadgu; +aadgv; +aadgw; +aadgx; +aadgy; +aadgz; +aadha; +aadhb; +aadhc; +aadhd; +aadhe; +aadhf; +aadhg; +aadhh; +aadhi; +aadhj; +aadhk; +aadhl; +aadhm; +aadhn; +aadho; +aadhp; +aadhq; +aadhr; +aadhs; +aadht; +aadhu; +aadhv; +aadhw; +aadhx; +aadhy; +aadhz; +aadia; +aadib; +aadic; +aadid; +aadie; +aadif; +aadig; +aadih; +aadii; +aadij; +aadik; +aadil; +aadim; +aadin; +aadio; +aadip; +aadiq; +aadir; +aadis; +aadit; +aadiu; +aadiv; +aadiw; +aadix; +aadiy; +aadiz; +aadja; +aadjb; +aadjc; +aadjd; +aadje; +aadjf; +aadjg; +aadjh; +aadji; +aadjj; +aadjk; +aadjl; +aadjm; +aadjn; +aadjo; +aadjp; +aadjq; +aadjr; +aadjs; +aadjt; +aadju; +aadjv; +aadjw; +aadjx; +aadjy; +aadjz; +aadka; +aadkb; +aadkc; +aadkd; +aadke; +aadkf; +aadkg; +aadkh; +aadki; +aadkj; +aadkk; +aadkl; +aadkm; +aadkn; +aadko; +aadkp; +aadkq; +aadkr; +aadks; +aadkt; +aadku; +aadkv; +aadkw; +aadkx; +aadky; +aadkz; +aadla; +aadlb; +aadlc; +aadld; +aadle; +aadlf; +aadlg; +aadlh; +aadli; +aadlj; +aadlk; +aadll; +aadlm; +aadln; +aadlo; +aadlp; +aadlq; +aadlr; +aadls; +aadlt; +aadlu; +aadlv; +aadlw; +aadlx; +aadly; +aadlz; +aadma; +aadmb; +aadmc; +aadmd; +aadme; +aadmf; +aadmg; +aadmh; +aadmi; +aadmj; +aadmk; +aadml; +aadmm; +aadmn; +aadmo; +aadmp; +aadmq; +aadmr; +aadms; +aadmt; +aadmu; +aadmv; +aadmw; +aadmx; +aadmy; +aadmz; +aadna; +aadnb; +aadnc; +aadnd; +aadne; +aadnf; +aadng; +aadnh; +aadni; +aadnj; +aadnk; +aadnl; +aadnm; +aadnn; +aadno; +aadnp; +aadnq; +aadnr; +aadns; +aadnt; +aadnu; +aadnv; +aadnw; +aadnx; +aadny; +aadnz; +aadoa; +aadob; +aadoc; +aadod; +aadoe; +aadof; +aadog; +aadoh; +aadoi; +aadoj; +aadok; +aadol; +aadom; +aadon; +aadoo; +aadop; +aadoq; +aador; +aados; +aadot; +aadou; +aadov; +aadow; +aadox; +aadoy; +aadoz; +aadpa; +aadpb; +aadpc; +aadpd; +aadpe; +aadpf; +aadpg; +aadph; +aadpi; +aadpj; +aadpk; +aadpl; +aadpm; +aadpn; +aadpo; +aadpp; +aadpq; +aadpr; +aadps; +aadpt; +aadpu; +aadpv; +aadpw; +aadpx; +aadpy; +aadpz; +aadqa; +aadqb; +aadqc; +aadqd; +aadqe; +aadqf; +aadqg; +aadqh; +aadqi; +aadqj; +aadqk; +aadql; +aadqm; +aadqn; +aadqo; +aadqp; +aadqq; +aadqr; +aadqs; +aadqt; +aadqu; +aadqv; +aadqw; +aadqx; +aadqy; +aadqz; +aadra; +aadrb; +aadrc; +aadrd; +aadre; +aadrf; +aadrg; +aadrh; +aadri; +aadrj; +aadrk; +aadrl; +aadrm; +aadrn; +aadro; +aadrp; +aadrq; +aadrr; +aadrs; +aadrt; +aadru; +aadrv; +aadrw; +aadrx; +aadry; +aadrz; +aadsa; +aadsb; +aadsc; +aadsd; +aadse; +aadsf; +aadsg; +aadsh; +aadsi; +aadsj; +aadsk; +aadsl; +aadsm; +aadsn; +aadso; +aadsp; +aadsq; +aadsr; +aadss; +aadst; +aadsu; +aadsv; +aadsw; +aadsx; +aadsy; +aadsz; +aadta; +aadtb; +aadtc; +aadtd; +aadte; +aadtf; +aadtg; +aadth; +aadti; +aadtj; +aadtk; +aadtl; +aadtm; +aadtn; +aadto; +aadtp; +aadtq; +aadtr; +aadts; +aadtt; +aadtu; +aadtv; +aadtw; +aadtx; +aadty; +aadtz; +aadua; +aadub; +aaduc; +aadud; +aadue; +aaduf; +aadug; +aaduh; +aadui; +aaduj; +aaduk; +aadul; +aadum; +aadun; +aaduo; +aadup; +aaduq; +aadur; +aadus; +aadut; +aaduu; +aaduv; +aaduw; +aadux; +aaduy; +aaduz; +aadva; +aadvb; +aadvc; +aadvd; +aadve; +aadvf; +aadvg; +aadvh; +aadvi; +aadvj; +aadvk; +aadvl; +aadvm; +aadvn; +aadvo; +aadvp; +aadvq; +aadvr; +aadvs; +aadvt; +aadvu; +aadvv; +aadvw; +aadvx; +aadvy; +aadvz; +aadwa; +aadwb; +aadwc; +aadwd; +aadwe; +aadwf; +aadwg; +aadwh; +aadwi; +aadwj; +aadwk; +aadwl; +aadwm; +aadwn; +aadwo; +aadwp; +aadwq; +aadwr; +aadws; +aadwt; +aadwu; +aadwv; +aadww; +aadwx; +aadwy; +aadwz; +aadxa; +aadxb; +aadxc; +aadxd; +aadxe; +aadxf; +aadxg; +aadxh; +aadxi; +aadxj; +aadxk; +aadxl; +aadxm; +aadxn; +aadxo; +aadxp; +aadxq; +aadxr; +aadxs; +aadxt; +aadxu; +aadxv; +aadxw; +aadxx; +aadxy; +aadxz; +aadya; +aadyb; +aadyc; +aadyd; +aadye; +aadyf; +aadyg; +aadyh; +aadyi; +aadyj; +aadyk; +aadyl; +aadym; +aadyn; +aadyo; +aadyp; +aadyq; +aadyr; +aadys; +aadyt; +aadyu; +aadyv; +aadyw; +aadyx; +aadyy; +aadyz; +aadza; +aadzb; +aadzc; +aadzd; +aadze; +aadzf; +aadzg; +aadzh; +aadzi; +aadzj; +aadzk; +aadzl; +aadzm; +aadzn; +aadzo; +aadzp; +aadzq; +aadzr; +aadzs; +aadzt; +aadzu; +aadzv; +aadzw; +aadzx; +aadzy; +aadzz; +aaeaa; +aaeab; +aaeac; +aaead; +aaeae; +aaeaf; +aaeag; +aaeah; +aaeai; +aaeaj; +aaeak; +aaeal; +aaeam; +aaean; +aaeao; +aaeap; +aaeaq; +aaear; +aaeas; +aaeat; +aaeau; +aaeav; +aaeaw; +aaeax; +aaeay; +aaeaz; +aaeba; +aaebb; +aaebc; +aaebd; +aaebe; +aaebf; +aaebg; +aaebh; +aaebi; +aaebj; +aaebk; +aaebl; +aaebm; +aaebn; +aaebo; +aaebp; +aaebq; +aaebr; +aaebs; +aaebt; +aaebu; +aaebv; +aaebw; +aaebx; +aaeby; +aaebz; +aaeca; +aaecb; +aaecc; +aaecd; +aaece; +aaecf; +aaecg; +aaech; +aaeci; +aaecj; +aaeck; +aaecl; +aaecm; +aaecn; +aaeco; +aaecp; +aaecq; +aaecr; +aaecs; +aaect; +aaecu; +aaecv; +aaecw; +aaecx; +aaecy; +aaecz; +aaeda; +aaedb; +aaedc; +aaedd; +aaede; +aaedf; +aaedg; +aaedh; +aaedi; +aaedj; +aaedk; +aaedl; +aaedm; +aaedn; +aaedo; +aaedp; +aaedq; +aaedr; +aaeds; +aaedt; +aaedu; +aaedv; +aaedw; +aaedx; +aaedy; +aaedz; +aaeea; +aaeeb; +aaeec; +aaeed; +aaeee; +aaeef; +aaeeg; +aaeeh; +aaeei; +aaeej; +aaeek; +aaeel; +aaeem; +aaeen; +aaeeo; +aaeep; +aaeeq; +aaeer; +aaees; +aaeet; +aaeeu; +aaeev; +aaeew; +aaeex; +aaeey; +aaeez; +aaefa; +aaefb; +aaefc; +aaefd; +aaefe; +aaeff; +aaefg; +aaefh; +aaefi; +aaefj; +aaefk; +aaefl; +aaefm; +aaefn; +aaefo; +aaefp; +aaefq; +aaefr; +aaefs; +aaeft; +aaefu; +aaefv; +aaefw; +aaefx; +aaefy; +aaefz; +aaega; +aaegb; +aaegc; +aaegd; +aaege; +aaegf; +aaegg; +aaegh; +aaegi; +aaegj; +aaegk; +aaegl; +aaegm; +aaegn; +aaego; +aaegp; +aaegq; +aaegr; +aaegs; +aaegt; +aaegu; +aaegv; +aaegw; +aaegx; +aaegy; +aaegz; +aaeha; +aaehb; +aaehc; +aaehd; +aaehe; +aaehf; +aaehg; +aaehh; +aaehi; +aaehj; +aaehk; +aaehl; +aaehm; +aaehn; +aaeho; +aaehp; +aaehq; +aaehr; +aaehs; +aaeht; +aaehu; +aaehv; +aaehw; +aaehx; +aaehy; +aaehz; +aaeia; +aaeib; +aaeic; +aaeid; +aaeie; +aaeif; +aaeig; +aaeih; +aaeii; +aaeij; +aaeik; +aaeil; +aaeim; +aaein; +aaeio; +aaeip; +aaeiq; +aaeir; +aaeis; +aaeit; +aaeiu; +aaeiv; +aaeiw; +aaeix; +aaeiy; +aaeiz; +aaeja; +aaejb; +aaejc; +aaejd; +aaeje; +aaejf; +aaejg; +aaejh; +aaeji; +aaejj; +aaejk; +aaejl; +aaejm; +aaejn; +aaejo; +aaejp; +aaejq; +aaejr; +aaejs; +aaejt; +aaeju; +aaejv; +aaejw; +aaejx; +aaejy; +aaejz; +aaeka; +aaekb; +aaekc; +aaekd; +aaeke; +aaekf; +aaekg; +aaekh; +aaeki; +aaekj; +aaekk; +aaekl; +aaekm; +aaekn; +aaeko; +aaekp; +aaekq; +aaekr; +aaeks; +aaekt; +aaeku; +aaekv; +aaekw; +aaekx; +aaeky; +aaekz; +aaela; +aaelb; +aaelc; +aaeld; +aaele; +aaelf; +aaelg; +aaelh; +aaeli; +aaelj; +aaelk; +aaell; +aaelm; +aaeln; +aaelo; +aaelp; +aaelq; +aaelr; +aaels; +aaelt; +aaelu; +aaelv; +aaelw; +aaelx; +aaely; +aaelz; +aaema; +aaemb; +aaemc; +aaemd; +aaeme; +aaemf; +aaemg; +aaemh; +aaemi; +aaemj; +aaemk; +aaeml; +aaemm; +aaemn; +aaemo; +aaemp; +aaemq; +aaemr; +aaems; +aaemt; +aaemu; +aaemv; +aaemw; +aaemx; +aaemy; +aaemz; +aaena; +aaenb; +aaenc; +aaend; +aaene; +aaenf; +aaeng; +aaenh; +aaeni; +aaenj; +aaenk; +aaenl; +aaenm; +aaenn; +aaeno; +aaenp; +aaenq; +aaenr; +aaens; +aaent; +aaenu; +aaenv; +aaenw; +aaenx; +aaeny; +aaenz; +aaeoa; +aaeob; +aaeoc; +aaeod; +aaeoe; +aaeof; +aaeog; +aaeoh; +aaeoi; +aaeoj; +aaeok; +aaeol; +aaeom; +aaeon; +aaeoo; +aaeop; +aaeoq; +aaeor; +aaeos; +aaeot; +aaeou; +aaeov; +aaeow; +aaeox; +aaeoy; +aaeoz; +aaepa; +aaepb; +aaepc; +aaepd; +aaepe; +aaepf; +aaepg; +aaeph; +aaepi; +aaepj; +aaepk; +aaepl; +aaepm; +aaepn; +aaepo; +aaepp; +aaepq; +aaepr; +aaeps; +aaept; +aaepu; +aaepv; +aaepw; +aaepx; +aaepy; +aaepz; +aaeqa; +aaeqb; +aaeqc; +aaeqd; +aaeqe; +aaeqf; +aaeqg; +aaeqh; +aaeqi; +aaeqj; +aaeqk; +aaeql; +aaeqm; +aaeqn; +aaeqo; +aaeqp; +aaeqq; +aaeqr; +aaeqs; +aaeqt; +aaequ; +aaeqv; +aaeqw; +aaeqx; +aaeqy; +aaeqz; +aaera; +aaerb; +aaerc; +aaerd; +aaere; +aaerf; +aaerg; +aaerh; +aaeri; +aaerj; +aaerk; +aaerl; +aaerm; +aaern; +aaero; +aaerp; +aaerq; +aaerr; +aaers; +aaert; +aaeru; +aaerv; +aaerw; +aaerx; +aaery; +aaerz; +aaesa; +aaesb; +aaesc; +aaesd; +aaese; +aaesf; +aaesg; +aaesh; +aaesi; +aaesj; +aaesk; +aaesl; +aaesm; +aaesn; +aaeso; +aaesp; +aaesq; +aaesr; +aaess; +aaest; +aaesu; +aaesv; +aaesw; +aaesx; +aaesy; +aaesz; +aaeta; +aaetb; +aaetc; +aaetd; +aaete; +aaetf; +aaetg; +aaeth; +aaeti; +aaetj; +aaetk; +aaetl; +aaetm; +aaetn; +aaeto; +aaetp; +aaetq; +aaetr; +aaets; +aaett; +aaetu; +aaetv; +aaetw; +aaetx; +aaety; +aaetz; +aaeua; +aaeub; +aaeuc; +aaeud; +aaeue; +aaeuf; +aaeug; +aaeuh; +aaeui; +aaeuj; +aaeuk; +aaeul; +aaeum; +aaeun; +aaeuo; +aaeup; +aaeuq; +aaeur; +aaeus; +aaeut; +aaeuu; +aaeuv; +aaeuw; +aaeux; +aaeuy; +aaeuz; +aaeva; +aaevb; +aaevc; +aaevd; +aaeve; +aaevf; +aaevg; +aaevh; +aaevi; +aaevj; +aaevk; +aaevl; +aaevm; +aaevn; +aaevo; +aaevp; +aaevq; +aaevr; +aaevs; +aaevt; +aaevu; +aaevv; +aaevw; +aaevx; +aaevy; +aaevz; +aaewa; +aaewb; +aaewc; +aaewd; +aaewe; +aaewf; +aaewg; +aaewh; +aaewi; +aaewj; +aaewk; +aaewl; +aaewm; +aaewn; +aaewo; +aaewp; +aaewq; +aaewr; +aaews; +aaewt; +aaewu; +aaewv; +aaeww; +aaewx; +aaewy; +aaewz; +aaexa; +aaexb; +aaexc; +aaexd; +aaexe; +aaexf; +aaexg; +aaexh; +aaexi; +aaexj; +aaexk; +aaexl; +aaexm; +aaexn; +aaexo; +aaexp; +aaexq; +aaexr; +aaexs; +aaext; +aaexu; +aaexv; +aaexw; +aaexx; +aaexy; +aaexz; +aaeya; +aaeyb; +aaeyc; +aaeyd; +aaeye; +aaeyf; +aaeyg; +aaeyh; +aaeyi; +aaeyj; +aaeyk; +aaeyl; +aaeym; +aaeyn; +aaeyo; +aaeyp; +aaeyq; +aaeyr; +aaeys; +aaeyt; +aaeyu; +aaeyv; +aaeyw; +aaeyx; +aaeyy; +aaeyz; +aaeza; +aaezb; +aaezc; +aaezd; +aaeze; +aaezf; +aaezg; +aaezh; +aaezi; +aaezj; +aaezk; +aaezl; +aaezm; +aaezn; +aaezo; +aaezp; +aaezq; +aaezr; +aaezs; +aaezt; +aaezu; +aaezv; +aaezw; +aaezx; +aaezy; +aaezz; +aafaa; +aafab; +aafac; +aafad; +aafae; +aafaf; +aafag; +aafah; +aafai; +aafaj; +aafak; +aafal; +aafam; +aafan; +aafao; +aafap; +aafaq; +aafar; +aafas; +aafat; +aafau; +aafav; +aafaw; +aafax; +aafay; +aafaz; +aafba; +aafbb; +aafbc; +aafbd; +aafbe; +aafbf; +aafbg; +aafbh; +aafbi; +aafbj; +aafbk; +aafbl; +aafbm; +aafbn; +aafbo; +aafbp; +aafbq; +aafbr; +aafbs; +aafbt; +aafbu; +aafbv; +aafbw; +aafbx; +aafby; +aafbz; +aafca; +aafcb; +aafcc; +aafcd; +aafce; +aafcf; +aafcg; +aafch; +aafci; +aafcj; +aafck; +aafcl; +aafcm; +aafcn; +aafco; +aafcp; +aafcq; +aafcr; +aafcs; +aafct; +aafcu; +aafcv; +aafcw; +aafcx; +aafcy; +aafcz; +aafda; +aafdb; +aafdc; +aafdd; +aafde; +aafdf; +aafdg; +aafdh; +aafdi; +aafdj; +aafdk; +aafdl; +aafdm; +aafdn; +aafdo; +aafdp; +aafdq; +aafdr; +aafds; +aafdt; +aafdu; +aafdv; +aafdw; +aafdx; +aafdy; +aafdz; +aafea; +aafeb; +aafec; +aafed; +aafee; +aafef; +aafeg; +aafeh; +aafei; +aafej; +aafek; +aafel; +aafem; +aafen; +aafeo; +aafep; +aafeq; +aafer; +aafes; +aafet; +aafeu; +aafev; +aafew; +aafex; +aafey; +aafez; +aaffa; +aaffb; +aaffc; +aaffd; +aaffe; +aafff; +aaffg; +aaffh; +aaffi; +aaffj; +aaffk; +aaffl; +aaffm; +aaffn; +aaffo; +aaffp; +aaffq; +aaffr; +aaffs; +aafft; +aaffu; +aaffv; +aaffw; +aaffx; +aaffy; +aaffz; +aafga; +aafgb; +aafgc; +aafgd; +aafge; +aafgf; +aafgg; +aafgh; +aafgi; +aafgj; +aafgk; +aafgl; +aafgm; +aafgn; +aafgo; +aafgp; +aafgq; +aafgr; +aafgs; +aafgt; +aafgu; +aafgv; +aafgw; +aafgx; +aafgy; +aafgz; +aafha; +aafhb; +aafhc; +aafhd; +aafhe; +aafhf; +aafhg; +aafhh; +aafhi; +aafhj; +aafhk; +aafhl; +aafhm; +aafhn; +aafho; +aafhp; +aafhq; +aafhr; +aafhs; +aafht; +aafhu; +aafhv; +aafhw; +aafhx; +aafhy; +aafhz; +aafia; +aafib; +aafic; +aafid; +aafie; +aafif; +aafig; +aafih; +aafii; +aafij; +aafik; +aafil; +aafim; +aafin; +aafio; +aafip; +aafiq; +aafir; +aafis; +aafit; +aafiu; +aafiv; +aafiw; +aafix; +aafiy; +aafiz; +aafja; +aafjb; +aafjc; +aafjd; +aafje; +aafjf; +aafjg; +aafjh; +aafji; +aafjj; +aafjk; +aafjl; +aafjm; +aafjn; +aafjo; +aafjp; +aafjq; +aafjr; +aafjs; +aafjt; +aafju; +aafjv; +aafjw; +aafjx; +aafjy; +aafjz; +aafka; +aafkb; +aafkc; +aafkd; +aafke; +aafkf; +aafkg; +aafkh; +aafki; +aafkj; +aafkk; +aafkl; +aafkm; +aafkn; +aafko; +aafkp; +aafkq; +aafkr; +aafks; +aafkt; +aafku; +aafkv; +aafkw; +aafkx; +aafky; +aafkz; +aafla; +aaflb; +aaflc; +aafld; +aafle; +aaflf; +aaflg; +aaflh; +aafli; +aaflj; +aaflk; +aafll; +aaflm; +aafln; +aaflo; +aaflp; +aaflq; +aaflr; +aafls; +aaflt; +aaflu; +aaflv; +aaflw; +aaflx; +aafly; +aaflz; +aafma; +aafmb; +aafmc; +aafmd; +aafme; +aafmf; +aafmg; +aafmh; +aafmi; +aafmj; +aafmk; +aafml; +aafmm; +aafmn; +aafmo; +aafmp; +aafmq; +aafmr; +aafms; +aafmt; +aafmu; +aafmv; +aafmw; +aafmx; +aafmy; +aafmz; +aafna; +aafnb; +aafnc; +aafnd; +aafne; +aafnf; +aafng; +aafnh; +aafni; +aafnj; +aafnk; +aafnl; +aafnm; +aafnn; +aafno; +aafnp; +aafnq; +aafnr; +aafns; +aafnt; +aafnu; +aafnv; +aafnw; +aafnx; +aafny; +aafnz; +aafoa; +aafob; +aafoc; +aafod; +aafoe; +aafof; +aafog; +aafoh; +aafoi; +aafoj; +aafok; +aafol; +aafom; +aafon; +aafoo; +aafop; +aafoq; +aafor; +aafos; +aafot; +aafou; +aafov; +aafow; +aafox; +aafoy; +aafoz; +aafpa; +aafpb; +aafpc; +aafpd; +aafpe; +aafpf; +aafpg; +aafph; +aafpi; +aafpj; +aafpk; +aafpl; +aafpm; +aafpn; +aafpo; +aafpp; +aafpq; +aafpr; +aafps; +aafpt; +aafpu; +aafpv; +aafpw; +aafpx; +aafpy; +aafpz; +aafqa; +aafqb; +aafqc; +aafqd; +aafqe; +aafqf; +aafqg; +aafqh; +aafqi; +aafqj; +aafqk; +aafql; +aafqm; +aafqn; +aafqo; +aafqp; +aafqq; +aafqr; +aafqs; +aafqt; +aafqu; +aafqv; +aafqw; +aafqx; +aafqy; +aafqz; +aafra; +aafrb; +aafrc; +aafrd; +aafre; +aafrf; +aafrg; +aafrh; +aafri; +aafrj; +aafrk; +aafrl; +aafrm; +aafrn; +aafro; +aafrp; +aafrq; +aafrr; +aafrs; +aafrt; +aafru; +aafrv; +aafrw; +aafrx; +aafry; +aafrz; +aafsa; +aafsb; +aafsc; +aafsd; +aafse; +aafsf; +aafsg; +aafsh; +aafsi; +aafsj; +aafsk; +aafsl; +aafsm; +aafsn; +aafso; +aafsp; +aafsq; +aafsr; +aafss; +aafst; +aafsu; +aafsv; +aafsw; +aafsx; +aafsy; +aafsz; +aafta; +aaftb; +aaftc; +aaftd; +aafte; +aaftf; +aaftg; +aafth; +aafti; +aaftj; +aaftk; +aaftl; +aaftm; +aaftn; +aafto; +aaftp; +aaftq; +aaftr; +aafts; +aaftt; +aaftu; +aaftv; +aaftw; +aaftx; +aafty; +aaftz; +aafua; +aafub; +aafuc; +aafud; +aafue; +aafuf; +aafug; +aafuh; +aafui; +aafuj; +aafuk; +aaful; +aafum; +aafun; +aafuo; +aafup; +aafuq; +aafur; +aafus; +aafut; +aafuu; +aafuv; +aafuw; +aafux; +aafuy; +aafuz; +aafva; +aafvb; +aafvc; +aafvd; +aafve; +aafvf; +aafvg; +aafvh; +aafvi; +aafvj; +aafvk; +aafvl; +aafvm; +aafvn; +aafvo; +aafvp; +aafvq; +aafvr; +aafvs; +aafvt; +aafvu; +aafvv; +aafvw; +aafvx; +aafvy; +aafvz; +aafwa; +aafwb; +aafwc; +aafwd; +aafwe; +aafwf; +aafwg; +aafwh; +aafwi; +aafwj; +aafwk; +aafwl; +aafwm; +aafwn; +aafwo; +aafwp; +aafwq; +aafwr; +aafws; +aafwt; +aafwu; +aafwv; +aafww; +aafwx; +aafwy; +aafwz; +aafxa; +aafxb; +aafxc; +aafxd; +aafxe; +aafxf; +aafxg; +aafxh; +aafxi; +aafxj; +aafxk; +aafxl; +aafxm; +aafxn; +aafxo; +aafxp; +aafxq; +aafxr; +aafxs; +aafxt; +aafxu; +aafxv; +aafxw; +aafxx; +aafxy; +aafxz; +aafya; +aafyb; +aafyc; +aafyd; +aafye; +aafyf; +aafyg; +aafyh; +aafyi; +aafyj; +aafyk; +aafyl; +aafym; +aafyn; +aafyo; +aafyp; +aafyq; +aafyr; +aafys; +aafyt; +aafyu; +aafyv; +aafyw; +aafyx; +aafyy; +aafyz; +aafza; +aafzb; +aafzc; +aafzd; +aafze; +aafzf; +aafzg; +aafzh; +aafzi; +aafzj; +aafzk; +aafzl; +aafzm; +aafzn; +aafzo; +aafzp; +aafzq; +aafzr; +aafzs; +aafzt; +aafzu; +aafzv; +aafzw; +aafzx; +aafzy; +aafzz; +aagaa; +aagab; +aagac; +aagad; +aagae; +aagaf; +aagag; +aagah; +aagai; +aagaj; +aagak; +aagal; +aagam; +aagan; +aagao; +aagap; +aagaq; +aagar; +aagas; +aagat; +aagau; +aagav; +aagaw; +aagax; +aagay; +aagaz; +aagba; +aagbb; +aagbc; +aagbd; +aagbe; +aagbf; +aagbg; +aagbh; +aagbi; +aagbj; +aagbk; +aagbl; +aagbm; +aagbn; +aagbo; +aagbp; +aagbq; +aagbr; +aagbs; +aagbt; +aagbu; +aagbv; +aagbw; +aagbx; +aagby; +aagbz; +aagca; +aagcb; +aagcc; +aagcd; +aagce; +aagcf; +aagcg; +aagch; +aagci; +aagcj; +aagck; +aagcl; +aagcm; +aagcn; +aagco; +aagcp; +aagcq; +aagcr; +aagcs; +aagct; +aagcu; +aagcv; +aagcw; +aagcx; +aagcy; +aagcz; +aagda; +aagdb; +aagdc; +aagdd; +aagde; +aagdf; +aagdg; +aagdh; +aagdi; +aagdj; +aagdk; +aagdl; +aagdm; +aagdn; +aagdo; +aagdp; +aagdq; +aagdr; +aagds; +aagdt; +aagdu; +aagdv; +aagdw; +aagdx; +aagdy; +aagdz; +aagea; +aageb; +aagec; +aaged; +aagee; +aagef; +aageg; +aageh; +aagei; +aagej; +aagek; +aagel; +aagem; +aagen; +aageo; +aagep; +aageq; +aager; +aages; +aaget; +aageu; +aagev; +aagew; +aagex; +aagey; +aagez; +aagfa; +aagfb; +aagfc; +aagfd; +aagfe; +aagff; +aagfg; +aagfh; +aagfi; +aagfj; +aagfk; +aagfl; +aagfm; +aagfn; +aagfo; +aagfp; +aagfq; +aagfr; +aagfs; +aagft; +aagfu; +aagfv; +aagfw; +aagfx; +aagfy; +aagfz; +aagga; +aaggb; +aaggc; +aaggd; +aagge; +aaggf; +aaggg; +aaggh; +aaggi; +aaggj; +aaggk; +aaggl; +aaggm; +aaggn; +aaggo; +aaggp; +aaggq; +aaggr; +aaggs; +aaggt; +aaggu; +aaggv; +aaggw; +aaggx; +aaggy; +aaggz; +aagha; +aaghb; +aaghc; +aaghd; +aaghe; +aaghf; +aaghg; +aaghh; +aaghi; +aaghj; +aaghk; +aaghl; +aaghm; +aaghn; +aagho; +aaghp; +aaghq; +aaghr; +aaghs; +aaght; +aaghu; +aaghv; +aaghw; +aaghx; +aaghy; +aaghz; +aagia; +aagib; +aagic; +aagid; +aagie; +aagif; +aagig; +aagih; +aagii; +aagij; +aagik; +aagil; +aagim; +aagin; +aagio; +aagip; +aagiq; +aagir; +aagis; +aagit; +aagiu; +aagiv; +aagiw; +aagix; +aagiy; +aagiz; +aagja; +aagjb; +aagjc; +aagjd; +aagje; +aagjf; +aagjg; +aagjh; +aagji; +aagjj; +aagjk; +aagjl; +aagjm; +aagjn; +aagjo; +aagjp; +aagjq; +aagjr; +aagjs; +aagjt; +aagju; +aagjv; +aagjw; +aagjx; +aagjy; +aagjz; +aagka; +aagkb; +aagkc; +aagkd; +aagke; +aagkf; +aagkg; +aagkh; +aagki; +aagkj; +aagkk; +aagkl; +aagkm; +aagkn; +aagko; +aagkp; +aagkq; +aagkr; +aagks; +aagkt; +aagku; +aagkv; +aagkw; +aagkx; +aagky; +aagkz; +aagla; +aaglb; +aaglc; +aagld; +aagle; +aaglf; +aaglg; +aaglh; +aagli; +aaglj; +aaglk; +aagll; +aaglm; +aagln; +aaglo; +aaglp; +aaglq; +aaglr; +aagls; +aaglt; +aaglu; +aaglv; +aaglw; +aaglx; +aagly; +aaglz; +aagma; +aagmb; +aagmc; +aagmd; +aagme; +aagmf; +aagmg; +aagmh; +aagmi; +aagmj; +aagmk; +aagml; +aagmm; +aagmn; +aagmo; +aagmp; +aagmq; +aagmr; +aagms; +aagmt; +aagmu; +aagmv; +aagmw; +aagmx; +aagmy; +aagmz; +aagna; +aagnb; +aagnc; +aagnd; +aagne; +aagnf; +aagng; +aagnh; +aagni; +aagnj; +aagnk; +aagnl; +aagnm; +aagnn; +aagno; +aagnp; +aagnq; +aagnr; +aagns; +aagnt; +aagnu; +aagnv; +aagnw; +aagnx; +aagny; +aagnz; +aagoa; +aagob; +aagoc; +aagod; +aagoe; +aagof; +aagog; +aagoh; +aagoi; +aagoj; +aagok; +aagol; +aagom; +aagon; +aagoo; +aagop; +aagoq; +aagor; +aagos; +aagot; +aagou; +aagov; +aagow; +aagox; +aagoy; +aagoz; +aagpa; +aagpb; +aagpc; +aagpd; +aagpe; +aagpf; +aagpg; +aagph; +aagpi; +aagpj; +aagpk; +aagpl; +aagpm; +aagpn; +aagpo; +aagpp; +aagpq; +aagpr; +aagps; +aagpt; +aagpu; +aagpv; +aagpw; +aagpx; +aagpy; +aagpz; +aagqa; +aagqb; +aagqc; +aagqd; +aagqe; +aagqf; +aagqg; +aagqh; +aagqi; +aagqj; +aagqk; +aagql; +aagqm; +aagqn; +aagqo; +aagqp; +aagqq; +aagqr; +aagqs; +aagqt; +aagqu; +aagqv; +aagqw; +aagqx; +aagqy; +aagqz; +aagra; +aagrb; +aagrc; +aagrd; +aagre; +aagrf; +aagrg; +aagrh; +aagri; +aagrj; +aagrk; +aagrl; +aagrm; +aagrn; +aagro; +aagrp; +aagrq; +aagrr; +aagrs; +aagrt; +aagru; +aagrv; +aagrw; +aagrx; +aagry; +aagrz; +aagsa; +aagsb; +aagsc; +aagsd; +aagse; +aagsf; +aagsg; +aagsh; +aagsi; +aagsj; +aagsk; +aagsl; +aagsm; +aagsn; +aagso; +aagsp; +aagsq; +aagsr; +aagss; +aagst; +aagsu; +aagsv; +aagsw; +aagsx; +aagsy; +aagsz; +aagta; +aagtb; +aagtc; +aagtd; +aagte; +aagtf; +aagtg; +aagth; +aagti; +aagtj; +aagtk; +aagtl; +aagtm; +aagtn; +aagto; +aagtp; +aagtq; +aagtr; +aagts; +aagtt; +aagtu; +aagtv; +aagtw; +aagtx; +aagty; +aagtz; +aagua; +aagub; +aaguc; +aagud; +aague; +aaguf; +aagug; +aaguh; +aagui; +aaguj; +aaguk; +aagul; +aagum; +aagun; +aaguo; +aagup; +aaguq; +aagur; +aagus; +aagut; +aaguu; +aaguv; +aaguw; +aagux; +aaguy; +aaguz; +aagva; +aagvb; +aagvc; +aagvd; +aagve; +aagvf; +aagvg; +aagvh; +aagvi; +aagvj; +aagvk; +aagvl; +aagvm; +aagvn; +aagvo; +aagvp; +aagvq; +aagvr; +aagvs; +aagvt; +aagvu; +aagvv; +aagvw; +aagvx; +aagvy; +aagvz; +aagwa; +aagwb; +aagwc; +aagwd; +aagwe; +aagwf; +aagwg; +aagwh; +aagwi; +aagwj; +aagwk; +aagwl; +aagwm; +aagwn; +aagwo; +aagwp; +aagwq; +aagwr; +aagws; +aagwt; +aagwu; +aagwv; +aagww; +aagwx; +aagwy; +aagwz; +aagxa; +aagxb; +aagxc; +aagxd; +aagxe; +aagxf; +aagxg; +aagxh; +aagxi; +aagxj; +aagxk; +aagxl; +aagxm; +aagxn; +aagxo; +aagxp; +aagxq; +aagxr; +aagxs; +aagxt; +aagxu; +aagxv; +aagxw; +aagxx; +aagxy; +aagxz; +aagya; +aagyb; +aagyc; +aagyd; +aagye; +aagyf; +aagyg; +aagyh; +aagyi; +aagyj; +aagyk; +aagyl; +aagym; +aagyn; +aagyo; +aagyp; +aagyq; +aagyr; +aagys; +aagyt; +aagyu; +aagyv; +aagyw; +aagyx; +aagyy; +aagyz; +aagza; +aagzb; +aagzc; +aagzd; +aagze; +aagzf; +aagzg; +aagzh; +aagzi; +aagzj; +aagzk; +aagzl; +aagzm; +aagzn; +aagzo; +aagzp; +aagzq; +aagzr; +aagzs; +aagzt; +aagzu; +aagzv; +aagzw; +aagzx; +aagzy; +aagzz; +aahaa; +aahab; +aahac; +aahad; +aahae; +aahaf; +aahag; +aahah; +aahai; +aahaj; +aahak; +aahal; +aaham; +aahan; +aahao; +aahap; +aahaq; +aahar; +aahas; +aahat; +aahau; +aahav; +aahaw; +aahax; +aahay; +aahaz; +aahba; +aahbb; +aahbc; +aahbd; +aahbe; +aahbf; +aahbg; +aahbh; +aahbi; +aahbj; +aahbk; +aahbl; +aahbm; +aahbn; +aahbo; +aahbp; +aahbq; +aahbr; +aahbs; +aahbt; +aahbu; +aahbv; +aahbw; +aahbx; +aahby; +aahbz; +aahca; +aahcb; +aahcc; +aahcd; +aahce; +aahcf; +aahcg; +aahch; +aahci; +aahcj; +aahck; +aahcl; +aahcm; +aahcn; +aahco; +aahcp; +aahcq; +aahcr; +aahcs; +aahct; +aahcu; +aahcv; +aahcw; +aahcx; +aahcy; +aahcz; +aahda; +aahdb; +aahdc; +aahdd; +aahde; +aahdf; +aahdg; +aahdh; +aahdi; +aahdj; +aahdk; +aahdl; +aahdm; +aahdn; +aahdo; +aahdp; +aahdq; +aahdr; +aahds; +aahdt; +aahdu; +aahdv; +aahdw; +aahdx; +aahdy; +aahdz; +aahea; +aaheb; +aahec; +aahed; +aahee; +aahef; +aaheg; +aaheh; +aahei; +aahej; +aahek; +aahel; +aahem; +aahen; +aaheo; +aahep; +aaheq; +aaher; +aahes; +aahet; +aaheu; +aahev; +aahew; +aahex; +aahey; +aahez; +aahfa; +aahfb; +aahfc; +aahfd; +aahfe; +aahff; +aahfg; +aahfh; +aahfi; +aahfj; +aahfk; +aahfl; +aahfm; +aahfn; +aahfo; +aahfp; +aahfq; +aahfr; +aahfs; +aahft; +aahfu; +aahfv; +aahfw; +aahfx; +aahfy; +aahfz; +aahga; +aahgb; +aahgc; +aahgd; +aahge; +aahgf; +aahgg; +aahgh; +aahgi; +aahgj; +aahgk; +aahgl; +aahgm; +aahgn; +aahgo; +aahgp; +aahgq; +aahgr; +aahgs; +aahgt; +aahgu; +aahgv; +aahgw; +aahgx; +aahgy; +aahgz; +aahha; +aahhb; +aahhc; +aahhd; +aahhe; +aahhf; +aahhg; +aahhh; +aahhi; +aahhj; +aahhk; +aahhl; +aahhm; +aahhn; +aahho; +aahhp; +aahhq; +aahhr; +aahhs; +aahht; +aahhu; +aahhv; +aahhw; +aahhx; +aahhy; +aahhz; +aahia; +aahib; +aahic; +aahid; +aahie; +aahif; +aahig; +aahih; +aahii; +aahij; +aahik; +aahil; +aahim; +aahin; +aahio; +aahip; +aahiq; +aahir; +aahis; +aahit; +aahiu; +aahiv; +aahiw; +aahix; +aahiy; +aahiz; +aahja; +aahjb; +aahjc; +aahjd; +aahje; +aahjf; +aahjg; +aahjh; +aahji; +aahjj; +aahjk; +aahjl; +aahjm; +aahjn; +aahjo; +aahjp; +aahjq; +aahjr; +aahjs; +aahjt; +aahju; +aahjv; +aahjw; +aahjx; +aahjy; +aahjz; +aahka; +aahkb; +aahkc; +aahkd; +aahke; +aahkf; +aahkg; +aahkh; +aahki; +aahkj; +aahkk; +aahkl; +aahkm; +aahkn; +aahko; +aahkp; +aahkq; +aahkr; +aahks; +aahkt; +aahku; +aahkv; +aahkw; +aahkx; +aahky; +aahkz; +aahla; +aahlb; +aahlc; +aahld; +aahle; +aahlf; +aahlg; +aahlh; +aahli; +aahlj; +aahlk; +aahll; +aahlm; +aahln; +aahlo; +aahlp; +aahlq; +aahlr; +aahls; +aahlt; +aahlu; +aahlv; +aahlw; +aahlx; +aahly; +aahlz; +aahma; +aahmb; +aahmc; +aahmd; +aahme; +aahmf; +aahmg; +aahmh; +aahmi; +aahmj; +aahmk; +aahml; +aahmm; +aahmn; +aahmo; +aahmp; +aahmq; +aahmr; +aahms; +aahmt; +aahmu; +aahmv; +aahmw; +aahmx; +aahmy; +aahmz; +aahna; +aahnb; +aahnc; +aahnd; +aahne; +aahnf; +aahng; +aahnh; +aahni; +aahnj; +aahnk; +aahnl; +aahnm; +aahnn; +aahno; +aahnp; +aahnq; +aahnr; +aahns; +aahnt; +aahnu; +aahnv; +aahnw; +aahnx; +aahny; +aahnz; +aahoa; +aahob; +aahoc; +aahod; +aahoe; +aahof; +aahog; +aahoh; +aahoi; +aahoj; +aahok; +aahol; +aahom; +aahon; +aahoo; +aahop; +aahoq; +aahor; +aahos; +aahot; +aahou; +aahov; +aahow; +aahox; +aahoy; +aahoz; +aahpa; +aahpb; +aahpc; +aahpd; +aahpe; +aahpf; +aahpg; +aahph; +aahpi; +aahpj; +aahpk; +aahpl; +aahpm; +aahpn; +aahpo; +aahpp; +aahpq; +aahpr; +aahps; +aahpt; +aahpu; +aahpv; +aahpw; +aahpx; +aahpy; +aahpz; +aahqa; +aahqb; +aahqc; +aahqd; +aahqe; +aahqf; +aahqg; +aahqh; +aahqi; +aahqj; +aahqk; +aahql; +aahqm; +aahqn; +aahqo; +aahqp; +aahqq; +aahqr; +aahqs; +aahqt; +aahqu; +aahqv; +aahqw; +aahqx; +aahqy; +aahqz; +aahra; +aahrb; +aahrc; +aahrd; +aahre; +aahrf; +aahrg; +aahrh; +aahri; +aahrj; +aahrk; +aahrl; +aahrm; +aahrn; +aahro; +aahrp; +aahrq; +aahrr; +aahrs; +aahrt; +aahru; +aahrv; +aahrw; +aahrx; +aahry; +aahrz; +aahsa; +aahsb; +aahsc; +aahsd; +aahse; +aahsf; +aahsg; +aahsh; +aahsi; +aahsj; +aahsk; +aahsl; +aahsm; +aahsn; +aahso; +aahsp; +aahsq; +aahsr; +aahss; +aahst; +aahsu; +aahsv; +aahsw; +aahsx; +aahsy; +aahsz; +aahta; +aahtb; +aahtc; +aahtd; +aahte; +aahtf; +aahtg; +aahth; +aahti; +aahtj; +aahtk; +aahtl; +aahtm; +aahtn; +aahto; +aahtp; +aahtq; +aahtr; +aahts; +aahtt; +aahtu; +aahtv; +aahtw; +aahtx; +aahty; +aahtz; +aahua; +aahub; +aahuc; +aahud; +aahue; +aahuf; +aahug; +aahuh; +aahui; +aahuj; +aahuk; +aahul; +aahum; +aahun; +aahuo; +aahup; +aahuq; +aahur; +aahus; +aahut; +aahuu; +aahuv; +aahuw; +aahux; +aahuy; +aahuz; +aahva; +aahvb; +aahvc; +aahvd; +aahve; +aahvf; +aahvg; +aahvh; +aahvi; +aahvj; +aahvk; +aahvl; +aahvm; +aahvn; +aahvo; +aahvp; +aahvq; +aahvr; +aahvs; +aahvt; +aahvu; +aahvv; +aahvw; +aahvx; +aahvy; +aahvz; +aahwa; +aahwb; +aahwc; +aahwd; +aahwe; +aahwf; +aahwg; +aahwh; +aahwi; +aahwj; +aahwk; +aahwl; +aahwm; +aahwn; +aahwo; +aahwp; +aahwq; +aahwr; +aahws; +aahwt; +aahwu; +aahwv; +aahww; +aahwx; +aahwy; +aahwz; +aahxa; +aahxb; +aahxc; +aahxd; +aahxe; +aahxf; +aahxg; +aahxh; +aahxi; +aahxj; +aahxk; +aahxl; +aahxm; +aahxn; +aahxo; +aahxp; +aahxq; +aahxr; +aahxs; +aahxt; +aahxu; +aahxv; +aahxw; +aahxx; +aahxy; +aahxz; +aahya; +aahyb; +aahyc; +aahyd; +aahye; +aahyf; +aahyg; +aahyh; +aahyi; +aahyj; +aahyk; +aahyl; +aahym; +aahyn; +aahyo; +aahyp; +aahyq; +aahyr; +aahys; +aahyt; +aahyu; +aahyv; +aahyw; +aahyx; +aahyy; +aahyz; +aahza; +aahzb; +aahzc; +aahzd; +aahze; +aahzf; +aahzg; +aahzh; +aahzi; +aahzj; +aahzk; +aahzl; +aahzm; +aahzn; +aahzo; +aahzp; +aahzq; +aahzr; +aahzs; +aahzt; +aahzu; +aahzv; +aahzw; +aahzx; +aahzy; +aahzz; +aaiaa; +aaiab; +aaiac; +aaiad; +aaiae; +aaiaf; +aaiag; +aaiah; +aaiai; +aaiaj; +aaiak; +aaial; +aaiam; +aaian; +aaiao; +aaiap; +aaiaq; +aaiar; +aaias; +aaiat; +aaiau; +aaiav; +aaiaw; +aaiax; +aaiay; +aaiaz; +aaiba; +aaibb; +aaibc; +aaibd; +aaibe; +aaibf; +aaibg; +aaibh; +aaibi; +aaibj; +aaibk; +aaibl; +aaibm; +aaibn; +aaibo; +aaibp; +aaibq; +aaibr; +aaibs; +aaibt; +aaibu; +aaibv; +aaibw; +aaibx; +aaiby; +aaibz; +aaica; +aaicb; +aaicc; +aaicd; +aaice; +aaicf; +aaicg; +aaich; +aaici; +aaicj; +aaick; +aaicl; +aaicm; +aaicn; +aaico; +aaicp; +aaicq; +aaicr; +aaics; +aaict; +aaicu; +aaicv; +aaicw; +aaicx; +aaicy; +aaicz; +aaida; +aaidb; +aaidc; +aaidd; +aaide; +aaidf; +aaidg; +aaidh; +aaidi; +aaidj; +aaidk; +aaidl; +aaidm; +aaidn; +aaido; +aaidp; +aaidq; +aaidr; +aaids; +aaidt; +aaidu; +aaidv; +aaidw; +aaidx; +aaidy; +aaidz; +aaiea; +aaieb; +aaiec; +aaied; +aaiee; +aaief; +aaieg; +aaieh; +aaiei; +aaiej; +aaiek; +aaiel; +aaiem; +aaien; +aaieo; +aaiep; +aaieq; +aaier; +aaies; +aaiet; +aaieu; +aaiev; +aaiew; +aaiex; +aaiey; +aaiez; +aaifa; +aaifb; +aaifc; +aaifd; +aaife; +aaiff; +aaifg; +aaifh; +aaifi; +aaifj; +aaifk; +aaifl; +aaifm; +aaifn; +aaifo; +aaifp; +aaifq; +aaifr; +aaifs; +aaift; +aaifu; +aaifv; +aaifw; +aaifx; +aaify; +aaifz; +aaiga; +aaigb; +aaigc; +aaigd; +aaige; +aaigf; +aaigg; +aaigh; +aaigi; +aaigj; +aaigk; +aaigl; +aaigm; +aaign; +aaigo; +aaigp; +aaigq; +aaigr; +aaigs; +aaigt; +aaigu; +aaigv; +aaigw; +aaigx; +aaigy; +aaigz; +aaiha; +aaihb; +aaihc; +aaihd; +aaihe; +aaihf; +aaihg; +aaihh; +aaihi; +aaihj; +aaihk; +aaihl; +aaihm; +aaihn; +aaiho; +aaihp; +aaihq; +aaihr; +aaihs; +aaiht; +aaihu; +aaihv; +aaihw; +aaihx; +aaihy; +aaihz; +aaiia; +aaiib; +aaiic; +aaiid; +aaiie; +aaiif; +aaiig; +aaiih; +aaiii; +aaiij; +aaiik; +aaiil; +aaiim; +aaiin; +aaiio; +aaiip; +aaiiq; +aaiir; +aaiis; +aaiit; +aaiiu; +aaiiv; +aaiiw; +aaiix; +aaiiy; +aaiiz; +aaija; +aaijb; +aaijc; +aaijd; +aaije; +aaijf; +aaijg; +aaijh; +aaiji; +aaijj; +aaijk; +aaijl; +aaijm; +aaijn; +aaijo; +aaijp; +aaijq; +aaijr; +aaijs; +aaijt; +aaiju; +aaijv; +aaijw; +aaijx; +aaijy; +aaijz; +aaika; +aaikb; +aaikc; +aaikd; +aaike; +aaikf; +aaikg; +aaikh; +aaiki; +aaikj; +aaikk; +aaikl; +aaikm; +aaikn; +aaiko; +aaikp; +aaikq; +aaikr; +aaiks; +aaikt; +aaiku; +aaikv; +aaikw; +aaikx; +aaiky; +aaikz; +aaila; +aailb; +aailc; +aaild; +aaile; +aailf; +aailg; +aailh; +aaili; +aailj; +aailk; +aaill; +aailm; +aailn; +aailo; +aailp; +aailq; +aailr; +aails; +aailt; +aailu; +aailv; +aailw; +aailx; +aaily; +aailz; +aaima; +aaimb; +aaimc; +aaimd; +aaime; +aaimf; +aaimg; +aaimh; +aaimi; +aaimj; +aaimk; +aaiml; +aaimm; +aaimn; +aaimo; +aaimp; +aaimq; +aaimr; +aaims; +aaimt; +aaimu; +aaimv; +aaimw; +aaimx; +aaimy; +aaimz; +aaina; +aainb; +aainc; +aaind; +aaine; +aainf; +aaing; +aainh; +aaini; +aainj; +aaink; +aainl; +aainm; +aainn; +aaino; +aainp; +aainq; +aainr; +aains; +aaint; +aainu; +aainv; +aainw; +aainx; +aainy; +aainz; +aaioa; +aaiob; +aaioc; +aaiod; +aaioe; +aaiof; +aaiog; +aaioh; +aaioi; +aaioj; +aaiok; +aaiol; +aaiom; +aaion; +aaioo; +aaiop; +aaioq; +aaior; +aaios; +aaiot; +aaiou; +aaiov; +aaiow; +aaiox; +aaioy; +aaioz; +aaipa; +aaipb; +aaipc; +aaipd; +aaipe; +aaipf; +aaipg; +aaiph; +aaipi; +aaipj; +aaipk; +aaipl; +aaipm; +aaipn; +aaipo; +aaipp; +aaipq; +aaipr; +aaips; +aaipt; +aaipu; +aaipv; +aaipw; +aaipx; +aaipy; +aaipz; +aaiqa; +aaiqb; +aaiqc; +aaiqd; +aaiqe; +aaiqf; +aaiqg; +aaiqh; +aaiqi; +aaiqj; +aaiqk; +aaiql; +aaiqm; +aaiqn; +aaiqo; +aaiqp; +aaiqq; +aaiqr; +aaiqs; +aaiqt; +aaiqu; +aaiqv; +aaiqw; +aaiqx; +aaiqy; +aaiqz; +aaira; +aairb; +aairc; +aaird; +aaire; +aairf; +aairg; +aairh; +aairi; +aairj; +aairk; +aairl; +aairm; +aairn; +aairo; +aairp; +aairq; +aairr; +aairs; +aairt; +aairu; +aairv; +aairw; +aairx; +aairy; +aairz; +aaisa; +aaisb; +aaisc; +aaisd; +aaise; +aaisf; +aaisg; +aaish; +aaisi; +aaisj; +aaisk; +aaisl; +aaism; +aaisn; +aaiso; +aaisp; +aaisq; +aaisr; +aaiss; +aaist; +aaisu; +aaisv; +aaisw; +aaisx; +aaisy; +aaisz; +aaita; +aaitb; +aaitc; +aaitd; +aaite; +aaitf; +aaitg; +aaith; +aaiti; +aaitj; +aaitk; +aaitl; +aaitm; +aaitn; +aaito; +aaitp; +aaitq; +aaitr; +aaits; +aaitt; +aaitu; +aaitv; +aaitw; +aaitx; +aaity; +aaitz; +aaiua; +aaiub; +aaiuc; +aaiud; +aaiue; +aaiuf; +aaiug; +aaiuh; +aaiui; +aaiuj; +aaiuk; +aaiul; +aaium; +aaiun; +aaiuo; +aaiup; +aaiuq; +aaiur; +aaius; +aaiut; +aaiuu; +aaiuv; +aaiuw; +aaiux; +aaiuy; +aaiuz; +aaiva; +aaivb; +aaivc; +aaivd; +aaive; +aaivf; +aaivg; +aaivh; +aaivi; +aaivj; +aaivk; +aaivl; +aaivm; +aaivn; +aaivo; +aaivp; +aaivq; +aaivr; +aaivs; +aaivt; +aaivu; +aaivv; +aaivw; +aaivx; +aaivy; +aaivz; +aaiwa; +aaiwb; +aaiwc; +aaiwd; +aaiwe; +aaiwf; +aaiwg; +aaiwh; +aaiwi; +aaiwj; +aaiwk; +aaiwl; +aaiwm; +aaiwn; +aaiwo; +aaiwp; +aaiwq; +aaiwr; +aaiws; +aaiwt; +aaiwu; +aaiwv; +aaiww; +aaiwx; +aaiwy; +aaiwz; +aaixa; +aaixb; +aaixc; +aaixd; +aaixe; +aaixf; +aaixg; +aaixh; +aaixi; +aaixj; +aaixk; +aaixl; +aaixm; +aaixn; +aaixo; +aaixp; +aaixq; +aaixr; +aaixs; +aaixt; +aaixu; +aaixv; +aaixw; +aaixx; +aaixy; +aaixz; +aaiya; +aaiyb; +aaiyc; +aaiyd; +aaiye; +aaiyf; +aaiyg; +aaiyh; +aaiyi; +aaiyj; +aaiyk; +aaiyl; +aaiym; +aaiyn; +aaiyo; +aaiyp; +aaiyq; +aaiyr; +aaiys; +aaiyt; +aaiyu; +aaiyv; +aaiyw; +aaiyx; +aaiyy; +aaiyz; +aaiza; +aaizb; +aaizc; +aaizd; +aaize; +aaizf; +aaizg; +aaizh; +aaizi; +aaizj; +aaizk; +aaizl; +aaizm; +aaizn; +aaizo; +aaizp; +aaizq; +aaizr; +aaizs; +aaizt; +aaizu; +aaizv; +aaizw; +aaizx; +aaizy; +aaizz; +aajaa; +aajab; +aajac; +aajad; +aajae; +aajaf; +aajag; +aajah; +aajai; +aajaj; +aajak; +aajal; +aajam; +aajan; +aajao; +aajap; +aajaq; +aajar; +aajas; +aajat; +aajau; +aajav; +aajaw; +aajax; +aajay; +aajaz; +aajba; +aajbb; +aajbc; +aajbd; +aajbe; +aajbf; +aajbg; +aajbh; +aajbi; +aajbj; +aajbk; +aajbl; +aajbm; +aajbn; +aajbo; +aajbp; +aajbq; +aajbr; +aajbs; +aajbt; +aajbu; +aajbv; +aajbw; +aajbx; +aajby; +aajbz; +aajca; +aajcb; +aajcc; +aajcd; +aajce; +aajcf; +aajcg; +aajch; +aajci; +aajcj; +aajck; +aajcl; +aajcm; +aajcn; +aajco; +aajcp; +aajcq; +aajcr; +aajcs; +aajct; +aajcu; +aajcv; +aajcw; +aajcx; +aajcy; +aajcz; +aajda; +aajdb; +aajdc; +aajdd; +aajde; +aajdf; +aajdg; +aajdh; +aajdi; +aajdj; +aajdk; +aajdl; +aajdm; +aajdn; +aajdo; +aajdp; +aajdq; +aajdr; +aajds; +aajdt; +aajdu; +aajdv; +aajdw; +aajdx; +aajdy; +aajdz; +aajea; +aajeb; +aajec; +aajed; +aajee; +aajef; +aajeg; +aajeh; +aajei; +aajej; +aajek; +aajel; +aajem; +aajen; +aajeo; +aajep; +aajeq; +aajer; +aajes; +aajet; +aajeu; +aajev; +aajew; +aajex; +aajey; +aajez; +aajfa; +aajfb; +aajfc; +aajfd; +aajfe; +aajff; +aajfg; +aajfh; +aajfi; +aajfj; +aajfk; +aajfl; +aajfm; +aajfn; +aajfo; +aajfp; +aajfq; +aajfr; +aajfs; +aajft; +aajfu; +aajfv; +aajfw; +aajfx; +aajfy; +aajfz; +aajga; +aajgb; +aajgc; +aajgd; +aajge; +aajgf; +aajgg; +aajgh; +aajgi; +aajgj; +aajgk; +aajgl; +aajgm; +aajgn; +aajgo; +aajgp; +aajgq; +aajgr; +aajgs; +aajgt; +aajgu; +aajgv; +aajgw; +aajgx; +aajgy; +aajgz; +aajha; +aajhb; +aajhc; +aajhd; +aajhe; +aajhf; +aajhg; +aajhh; +aajhi; +aajhj; +aajhk; +aajhl; +aajhm; +aajhn; +aajho; +aajhp; +aajhq; +aajhr; +aajhs; +aajht; +aajhu; +aajhv; +aajhw; +aajhx; +aajhy; +aajhz; +aajia; +aajib; +aajic; +aajid; +aajie; +aajif; +aajig; +aajih; +aajii; +aajij; +aajik; +aajil; +aajim; +aajin; +aajio; +aajip; +aajiq; +aajir; +aajis; +aajit; +aajiu; +aajiv; +aajiw; +aajix; +aajiy; +aajiz; +aajja; +aajjb; +aajjc; +aajjd; +aajje; +aajjf; +aajjg; +aajjh; +aajji; +aajjj; +aajjk; +aajjl; +aajjm; +aajjn; +aajjo; +aajjp; +aajjq; +aajjr; +aajjs; +aajjt; +aajju; +aajjv; +aajjw; +aajjx; +aajjy; +aajjz; +aajka; +aajkb; +aajkc; +aajkd; +aajke; +aajkf; +aajkg; +aajkh; +aajki; +aajkj; +aajkk; +aajkl; +aajkm; +aajkn; +aajko; +aajkp; +aajkq; +aajkr; +aajks; +aajkt; +aajku; +aajkv; +aajkw; +aajkx; +aajky; +aajkz; +aajla; +aajlb; +aajlc; +aajld; +aajle; +aajlf; +aajlg; +aajlh; +aajli; +aajlj; +aajlk; +aajll; +aajlm; +aajln; +aajlo; +aajlp; +aajlq; +aajlr; +aajls; +aajlt; +aajlu; +aajlv; +aajlw; +aajlx; +aajly; +aajlz; +aajma; +aajmb; +aajmc; +aajmd; +aajme; +aajmf; +aajmg; +aajmh; +aajmi; +aajmj; +aajmk; +aajml; +aajmm; +aajmn; +aajmo; +aajmp; +aajmq; +aajmr; +aajms; +aajmt; +aajmu; +aajmv; +aajmw; +aajmx; +aajmy; +aajmz; +aajna; +aajnb; +aajnc; +aajnd; +aajne; +aajnf; +aajng; +aajnh; +aajni; +aajnj; +aajnk; +aajnl; +aajnm; +aajnn; +aajno; +aajnp; +aajnq; +aajnr; +aajns; +aajnt; +aajnu; +aajnv; +aajnw; +aajnx; +aajny; +aajnz; +aajoa; +aajob; +aajoc; +aajod; +aajoe; +aajof; +aajog; +aajoh; +aajoi; +aajoj; +aajok; +aajol; +aajom; +aajon; +aajoo; +aajop; +aajoq; +aajor; +aajos; +aajot; +aajou; +aajov; +aajow; +aajox; +aajoy; +aajoz; +aajpa; +aajpb; +aajpc; +aajpd; +aajpe; +aajpf; +aajpg; +aajph; +aajpi; +aajpj; +aajpk; +aajpl; +aajpm; +aajpn; +aajpo; +aajpp; +aajpq; +aajpr; +aajps; +aajpt; +aajpu; +aajpv; +aajpw; +aajpx; +aajpy; +aajpz; +aajqa; +aajqb; +aajqc; +aajqd; +aajqe; +aajqf; +aajqg; +aajqh; +aajqi; +aajqj; +aajqk; +aajql; +aajqm; +aajqn; +aajqo; +aajqp; +aajqq; +aajqr; +aajqs; +aajqt; +aajqu; +aajqv; +aajqw; +aajqx; +aajqy; +aajqz; +aajra; +aajrb; +aajrc; +aajrd; +aajre; +aajrf; +aajrg; +aajrh; +aajri; +aajrj; +aajrk; +aajrl; +aajrm; +aajrn; +aajro; +aajrp; +aajrq; +aajrr; +aajrs; +aajrt; +aajru; +aajrv; +aajrw; +aajrx; +aajry; +aajrz; +aajsa; +aajsb; +aajsc; +aajsd; +aajse; +aajsf; +aajsg; +aajsh; +aajsi; +aajsj; +aajsk; +aajsl; +aajsm; +aajsn; +aajso; +aajsp; +aajsq; +aajsr; +aajss; +aajst; +aajsu; +aajsv; +aajsw; +aajsx; +aajsy; +aajsz; +aajta; +aajtb; +aajtc; +aajtd; +aajte; +aajtf; +aajtg; +aajth; +aajti; +aajtj; +aajtk; +aajtl; +aajtm; +aajtn; +aajto; +aajtp; +aajtq; +aajtr; +aajts; +aajtt; +aajtu; +aajtv; +aajtw; +aajtx; +aajty; +aajtz; +aajua; +aajub; +aajuc; +aajud; +aajue; +aajuf; +aajug; +aajuh; +aajui; +aajuj; +aajuk; +aajul; +aajum; +aajun; +aajuo; +aajup; +aajuq; +aajur; +aajus; +aajut; +aajuu; +aajuv; +aajuw; +aajux; +aajuy; +aajuz; +aajva; +aajvb; +aajvc; +aajvd; +aajve; +aajvf; +aajvg; +aajvh; +aajvi; +aajvj; +aajvk; +aajvl; +aajvm; +aajvn; +aajvo; +aajvp; +aajvq; +aajvr; +aajvs; +aajvt; +aajvu; +aajvv; +aajvw; +aajvx; +aajvy; +aajvz; +aajwa; +aajwb; +aajwc; +aajwd; +aajwe; +aajwf; +aajwg; +aajwh; +aajwi; +aajwj; +aajwk; +aajwl; +aajwm; +aajwn; +aajwo; +aajwp; +aajwq; +aajwr; +aajws; +aajwt; +aajwu; +aajwv; +aajww; +aajwx; +aajwy; +aajwz; +aajxa; +aajxb; +aajxc; +aajxd; +aajxe; +aajxf; +aajxg; +aajxh; +aajxi; +aajxj; +aajxk; +aajxl; +aajxm; +aajxn; +aajxo; +aajxp; +aajxq; +aajxr; +aajxs; +aajxt; +aajxu; +aajxv; +aajxw; +aajxx; +aajxy; +aajxz; +aajya; +aajyb; +aajyc; +aajyd; +aajye; +aajyf; +aajyg; +aajyh; +aajyi; +aajyj; +aajyk; +aajyl; +aajym; +aajyn; +aajyo; +aajyp; +aajyq; +aajyr; +aajys; +aajyt; +aajyu; +aajyv; +aajyw; +aajyx; +aajyy; +aajyz; +aajza; +aajzb; +aajzc; +aajzd; +aajze; +aajzf; +aajzg; +aajzh; +aajzi; +aajzj; +aajzk; +aajzl; +aajzm; +aajzn; +aajzo; +aajzp; +aajzq; +aajzr; +aajzs; +aajzt; +aajzu; +aajzv; +aajzw; +aajzx; +aajzy; +aajzz; +aakaa; +aakab; +aakac; +aakad; +aakae; +aakaf; +aakag; +aakah; +aakai; +aakaj; +aakak; +aakal; +aakam; +aakan; +aakao; +aakap; +aakaq; +aakar; +aakas; +aakat; +aakau; +aakav; +aakaw; +aakax; +aakay; +aakaz; +aakba; +aakbb; +aakbc; +aakbd; +aakbe; +aakbf; +aakbg; +aakbh; +aakbi; +aakbj; +aakbk; +aakbl; +aakbm; +aakbn; +aakbo; +aakbp; +aakbq; +aakbr; +aakbs; +aakbt; +aakbu; +aakbv; +aakbw; +aakbx; +aakby; +aakbz; +aakca; +aakcb; +aakcc; +aakcd; +aakce; +aakcf; +aakcg; +aakch; +aakci; +aakcj; +aakck; +aakcl; +aakcm; +aakcn; +aakco; +aakcp; +aakcq; +aakcr; +aakcs; +aakct; +aakcu; +aakcv; +aakcw; +aakcx; +aakcy; +aakcz; +aakda; +aakdb; +aakdc; +aakdd; +aakde; +aakdf; +aakdg; +aakdh; +aakdi; +aakdj; +aakdk; +aakdl; +aakdm; +aakdn; +aakdo; +aakdp; +aakdq; +aakdr; +aakds; +aakdt; +aakdu; +aakdv; +aakdw; +aakdx; +aakdy; +aakdz; +aakea; +aakeb; +aakec; +aaked; +aakee; +aakef; +aakeg; +aakeh; +aakei; +aakej; +aakek; +aakel; +aakem; +aaken; +aakeo; +aakep; +aakeq; +aaker; +aakes; +aaket; +aakeu; +aakev; +aakew; +aakex; +aakey; +aakez; +aakfa; +aakfb; +aakfc; +aakfd; +aakfe; +aakff; +aakfg; +aakfh; +aakfi; +aakfj; +aakfk; +aakfl; +aakfm; +aakfn; +aakfo; +aakfp; +aakfq; +aakfr; +aakfs; +aakft; +aakfu; +aakfv; +aakfw; +aakfx; +aakfy; +aakfz; +aakga; +aakgb; +aakgc; +aakgd; +aakge; +aakgf; +aakgg; +aakgh; +aakgi; +aakgj; +aakgk; +aakgl; +aakgm; +aakgn; +aakgo; +aakgp; +aakgq; +aakgr; +aakgs; +aakgt; +aakgu; +aakgv; +aakgw; +aakgx; +aakgy; +aakgz; +aakha; +aakhb; +aakhc; +aakhd; +aakhe; +aakhf; +aakhg; +aakhh; +aakhi; +aakhj; +aakhk; +aakhl; +aakhm; +aakhn; +aakho; +aakhp; +aakhq; +aakhr; +aakhs; +aakht; +aakhu; +aakhv; +aakhw; +aakhx; +aakhy; +aakhz; +aakia; +aakib; +aakic; +aakid; +aakie; +aakif; +aakig; +aakih; +aakii; +aakij; +aakik; +aakil; +aakim; +aakin; +aakio; +aakip; +aakiq; +aakir; +aakis; +aakit; +aakiu; +aakiv; +aakiw; +aakix; +aakiy; +aakiz; +aakja; +aakjb; +aakjc; +aakjd; +aakje; +aakjf; +aakjg; +aakjh; +aakji; +aakjj; +aakjk; +aakjl; +aakjm; +aakjn; +aakjo; +aakjp; +aakjq; +aakjr; +aakjs; +aakjt; +aakju; +aakjv; +aakjw; +aakjx; +aakjy; +aakjz; +aakka; +aakkb; +aakkc; +aakkd; +aakke; +aakkf; +aakkg; +aakkh; +aakki; +aakkj; +aakkk; +aakkl; +aakkm; +aakkn; +aakko; +aakkp; +aakkq; +aakkr; +aakks; +aakkt; +aakku; +aakkv; +aakkw; +aakkx; +aakky; +aakkz; +aakla; +aaklb; +aaklc; +aakld; +aakle; +aaklf; +aaklg; +aaklh; +aakli; +aaklj; +aaklk; +aakll; +aaklm; +aakln; +aaklo; +aaklp; +aaklq; +aaklr; +aakls; +aaklt; +aaklu; +aaklv; +aaklw; +aaklx; +aakly; +aaklz; +aakma; +aakmb; +aakmc; +aakmd; +aakme; +aakmf; +aakmg; +aakmh; +aakmi; +aakmj; +aakmk; +aakml; +aakmm; +aakmn; +aakmo; +aakmp; +aakmq; +aakmr; +aakms; +aakmt; +aakmu; +aakmv; +aakmw; +aakmx; +aakmy; +aakmz; +aakna; +aaknb; +aaknc; +aaknd; +aakne; +aaknf; +aakng; +aaknh; +aakni; +aaknj; +aaknk; +aaknl; +aaknm; +aaknn; +aakno; +aaknp; +aaknq; +aaknr; +aakns; +aaknt; +aaknu; +aaknv; +aaknw; +aaknx; +aakny; +aaknz; +aakoa; +aakob; +aakoc; +aakod; +aakoe; +aakof; +aakog; +aakoh; +aakoi; +aakoj; +aakok; +aakol; +aakom; +aakon; +aakoo; +aakop; +aakoq; +aakor; +aakos; +aakot; +aakou; +aakov; +aakow; +aakox; +aakoy; +aakoz; +aakpa; +aakpb; +aakpc; +aakpd; +aakpe; +aakpf; +aakpg; +aakph; +aakpi; +aakpj; +aakpk; +aakpl; +aakpm; +aakpn; +aakpo; +aakpp; +aakpq; +aakpr; +aakps; +aakpt; +aakpu; +aakpv; +aakpw; +aakpx; +aakpy; +aakpz; +aakqa; +aakqb; +aakqc; +aakqd; +aakqe; +aakqf; +aakqg; +aakqh; +aakqi; +aakqj; +aakqk; +aakql; +aakqm; +aakqn; +aakqo; +aakqp; +aakqq; +aakqr; +aakqs; +aakqt; +aakqu; +aakqv; +aakqw; +aakqx; +aakqy; +aakqz; +aakra; +aakrb; +aakrc; +aakrd; +aakre; +aakrf; +aakrg; +aakrh; +aakri; +aakrj; +aakrk; +aakrl; +aakrm; +aakrn; +aakro; +aakrp; +aakrq; +aakrr; +aakrs; +aakrt; +aakru; +aakrv; +aakrw; +aakrx; +aakry; +aakrz; +aaksa; +aaksb; +aaksc; +aaksd; +aakse; +aaksf; +aaksg; +aaksh; +aaksi; +aaksj; +aaksk; +aaksl; +aaksm; +aaksn; +aakso; +aaksp; +aaksq; +aaksr; +aakss; +aakst; +aaksu; +aaksv; +aaksw; +aaksx; +aaksy; +aaksz; +aakta; +aaktb; +aaktc; +aaktd; +aakte; +aaktf; +aaktg; +aakth; +aakti; +aaktj; +aaktk; +aaktl; +aaktm; +aaktn; +aakto; +aaktp; +aaktq; +aaktr; +aakts; +aaktt; +aaktu; +aaktv; +aaktw; +aaktx; +aakty; +aaktz; +aakua; +aakub; +aakuc; +aakud; +aakue; +aakuf; +aakug; +aakuh; +aakui; +aakuj; +aakuk; +aakul; +aakum; +aakun; +aakuo; +aakup; +aakuq; +aakur; +aakus; +aakut; +aakuu; +aakuv; +aakuw; +aakux; +aakuy; +aakuz; +aakva; +aakvb; +aakvc; +aakvd; +aakve; +aakvf; +aakvg; +aakvh; +aakvi; +aakvj; +aakvk; +aakvl; +aakvm; +aakvn; +aakvo; +aakvp; +aakvq; +aakvr; +aakvs; +aakvt; +aakvu; +aakvv; +aakvw; +aakvx; +aakvy; +aakvz; +aakwa; +aakwb; +aakwc; +aakwd; +aakwe; +aakwf; +aakwg; +aakwh; +aakwi; +aakwj; +aakwk; +aakwl; +aakwm; +aakwn; +aakwo; +aakwp; +aakwq; +aakwr; +aakws; +aakwt; +aakwu; +aakwv; +aakww; +aakwx; +aakwy; +aakwz; +aakxa; +aakxb; +aakxc; +aakxd; +aakxe; +aakxf; +aakxg; +aakxh; +aakxi; +aakxj; +aakxk; +aakxl; +aakxm; +aakxn; +aakxo; +aakxp; +aakxq; +aakxr; +aakxs; +aakxt; +aakxu; +aakxv; +aakxw; +aakxx; +aakxy; +aakxz; +aakya; +aakyb; +aakyc; +aakyd; +aakye; +aakyf; +aakyg; +aakyh; +aakyi; +aakyj; +aakyk; +aakyl; +aakym; +aakyn; +aakyo; +aakyp; +aakyq; +aakyr; +aakys; +aakyt; +aakyu; +aakyv; +aakyw; +aakyx; +aakyy; +aakyz; +aakza; +aakzb; +aakzc; +aakzd; +aakze; +aakzf; +aakzg; +aakzh; +aakzi; +aakzj; +aakzk; +aakzl; +aakzm; +aakzn; +aakzo; +aakzp; +aakzq; +aakzr; +aakzs; +aakzt; +aakzu; +aakzv; +aakzw; +aakzx; +aakzy; +aakzz; +aalaa; +aalab; +aalac; +aalad; +aalae; +aalaf; +aalag; +aalah; +aalai; +aalaj; +aalak; +aalal; +aalam; +aalan; +aalao; +aalap; +aalaq; +aalar; +aalas; +aalat; +aalau; +aalav; +aalaw; +aalax; +aalay; +aalaz; +aalba; +aalbb; +aalbc; +aalbd; +aalbe; +aalbf; +aalbg; +aalbh; +aalbi; +aalbj; +aalbk; +aalbl; +aalbm; +aalbn; +aalbo; +aalbp; +aalbq; +aalbr; +aalbs; +aalbt; +aalbu; +aalbv; +aalbw; +aalbx; +aalby; +aalbz; +aalca; +aalcb; +aalcc; +aalcd; +aalce; +aalcf; +aalcg; +aalch; +aalci; +aalcj; +aalck; +aalcl; +aalcm; +aalcn; +aalco; +aalcp; +aalcq; +aalcr; +aalcs; +aalct; +aalcu; +aalcv; +aalcw; +aalcx; +aalcy; +aalcz; +aalda; +aaldb; +aaldc; +aaldd; +aalde; +aaldf; +aaldg; +aaldh; +aaldi; +aaldj; +aaldk; +aaldl; +aaldm; +aaldn; +aaldo; +aaldp; +aaldq; +aaldr; +aalds; +aaldt; +aaldu; +aaldv; +aaldw; +aaldx; +aaldy; +aaldz; +aalea; +aaleb; +aalec; +aaled; +aalee; +aalef; +aaleg; +aaleh; +aalei; +aalej; +aalek; +aalel; +aalem; +aalen; +aaleo; +aalep; +aaleq; +aaler; +aales; +aalet; +aaleu; +aalev; +aalew; +aalex; +aaley; +aalez; +aalfa; +aalfb; +aalfc; +aalfd; +aalfe; +aalff; +aalfg; +aalfh; +aalfi; +aalfj; +aalfk; +aalfl; +aalfm; +aalfn; +aalfo; +aalfp; +aalfq; +aalfr; +aalfs; +aalft; +aalfu; +aalfv; +aalfw; +aalfx; +aalfy; +aalfz; +aalga; +aalgb; +aalgc; +aalgd; +aalge; +aalgf; +aalgg; +aalgh; +aalgi; +aalgj; +aalgk; +aalgl; +aalgm; +aalgn; +aalgo; +aalgp; +aalgq; +aalgr; +aalgs; +aalgt; +aalgu; +aalgv; +aalgw; +aalgx; +aalgy; +aalgz; +aalha; +aalhb; +aalhc; +aalhd; +aalhe; +aalhf; +aalhg; +aalhh; +aalhi; +aalhj; +aalhk; +aalhl; +aalhm; +aalhn; +aalho; +aalhp; +aalhq; +aalhr; +aalhs; +aalht; +aalhu; +aalhv; +aalhw; +aalhx; +aalhy; +aalhz; +aalia; +aalib; +aalic; +aalid; +aalie; +aalif; +aalig; +aalih; +aalii; +aalij; +aalik; +aalil; +aalim; +aalin; +aalio; +aalip; +aaliq; +aalir; +aalis; +aalit; +aaliu; +aaliv; +aaliw; +aalix; +aaliy; +aaliz; +aalja; +aaljb; +aaljc; +aaljd; +aalje; +aaljf; +aaljg; +aaljh; +aalji; +aaljj; +aaljk; +aaljl; +aaljm; +aaljn; +aaljo; +aaljp; +aaljq; +aaljr; +aaljs; +aaljt; +aalju; +aaljv; +aaljw; +aaljx; +aaljy; +aaljz; +aalka; +aalkb; +aalkc; +aalkd; +aalke; +aalkf; +aalkg; +aalkh; +aalki; +aalkj; +aalkk; +aalkl; +aalkm; +aalkn; +aalko; +aalkp; +aalkq; +aalkr; +aalks; +aalkt; +aalku; +aalkv; +aalkw; +aalkx; +aalky; +aalkz; +aalla; +aallb; +aallc; +aalld; +aalle; +aallf; +aallg; +aallh; +aalli; +aallj; +aallk; +aalll; +aallm; +aalln; +aallo; +aallp; +aallq; +aallr; +aalls; +aallt; +aallu; +aallv; +aallw; +aallx; +aally; +aallz; +aalma; +aalmb; +aalmc; +aalmd; +aalme; +aalmf; +aalmg; +aalmh; +aalmi; +aalmj; +aalmk; +aalml; +aalmm; +aalmn; +aalmo; +aalmp; +aalmq; +aalmr; +aalms; +aalmt; +aalmu; +aalmv; +aalmw; +aalmx; +aalmy; +aalmz; +aalna; +aalnb; +aalnc; +aalnd; +aalne; +aalnf; +aalng; +aalnh; +aalni; +aalnj; +aalnk; +aalnl; +aalnm; +aalnn; +aalno; +aalnp; +aalnq; +aalnr; +aalns; +aalnt; +aalnu; +aalnv; +aalnw; +aalnx; +aalny; +aalnz; +aaloa; +aalob; +aaloc; +aalod; +aaloe; +aalof; +aalog; +aaloh; +aaloi; +aaloj; +aalok; +aalol; +aalom; +aalon; +aaloo; +aalop; +aaloq; +aalor; +aalos; +aalot; +aalou; +aalov; +aalow; +aalox; +aaloy; +aaloz; +aalpa; +aalpb; +aalpc; +aalpd; +aalpe; +aalpf; +aalpg; +aalph; +aalpi; +aalpj; +aalpk; +aalpl; +aalpm; +aalpn; +aalpo; +aalpp; +aalpq; +aalpr; +aalps; +aalpt; +aalpu; +aalpv; +aalpw; +aalpx; +aalpy; +aalpz; +aalqa; +aalqb; +aalqc; +aalqd; +aalqe; +aalqf; +aalqg; +aalqh; +aalqi; +aalqj; +aalqk; +aalql; +aalqm; +aalqn; +aalqo; +aalqp; +aalqq; +aalqr; +aalqs; +aalqt; +aalqu; +aalqv; +aalqw; +aalqx; +aalqy; +aalqz; +aalra; +aalrb; +aalrc; +aalrd; +aalre; +aalrf; +aalrg; +aalrh; +aalri; +aalrj; +aalrk; +aalrl; +aalrm; +aalrn; +aalro; +aalrp; +aalrq; +aalrr; +aalrs; +aalrt; +aalru; +aalrv; +aalrw; +aalrx; +aalry; +aalrz; +aalsa; +aalsb; +aalsc; +aalsd; +aalse; +aalsf; +aalsg; +aalsh; +aalsi; +aalsj; +aalsk; +aalsl; +aalsm; +aalsn; +aalso; +aalsp; +aalsq; +aalsr; +aalss; +aalst; +aalsu; +aalsv; +aalsw; +aalsx; +aalsy; +aalsz; +aalta; +aaltb; +aaltc; +aaltd; +aalte; +aaltf; +aaltg; +aalth; +aalti; +aaltj; +aaltk; +aaltl; +aaltm; +aaltn; +aalto; +aaltp; +aaltq; +aaltr; +aalts; +aaltt; +aaltu; +aaltv; +aaltw; +aaltx; +aalty; +aaltz; +aalua; +aalub; +aaluc; +aalud; +aalue; +aaluf; +aalug; +aaluh; +aalui; +aaluj; +aaluk; +aalul; +aalum; +aalun; +aaluo; +aalup; +aaluq; +aalur; +aalus; +aalut; +aaluu; +aaluv; +aaluw; +aalux; +aaluy; +aaluz; +aalva; +aalvb; +aalvc; +aalvd; +aalve; +aalvf; +aalvg; +aalvh; +aalvi; +aalvj; +aalvk; +aalvl; +aalvm; +aalvn; +aalvo; +aalvp; +aalvq; +aalvr; +aalvs; +aalvt; +aalvu; +aalvv; +aalvw; +aalvx; +aalvy; +aalvz; +aalwa; +aalwb; +aalwc; +aalwd; +aalwe; +aalwf; +aalwg; +aalwh; +aalwi; +aalwj; +aalwk; +aalwl; +aalwm; +aalwn; +aalwo; +aalwp; +aalwq; +aalwr; +aalws; +aalwt; +aalwu; +aalwv; +aalww; +aalwx; +aalwy; +aalwz; +aalxa; +aalxb; +aalxc; +aalxd; +aalxe; +aalxf; +aalxg; +aalxh; +aalxi; +aalxj; +aalxk; +aalxl; +aalxm; +aalxn; +aalxo; +aalxp; +aalxq; +aalxr; +aalxs; +aalxt; +aalxu; +aalxv; +aalxw; +aalxx; +aalxy; +aalxz; +aalya; +aalyb; +aalyc; +aalyd; +aalye; +aalyf; +aalyg; +aalyh; +aalyi; +aalyj; +aalyk; +aalyl; +aalym; +aalyn; +aalyo; +aalyp; +aalyq; +aalyr; +aalys; +aalyt; +aalyu; +aalyv; +aalyw; +aalyx; +aalyy; +aalyz; +aalza; +aalzb; +aalzc; +aalzd; +aalze; +aalzf; +aalzg; +aalzh; +aalzi; +aalzj; +aalzk; +aalzl; +aalzm; +aalzn; +aalzo; +aalzp; +aalzq; +aalzr; +aalzs; +aalzt; +aalzu; +aalzv; +aalzw; +aalzx; +aalzy; +aalzz; +aamaa; +aamab; +aamac; +aamad; +aamae; +aamaf; +aamag; +aamah; +aamai; +aamaj; +aamak; +aamal; +aamam; +aaman; +aamao; +aamap; +aamaq; +aamar; +aamas; +aamat; +aamau; +aamav; +aamaw; +aamax; +aamay; +aamaz; +aamba; +aambb; +aambc; +aambd; +aambe; +aambf; +aambg; +aambh; +aambi; +aambj; +aambk; +aambl; +aambm; +aambn; +aambo; +aambp; +aambq; +aambr; +aambs; +aambt; +aambu; +aambv; +aambw; +aambx; +aamby; +aambz; +aamca; +aamcb; +aamcc; +aamcd; +aamce; +aamcf; +aamcg; +aamch; +aamci; +aamcj; +aamck; +aamcl; +aamcm; +aamcn; +aamco; +aamcp; +aamcq; +aamcr; +aamcs; +aamct; +aamcu; +aamcv; +aamcw; +aamcx; +aamcy; +aamcz; +aamda; +aamdb; +aamdc; +aamdd; +aamde; +aamdf; +aamdg; +aamdh; +aamdi; +aamdj; +aamdk; +aamdl; +aamdm; +aamdn; +aamdo; +aamdp; +aamdq; +aamdr; +aamds; +aamdt; +aamdu; +aamdv; +aamdw; +aamdx; +aamdy; +aamdz; +aamea; +aameb; +aamec; +aamed; +aamee; +aamef; +aameg; +aameh; +aamei; +aamej; +aamek; +aamel; +aamem; +aamen; +aameo; +aamep; +aameq; +aamer; +aames; +aamet; +aameu; +aamev; +aamew; +aamex; +aamey; +aamez; +aamfa; +aamfb; +aamfc; +aamfd; +aamfe; +aamff; +aamfg; +aamfh; +aamfi; +aamfj; +aamfk; +aamfl; +aamfm; +aamfn; +aamfo; +aamfp; +aamfq; +aamfr; +aamfs; +aamft; +aamfu; +aamfv; +aamfw; +aamfx; +aamfy; +aamfz; +aamga; +aamgb; +aamgc; +aamgd; +aamge; +aamgf; +aamgg; +aamgh; +aamgi; +aamgj; +aamgk; +aamgl; +aamgm; +aamgn; +aamgo; +aamgp; +aamgq; +aamgr; +aamgs; +aamgt; +aamgu; +aamgv; +aamgw; +aamgx; +aamgy; +aamgz; +aamha; +aamhb; +aamhc; +aamhd; +aamhe; +aamhf; +aamhg; +aamhh; +aamhi; +aamhj; +aamhk; +aamhl; +aamhm; +aamhn; +aamho; +aamhp; +aamhq; +aamhr; +aamhs; +aamht; +aamhu; +aamhv; +aamhw; +aamhx; +aamhy; +aamhz; +aamia; +aamib; +aamic; +aamid; +aamie; +aamif; +aamig; +aamih; +aamii; +aamij; +aamik; +aamil; +aamim; +aamin; +aamio; +aamip; +aamiq; +aamir; +aamis; +aamit; +aamiu; +aamiv; +aamiw; +aamix; +aamiy; +aamiz; +aamja; +aamjb; +aamjc; +aamjd; +aamje; +aamjf; +aamjg; +aamjh; +aamji; +aamjj; +aamjk; +aamjl; +aamjm; +aamjn; +aamjo; +aamjp; +aamjq; +aamjr; +aamjs; +aamjt; +aamju; +aamjv; +aamjw; +aamjx; +aamjy; +aamjz; +aamka; +aamkb; +aamkc; +aamkd; +aamke; +aamkf; +aamkg; +aamkh; +aamki; +aamkj; +aamkk; +aamkl; +aamkm; +aamkn; +aamko; +aamkp; +aamkq; +aamkr; +aamks; +aamkt; +aamku; +aamkv; +aamkw; +aamkx; +aamky; +aamkz; +aamla; +aamlb; +aamlc; +aamld; +aamle; +aamlf; +aamlg; +aamlh; +aamli; +aamlj; +aamlk; +aamll; +aamlm; +aamln; +aamlo; +aamlp; +aamlq; +aamlr; +aamls; +aamlt; +aamlu; +aamlv; +aamlw; +aamlx; +aamly; +aamlz; +aamma; +aammb; +aammc; +aammd; +aamme; +aammf; +aammg; +aammh; +aammi; +aammj; +aammk; +aamml; +aammm; +aammn; +aammo; +aammp; +aammq; +aammr; +aamms; +aammt; +aammu; +aammv; +aammw; +aammx; +aammy; +aammz; +aamna; +aamnb; +aamnc; +aamnd; +aamne; +aamnf; +aamng; +aamnh; +aamni; +aamnj; +aamnk; +aamnl; +aamnm; +aamnn; +aamno; +aamnp; +aamnq; +aamnr; +aamns; +aamnt; +aamnu; +aamnv; +aamnw; +aamnx; +aamny; +aamnz; +aamoa; +aamob; +aamoc; +aamod; +aamoe; +aamof; +aamog; +aamoh; +aamoi; +aamoj; +aamok; +aamol; +aamom; +aamon; +aamoo; +aamop; +aamoq; +aamor; +aamos; +aamot; +aamou; +aamov; +aamow; +aamox; +aamoy; +aamoz; +aampa; +aampb; +aampc; +aampd; +aampe; +aampf; +aampg; +aamph; +aampi; +aampj; +aampk; +aampl; +aampm; +aampn; +aampo; +aampp; +aampq; +aampr; +aamps; +aampt; +aampu; +aampv; +aampw; +aampx; +aampy; +aampz; +aamqa; +aamqb; +aamqc; +aamqd; +aamqe; +aamqf; +aamqg; +aamqh; +aamqi; +aamqj; +aamqk; +aamql; +aamqm; +aamqn; +aamqo; +aamqp; +aamqq; +aamqr; +aamqs; +aamqt; +aamqu; +aamqv; +aamqw; +aamqx; +aamqy; +aamqz; +aamra; +aamrb; +aamrc; +aamrd; +aamre; +aamrf; +aamrg; +aamrh; +aamri; +aamrj; +aamrk; +aamrl; +aamrm; +aamrn; +aamro; +aamrp; +aamrq; +aamrr; +aamrs; +aamrt; +aamru; +aamrv; +aamrw; +aamrx; +aamry; +aamrz; +aamsa; +aamsb; +aamsc; +aamsd; +aamse; +aamsf; +aamsg; +aamsh; +aamsi; +aamsj; +aamsk; +aamsl; +aamsm; +aamsn; +aamso; +aamsp; +aamsq; +aamsr; +aamss; +aamst; +aamsu; +aamsv; +aamsw; +aamsx; +aamsy; +aamsz; +aamta; +aamtb; +aamtc; +aamtd; +aamte; +aamtf; +aamtg; +aamth; +aamti; +aamtj; +aamtk; +aamtl; +aamtm; +aamtn; +aamto; +aamtp; +aamtq; +aamtr; +aamts; +aamtt; +aamtu; +aamtv; +aamtw; +aamtx; +aamty; +aamtz; +aamua; +aamub; +aamuc; +aamud; +aamue; +aamuf; +aamug; +aamuh; +aamui; +aamuj; +aamuk; +aamul; +aamum; +aamun; +aamuo; +aamup; +aamuq; +aamur; +aamus; +aamut; +aamuu; +aamuv; +aamuw; +aamux; +aamuy; +aamuz; +aamva; +aamvb; +aamvc; +aamvd; +aamve; +aamvf; +aamvg; +aamvh; +aamvi; +aamvj; +aamvk; +aamvl; +aamvm; +aamvn; +aamvo; +aamvp; +aamvq; +aamvr; +aamvs; +aamvt; +aamvu; +aamvv; +aamvw; +aamvx; +aamvy; +aamvz; +aamwa; +aamwb; +aamwc; +aamwd; +aamwe; +aamwf; +aamwg; +aamwh; +aamwi; +aamwj; +aamwk; +aamwl; +aamwm; +aamwn; +aamwo; +aamwp; +aamwq; +aamwr; +aamws; +aamwt; +aamwu; +aamwv; +aamww; +aamwx; +aamwy; +aamwz; +aamxa; +aamxb; +aamxc; +aamxd; +aamxe; +aamxf; +aamxg; +aamxh; +aamxi; +aamxj; +aamxk; +aamxl; +aamxm; +aamxn; +aamxo; +aamxp; +aamxq; +aamxr; +aamxs; +aamxt; +aamxu; +aamxv; +aamxw; +aamxx; +aamxy; +aamxz; +aamya; +aamyb; +aamyc; +aamyd; +aamye; +aamyf; +aamyg; +aamyh; +aamyi; +aamyj; +aamyk; +aamyl; +aamym; +aamyn; +aamyo; +aamyp; +aamyq; +aamyr; +aamys; +aamyt; +aamyu; +aamyv; +aamyw; +aamyx; +aamyy; +aamyz; +aamza; +aamzb; +aamzc; +aamzd; +aamze; +aamzf; +aamzg; +aamzh; +aamzi; +aamzj; +aamzk; +aamzl; +aamzm; +aamzn; +aamzo; +aamzp; +aamzq; +aamzr; +aamzs; +aamzt; +aamzu; +aamzv; +aamzw; +aamzx; +aamzy; +aamzz; +aanaa; +aanab; +aanac; +aanad; +aanae; +aanaf; +aanag; +aanah; +aanai; +aanaj; +aanak; +aanal; +aanam; +aanan; +aanao; +aanap; +aanaq; +aanar; +aanas; +aanat; +aanau; +aanav; +aanaw; +aanax; +aanay; +aanaz; +aanba; +aanbb; +aanbc; +aanbd; +aanbe; +aanbf; +aanbg; +aanbh; +aanbi; +aanbj; +aanbk; +aanbl; +aanbm; +aanbn; +aanbo; +aanbp; +aanbq; +aanbr; +aanbs; +aanbt; +aanbu; +aanbv; +aanbw; +aanbx; +aanby; +aanbz; +aanca; +aancb; +aancc; +aancd; +aance; +aancf; +aancg; +aanch; +aanci; +aancj; +aanck; +aancl; +aancm; +aancn; +aanco; +aancp; +aancq; +aancr; +aancs; +aanct; +aancu; +aancv; +aancw; +aancx; +aancy; +aancz; +aanda; +aandb; +aandc; +aandd; +aande; +aandf; +aandg; +aandh; +aandi; +aandj; +aandk; +aandl; +aandm; +aandn; +aando; +aandp; +aandq; +aandr; +aands; +aandt; +aandu; +aandv; +aandw; +aandx; +aandy; +aandz; +aanea; +aaneb; +aanec; +aaned; +aanee; +aanef; +aaneg; +aaneh; +aanei; +aanej; +aanek; +aanel; +aanem; +aanen; +aaneo; +aanep; +aaneq; +aaner; +aanes; +aanet; +aaneu; +aanev; +aanew; +aanex; +aaney; +aanez; +aanfa; +aanfb; +aanfc; +aanfd; +aanfe; +aanff; +aanfg; +aanfh; +aanfi; +aanfj; +aanfk; +aanfl; +aanfm; +aanfn; +aanfo; +aanfp; +aanfq; +aanfr; +aanfs; +aanft; +aanfu; +aanfv; +aanfw; +aanfx; +aanfy; +aanfz; +aanga; +aangb; +aangc; +aangd; +aange; +aangf; +aangg; +aangh; +aangi; +aangj; +aangk; +aangl; +aangm; +aangn; +aango; +aangp; +aangq; +aangr; +aangs; +aangt; +aangu; +aangv; +aangw; +aangx; +aangy; +aangz; +aanha; +aanhb; +aanhc; +aanhd; +aanhe; +aanhf; +aanhg; +aanhh; +aanhi; +aanhj; +aanhk; +aanhl; +aanhm; +aanhn; +aanho; +aanhp; +aanhq; +aanhr; +aanhs; +aanht; +aanhu; +aanhv; +aanhw; +aanhx; +aanhy; +aanhz; +aania; +aanib; +aanic; +aanid; +aanie; +aanif; +aanig; +aanih; +aanii; +aanij; +aanik; +aanil; +aanim; +aanin; +aanio; +aanip; +aaniq; +aanir; +aanis; +aanit; +aaniu; +aaniv; +aaniw; +aanix; +aaniy; +aaniz; +aanja; +aanjb; +aanjc; +aanjd; +aanje; +aanjf; +aanjg; +aanjh; +aanji; +aanjj; +aanjk; +aanjl; +aanjm; +aanjn; +aanjo; +aanjp; +aanjq; +aanjr; +aanjs; +aanjt; +aanju; +aanjv; +aanjw; +aanjx; +aanjy; +aanjz; +aanka; +aankb; +aankc; +aankd; +aanke; +aankf; +aankg; +aankh; +aanki; +aankj; +aankk; +aankl; +aankm; +aankn; +aanko; +aankp; +aankq; +aankr; +aanks; +aankt; +aanku; +aankv; +aankw; +aankx; +aanky; +aankz; +aanla; +aanlb; +aanlc; +aanld; +aanle; +aanlf; +aanlg; +aanlh; +aanli; +aanlj; +aanlk; +aanll; +aanlm; +aanln; +aanlo; +aanlp; +aanlq; +aanlr; +aanls; +aanlt; +aanlu; +aanlv; +aanlw; +aanlx; +aanly; +aanlz; +aanma; +aanmb; +aanmc; +aanmd; +aanme; +aanmf; +aanmg; +aanmh; +aanmi; +aanmj; +aanmk; +aanml; +aanmm; +aanmn; +aanmo; +aanmp; +aanmq; +aanmr; +aanms; +aanmt; +aanmu; +aanmv; +aanmw; +aanmx; +aanmy; +aanmz; +aanna; +aannb; +aannc; +aannd; +aanne; +aannf; +aanng; +aannh; +aanni; +aannj; +aannk; +aannl; +aannm; +aannn; +aanno; +aannp; +aannq; +aannr; +aanns; +aannt; +aannu; +aannv; +aannw; +aannx; +aanny; +aannz; +aanoa; +aanob; +aanoc; +aanod; +aanoe; +aanof; +aanog; +aanoh; +aanoi; +aanoj; +aanok; +aanol; +aanom; +aanon; +aanoo; +aanop; +aanoq; +aanor; +aanos; +aanot; +aanou; +aanov; +aanow; +aanox; +aanoy; +aanoz; +aanpa; +aanpb; +aanpc; +aanpd; +aanpe; +aanpf; +aanpg; +aanph; +aanpi; +aanpj; +aanpk; +aanpl; +aanpm; +aanpn; +aanpo; +aanpp; +aanpq; +aanpr; +aanps; +aanpt; +aanpu; +aanpv; +aanpw; +aanpx; +aanpy; +aanpz; +aanqa; +aanqb; +aanqc; +aanqd; +aanqe; +aanqf; +aanqg; +aanqh; +aanqi; +aanqj; +aanqk; +aanql; +aanqm; +aanqn; +aanqo; +aanqp; +aanqq; +aanqr; +aanqs; +aanqt; +aanqu; +aanqv; +aanqw; +aanqx; +aanqy; +aanqz; +aanra; +aanrb; +aanrc; +aanrd; +aanre; +aanrf; +aanrg; +aanrh; +aanri; +aanrj; +aanrk; +aanrl; +aanrm; +aanrn; +aanro; +aanrp; +aanrq; +aanrr; +aanrs; +aanrt; +aanru; +aanrv; +aanrw; +aanrx; +aanry; +aanrz; +aansa; +aansb; +aansc; +aansd; +aanse; +aansf; +aansg; +aansh; +aansi; +aansj; +aansk; +aansl; +aansm; +aansn; +aanso; +aansp; +aansq; +aansr; +aanss; +aanst; +aansu; +aansv; +aansw; +aansx; +aansy; +aansz; +aanta; +aantb; +aantc; +aantd; +aante; +aantf; +aantg; +aanth; +aanti; +aantj; +aantk; +aantl; +aantm; +aantn; +aanto; +aantp; +aantq; +aantr; +aants; +aantt; +aantu; +aantv; +aantw; +aantx; +aanty; +aantz; +aanua; +aanub; +aanuc; +aanud; +aanue; +aanuf; +aanug; +aanuh; +aanui; +aanuj; +aanuk; +aanul; +aanum; +aanun; +aanuo; +aanup; +aanuq; +aanur; +aanus; +aanut; +aanuu; +aanuv; +aanuw; +aanux; +aanuy; +aanuz; +aanva; +aanvb; +aanvc; +aanvd; +aanve; +aanvf; +aanvg; +aanvh; +aanvi; +aanvj; +aanvk; +aanvl; +aanvm; +aanvn; +aanvo; +aanvp; +aanvq; +aanvr; +aanvs; +aanvt; +aanvu; +aanvv; +aanvw; +aanvx; +aanvy; +aanvz; +aanwa; +aanwb; +aanwc; +aanwd; +aanwe; +aanwf; +aanwg; +aanwh; +aanwi; +aanwj; +aanwk; +aanwl; +aanwm; +aanwn; +aanwo; +aanwp; +aanwq; +aanwr; +aanws; +aanwt; +aanwu; +aanwv; +aanww; +aanwx; +aanwy; +aanwz; +aanxa; +aanxb; +aanxc; +aanxd; +aanxe; +aanxf; +aanxg; +aanxh; +aanxi; +aanxj; +aanxk; +aanxl; +aanxm; +aanxn; +aanxo; +aanxp; +aanxq; +aanxr; +aanxs; +aanxt; +aanxu; +aanxv; +aanxw; +aanxx; +aanxy; +aanxz; +aanya; +aanyb; +aanyc; +aanyd; +aanye; +aanyf; +aanyg; +aanyh; +aanyi; +aanyj; +aanyk; +aanyl; +aanym; +aanyn; +aanyo; +aanyp; +aanyq; +aanyr; +aanys; +aanyt; +aanyu; +aanyv; +aanyw; +aanyx; +aanyy; +aanyz; +aanza; +aanzb; +aanzc; +aanzd; +aanze; +aanzf; +aanzg; +aanzh; +aanzi; +aanzj; +aanzk; +aanzl; +aanzm; +aanzn; +aanzo; +aanzp; +aanzq; +aanzr; +aanzs; +aanzt; +aanzu; +aanzv; +aanzw; +aanzx; +aanzy; +aanzz; +aaoaa; +aaoab; +aaoac; +aaoad; +aaoae; +aaoaf; +aaoag; +aaoah; +aaoai; +aaoaj; +aaoak; +aaoal; +aaoam; +aaoan; +aaoao; +aaoap; +aaoaq; +aaoar; +aaoas; +aaoat; +aaoau; +aaoav; +aaoaw; +aaoax; +aaoay; +aaoaz; +aaoba; +aaobb; +aaobc; +aaobd; +aaobe; +aaobf; +aaobg; +aaobh; +aaobi; +aaobj; +aaobk; +aaobl; +aaobm; +aaobn; +aaobo; +aaobp; +aaobq; +aaobr; +aaobs; +aaobt; +aaobu; +aaobv; +aaobw; +aaobx; +aaoby; +aaobz; +aaoca; +aaocb; +aaocc; +aaocd; +aaoce; +aaocf; +aaocg; +aaoch; +aaoci; +aaocj; +aaock; +aaocl; +aaocm; +aaocn; +aaoco; +aaocp; +aaocq; +aaocr; +aaocs; +aaoct; +aaocu; +aaocv; +aaocw; +aaocx; +aaocy; +aaocz; +aaoda; +aaodb; +aaodc; +aaodd; +aaode; +aaodf; +aaodg; +aaodh; +aaodi; +aaodj; +aaodk; +aaodl; +aaodm; +aaodn; +aaodo; +aaodp; +aaodq; +aaodr; +aaods; +aaodt; +aaodu; +aaodv; +aaodw; +aaodx; +aaody; +aaodz; +aaoea; +aaoeb; +aaoec; +aaoed; +aaoee; +aaoef; +aaoeg; +aaoeh; +aaoei; +aaoej; +aaoek; +aaoel; +aaoem; +aaoen; +aaoeo; +aaoep; +aaoeq; +aaoer; +aaoes; +aaoet; +aaoeu; +aaoev; +aaoew; +aaoex; +aaoey; +aaoez; +aaofa; +aaofb; +aaofc; +aaofd; +aaofe; +aaoff; +aaofg; +aaofh; +aaofi; +aaofj; +aaofk; +aaofl; +aaofm; +aaofn; +aaofo; +aaofp; +aaofq; +aaofr; +aaofs; +aaoft; +aaofu; +aaofv; +aaofw; +aaofx; +aaofy; +aaofz; +aaoga; +aaogb; +aaogc; +aaogd; +aaoge; +aaogf; +aaogg; +aaogh; +aaogi; +aaogj; +aaogk; +aaogl; +aaogm; +aaogn; +aaogo; +aaogp; +aaogq; +aaogr; +aaogs; +aaogt; +aaogu; +aaogv; +aaogw; +aaogx; +aaogy; +aaogz; +aaoha; +aaohb; +aaohc; +aaohd; +aaohe; +aaohf; +aaohg; +aaohh; +aaohi; +aaohj; +aaohk; +aaohl; +aaohm; +aaohn; +aaoho; +aaohp; +aaohq; +aaohr; +aaohs; +aaoht; +aaohu; +aaohv; +aaohw; +aaohx; +aaohy; +aaohz; +aaoia; +aaoib; +aaoic; +aaoid; +aaoie; +aaoif; +aaoig; +aaoih; +aaoii; +aaoij; +aaoik; +aaoil; +aaoim; +aaoin; +aaoio; +aaoip; +aaoiq; +aaoir; +aaois; +aaoit; +aaoiu; +aaoiv; +aaoiw; +aaoix; +aaoiy; +aaoiz; +aaoja; +aaojb; +aaojc; +aaojd; +aaoje; +aaojf; +aaojg; +aaojh; +aaoji; +aaojj; +aaojk; +aaojl; +aaojm; +aaojn; +aaojo; +aaojp; +aaojq; +aaojr; +aaojs; +aaojt; +aaoju; +aaojv; +aaojw; +aaojx; +aaojy; +aaojz; +aaoka; +aaokb; +aaokc; +aaokd; +aaoke; +aaokf; +aaokg; +aaokh; +aaoki; +aaokj; +aaokk; +aaokl; +aaokm; +aaokn; +aaoko; +aaokp; +aaokq; +aaokr; +aaoks; +aaokt; +aaoku; +aaokv; +aaokw; +aaokx; +aaoky; +aaokz; +aaola; +aaolb; +aaolc; +aaold; +aaole; +aaolf; +aaolg; +aaolh; +aaoli; +aaolj; +aaolk; +aaoll; +aaolm; +aaoln; +aaolo; +aaolp; +aaolq; +aaolr; +aaols; +aaolt; +aaolu; +aaolv; +aaolw; +aaolx; +aaoly; +aaolz; +aaoma; +aaomb; +aaomc; +aaomd; +aaome; +aaomf; +aaomg; +aaomh; +aaomi; +aaomj; +aaomk; +aaoml; +aaomm; +aaomn; +aaomo; +aaomp; +aaomq; +aaomr; +aaoms; +aaomt; +aaomu; +aaomv; +aaomw; +aaomx; +aaomy; +aaomz; +aaona; +aaonb; +aaonc; +aaond; +aaone; +aaonf; +aaong; +aaonh; +aaoni; +aaonj; +aaonk; +aaonl; +aaonm; +aaonn; +aaono; +aaonp; +aaonq; +aaonr; +aaons; +aaont; +aaonu; +aaonv; +aaonw; +aaonx; +aaony; +aaonz; +aaooa; +aaoob; +aaooc; +aaood; +aaooe; +aaoof; +aaoog; +aaooh; +aaooi; +aaooj; +aaook; +aaool; +aaoom; +aaoon; +aaooo; +aaoop; +aaooq; +aaoor; +aaoos; +aaoot; +aaoou; +aaoov; +aaoow; +aaoox; +aaooy; +aaooz; +aaopa; +aaopb; +aaopc; +aaopd; +aaope; +aaopf; +aaopg; +aaoph; +aaopi; +aaopj; +aaopk; +aaopl; +aaopm; +aaopn; +aaopo; +aaopp; +aaopq; +aaopr; +aaops; +aaopt; +aaopu; +aaopv; +aaopw; +aaopx; +aaopy; +aaopz; +aaoqa; +aaoqb; +aaoqc; +aaoqd; +aaoqe; +aaoqf; +aaoqg; +aaoqh; +aaoqi; +aaoqj; +aaoqk; +aaoql; +aaoqm; +aaoqn; +aaoqo; +aaoqp; +aaoqq; +aaoqr; +aaoqs; +aaoqt; +aaoqu; +aaoqv; +aaoqw; +aaoqx; +aaoqy; +aaoqz; +aaora; +aaorb; +aaorc; +aaord; +aaore; +aaorf; +aaorg; +aaorh; +aaori; +aaorj; +aaork; +aaorl; +aaorm; +aaorn; +aaoro; +aaorp; +aaorq; +aaorr; +aaors; +aaort; +aaoru; +aaorv; +aaorw; +aaorx; +aaory; +aaorz; +aaosa; +aaosb; +aaosc; +aaosd; +aaose; +aaosf; +aaosg; +aaosh; +aaosi; +aaosj; +aaosk; +aaosl; +aaosm; +aaosn; +aaoso; +aaosp; +aaosq; +aaosr; +aaoss; +aaost; +aaosu; +aaosv; +aaosw; +aaosx; +aaosy; +aaosz; +aaota; +aaotb; +aaotc; +aaotd; +aaote; +aaotf; +aaotg; +aaoth; +aaoti; +aaotj; +aaotk; +aaotl; +aaotm; +aaotn; +aaoto; +aaotp; +aaotq; +aaotr; +aaots; +aaott; +aaotu; +aaotv; +aaotw; +aaotx; +aaoty; +aaotz; +aaoua; +aaoub; +aaouc; +aaoud; +aaoue; +aaouf; +aaoug; +aaouh; +aaoui; +aaouj; +aaouk; +aaoul; +aaoum; +aaoun; +aaouo; +aaoup; +aaouq; +aaour; +aaous; +aaout; +aaouu; +aaouv; +aaouw; +aaoux; +aaouy; +aaouz; +aaova; +aaovb; +aaovc; +aaovd; +aaove; +aaovf; +aaovg; +aaovh; +aaovi; +aaovj; +aaovk; +aaovl; +aaovm; +aaovn; +aaovo; +aaovp; +aaovq; +aaovr; +aaovs; +aaovt; +aaovu; +aaovv; +aaovw; +aaovx; +aaovy; +aaovz; +aaowa; +aaowb; +aaowc; +aaowd; +aaowe; +aaowf; +aaowg; +aaowh; +aaowi; +aaowj; +aaowk; +aaowl; +aaowm; +aaown; +aaowo; +aaowp; +aaowq; +aaowr; +aaows; +aaowt; +aaowu; +aaowv; +aaoww; +aaowx; +aaowy; +aaowz; +aaoxa; +aaoxb; +aaoxc; +aaoxd; +aaoxe; +aaoxf; +aaoxg; +aaoxh; +aaoxi; +aaoxj; +aaoxk; +aaoxl; +aaoxm; +aaoxn; +aaoxo; +aaoxp; +aaoxq; +aaoxr; +aaoxs; +aaoxt; +aaoxu; +aaoxv; +aaoxw; +aaoxx; +aaoxy; +aaoxz; +aaoya; +aaoyb; +aaoyc; +aaoyd; +aaoye; +aaoyf; +aaoyg; +aaoyh; +aaoyi; +aaoyj; +aaoyk; +aaoyl; +aaoym; +aaoyn; +aaoyo; +aaoyp; +aaoyq; +aaoyr; +aaoys; +aaoyt; +aaoyu; +aaoyv; +aaoyw; +aaoyx; +aaoyy; +aaoyz; +aaoza; +aaozb; +aaozc; +aaozd; +aaoze; +aaozf; +aaozg; +aaozh; +aaozi; +aaozj; +aaozk; +aaozl; +aaozm; +aaozn; +aaozo; +aaozp; +aaozq; +aaozr; +aaozs; +aaozt; +aaozu; +aaozv; +aaozw; +aaozx; +aaozy; +aaozz; +aapaa; +aapab; +aapac; +aapad; +aapae; +aapaf; +aapag; +aapah; +aapai; +aapaj; +aapak; +aapal; +aapam; +aapan; +aapao; +aapap; +aapaq; +aapar; +aapas; +aapat; +aapau; +aapav; +aapaw; +aapax; +aapay; +aapaz; +aapba; +aapbb; +aapbc; +aapbd; +aapbe; +aapbf; +aapbg; +aapbh; +aapbi; +aapbj; +aapbk; +aapbl; +aapbm; +aapbn; +aapbo; +aapbp; +aapbq; +aapbr; +aapbs; +aapbt; +aapbu; +aapbv; +aapbw; +aapbx; +aapby; +aapbz; +aapca; +aapcb; +aapcc; +aapcd; +aapce; +aapcf; +aapcg; +aapch; +aapci; +aapcj; +aapck; +aapcl; +aapcm; +aapcn; +aapco; +aapcp; +aapcq; +aapcr; +aapcs; +aapct; +aapcu; +aapcv; +aapcw; +aapcx; +aapcy; +aapcz; +aapda; +aapdb; +aapdc; +aapdd; +aapde; +aapdf; +aapdg; +aapdh; +aapdi; +aapdj; +aapdk; +aapdl; +aapdm; +aapdn; +aapdo; +aapdp; +aapdq; +aapdr; +aapds; +aapdt; +aapdu; +aapdv; +aapdw; +aapdx; +aapdy; +aapdz; +aapea; +aapeb; +aapec; +aaped; +aapee; +aapef; +aapeg; +aapeh; +aapei; +aapej; +aapek; +aapel; +aapem; +aapen; +aapeo; +aapep; +aapeq; +aaper; +aapes; +aapet; +aapeu; +aapev; +aapew; +aapex; +aapey; +aapez; +aapfa; +aapfb; +aapfc; +aapfd; +aapfe; +aapff; +aapfg; +aapfh; +aapfi; +aapfj; +aapfk; +aapfl; +aapfm; +aapfn; +aapfo; +aapfp; +aapfq; +aapfr; +aapfs; +aapft; +aapfu; +aapfv; +aapfw; +aapfx; +aapfy; +aapfz; +aapga; +aapgb; +aapgc; +aapgd; +aapge; +aapgf; +aapgg; +aapgh; +aapgi; +aapgj; +aapgk; +aapgl; +aapgm; +aapgn; +aapgo; +aapgp; +aapgq; +aapgr; +aapgs; +aapgt; +aapgu; +aapgv; +aapgw; +aapgx; +aapgy; +aapgz; +aapha; +aaphb; +aaphc; +aaphd; +aaphe; +aaphf; +aaphg; +aaphh; +aaphi; +aaphj; +aaphk; +aaphl; +aaphm; +aaphn; +aapho; +aaphp; +aaphq; +aaphr; +aaphs; +aapht; +aaphu; +aaphv; +aaphw; +aaphx; +aaphy; +aaphz; +aapia; +aapib; +aapic; +aapid; +aapie; +aapif; +aapig; +aapih; +aapii; +aapij; +aapik; +aapil; +aapim; +aapin; +aapio; +aapip; +aapiq; +aapir; +aapis; +aapit; +aapiu; +aapiv; +aapiw; +aapix; +aapiy; +aapiz; +aapja; +aapjb; +aapjc; +aapjd; +aapje; +aapjf; +aapjg; +aapjh; +aapji; +aapjj; +aapjk; +aapjl; +aapjm; +aapjn; +aapjo; +aapjp; +aapjq; +aapjr; +aapjs; +aapjt; +aapju; +aapjv; +aapjw; +aapjx; +aapjy; +aapjz; +aapka; +aapkb; +aapkc; +aapkd; +aapke; +aapkf; +aapkg; +aapkh; +aapki; +aapkj; +aapkk; +aapkl; +aapkm; +aapkn; +aapko; +aapkp; +aapkq; +aapkr; +aapks; +aapkt; +aapku; +aapkv; +aapkw; +aapkx; +aapky; +aapkz; +aapla; +aaplb; +aaplc; +aapld; +aaple; +aaplf; +aaplg; +aaplh; +aapli; +aaplj; +aaplk; +aapll; +aaplm; +aapln; +aaplo; +aaplp; +aaplq; +aaplr; +aapls; +aaplt; +aaplu; +aaplv; +aaplw; +aaplx; +aaply; +aaplz; +aapma; +aapmb; +aapmc; +aapmd; +aapme; +aapmf; +aapmg; +aapmh; +aapmi; +aapmj; +aapmk; +aapml; +aapmm; +aapmn; +aapmo; +aapmp; +aapmq; +aapmr; +aapms; +aapmt; +aapmu; +aapmv; +aapmw; +aapmx; +aapmy; +aapmz; +aapna; +aapnb; +aapnc; +aapnd; +aapne; +aapnf; +aapng; +aapnh; +aapni; +aapnj; +aapnk; +aapnl; +aapnm; +aapnn; +aapno; +aapnp; +aapnq; +aapnr; +aapns; +aapnt; +aapnu; +aapnv; +aapnw; +aapnx; +aapny; +aapnz; +aapoa; +aapob; +aapoc; +aapod; +aapoe; +aapof; +aapog; +aapoh; +aapoi; +aapoj; +aapok; +aapol; +aapom; +aapon; +aapoo; +aapop; +aapoq; +aapor; +aapos; +aapot; +aapou; +aapov; +aapow; +aapox; +aapoy; +aapoz; +aappa; +aappb; +aappc; +aappd; +aappe; +aappf; +aappg; +aapph; +aappi; +aappj; +aappk; +aappl; +aappm; +aappn; +aappo; +aappp; +aappq; +aappr; +aapps; +aappt; +aappu; +aappv; +aappw; +aappx; +aappy; +aappz; +aapqa; +aapqb; +aapqc; +aapqd; +aapqe; +aapqf; +aapqg; +aapqh; +aapqi; +aapqj; +aapqk; +aapql; +aapqm; +aapqn; +aapqo; +aapqp; +aapqq; +aapqr; +aapqs; +aapqt; +aapqu; +aapqv; +aapqw; +aapqx; +aapqy; +aapqz; +aapra; +aaprb; +aaprc; +aaprd; +aapre; +aaprf; +aaprg; +aaprh; +aapri; +aaprj; +aaprk; +aaprl; +aaprm; +aaprn; +aapro; +aaprp; +aaprq; +aaprr; +aaprs; +aaprt; +aapru; +aaprv; +aaprw; +aaprx; +aapry; +aaprz; +aapsa; +aapsb; +aapsc; +aapsd; +aapse; +aapsf; +aapsg; +aapsh; +aapsi; +aapsj; +aapsk; +aapsl; +aapsm; +aapsn; +aapso; +aapsp; +aapsq; +aapsr; +aapss; +aapst; +aapsu; +aapsv; +aapsw; +aapsx; +aapsy; +aapsz; +aapta; +aaptb; +aaptc; +aaptd; +aapte; +aaptf; +aaptg; +aapth; +aapti; +aaptj; +aaptk; +aaptl; +aaptm; +aaptn; +aapto; +aaptp; +aaptq; +aaptr; +aapts; +aaptt; +aaptu; +aaptv; +aaptw; +aaptx; +aapty; +aaptz; +aapua; +aapub; +aapuc; +aapud; +aapue; +aapuf; +aapug; +aapuh; +aapui; +aapuj; +aapuk; +aapul; +aapum; +aapun; +aapuo; +aapup; +aapuq; +aapur; +aapus; +aaput; +aapuu; +aapuv; +aapuw; +aapux; +aapuy; +aapuz; +aapva; +aapvb; +aapvc; +aapvd; +aapve; +aapvf; +aapvg; +aapvh; +aapvi; +aapvj; +aapvk; +aapvl; +aapvm; +aapvn; +aapvo; +aapvp; +aapvq; +aapvr; +aapvs; +aapvt; +aapvu; +aapvv; +aapvw; +aapvx; +aapvy; +aapvz; +aapwa; +aapwb; +aapwc; +aapwd; +aapwe; +aapwf; +aapwg; +aapwh; +aapwi; +aapwj; +aapwk; +aapwl; +aapwm; +aapwn; +aapwo; +aapwp; +aapwq; +aapwr; +aapws; +aapwt; +aapwu; +aapwv; +aapww; +aapwx; +aapwy; +aapwz; +aapxa; +aapxb; +aapxc; +aapxd; +aapxe; +aapxf; +aapxg; +aapxh; +aapxi; +aapxj; +aapxk; +aapxl; +aapxm; +aapxn; +aapxo; +aapxp; +aapxq; +aapxr; +aapxs; +aapxt; +aapxu; +aapxv; +aapxw; +aapxx; +aapxy; +aapxz; +aapya; +aapyb; +aapyc; +aapyd; +aapye; +aapyf; +aapyg; +aapyh; +aapyi; +aapyj; +aapyk; +aapyl; +aapym; +aapyn; +aapyo; +aapyp; +aapyq; +aapyr; +aapys; +aapyt; +aapyu; +aapyv; +aapyw; +aapyx; +aapyy; +aapyz; +aapza; +aapzb; +aapzc; +aapzd; +aapze; +aapzf; +aapzg; +aapzh; +aapzi; +aapzj; +aapzk; +aapzl; +aapzm; +aapzn; +aapzo; +aapzp; +aapzq; +aapzr; +aapzs; +aapzt; +aapzu; +aapzv; +aapzw; +aapzx; +aapzy; +aapzz; +aaqaa; +aaqab; +aaqac; +aaqad; +aaqae; +aaqaf; +aaqag; +aaqah; +aaqai; +aaqaj; +aaqak; +aaqal; +aaqam; +aaqan; +aaqao; +aaqap; +aaqaq; +aaqar; +aaqas; +aaqat; +aaqau; +aaqav; +aaqaw; +aaqax; +aaqay; +aaqaz; +aaqba; +aaqbb; +aaqbc; +aaqbd; +aaqbe; +aaqbf; +aaqbg; +aaqbh; +aaqbi; +aaqbj; +aaqbk; +aaqbl; +aaqbm; +aaqbn; +aaqbo; +aaqbp; +aaqbq; +aaqbr; +aaqbs; +aaqbt; +aaqbu; +aaqbv; +aaqbw; +aaqbx; +aaqby; +aaqbz; +aaqca; +aaqcb; +aaqcc; +aaqcd; +aaqce; +aaqcf; +aaqcg; +aaqch; +aaqci; +aaqcj; +aaqck; +aaqcl; +aaqcm; +aaqcn; +aaqco; +aaqcp; +aaqcq; +aaqcr; +aaqcs; +aaqct; +aaqcu; +aaqcv; +aaqcw; +aaqcx; +aaqcy; +aaqcz; +aaqda; +aaqdb; +aaqdc; +aaqdd; +aaqde; +aaqdf; +aaqdg; +aaqdh; +aaqdi; +aaqdj; +aaqdk; +aaqdl; +aaqdm; +aaqdn; +aaqdo; +aaqdp; +aaqdq; +aaqdr; +aaqds; +aaqdt; +aaqdu; +aaqdv; +aaqdw; +aaqdx; +aaqdy; +aaqdz; +aaqea; +aaqeb; +aaqec; +aaqed; +aaqee; +aaqef; +aaqeg; +aaqeh; +aaqei; +aaqej; +aaqek; +aaqel; +aaqem; +aaqen; +aaqeo; +aaqep; +aaqeq; +aaqer; +aaqes; +aaqet; +aaqeu; +aaqev; +aaqew; +aaqex; +aaqey; +aaqez; +aaqfa; +aaqfb; +aaqfc; +aaqfd; +aaqfe; +aaqff; +aaqfg; +aaqfh; +aaqfi; +aaqfj; +aaqfk; +aaqfl; +aaqfm; +aaqfn; +aaqfo; +aaqfp; +aaqfq; +aaqfr; +aaqfs; +aaqft; +aaqfu; +aaqfv; +aaqfw; +aaqfx; +aaqfy; +aaqfz; +aaqga; +aaqgb; +aaqgc; +aaqgd; +aaqge; +aaqgf; +aaqgg; +aaqgh; +aaqgi; +aaqgj; +aaqgk; +aaqgl; +aaqgm; +aaqgn; +aaqgo; +aaqgp; +aaqgq; +aaqgr; +aaqgs; +aaqgt; +aaqgu; +aaqgv; +aaqgw; +aaqgx; +aaqgy; +aaqgz; +aaqha; +aaqhb; +aaqhc; +aaqhd; +aaqhe; +aaqhf; +aaqhg; +aaqhh; +aaqhi; +aaqhj; +aaqhk; +aaqhl; +aaqhm; +aaqhn; +aaqho; +aaqhp; +aaqhq; +aaqhr; +aaqhs; +aaqht; +aaqhu; +aaqhv; +aaqhw; +aaqhx; +aaqhy; +aaqhz; +aaqia; +aaqib; +aaqic; +aaqid; +aaqie; +aaqif; +aaqig; +aaqih; +aaqii; +aaqij; +aaqik; +aaqil; +aaqim; +aaqin; +aaqio; +aaqip; +aaqiq; +aaqir; +aaqis; +aaqit; +aaqiu; +aaqiv; +aaqiw; +aaqix; +aaqiy; +aaqiz; +aaqja; +aaqjb; +aaqjc; +aaqjd; +aaqje; +aaqjf; +aaqjg; +aaqjh; +aaqji; +aaqjj; +aaqjk; +aaqjl; +aaqjm; +aaqjn; +aaqjo; +aaqjp; +aaqjq; +aaqjr; +aaqjs; +aaqjt; +aaqju; +aaqjv; +aaqjw; +aaqjx; +aaqjy; +aaqjz; +aaqka; +aaqkb; +aaqkc; +aaqkd; +aaqke; +aaqkf; +aaqkg; +aaqkh; +aaqki; +aaqkj; +aaqkk; +aaqkl; +aaqkm; +aaqkn; +aaqko; +aaqkp; +aaqkq; +aaqkr; +aaqks; +aaqkt; +aaqku; +aaqkv; +aaqkw; +aaqkx; +aaqky; +aaqkz; +aaqla; +aaqlb; +aaqlc; +aaqld; +aaqle; +aaqlf; +aaqlg; +aaqlh; +aaqli; +aaqlj; +aaqlk; +aaqll; +aaqlm; +aaqln; +aaqlo; +aaqlp; +aaqlq; +aaqlr; +aaqls; +aaqlt; +aaqlu; +aaqlv; +aaqlw; +aaqlx; +aaqly; +aaqlz; +aaqma; +aaqmb; +aaqmc; +aaqmd; +aaqme; +aaqmf; +aaqmg; +aaqmh; +aaqmi; +aaqmj; +aaqmk; +aaqml; +aaqmm; +aaqmn; +aaqmo; +aaqmp; +aaqmq; +aaqmr; +aaqms; +aaqmt; +aaqmu; +aaqmv; +aaqmw; +aaqmx; +aaqmy; +aaqmz; +aaqna; +aaqnb; +aaqnc; +aaqnd; +aaqne; +aaqnf; +aaqng; +aaqnh; +aaqni; +aaqnj; +aaqnk; +aaqnl; +aaqnm; +aaqnn; +aaqno; +aaqnp; +aaqnq; +aaqnr; +aaqns; +aaqnt; +aaqnu; +aaqnv; +aaqnw; +aaqnx; +aaqny; +aaqnz; +aaqoa; +aaqob; +aaqoc; +aaqod; +aaqoe; +aaqof; +aaqog; +aaqoh; +aaqoi; +aaqoj; +aaqok; +aaqol; +aaqom; +aaqon; +aaqoo; +aaqop; +aaqoq; +aaqor; +aaqos; +aaqot; +aaqou; +aaqov; +aaqow; +aaqox; +aaqoy; +aaqoz; +aaqpa; +aaqpb; +aaqpc; +aaqpd; +aaqpe; +aaqpf; +aaqpg; +aaqph; +aaqpi; +aaqpj; +aaqpk; +aaqpl; +aaqpm; +aaqpn; +aaqpo; +aaqpp; +aaqpq; +aaqpr; +aaqps; +aaqpt; +aaqpu; +aaqpv; +aaqpw; +aaqpx; +aaqpy; +aaqpz; +aaqqa; +aaqqb; +aaqqc; +aaqqd; +aaqqe; +aaqqf; +aaqqg; +aaqqh; +aaqqi; +aaqqj; +aaqqk; +aaqql; +aaqqm; +aaqqn; +aaqqo; +aaqqp; +aaqqq; +aaqqr; +aaqqs; +aaqqt; +aaqqu; +aaqqv; +aaqqw; +aaqqx; +aaqqy; +aaqqz; +aaqra; +aaqrb; +aaqrc; +aaqrd; +aaqre; +aaqrf; +aaqrg; +aaqrh; +aaqri; +aaqrj; +aaqrk; +aaqrl; +aaqrm; +aaqrn; +aaqro; +aaqrp; +aaqrq; +aaqrr; +aaqrs; +aaqrt; +aaqru; +aaqrv; +aaqrw; +aaqrx; +aaqry; +aaqrz; +aaqsa; +aaqsb; +aaqsc; +aaqsd; +aaqse; +aaqsf; +aaqsg; +aaqsh; +aaqsi; +aaqsj; +aaqsk; +aaqsl; +aaqsm; +aaqsn; +aaqso; +aaqsp; +aaqsq; +aaqsr; +aaqss; +aaqst; +aaqsu; +aaqsv; +aaqsw; +aaqsx; +aaqsy; +aaqsz; +aaqta; +aaqtb; +aaqtc; +aaqtd; +aaqte; +aaqtf; +aaqtg; +aaqth; +aaqti; +aaqtj; +aaqtk; +aaqtl; +aaqtm; +aaqtn; +aaqto; +aaqtp; +aaqtq; +aaqtr; +aaqts; +aaqtt; +aaqtu; +aaqtv; +aaqtw; +aaqtx; +aaqty; +aaqtz; +aaqua; +aaqub; +aaquc; +aaqud; +aaque; +aaquf; +aaqug; +aaquh; +aaqui; +aaquj; +aaquk; +aaqul; +aaqum; +aaqun; +aaquo; +aaqup; +aaquq; +aaqur; +aaqus; +aaqut; +aaquu; +aaquv; +aaquw; +aaqux; +aaquy; +aaquz; +aaqva; +aaqvb; +aaqvc; +aaqvd; +aaqve; +aaqvf; +aaqvg; +aaqvh; +aaqvi; +aaqvj; +aaqvk; +aaqvl; +aaqvm; +aaqvn; +aaqvo; +aaqvp; +aaqvq; +aaqvr; +aaqvs; +aaqvt; +aaqvu; +aaqvv; +aaqvw; +aaqvx; +aaqvy; +aaqvz; +aaqwa; +aaqwb; +aaqwc; +aaqwd; +aaqwe; +aaqwf; +aaqwg; +aaqwh; +aaqwi; +aaqwj; +aaqwk; +aaqwl; +aaqwm; +aaqwn; +aaqwo; +aaqwp; +aaqwq; +aaqwr; +aaqws; +aaqwt; +aaqwu; +aaqwv; +aaqww; +aaqwx; +aaqwy; +aaqwz; +aaqxa; +aaqxb; +aaqxc; +aaqxd; +aaqxe; +aaqxf; +aaqxg; +aaqxh; +aaqxi; +aaqxj; +aaqxk; +aaqxl; +aaqxm; +aaqxn; +aaqxo; +aaqxp; +aaqxq; +aaqxr; +aaqxs; +aaqxt; +aaqxu; +aaqxv; +aaqxw; +aaqxx; +aaqxy; +aaqxz; +aaqya; +aaqyb; +aaqyc; +aaqyd; +aaqye; +aaqyf; +aaqyg; +aaqyh; +aaqyi; +aaqyj; +aaqyk; +aaqyl; +aaqym; +aaqyn; +aaqyo; +aaqyp; +aaqyq; +aaqyr; +aaqys; +aaqyt; +aaqyu; +aaqyv; +aaqyw; +aaqyx; +aaqyy; +aaqyz; +aaqza; +aaqzb; +aaqzc; +aaqzd; +aaqze; +aaqzf; +aaqzg; +aaqzh; +aaqzi; +aaqzj; +aaqzk; +aaqzl; +aaqzm; +aaqzn; +aaqzo; +aaqzp; +aaqzq; +aaqzr; +aaqzs; +aaqzt; +aaqzu; +aaqzv; +aaqzw; +aaqzx; +aaqzy; +aaqzz; +aaraa; +aarab; +aarac; +aarad; +aarae; +aaraf; +aarag; +aarah; +aarai; +aaraj; +aarak; +aaral; +aaram; +aaran; +aarao; +aarap; +aaraq; +aarar; +aaras; +aarat; +aarau; +aarav; +aaraw; +aarax; +aaray; +aaraz; +aarba; +aarbb; +aarbc; +aarbd; +aarbe; +aarbf; +aarbg; +aarbh; +aarbi; +aarbj; +aarbk; +aarbl; +aarbm; +aarbn; +aarbo; +aarbp; +aarbq; +aarbr; +aarbs; +aarbt; +aarbu; +aarbv; +aarbw; +aarbx; +aarby; +aarbz; +aarca; +aarcb; +aarcc; +aarcd; +aarce; +aarcf; +aarcg; +aarch; +aarci; +aarcj; +aarck; +aarcl; +aarcm; +aarcn; +aarco; +aarcp; +aarcq; +aarcr; +aarcs; +aarct; +aarcu; +aarcv; +aarcw; +aarcx; +aarcy; +aarcz; +aarda; +aardb; +aardc; +aardd; +aarde; +aardf; +aardg; +aardh; +aardi; +aardj; +aardk; +aardl; +aardm; +aardn; +aardo; +aardp; +aardq; +aardr; +aards; +aardt; +aardu; +aardv; +aardw; +aardx; +aardy; +aardz; +aarea; +aareb; +aarec; +aared; +aaree; +aaref; +aareg; +aareh; +aarei; +aarej; +aarek; +aarel; +aarem; +aaren; +aareo; +aarep; +aareq; +aarer; +aares; +aaret; +aareu; +aarev; +aarew; +aarex; +aarey; +aarez; +aarfa; +aarfb; +aarfc; +aarfd; +aarfe; +aarff; +aarfg; +aarfh; +aarfi; +aarfj; +aarfk; +aarfl; +aarfm; +aarfn; +aarfo; +aarfp; +aarfq; +aarfr; +aarfs; +aarft; +aarfu; +aarfv; +aarfw; +aarfx; +aarfy; +aarfz; +aarga; +aargb; +aargc; +aargd; +aarge; +aargf; +aargg; +aargh; +aargi; +aargj; +aargk; +aargl; +aargm; +aargn; +aargo; +aargp; +aargq; +aargr; +aargs; +aargt; +aargu; +aargv; +aargw; +aargx; +aargy; +aargz; +aarha; +aarhb; +aarhc; +aarhd; +aarhe; +aarhf; +aarhg; +aarhh; +aarhi; +aarhj; +aarhk; +aarhl; +aarhm; +aarhn; +aarho; +aarhp; +aarhq; +aarhr; +aarhs; +aarht; +aarhu; +aarhv; +aarhw; +aarhx; +aarhy; +aarhz; +aaria; +aarib; +aaric; +aarid; +aarie; +aarif; +aarig; +aarih; +aarii; +aarij; +aarik; +aaril; +aarim; +aarin; +aario; +aarip; +aariq; +aarir; +aaris; +aarit; +aariu; +aariv; +aariw; +aarix; +aariy; +aariz; +aarja; +aarjb; +aarjc; +aarjd; +aarje; +aarjf; +aarjg; +aarjh; +aarji; +aarjj; +aarjk; +aarjl; +aarjm; +aarjn; +aarjo; +aarjp; +aarjq; +aarjr; +aarjs; +aarjt; +aarju; +aarjv; +aarjw; +aarjx; +aarjy; +aarjz; +aarka; +aarkb; +aarkc; +aarkd; +aarke; +aarkf; +aarkg; +aarkh; +aarki; +aarkj; +aarkk; +aarkl; +aarkm; +aarkn; +aarko; +aarkp; +aarkq; +aarkr; +aarks; +aarkt; +aarku; +aarkv; +aarkw; +aarkx; +aarky; +aarkz; +aarla; +aarlb; +aarlc; +aarld; +aarle; +aarlf; +aarlg; +aarlh; +aarli; +aarlj; +aarlk; +aarll; +aarlm; +aarln; +aarlo; +aarlp; +aarlq; +aarlr; +aarls; +aarlt; +aarlu; +aarlv; +aarlw; +aarlx; +aarly; +aarlz; +aarma; +aarmb; +aarmc; +aarmd; +aarme; +aarmf; +aarmg; +aarmh; +aarmi; +aarmj; +aarmk; +aarml; +aarmm; +aarmn; +aarmo; +aarmp; +aarmq; +aarmr; +aarms; +aarmt; +aarmu; +aarmv; +aarmw; +aarmx; +aarmy; +aarmz; +aarna; +aarnb; +aarnc; +aarnd; +aarne; +aarnf; +aarng; +aarnh; +aarni; +aarnj; +aarnk; +aarnl; +aarnm; +aarnn; +aarno; +aarnp; +aarnq; +aarnr; +aarns; +aarnt; +aarnu; +aarnv; +aarnw; +aarnx; +aarny; +aarnz; +aaroa; +aarob; +aaroc; +aarod; +aaroe; +aarof; +aarog; +aaroh; +aaroi; +aaroj; +aarok; +aarol; +aarom; +aaron; +aaroo; +aarop; +aaroq; +aaror; +aaros; +aarot; +aarou; +aarov; +aarow; +aarox; +aaroy; +aaroz; +aarpa; +aarpb; +aarpc; +aarpd; +aarpe; +aarpf; +aarpg; +aarph; +aarpi; +aarpj; +aarpk; +aarpl; +aarpm; +aarpn; +aarpo; +aarpp; +aarpq; +aarpr; +aarps; +aarpt; +aarpu; +aarpv; +aarpw; +aarpx; +aarpy; +aarpz; +aarqa; +aarqb; +aarqc; +aarqd; +aarqe; +aarqf; +aarqg; +aarqh; +aarqi; +aarqj; +aarqk; +aarql; +aarqm; +aarqn; +aarqo; +aarqp; +aarqq; +aarqr; +aarqs; +aarqt; +aarqu; +aarqv; +aarqw; +aarqx; +aarqy; +aarqz; +aarra; +aarrb; +aarrc; +aarrd; +aarre; +aarrf; +aarrg; +aarrh; +aarri; +aarrj; +aarrk; +aarrl; +aarrm; +aarrn; +aarro; +aarrp; +aarrq; +aarrr; +aarrs; +aarrt; +aarru; +aarrv; +aarrw; +aarrx; +aarry; +aarrz; +aarsa; +aarsb; +aarsc; +aarsd; +aarse; +aarsf; +aarsg; +aarsh; +aarsi; +aarsj; +aarsk; +aarsl; +aarsm; +aarsn; +aarso; +aarsp; +aarsq; +aarsr; +aarss; +aarst; +aarsu; +aarsv; +aarsw; +aarsx; +aarsy; +aarsz; +aarta; +aartb; +aartc; +aartd; +aarte; +aartf; +aartg; +aarth; +aarti; +aartj; +aartk; +aartl; +aartm; +aartn; +aarto; +aartp; +aartq; +aartr; +aarts; +aartt; +aartu; +aartv; +aartw; +aartx; +aarty; +aartz; +aarua; +aarub; +aaruc; +aarud; +aarue; +aaruf; +aarug; +aaruh; +aarui; +aaruj; +aaruk; +aarul; +aarum; +aarun; +aaruo; +aarup; +aaruq; +aarur; +aarus; +aarut; +aaruu; +aaruv; +aaruw; +aarux; +aaruy; +aaruz; +aarva; +aarvb; +aarvc; +aarvd; +aarve; +aarvf; +aarvg; +aarvh; +aarvi; +aarvj; +aarvk; +aarvl; +aarvm; +aarvn; +aarvo; +aarvp; +aarvq; +aarvr; +aarvs; +aarvt; +aarvu; +aarvv; +aarvw; +aarvx; +aarvy; +aarvz; +aarwa; +aarwb; +aarwc; +aarwd; +aarwe; +aarwf; +aarwg; +aarwh; +aarwi; +aarwj; +aarwk; +aarwl; +aarwm; +aarwn; +aarwo; +aarwp; +aarwq; +aarwr; +aarws; +aarwt; +aarwu; +aarwv; +aarww; +aarwx; +aarwy; +aarwz; +aarxa; +aarxb; +aarxc; +aarxd; +aarxe; +aarxf; +aarxg; +aarxh; +aarxi; +aarxj; +aarxk; +aarxl; +aarxm; +aarxn; +aarxo; +aarxp; +aarxq; +aarxr; +aarxs; +aarxt; +aarxu; +aarxv; +aarxw; +aarxx; +aarxy; +aarxz; +aarya; +aaryb; +aaryc; +aaryd; +aarye; +aaryf; +aaryg; +aaryh; +aaryi; +aaryj; +aaryk; +aaryl; +aarym; +aaryn; +aaryo; +aaryp; +aaryq; +aaryr; +aarys; +aaryt; +aaryu; +aaryv; +aaryw; +aaryx; +aaryy; +aaryz; +aarza; +aarzb; +aarzc; +aarzd; +aarze; +aarzf; +aarzg; +aarzh; +aarzi; +aarzj; +aarzk; +aarzl; +aarzm; +aarzn; +aarzo; +aarzp; +aarzq; +aarzr; +aarzs; +aarzt; +aarzu; +aarzv; +aarzw; +aarzx; +aarzy; +aarzz; +aasaa; +aasab; +aasac; +aasad; +aasae; +aasaf; +aasag; +aasah; +aasai; +aasaj; +aasak; +aasal; +aasam; +aasan; +aasao; +aasap; +aasaq; +aasar; +aasas; +aasat; +aasau; +aasav; +aasaw; +aasax; +aasay; +aasaz; +aasba; +aasbb; +aasbc; +aasbd; +aasbe; +aasbf; +aasbg; +aasbh; +aasbi; +aasbj; +aasbk; +aasbl; +aasbm; +aasbn; +aasbo; +aasbp; +aasbq; +aasbr; +aasbs; +aasbt; +aasbu; +aasbv; +aasbw; +aasbx; +aasby; +aasbz; +aasca; +aascb; +aascc; +aascd; +aasce; +aascf; +aascg; +aasch; +aasci; +aascj; +aasck; +aascl; +aascm; +aascn; +aasco; +aascp; +aascq; +aascr; +aascs; +aasct; +aascu; +aascv; +aascw; +aascx; +aascy; +aascz; +aasda; +aasdb; +aasdc; +aasdd; +aasde; +aasdf; +aasdg; +aasdh; +aasdi; +aasdj; +aasdk; +aasdl; +aasdm; +aasdn; +aasdo; +aasdp; +aasdq; +aasdr; +aasds; +aasdt; +aasdu; +aasdv; +aasdw; +aasdx; +aasdy; +aasdz; +aasea; +aaseb; +aasec; +aased; +aasee; +aasef; +aaseg; +aaseh; +aasei; +aasej; +aasek; +aasel; +aasem; +aasen; +aaseo; +aasep; +aaseq; +aaser; +aases; +aaset; +aaseu; +aasev; +aasew; +aasex; +aasey; +aasez; +aasfa; +aasfb; +aasfc; +aasfd; +aasfe; +aasff; +aasfg; +aasfh; +aasfi; +aasfj; +aasfk; +aasfl; +aasfm; +aasfn; +aasfo; +aasfp; +aasfq; +aasfr; +aasfs; +aasft; +aasfu; +aasfv; +aasfw; +aasfx; +aasfy; +aasfz; +aasga; +aasgb; +aasgc; +aasgd; +aasge; +aasgf; +aasgg; +aasgh; +aasgi; +aasgj; +aasgk; +aasgl; +aasgm; +aasgn; +aasgo; +aasgp; +aasgq; +aasgr; +aasgs; +aasgt; +aasgu; +aasgv; +aasgw; +aasgx; +aasgy; +aasgz; +aasha; +aashb; +aashc; +aashd; +aashe; +aashf; +aashg; +aashh; +aashi; +aashj; +aashk; +aashl; +aashm; +aashn; +aasho; +aashp; +aashq; +aashr; +aashs; +aasht; +aashu; +aashv; +aashw; +aashx; +aashy; +aashz; +aasia; +aasib; +aasic; +aasid; +aasie; +aasif; +aasig; +aasih; +aasii; +aasij; +aasik; +aasil; +aasim; +aasin; +aasio; +aasip; +aasiq; +aasir; +aasis; +aasit; +aasiu; +aasiv; +aasiw; +aasix; +aasiy; +aasiz; +aasja; +aasjb; +aasjc; +aasjd; +aasje; +aasjf; +aasjg; +aasjh; +aasji; +aasjj; +aasjk; +aasjl; +aasjm; +aasjn; +aasjo; +aasjp; +aasjq; +aasjr; +aasjs; +aasjt; +aasju; +aasjv; +aasjw; +aasjx; +aasjy; +aasjz; +aaska; +aaskb; +aaskc; +aaskd; +aaske; +aaskf; +aaskg; +aaskh; +aaski; +aaskj; +aaskk; +aaskl; +aaskm; +aaskn; +aasko; +aaskp; +aaskq; +aaskr; +aasks; +aaskt; +aasku; +aaskv; +aaskw; +aaskx; +aasky; +aaskz; +aasla; +aaslb; +aaslc; +aasld; +aasle; +aaslf; +aaslg; +aaslh; +aasli; +aaslj; +aaslk; +aasll; +aaslm; +aasln; +aaslo; +aaslp; +aaslq; +aaslr; +aasls; +aaslt; +aaslu; +aaslv; +aaslw; +aaslx; +aasly; +aaslz; +aasma; +aasmb; +aasmc; +aasmd; +aasme; +aasmf; +aasmg; +aasmh; +aasmi; +aasmj; +aasmk; +aasml; +aasmm; +aasmn; +aasmo; +aasmp; +aasmq; +aasmr; +aasms; +aasmt; +aasmu; +aasmv; +aasmw; +aasmx; +aasmy; +aasmz; +aasna; +aasnb; +aasnc; +aasnd; +aasne; +aasnf; +aasng; +aasnh; +aasni; +aasnj; +aasnk; +aasnl; +aasnm; +aasnn; +aasno; +aasnp; +aasnq; +aasnr; +aasns; +aasnt; +aasnu; +aasnv; +aasnw; +aasnx; +aasny; +aasnz; +aasoa; +aasob; +aasoc; +aasod; +aasoe; +aasof; +aasog; +aasoh; +aasoi; +aasoj; +aasok; +aasol; +aasom; +aason; +aasoo; +aasop; +aasoq; +aasor; +aasos; +aasot; +aasou; +aasov; +aasow; +aasox; +aasoy; +aasoz; +aaspa; +aaspb; +aaspc; +aaspd; +aaspe; +aaspf; +aaspg; +aasph; +aaspi; +aaspj; +aaspk; +aaspl; +aaspm; +aaspn; +aaspo; +aaspp; +aaspq; +aaspr; +aasps; +aaspt; +aaspu; +aaspv; +aaspw; +aaspx; +aaspy; +aaspz; +aasqa; +aasqb; +aasqc; +aasqd; +aasqe; +aasqf; +aasqg; +aasqh; +aasqi; +aasqj; +aasqk; +aasql; +aasqm; +aasqn; +aasqo; +aasqp; +aasqq; +aasqr; +aasqs; +aasqt; +aasqu; +aasqv; +aasqw; +aasqx; +aasqy; +aasqz; +aasra; +aasrb; +aasrc; +aasrd; +aasre; +aasrf; +aasrg; +aasrh; +aasri; +aasrj; +aasrk; +aasrl; +aasrm; +aasrn; +aasro; +aasrp; +aasrq; +aasrr; +aasrs; +aasrt; +aasru; +aasrv; +aasrw; +aasrx; +aasry; +aasrz; +aassa; +aassb; +aassc; +aassd; +aasse; +aassf; +aassg; +aassh; +aassi; +aassj; +aassk; +aassl; +aassm; +aassn; +aasso; +aassp; +aassq; +aassr; +aasss; +aasst; +aassu; +aassv; +aassw; +aassx; +aassy; +aassz; +aasta; +aastb; +aastc; +aastd; +aaste; +aastf; +aastg; +aasth; +aasti; +aastj; +aastk; +aastl; +aastm; +aastn; +aasto; +aastp; +aastq; +aastr; +aasts; +aastt; +aastu; +aastv; +aastw; +aastx; +aasty; +aastz; +aasua; +aasub; +aasuc; +aasud; +aasue; +aasuf; +aasug; +aasuh; +aasui; +aasuj; +aasuk; +aasul; +aasum; +aasun; +aasuo; +aasup; +aasuq; +aasur; +aasus; +aasut; +aasuu; +aasuv; +aasuw; +aasux; +aasuy; +aasuz; +aasva; +aasvb; +aasvc; +aasvd; +aasve; +aasvf; +aasvg; +aasvh; +aasvi; +aasvj; +aasvk; +aasvl; +aasvm; +aasvn; +aasvo; +aasvp; +aasvq; +aasvr; +aasvs; +aasvt; +aasvu; +aasvv; +aasvw; +aasvx; +aasvy; +aasvz; +aaswa; +aaswb; +aaswc; +aaswd; +aaswe; +aaswf; +aaswg; +aaswh; +aaswi; +aaswj; +aaswk; +aaswl; +aaswm; +aaswn; +aaswo; +aaswp; +aaswq; +aaswr; +aasws; +aaswt; +aaswu; +aaswv; +aasww; +aaswx; +aaswy; +aaswz; +aasxa; +aasxb; +aasxc; +aasxd; +aasxe; +aasxf; +aasxg; +aasxh; +aasxi; +aasxj; +aasxk; +aasxl; +aasxm; +aasxn; +aasxo; +aasxp; +aasxq; +aasxr; +aasxs; +aasxt; +aasxu; +aasxv; +aasxw; +aasxx; +aasxy; +aasxz; +aasya; +aasyb; +aasyc; +aasyd; +aasye; +aasyf; +aasyg; +aasyh; +aasyi; +aasyj; +aasyk; +aasyl; +aasym; +aasyn; +aasyo; +aasyp; +aasyq; +aasyr; +aasys; +aasyt; +aasyu; +aasyv; +aasyw; +aasyx; +aasyy; +aasyz; +aasza; +aaszb; +aaszc; +aaszd; +aasze; +aaszf; +aaszg; +aaszh; +aaszi; +aaszj; +aaszk; +aaszl; +aaszm; +aaszn; +aaszo; +aaszp; +aaszq; +aaszr; +aaszs; +aaszt; +aaszu; +aaszv; +aaszw; +aaszx; +aaszy; +aaszz; +aataa; +aatab; +aatac; +aatad; +aatae; +aataf; +aatag; +aatah; +aatai; +aataj; +aatak; +aatal; +aatam; +aatan; +aatao; +aatap; +aataq; +aatar; +aatas; +aatat; +aatau; +aatav; +aataw; +aatax; +aatay; +aataz; +aatba; +aatbb; +aatbc; +aatbd; +aatbe; +aatbf; +aatbg; +aatbh; +aatbi; +aatbj; +aatbk; +aatbl; +aatbm; +aatbn; +aatbo; +aatbp; +aatbq; +aatbr; +aatbs; +aatbt; +aatbu; +aatbv; +aatbw; +aatbx; +aatby; +aatbz; +aatca; +aatcb; +aatcc; +aatcd; +aatce; +aatcf; +aatcg; +aatch; +aatci; +aatcj; +aatck; +aatcl; +aatcm; +aatcn; +aatco; +aatcp; +aatcq; +aatcr; +aatcs; +aatct; +aatcu; +aatcv; +aatcw; +aatcx; +aatcy; +aatcz; +aatda; +aatdb; +aatdc; +aatdd; +aatde; +aatdf; +aatdg; +aatdh; +aatdi; +aatdj; +aatdk; +aatdl; +aatdm; +aatdn; +aatdo; +aatdp; +aatdq; +aatdr; +aatds; +aatdt; +aatdu; +aatdv; +aatdw; +aatdx; +aatdy; +aatdz; +aatea; +aateb; +aatec; +aated; +aatee; +aatef; +aateg; +aateh; +aatei; +aatej; +aatek; +aatel; +aatem; +aaten; +aateo; +aatep; +aateq; +aater; +aates; +aatet; +aateu; +aatev; +aatew; +aatex; +aatey; +aatez; +aatfa; +aatfb; +aatfc; +aatfd; +aatfe; +aatff; +aatfg; +aatfh; +aatfi; +aatfj; +aatfk; +aatfl; +aatfm; +aatfn; +aatfo; +aatfp; +aatfq; +aatfr; +aatfs; +aatft; +aatfu; +aatfv; +aatfw; +aatfx; +aatfy; +aatfz; +aatga; +aatgb; +aatgc; +aatgd; +aatge; +aatgf; +aatgg; +aatgh; +aatgi; +aatgj; +aatgk; +aatgl; +aatgm; +aatgn; +aatgo; +aatgp; +aatgq; +aatgr; +aatgs; +aatgt; +aatgu; +aatgv; +aatgw; +aatgx; +aatgy; +aatgz; +aatha; +aathb; +aathc; +aathd; +aathe; +aathf; +aathg; +aathh; +aathi; +aathj; +aathk; +aathl; +aathm; +aathn; +aatho; +aathp; +aathq; +aathr; +aaths; +aatht; +aathu; +aathv; +aathw; +aathx; +aathy; +aathz; +aatia; +aatib; +aatic; +aatid; +aatie; +aatif; +aatig; +aatih; +aatii; +aatij; +aatik; +aatil; +aatim; +aatin; +aatio; +aatip; +aatiq; +aatir; +aatis; +aatit; +aatiu; +aativ; +aatiw; +aatix; +aatiy; +aatiz; +aatja; +aatjb; +aatjc; +aatjd; +aatje; +aatjf; +aatjg; +aatjh; +aatji; +aatjj; +aatjk; +aatjl; +aatjm; +aatjn; +aatjo; +aatjp; +aatjq; +aatjr; +aatjs; +aatjt; +aatju; +aatjv; +aatjw; +aatjx; +aatjy; +aatjz; +aatka; +aatkb; +aatkc; +aatkd; +aatke; +aatkf; +aatkg; +aatkh; +aatki; +aatkj; +aatkk; +aatkl; +aatkm; +aatkn; +aatko; +aatkp; +aatkq; +aatkr; +aatks; +aatkt; +aatku; +aatkv; +aatkw; +aatkx; +aatky; +aatkz; +aatla; +aatlb; +aatlc; +aatld; +aatle; +aatlf; +aatlg; +aatlh; +aatli; +aatlj; +aatlk; +aatll; +aatlm; +aatln; +aatlo; +aatlp; +aatlq; +aatlr; +aatls; +aatlt; +aatlu; +aatlv; +aatlw; +aatlx; +aatly; +aatlz; +aatma; +aatmb; +aatmc; +aatmd; +aatme; +aatmf; +aatmg; +aatmh; +aatmi; +aatmj; +aatmk; +aatml; +aatmm; +aatmn; +aatmo; +aatmp; +aatmq; +aatmr; +aatms; +aatmt; +aatmu; +aatmv; +aatmw; +aatmx; +aatmy; +aatmz; +aatna; +aatnb; +aatnc; +aatnd; +aatne; +aatnf; +aatng; +aatnh; +aatni; +aatnj; +aatnk; +aatnl; +aatnm; +aatnn; +aatno; +aatnp; +aatnq; +aatnr; +aatns; +aatnt; +aatnu; +aatnv; +aatnw; +aatnx; +aatny; +aatnz; +aatoa; +aatob; +aatoc; +aatod; +aatoe; +aatof; +aatog; +aatoh; +aatoi; +aatoj; +aatok; +aatol; +aatom; +aaton; +aatoo; +aatop; +aatoq; +aator; +aatos; +aatot; +aatou; +aatov; +aatow; +aatox; +aatoy; +aatoz; +aatpa; +aatpb; +aatpc; +aatpd; +aatpe; +aatpf; +aatpg; +aatph; +aatpi; +aatpj; +aatpk; +aatpl; +aatpm; +aatpn; +aatpo; +aatpp; +aatpq; +aatpr; +aatps; +aatpt; +aatpu; +aatpv; +aatpw; +aatpx; +aatpy; +aatpz; +aatqa; +aatqb; +aatqc; +aatqd; +aatqe; +aatqf; +aatqg; +aatqh; +aatqi; +aatqj; +aatqk; +aatql; +aatqm; +aatqn; +aatqo; +aatqp; +aatqq; +aatqr; +aatqs; +aatqt; +aatqu; +aatqv; +aatqw; +aatqx; +aatqy; +aatqz; +aatra; +aatrb; +aatrc; +aatrd; +aatre; +aatrf; +aatrg; +aatrh; +aatri; +aatrj; +aatrk; +aatrl; +aatrm; +aatrn; +aatro; +aatrp; +aatrq; +aatrr; +aatrs; +aatrt; +aatru; +aatrv; +aatrw; +aatrx; +aatry; +aatrz; +aatsa; +aatsb; +aatsc; +aatsd; +aatse; +aatsf; +aatsg; +aatsh; +aatsi; +aatsj; +aatsk; +aatsl; +aatsm; +aatsn; +aatso; +aatsp; +aatsq; +aatsr; +aatss; +aatst; +aatsu; +aatsv; +aatsw; +aatsx; +aatsy; +aatsz; +aatta; +aattb; +aattc; +aattd; +aatte; +aattf; +aattg; +aatth; +aatti; +aattj; +aattk; +aattl; +aattm; +aattn; +aatto; +aattp; +aattq; +aattr; +aatts; +aattt; +aattu; +aattv; +aattw; +aattx; +aatty; +aattz; +aatua; +aatub; +aatuc; +aatud; +aatue; +aatuf; +aatug; +aatuh; +aatui; +aatuj; +aatuk; +aatul; +aatum; +aatun; +aatuo; +aatup; +aatuq; +aatur; +aatus; +aatut; +aatuu; +aatuv; +aatuw; +aatux; +aatuy; +aatuz; +aatva; +aatvb; +aatvc; +aatvd; +aatve; +aatvf; +aatvg; +aatvh; +aatvi; +aatvj; +aatvk; +aatvl; +aatvm; +aatvn; +aatvo; +aatvp; +aatvq; +aatvr; +aatvs; +aatvt; +aatvu; +aatvv; +aatvw; +aatvx; +aatvy; +aatvz; +aatwa; +aatwb; +aatwc; +aatwd; +aatwe; +aatwf; +aatwg; +aatwh; +aatwi; +aatwj; +aatwk; +aatwl; +aatwm; +aatwn; +aatwo; +aatwp; +aatwq; +aatwr; +aatws; +aatwt; +aatwu; +aatwv; +aatww; +aatwx; +aatwy; +aatwz; +aatxa; +aatxb; +aatxc; +aatxd; +aatxe; +aatxf; +aatxg; +aatxh; +aatxi; +aatxj; +aatxk; +aatxl; +aatxm; +aatxn; +aatxo; +aatxp; +aatxq; +aatxr; +aatxs; +aatxt; +aatxu; +aatxv; +aatxw; +aatxx; +aatxy; +aatxz; +aatya; +aatyb; +aatyc; +aatyd; +aatye; +aatyf; +aatyg; +aatyh; +aatyi; +aatyj; +aatyk; +aatyl; +aatym; +aatyn; +aatyo; +aatyp; +aatyq; +aatyr; +aatys; +aatyt; +aatyu; +aatyv; +aatyw; +aatyx; +aatyy; +aatyz; +aatza; +aatzb; +aatzc; +aatzd; +aatze; +aatzf; +aatzg; +aatzh; +aatzi; +aatzj; +aatzk; +aatzl; +aatzm; +aatzn; +aatzo; +aatzp; +aatzq; +aatzr; +aatzs; +aatzt; +aatzu; +aatzv; +aatzw; +aatzx; +aatzy; +aatzz; +aauaa; +aauab; +aauac; +aauad; +aauae; +aauaf; +aauag; +aauah; +aauai; +aauaj; +aauak; +aaual; +aauam; +aauan; +aauao; +aauap; +aauaq; +aauar; +aauas; +aauat; +aauau; +aauav; +aauaw; +aauax; +aauay; +aauaz; +aauba; +aaubb; +aaubc; +aaubd; +aaube; +aaubf; +aaubg; +aaubh; +aaubi; +aaubj; +aaubk; +aaubl; +aaubm; +aaubn; +aaubo; +aaubp; +aaubq; +aaubr; +aaubs; +aaubt; +aaubu; +aaubv; +aaubw; +aaubx; +aauby; +aaubz; +aauca; +aaucb; +aaucc; +aaucd; +aauce; +aaucf; +aaucg; +aauch; +aauci; +aaucj; +aauck; +aaucl; +aaucm; +aaucn; +aauco; +aaucp; +aaucq; +aaucr; +aaucs; +aauct; +aaucu; +aaucv; +aaucw; +aaucx; +aaucy; +aaucz; +aauda; +aaudb; +aaudc; +aaudd; +aaude; +aaudf; +aaudg; +aaudh; +aaudi; +aaudj; +aaudk; +aaudl; +aaudm; +aaudn; +aaudo; +aaudp; +aaudq; +aaudr; +aauds; +aaudt; +aaudu; +aaudv; +aaudw; +aaudx; +aaudy; +aaudz; +aauea; +aaueb; +aauec; +aaued; +aauee; +aauef; +aaueg; +aaueh; +aauei; +aauej; +aauek; +aauel; +aauem; +aauen; +aaueo; +aauep; +aaueq; +aauer; +aaues; +aauet; +aaueu; +aauev; +aauew; +aauex; +aauey; +aauez; +aaufa; +aaufb; +aaufc; +aaufd; +aaufe; +aauff; +aaufg; +aaufh; +aaufi; +aaufj; +aaufk; +aaufl; +aaufm; +aaufn; +aaufo; +aaufp; +aaufq; +aaufr; +aaufs; +aauft; +aaufu; +aaufv; +aaufw; +aaufx; +aaufy; +aaufz; +aauga; +aaugb; +aaugc; +aaugd; +aauge; +aaugf; +aaugg; +aaugh; +aaugi; +aaugj; +aaugk; +aaugl; +aaugm; +aaugn; +aaugo; +aaugp; +aaugq; +aaugr; +aaugs; +aaugt; +aaugu; +aaugv; +aaugw; +aaugx; +aaugy; +aaugz; +aauha; +aauhb; +aauhc; +aauhd; +aauhe; +aauhf; +aauhg; +aauhh; +aauhi; +aauhj; +aauhk; +aauhl; +aauhm; +aauhn; +aauho; +aauhp; +aauhq; +aauhr; +aauhs; +aauht; +aauhu; +aauhv; +aauhw; +aauhx; +aauhy; +aauhz; +aauia; +aauib; +aauic; +aauid; +aauie; +aauif; +aauig; +aauih; +aauii; +aauij; +aauik; +aauil; +aauim; +aauin; +aauio; +aauip; +aauiq; +aauir; +aauis; +aauit; +aauiu; +aauiv; +aauiw; +aauix; +aauiy; +aauiz; +aauja; +aaujb; +aaujc; +aaujd; +aauje; +aaujf; +aaujg; +aaujh; +aauji; +aaujj; +aaujk; +aaujl; +aaujm; +aaujn; +aaujo; +aaujp; +aaujq; +aaujr; +aaujs; +aaujt; +aauju; +aaujv; +aaujw; +aaujx; +aaujy; +aaujz; +aauka; +aaukb; +aaukc; +aaukd; +aauke; +aaukf; +aaukg; +aaukh; +aauki; +aaukj; +aaukk; +aaukl; +aaukm; +aaukn; +aauko; +aaukp; +aaukq; +aaukr; +aauks; +aaukt; +aauku; +aaukv; +aaukw; +aaukx; +aauky; +aaukz; +aaula; +aaulb; +aaulc; +aauld; +aaule; +aaulf; +aaulg; +aaulh; +aauli; +aaulj; +aaulk; +aaull; +aaulm; +aauln; +aaulo; +aaulp; +aaulq; +aaulr; +aauls; +aault; +aaulu; +aaulv; +aaulw; +aaulx; +aauly; +aaulz; +aauma; +aaumb; +aaumc; +aaumd; +aaume; +aaumf; +aaumg; +aaumh; +aaumi; +aaumj; +aaumk; +aauml; +aaumm; +aaumn; +aaumo; +aaump; +aaumq; +aaumr; +aaums; +aaumt; +aaumu; +aaumv; +aaumw; +aaumx; +aaumy; +aaumz; +aauna; +aaunb; +aaunc; +aaund; +aaune; +aaunf; +aaung; +aaunh; +aauni; +aaunj; +aaunk; +aaunl; +aaunm; +aaunn; +aauno; +aaunp; +aaunq; +aaunr; +aauns; +aaunt; +aaunu; +aaunv; +aaunw; +aaunx; +aauny; +aaunz; +aauoa; +aauob; +aauoc; +aauod; +aauoe; +aauof; +aauog; +aauoh; +aauoi; +aauoj; +aauok; +aauol; +aauom; +aauon; +aauoo; +aauop; +aauoq; +aauor; +aauos; +aauot; +aauou; +aauov; +aauow; +aauox; +aauoy; +aauoz; +aaupa; +aaupb; +aaupc; +aaupd; +aaupe; +aaupf; +aaupg; +aauph; +aaupi; +aaupj; +aaupk; +aaupl; +aaupm; +aaupn; +aaupo; +aaupp; +aaupq; +aaupr; +aaups; +aaupt; +aaupu; +aaupv; +aaupw; +aaupx; +aaupy; +aaupz; +aauqa; +aauqb; +aauqc; +aauqd; +aauqe; +aauqf; +aauqg; +aauqh; +aauqi; +aauqj; +aauqk; +aauql; +aauqm; +aauqn; +aauqo; +aauqp; +aauqq; +aauqr; +aauqs; +aauqt; +aauqu; +aauqv; +aauqw; +aauqx; +aauqy; +aauqz; +aaura; +aaurb; +aaurc; +aaurd; +aaure; +aaurf; +aaurg; +aaurh; +aauri; +aaurj; +aaurk; +aaurl; +aaurm; +aaurn; +aauro; +aaurp; +aaurq; +aaurr; +aaurs; +aaurt; +aauru; +aaurv; +aaurw; +aaurx; +aaury; +aaurz; +aausa; +aausb; +aausc; +aausd; +aause; +aausf; +aausg; +aaush; +aausi; +aausj; +aausk; +aausl; +aausm; +aausn; +aauso; +aausp; +aausq; +aausr; +aauss; +aaust; +aausu; +aausv; +aausw; +aausx; +aausy; +aausz; +aauta; +aautb; +aautc; +aautd; +aaute; +aautf; +aautg; +aauth; +aauti; +aautj; +aautk; +aautl; +aautm; +aautn; +aauto; +aautp; +aautq; +aautr; +aauts; +aautt; +aautu; +aautv; +aautw; +aautx; +aauty; +aautz; +aauua; +aauub; +aauuc; +aauud; +aauue; +aauuf; +aauug; +aauuh; +aauui; +aauuj; +aauuk; +aauul; +aauum; +aauun; +aauuo; +aauup; +aauuq; +aauur; +aauus; +aauut; +aauuu; +aauuv; +aauuw; +aauux; +aauuy; +aauuz; +aauva; +aauvb; +aauvc; +aauvd; +aauve; +aauvf; +aauvg; +aauvh; +aauvi; +aauvj; +aauvk; +aauvl; +aauvm; +aauvn; +aauvo; +aauvp; +aauvq; +aauvr; +aauvs; +aauvt; +aauvu; +aauvv; +aauvw; +aauvx; +aauvy; +aauvz; +aauwa; +aauwb; +aauwc; +aauwd; +aauwe; +aauwf; +aauwg; +aauwh; +aauwi; +aauwj; +aauwk; +aauwl; +aauwm; +aauwn; +aauwo; +aauwp; +aauwq; +aauwr; +aauws; +aauwt; +aauwu; +aauwv; +aauww; +aauwx; +aauwy; +aauwz; +aauxa; +aauxb; +aauxc; +aauxd; +aauxe; +aauxf; +aauxg; +aauxh; +aauxi; +aauxj; +aauxk; +aauxl; +aauxm; +aauxn; +aauxo; +aauxp; +aauxq; +aauxr; +aauxs; +aauxt; +aauxu; +aauxv; +aauxw; +aauxx; +aauxy; +aauxz; +aauya; +aauyb; +aauyc; +aauyd; +aauye; +aauyf; +aauyg; +aauyh; +aauyi; +aauyj; +aauyk; +aauyl; +aauym; +aauyn; +aauyo; +aauyp; +aauyq; +aauyr; +aauys; +aauyt; +aauyu; +aauyv; +aauyw; +aauyx; +aauyy; +aauyz; +aauza; +aauzb; +aauzc; +aauzd; +aauze; +aauzf; +aauzg; +aauzh; +aauzi; +aauzj; +aauzk; +aauzl; +aauzm; +aauzn; +aauzo; +aauzp; +aauzq; +aauzr; +aauzs; +aauzt; +aauzu; +aauzv; +aauzw; +aauzx; +aauzy; +aauzz; +aavaa; +aavab; +aavac; +aavad; +aavae; +aavaf; +aavag; +aavah; +aavai; +aavaj; +aavak; +aaval; +aavam; +aavan; +aavao; +aavap; +aavaq; +aavar; +aavas; +aavat; +aavau; +aavav; +aavaw; +aavax; +aavay; +aavaz; +aavba; +aavbb; +aavbc; +aavbd; +aavbe; +aavbf; +aavbg; +aavbh; +aavbi; +aavbj; +aavbk; +aavbl; +aavbm; +aavbn; +aavbo; +aavbp; +aavbq; +aavbr; +aavbs; +aavbt; +aavbu; +aavbv; +aavbw; +aavbx; +aavby; +aavbz; +aavca; +aavcb; +aavcc; +aavcd; +aavce; +aavcf; +aavcg; +aavch; +aavci; +aavcj; +aavck; +aavcl; +aavcm; +aavcn; +aavco; +aavcp; +aavcq; +aavcr; +aavcs; +aavct; +aavcu; +aavcv; +aavcw; +aavcx; +aavcy; +aavcz; +aavda; +aavdb; +aavdc; +aavdd; +aavde; +aavdf; +aavdg; +aavdh; +aavdi; +aavdj; +aavdk; +aavdl; +aavdm; +aavdn; +aavdo; +aavdp; +aavdq; +aavdr; +aavds; +aavdt; +aavdu; +aavdv; +aavdw; +aavdx; +aavdy; +aavdz; +aavea; +aaveb; +aavec; +aaved; +aavee; +aavef; +aaveg; +aaveh; +aavei; +aavej; +aavek; +aavel; +aavem; +aaven; +aaveo; +aavep; +aaveq; +aaver; +aaves; +aavet; +aaveu; +aavev; +aavew; +aavex; +aavey; +aavez; +aavfa; +aavfb; +aavfc; +aavfd; +aavfe; +aavff; +aavfg; +aavfh; +aavfi; +aavfj; +aavfk; +aavfl; +aavfm; +aavfn; +aavfo; +aavfp; +aavfq; +aavfr; +aavfs; +aavft; +aavfu; +aavfv; +aavfw; +aavfx; +aavfy; +aavfz; +aavga; +aavgb; +aavgc; +aavgd; +aavge; +aavgf; +aavgg; +aavgh; +aavgi; +aavgj; +aavgk; +aavgl; +aavgm; +aavgn; +aavgo; +aavgp; +aavgq; +aavgr; +aavgs; +aavgt; +aavgu; +aavgv; +aavgw; +aavgx; +aavgy; +aavgz; +aavha; +aavhb; +aavhc; +aavhd; +aavhe; +aavhf; +aavhg; +aavhh; +aavhi; +aavhj; +aavhk; +aavhl; +aavhm; +aavhn; +aavho; +aavhp; +aavhq; +aavhr; +aavhs; +aavht; +aavhu; +aavhv; +aavhw; +aavhx; +aavhy; +aavhz; +aavia; +aavib; +aavic; +aavid; +aavie; +aavif; +aavig; +aavih; +aavii; +aavij; +aavik; +aavil; +aavim; +aavin; +aavio; +aavip; +aaviq; +aavir; +aavis; +aavit; +aaviu; +aaviv; +aaviw; +aavix; +aaviy; +aaviz; +aavja; +aavjb; +aavjc; +aavjd; +aavje; +aavjf; +aavjg; +aavjh; +aavji; +aavjj; +aavjk; +aavjl; +aavjm; +aavjn; +aavjo; +aavjp; +aavjq; +aavjr; +aavjs; +aavjt; +aavju; +aavjv; +aavjw; +aavjx; +aavjy; +aavjz; +aavka; +aavkb; +aavkc; +aavkd; +aavke; +aavkf; +aavkg; +aavkh; +aavki; +aavkj; +aavkk; +aavkl; +aavkm; +aavkn; +aavko; +aavkp; +aavkq; +aavkr; +aavks; +aavkt; +aavku; +aavkv; +aavkw; +aavkx; +aavky; +aavkz; +aavla; +aavlb; +aavlc; +aavld; +aavle; +aavlf; +aavlg; +aavlh; +aavli; +aavlj; +aavlk; +aavll; +aavlm; +aavln; +aavlo; +aavlp; +aavlq; +aavlr; +aavls; +aavlt; +aavlu; +aavlv; +aavlw; +aavlx; +aavly; +aavlz; +aavma; +aavmb; +aavmc; +aavmd; +aavme; +aavmf; +aavmg; +aavmh; +aavmi; +aavmj; +aavmk; +aavml; +aavmm; +aavmn; +aavmo; +aavmp; +aavmq; +aavmr; +aavms; +aavmt; +aavmu; +aavmv; +aavmw; +aavmx; +aavmy; +aavmz; +aavna; +aavnb; +aavnc; +aavnd; +aavne; +aavnf; +aavng; +aavnh; +aavni; +aavnj; +aavnk; +aavnl; +aavnm; +aavnn; +aavno; +aavnp; +aavnq; +aavnr; +aavns; +aavnt; +aavnu; +aavnv; +aavnw; +aavnx; +aavny; +aavnz; +aavoa; +aavob; +aavoc; +aavod; +aavoe; +aavof; +aavog; +aavoh; +aavoi; +aavoj; +aavok; +aavol; +aavom; +aavon; +aavoo; +aavop; +aavoq; +aavor; +aavos; +aavot; +aavou; +aavov; +aavow; +aavox; +aavoy; +aavoz; +aavpa; +aavpb; +aavpc; +aavpd; +aavpe; +aavpf; +aavpg; +aavph; +aavpi; +aavpj; +aavpk; +aavpl; +aavpm; +aavpn; +aavpo; +aavpp; +aavpq; +aavpr; +aavps; +aavpt; +aavpu; +aavpv; +aavpw; +aavpx; +aavpy; +aavpz; +aavqa; +aavqb; +aavqc; +aavqd; +aavqe; +aavqf; +aavqg; +aavqh; +aavqi; +aavqj; +aavqk; +aavql; +aavqm; +aavqn; +aavqo; +aavqp; +aavqq; +aavqr; +aavqs; +aavqt; +aavqu; +aavqv; +aavqw; +aavqx; +aavqy; +aavqz; +aavra; +aavrb; +aavrc; +aavrd; +aavre; +aavrf; +aavrg; +aavrh; +aavri; +aavrj; +aavrk; +aavrl; +aavrm; +aavrn; +aavro; +aavrp; +aavrq; +aavrr; +aavrs; +aavrt; +aavru; +aavrv; +aavrw; +aavrx; +aavry; +aavrz; +aavsa; +aavsb; +aavsc; +aavsd; +aavse; +aavsf; +aavsg; +aavsh; +aavsi; +aavsj; +aavsk; +aavsl; +aavsm; +aavsn; +aavso; +aavsp; +aavsq; +aavsr; +aavss; +aavst; +aavsu; +aavsv; +aavsw; +aavsx; +aavsy; +aavsz; +aavta; +aavtb; +aavtc; +aavtd; +aavte; +aavtf; +aavtg; +aavth; +aavti; +aavtj; +aavtk; +aavtl; +aavtm; +aavtn; +aavto; +aavtp; +aavtq; +aavtr; +aavts; +aavtt; +aavtu; +aavtv; +aavtw; +aavtx; +aavty; +aavtz; +aavua; +aavub; +aavuc; +aavud; +aavue; +aavuf; +aavug; +aavuh; +aavui; +aavuj; +aavuk; +aavul; +aavum; +aavun; +aavuo; +aavup; +aavuq; +aavur; +aavus; +aavut; +aavuu; +aavuv; +aavuw; +aavux; +aavuy; +aavuz; +aavva; +aavvb; +aavvc; +aavvd; +aavve; +aavvf; +aavvg; +aavvh; +aavvi; +aavvj; +aavvk; +aavvl; +aavvm; +aavvn; +aavvo; +aavvp; +aavvq; +aavvr; +aavvs; +aavvt; +aavvu; +aavvv; +aavvw; +aavvx; +aavvy; +aavvz; +aavwa; +aavwb; +aavwc; +aavwd; +aavwe; +aavwf; +aavwg; +aavwh; +aavwi; +aavwj; +aavwk; +aavwl; +aavwm; +aavwn; +aavwo; +aavwp; +aavwq; +aavwr; +aavws; +aavwt; +aavwu; +aavwv; +aavww; +aavwx; +aavwy; +aavwz; +aavxa; +aavxb; +aavxc; +aavxd; +aavxe; +aavxf; +aavxg; +aavxh; +aavxi; +aavxj; +aavxk; +aavxl; +aavxm; +aavxn; +aavxo; +aavxp; +aavxq; +aavxr; +aavxs; +aavxt; +aavxu; +aavxv; +aavxw; +aavxx; +aavxy; +aavxz; +aavya; +aavyb; +aavyc; +aavyd; +aavye; +aavyf; +aavyg; +aavyh; +aavyi; +aavyj; +aavyk; +aavyl; +aavym; +aavyn; +aavyo; +aavyp; +aavyq; +aavyr; +aavys; +aavyt; +aavyu; +aavyv; +aavyw; +aavyx; +aavyy; +aavyz; +aavza; +aavzb; +aavzc; +aavzd; +aavze; +aavzf; +aavzg; +aavzh; +aavzi; +aavzj; +aavzk; +aavzl; +aavzm; +aavzn; +aavzo; +aavzp; +aavzq; +aavzr; +aavzs; +aavzt; +aavzu; +aavzv; +aavzw; +aavzx; +aavzy; +aavzz; +aawaa; +aawab; +aawac; +aawad; +aawae; +aawaf; +aawag; +aawah; +aawai; +aawaj; +aawak; +aawal; +aawam; +aawan; +aawao; +aawap; +aawaq; +aawar; +aawas; +aawat; +aawau; +aawav; +aawaw; +aawax; +aaway; +aawaz; +aawba; +aawbb; +aawbc; +aawbd; +aawbe; +aawbf; +aawbg; +aawbh; +aawbi; +aawbj; +aawbk; +aawbl; +aawbm; +aawbn; +aawbo; +aawbp; +aawbq; +aawbr; +aawbs; +aawbt; +aawbu; +aawbv; +aawbw; +aawbx; +aawby; +aawbz; +aawca; +aawcb; +aawcc; +aawcd; +aawce; +aawcf; +aawcg; +aawch; +aawci; +aawcj; +aawck; +aawcl; +aawcm; +aawcn; +aawco; +aawcp; +aawcq; +aawcr; +aawcs; +aawct; +aawcu; +aawcv; +aawcw; +aawcx; +aawcy; +aawcz; +aawda; +aawdb; +aawdc; +aawdd; +aawde; +aawdf; +aawdg; +aawdh; +aawdi; +aawdj; +aawdk; +aawdl; +aawdm; +aawdn; +aawdo; +aawdp; +aawdq; +aawdr; +aawds; +aawdt; +aawdu; +aawdv; +aawdw; +aawdx; +aawdy; +aawdz; +aawea; +aaweb; +aawec; +aawed; +aawee; +aawef; +aaweg; +aaweh; +aawei; +aawej; +aawek; +aawel; +aawem; +aawen; +aaweo; +aawep; +aaweq; +aawer; +aawes; +aawet; +aaweu; +aawev; +aawew; +aawex; +aawey; +aawez; +aawfa; +aawfb; +aawfc; +aawfd; +aawfe; +aawff; +aawfg; +aawfh; +aawfi; +aawfj; +aawfk; +aawfl; +aawfm; +aawfn; +aawfo; +aawfp; +aawfq; +aawfr; +aawfs; +aawft; +aawfu; +aawfv; +aawfw; +aawfx; +aawfy; +aawfz; +aawga; +aawgb; +aawgc; +aawgd; +aawge; +aawgf; +aawgg; +aawgh; +aawgi; +aawgj; +aawgk; +aawgl; +aawgm; +aawgn; +aawgo; +aawgp; +aawgq; +aawgr; +aawgs; +aawgt; +aawgu; +aawgv; +aawgw; +aawgx; +aawgy; +aawgz; +aawha; +aawhb; +aawhc; +aawhd; +aawhe; +aawhf; +aawhg; +aawhh; +aawhi; +aawhj; +aawhk; +aawhl; +aawhm; +aawhn; +aawho; +aawhp; +aawhq; +aawhr; +aawhs; +aawht; +aawhu; +aawhv; +aawhw; +aawhx; +aawhy; +aawhz; +aawia; +aawib; +aawic; +aawid; +aawie; +aawif; +aawig; +aawih; +aawii; +aawij; +aawik; +aawil; +aawim; +aawin; +aawio; +aawip; +aawiq; +aawir; +aawis; +aawit; +aawiu; +aawiv; +aawiw; +aawix; +aawiy; +aawiz; +aawja; +aawjb; +aawjc; +aawjd; +aawje; +aawjf; +aawjg; +aawjh; +aawji; +aawjj; +aawjk; +aawjl; +aawjm; +aawjn; +aawjo; +aawjp; +aawjq; +aawjr; +aawjs; +aawjt; +aawju; +aawjv; +aawjw; +aawjx; +aawjy; +aawjz; +aawka; +aawkb; +aawkc; +aawkd; +aawke; +aawkf; +aawkg; +aawkh; +aawki; +aawkj; +aawkk; +aawkl; +aawkm; +aawkn; +aawko; +aawkp; +aawkq; +aawkr; +aawks; +aawkt; +aawku; +aawkv; +aawkw; +aawkx; +aawky; +aawkz; +aawla; +aawlb; +aawlc; +aawld; +aawle; +aawlf; +aawlg; +aawlh; +aawli; +aawlj; +aawlk; +aawll; +aawlm; +aawln; +aawlo; +aawlp; +aawlq; +aawlr; +aawls; +aawlt; +aawlu; +aawlv; +aawlw; +aawlx; +aawly; +aawlz; +aawma; +aawmb; +aawmc; +aawmd; +aawme; +aawmf; +aawmg; +aawmh; +aawmi; +aawmj; +aawmk; +aawml; +aawmm; +aawmn; +aawmo; +aawmp; +aawmq; +aawmr; +aawms; +aawmt; +aawmu; +aawmv; +aawmw; +aawmx; +aawmy; +aawmz; +aawna; +aawnb; +aawnc; +aawnd; +aawne; +aawnf; +aawng; +aawnh; +aawni; +aawnj; +aawnk; +aawnl; +aawnm; +aawnn; +aawno; +aawnp; +aawnq; +aawnr; +aawns; +aawnt; +aawnu; +aawnv; +aawnw; +aawnx; +aawny; +aawnz; +aawoa; +aawob; +aawoc; +aawod; +aawoe; +aawof; +aawog; +aawoh; +aawoi; +aawoj; +aawok; +aawol; +aawom; +aawon; +aawoo; +aawop; +aawoq; +aawor; +aawos; +aawot; +aawou; +aawov; +aawow; +aawox; +aawoy; +aawoz; +aawpa; +aawpb; +aawpc; +aawpd; +aawpe; +aawpf; +aawpg; +aawph; +aawpi; +aawpj; +aawpk; +aawpl; +aawpm; +aawpn; +aawpo; +aawpp; +aawpq; +aawpr; +aawps; +aawpt; +aawpu; +aawpv; +aawpw; +aawpx; +aawpy; +aawpz; +aawqa; +aawqb; +aawqc; +aawqd; +aawqe; +aawqf; +aawqg; +aawqh; +aawqi; +aawqj; +aawqk; +aawql; +aawqm; +aawqn; +aawqo; +aawqp; +aawqq; +aawqr; +aawqs; +aawqt; +aawqu; +aawqv; +aawqw; +aawqx; +aawqy; +aawqz; +aawra; +aawrb; +aawrc; +aawrd; +aawre; +aawrf; +aawrg; +aawrh; +aawri; +aawrj; +aawrk; +aawrl; +aawrm; +aawrn; +aawro; +aawrp; +aawrq; +aawrr; +aawrs; +aawrt; +aawru; +aawrv; +aawrw; +aawrx; +aawry; +aawrz; +aawsa; +aawsb; +aawsc; +aawsd; +aawse; +aawsf; +aawsg; +aawsh; +aawsi; +aawsj; +aawsk; +aawsl; +aawsm; +aawsn; +aawso; +aawsp; +aawsq; +aawsr; +aawss; +aawst; +aawsu; +aawsv; +aawsw; +aawsx; +aawsy; +aawsz; +aawta; +aawtb; +aawtc; +aawtd; +aawte; +aawtf; +aawtg; +aawth; +aawti; +aawtj; +aawtk; +aawtl; +aawtm; +aawtn; +aawto; +aawtp; +aawtq; +aawtr; +aawts; +aawtt; +aawtu; +aawtv; +aawtw; +aawtx; +aawty; +aawtz; +aawua; +aawub; +aawuc; +aawud; +aawue; +aawuf; +aawug; +aawuh; +aawui; +aawuj; +aawuk; +aawul; +aawum; +aawun; +aawuo; +aawup; +aawuq; +aawur; +aawus; +aawut; +aawuu; +aawuv; +aawuw; +aawux; +aawuy; +aawuz; +aawva; +aawvb; +aawvc; +aawvd; +aawve; +aawvf; +aawvg; +aawvh; +aawvi; +aawvj; +aawvk; +aawvl; +aawvm; +aawvn; +aawvo; +aawvp; +aawvq; +aawvr; +aawvs; +aawvt; +aawvu; +aawvv; +aawvw; +aawvx; +aawvy; +aawvz; +aawwa; +aawwb; +aawwc; +aawwd; +aawwe; +aawwf; +aawwg; +aawwh; +aawwi; +aawwj; +aawwk; +aawwl; +aawwm; +aawwn; +aawwo; +aawwp; +aawwq; +aawwr; +aawws; +aawwt; +aawwu; +aawwv; +aawww; +aawwx; +aawwy; +aawwz; +aawxa; +aawxb; +aawxc; +aawxd; +aawxe; +aawxf; +aawxg; +aawxh; +aawxi; +aawxj; +aawxk; +aawxl; +aawxm; +aawxn; +aawxo; +aawxp; +aawxq; +aawxr; +aawxs; +aawxt; +aawxu; +aawxv; +aawxw; +aawxx; +aawxy; +aawxz; +aawya; +aawyb; +aawyc; +aawyd; +aawye; +aawyf; +aawyg; +aawyh; +aawyi; +aawyj; +aawyk; +aawyl; +aawym; +aawyn; +aawyo; +aawyp; +aawyq; +aawyr; +aawys; +aawyt; +aawyu; +aawyv; +aawyw; +aawyx; +aawyy; +aawyz; +aawza; +aawzb; +aawzc; +aawzd; +aawze; +aawzf; +aawzg; +aawzh; +aawzi; +aawzj; +aawzk; +aawzl; +aawzm; +aawzn; +aawzo; +aawzp; +aawzq; +aawzr; +aawzs; +aawzt; +aawzu; +aawzv; +aawzw; +aawzx; +aawzy; +aawzz; +aaxaa; +aaxab; +aaxac; +aaxad; +aaxae; +aaxaf; +aaxag; +aaxah; +aaxai; +aaxaj; +aaxak; +aaxal; +aaxam; +aaxan; +aaxao; +aaxap; +aaxaq; +aaxar; +aaxas; +aaxat; +aaxau; +aaxav; +aaxaw; +aaxax; +aaxay; +aaxaz; +aaxba; +aaxbb; +aaxbc; +aaxbd; +aaxbe; +aaxbf; +aaxbg; +aaxbh; +aaxbi; +aaxbj; +aaxbk; +aaxbl; +aaxbm; +aaxbn; +aaxbo; +aaxbp; +aaxbq; +aaxbr; +aaxbs; +aaxbt; +aaxbu; +aaxbv; +aaxbw; +aaxbx; +aaxby; +aaxbz; +aaxca; +aaxcb; +aaxcc; +aaxcd; +aaxce; +aaxcf; +aaxcg; +aaxch; +aaxci; +aaxcj; +aaxck; +aaxcl; +aaxcm; +aaxcn; +aaxco; +aaxcp; +aaxcq; +aaxcr; +aaxcs; +aaxct; +aaxcu; +aaxcv; +aaxcw; +aaxcx; +aaxcy; +aaxcz; +aaxda; +aaxdb; +aaxdc; +aaxdd; +aaxde; +aaxdf; +aaxdg; +aaxdh; +aaxdi; +aaxdj; +aaxdk; +aaxdl; +aaxdm; +aaxdn; +aaxdo; +aaxdp; +aaxdq; +aaxdr; +aaxds; +aaxdt; +aaxdu; +aaxdv; +aaxdw; +aaxdx; +aaxdy; +aaxdz; +aaxea; +aaxeb; +aaxec; +aaxed; +aaxee; +aaxef; +aaxeg; +aaxeh; +aaxei; +aaxej; +aaxek; +aaxel; +aaxem; +aaxen; +aaxeo; +aaxep; +aaxeq; +aaxer; +aaxes; +aaxet; +aaxeu; +aaxev; +aaxew; +aaxex; +aaxey; +aaxez; +aaxfa; +aaxfb; +aaxfc; +aaxfd; +aaxfe; +aaxff; +aaxfg; +aaxfh; +aaxfi; +aaxfj; +aaxfk; +aaxfl; +aaxfm; +aaxfn; +aaxfo; +aaxfp; +aaxfq; +aaxfr; +aaxfs; +aaxft; +aaxfu; +aaxfv; +aaxfw; +aaxfx; +aaxfy; +aaxfz; +aaxga; +aaxgb; +aaxgc; +aaxgd; +aaxge; +aaxgf; +aaxgg; +aaxgh; +aaxgi; +aaxgj; +aaxgk; +aaxgl; +aaxgm; +aaxgn; +aaxgo; +aaxgp; +aaxgq; +aaxgr; +aaxgs; +aaxgt; +aaxgu; +aaxgv; +aaxgw; +aaxgx; +aaxgy; +aaxgz; +aaxha; +aaxhb; +aaxhc; +aaxhd; +aaxhe; +aaxhf; +aaxhg; +aaxhh; +aaxhi; +aaxhj; +aaxhk; +aaxhl; +aaxhm; +aaxhn; +aaxho; +aaxhp; +aaxhq; +aaxhr; +aaxhs; +aaxht; +aaxhu; +aaxhv; +aaxhw; +aaxhx; +aaxhy; +aaxhz; +aaxia; +aaxib; +aaxic; +aaxid; +aaxie; +aaxif; +aaxig; +aaxih; +aaxii; +aaxij; +aaxik; +aaxil; +aaxim; +aaxin; +aaxio; +aaxip; +aaxiq; +aaxir; +aaxis; +aaxit; +aaxiu; +aaxiv; +aaxiw; +aaxix; +aaxiy; +aaxiz; +aaxja; +aaxjb; +aaxjc; +aaxjd; +aaxje; +aaxjf; +aaxjg; +aaxjh; +aaxji; +aaxjj; +aaxjk; +aaxjl; +aaxjm; +aaxjn; +aaxjo; +aaxjp; +aaxjq; +aaxjr; +aaxjs; +aaxjt; +aaxju; +aaxjv; +aaxjw; +aaxjx; +aaxjy; +aaxjz; +aaxka; +aaxkb; +aaxkc; +aaxkd; +aaxke; +aaxkf; +aaxkg; +aaxkh; +aaxki; +aaxkj; +aaxkk; +aaxkl; +aaxkm; +aaxkn; +aaxko; +aaxkp; +aaxkq; +aaxkr; +aaxks; +aaxkt; +aaxku; +aaxkv; +aaxkw; +aaxkx; +aaxky; +aaxkz; +aaxla; +aaxlb; +aaxlc; +aaxld; +aaxle; +aaxlf; +aaxlg; +aaxlh; +aaxli; +aaxlj; +aaxlk; +aaxll; +aaxlm; +aaxln; +aaxlo; +aaxlp; +aaxlq; +aaxlr; +aaxls; +aaxlt; +aaxlu; +aaxlv; +aaxlw; +aaxlx; +aaxly; +aaxlz; +aaxma; +aaxmb; +aaxmc; +aaxmd; +aaxme; +aaxmf; +aaxmg; +aaxmh; +aaxmi; +aaxmj; +aaxmk; +aaxml; +aaxmm; +aaxmn; +aaxmo; +aaxmp; +aaxmq; +aaxmr; +aaxms; +aaxmt; +aaxmu; +aaxmv; +aaxmw; +aaxmx; +aaxmy; +aaxmz; +aaxna; +aaxnb; +aaxnc; +aaxnd; +aaxne; +aaxnf; +aaxng; +aaxnh; +aaxni; +aaxnj; +aaxnk; +aaxnl; +aaxnm; +aaxnn; +aaxno; +aaxnp; +aaxnq; +aaxnr; +aaxns; +aaxnt; +aaxnu; +aaxnv; +aaxnw; +aaxnx; +aaxny; +aaxnz; +aaxoa; +aaxob; +aaxoc; +aaxod; +aaxoe; +aaxof; +aaxog; +aaxoh; +aaxoi; +aaxoj; +aaxok; +aaxol; +aaxom; +aaxon; +aaxoo; +aaxop; +aaxoq; +aaxor; +aaxos; +aaxot; +aaxou; +aaxov; +aaxow; +aaxox; +aaxoy; +aaxoz; +aaxpa; +aaxpb; +aaxpc; +aaxpd; +aaxpe; +aaxpf; +aaxpg; +aaxph; +aaxpi; +aaxpj; +aaxpk; +aaxpl; +aaxpm; +aaxpn; +aaxpo; +aaxpp; +aaxpq; +aaxpr; +aaxps; +aaxpt; +aaxpu; +aaxpv; +aaxpw; +aaxpx; +aaxpy; +aaxpz; +aaxqa; +aaxqb; +aaxqc; +aaxqd; +aaxqe; +aaxqf; +aaxqg; +aaxqh; +aaxqi; +aaxqj; +aaxqk; +aaxql; +aaxqm; +aaxqn; +aaxqo; +aaxqp; +aaxqq; +aaxqr; +aaxqs; +aaxqt; +aaxqu; +aaxqv; +aaxqw; +aaxqx; +aaxqy; +aaxqz; +aaxra; +aaxrb; +aaxrc; +aaxrd; +aaxre; +aaxrf; +aaxrg; +aaxrh; +aaxri; +aaxrj; +aaxrk; +aaxrl; +aaxrm; +aaxrn; +aaxro; +aaxrp; +aaxrq; +aaxrr; +aaxrs; +aaxrt; +aaxru; +aaxrv; +aaxrw; +aaxrx; +aaxry; +aaxrz; +aaxsa; +aaxsb; +aaxsc; +aaxsd; +aaxse; +aaxsf; +aaxsg; +aaxsh; +aaxsi; +aaxsj; +aaxsk; +aaxsl; +aaxsm; +aaxsn; +aaxso; +aaxsp; +aaxsq; +aaxsr; +aaxss; +aaxst; +aaxsu; +aaxsv; +aaxsw; +aaxsx; +aaxsy; +aaxsz; +aaxta; +aaxtb; +aaxtc; +aaxtd; +aaxte; +aaxtf; +aaxtg; +aaxth; +aaxti; +aaxtj; +aaxtk; +aaxtl; +aaxtm; +aaxtn; +aaxto; +aaxtp; +aaxtq; +aaxtr; +aaxts; +aaxtt; +aaxtu; +aaxtv; +aaxtw; +aaxtx; +aaxty; +aaxtz; +aaxua; +aaxub; +aaxuc; +aaxud; +aaxue; +aaxuf; +aaxug; +aaxuh; +aaxui; +aaxuj; +aaxuk; +aaxul; +aaxum; +aaxun; +aaxuo; +aaxup; +aaxuq; +aaxur; +aaxus; +aaxut; +aaxuu; +aaxuv; +aaxuw; +aaxux; +aaxuy; +aaxuz; +aaxva; +aaxvb; +aaxvc; +aaxvd; +aaxve; +aaxvf; +aaxvg; +aaxvh; +aaxvi; +aaxvj; +aaxvk; +aaxvl; +aaxvm; +aaxvn; +aaxvo; +aaxvp; +aaxvq; +aaxvr; +aaxvs; +aaxvt; +aaxvu; +aaxvv; +aaxvw; +aaxvx; +aaxvy; +aaxvz; +aaxwa; +aaxwb; +aaxwc; +aaxwd; +aaxwe; +aaxwf; +aaxwg; +aaxwh; +aaxwi; +aaxwj; +aaxwk; +aaxwl; +aaxwm; +aaxwn; +aaxwo; +aaxwp; +aaxwq; +aaxwr; +aaxws; +aaxwt; +aaxwu; +aaxwv; +aaxww; +aaxwx; +aaxwy; +aaxwz; +aaxxa; +aaxxb; +aaxxc; +aaxxd; +aaxxe; +aaxxf; +aaxxg; +aaxxh; +aaxxi; +aaxxj; +aaxxk; +aaxxl; +aaxxm; +aaxxn; +aaxxo; +aaxxp; +aaxxq; +aaxxr; +aaxxs; +aaxxt; +aaxxu; +aaxxv; +aaxxw; +aaxxx; +aaxxy; +aaxxz; +aaxya; +aaxyb; +aaxyc; +aaxyd; +aaxye; +aaxyf; +aaxyg; +aaxyh; +aaxyi; +aaxyj; +aaxyk; +aaxyl; +aaxym; +aaxyn; +aaxyo; +aaxyp; +aaxyq; +aaxyr; +aaxys; +aaxyt; +aaxyu; +aaxyv; +aaxyw; +aaxyx; +aaxyy; +aaxyz; +aaxza; +aaxzb; +aaxzc; +aaxzd; +aaxze; +aaxzf; +aaxzg; +aaxzh; +aaxzi; +aaxzj; +aaxzk; +aaxzl; +aaxzm; +aaxzn; +aaxzo; +aaxzp; +aaxzq; +aaxzr; +aaxzs; +aaxzt; +aaxzu; +aaxzv; +aaxzw; +aaxzx; +aaxzy; +aaxzz; +aayaa; +aayab; +aayac; +aayad; +aayae; +aayaf; +aayag; +aayah; +aayai; +aayaj; +aayak; +aayal; +aayam; +aayan; +aayao; +aayap; +aayaq; +aayar; +aayas; +aayat; +aayau; +aayav; +aayaw; +aayax; +aayay; +aayaz; +aayba; +aaybb; +aaybc; +aaybd; +aaybe; +aaybf; +aaybg; +aaybh; +aaybi; +aaybj; +aaybk; +aaybl; +aaybm; +aaybn; +aaybo; +aaybp; +aaybq; +aaybr; +aaybs; +aaybt; +aaybu; +aaybv; +aaybw; +aaybx; +aayby; +aaybz; +aayca; +aaycb; +aaycc; +aaycd; +aayce; +aaycf; +aaycg; +aaych; +aayci; +aaycj; +aayck; +aaycl; +aaycm; +aaycn; +aayco; +aaycp; +aaycq; +aaycr; +aaycs; +aayct; +aaycu; +aaycv; +aaycw; +aaycx; +aaycy; +aaycz; +aayda; +aaydb; +aaydc; +aaydd; +aayde; +aaydf; +aaydg; +aaydh; +aaydi; +aaydj; +aaydk; +aaydl; +aaydm; +aaydn; +aaydo; +aaydp; +aaydq; +aaydr; +aayds; +aaydt; +aaydu; +aaydv; +aaydw; +aaydx; +aaydy; +aaydz; +aayea; +aayeb; +aayec; +aayed; +aayee; +aayef; +aayeg; +aayeh; +aayei; +aayej; +aayek; +aayel; +aayem; +aayen; +aayeo; +aayep; +aayeq; +aayer; +aayes; +aayet; +aayeu; +aayev; +aayew; +aayex; +aayey; +aayez; +aayfa; +aayfb; +aayfc; +aayfd; +aayfe; +aayff; +aayfg; +aayfh; +aayfi; +aayfj; +aayfk; +aayfl; +aayfm; +aayfn; +aayfo; +aayfp; +aayfq; +aayfr; +aayfs; +aayft; +aayfu; +aayfv; +aayfw; +aayfx; +aayfy; +aayfz; +aayga; +aaygb; +aaygc; +aaygd; +aayge; +aaygf; +aaygg; +aaygh; +aaygi; +aaygj; +aaygk; +aaygl; +aaygm; +aaygn; +aaygo; +aaygp; +aaygq; +aaygr; +aaygs; +aaygt; +aaygu; +aaygv; +aaygw; +aaygx; +aaygy; +aaygz; +aayha; +aayhb; +aayhc; +aayhd; +aayhe; +aayhf; +aayhg; +aayhh; +aayhi; +aayhj; +aayhk; +aayhl; +aayhm; +aayhn; +aayho; +aayhp; +aayhq; +aayhr; +aayhs; +aayht; +aayhu; +aayhv; +aayhw; +aayhx; +aayhy; +aayhz; +aayia; +aayib; +aayic; +aayid; +aayie; +aayif; +aayig; +aayih; +aayii; +aayij; +aayik; +aayil; +aayim; +aayin; +aayio; +aayip; +aayiq; +aayir; +aayis; +aayit; +aayiu; +aayiv; +aayiw; +aayix; +aayiy; +aayiz; +aayja; +aayjb; +aayjc; +aayjd; +aayje; +aayjf; +aayjg; +aayjh; +aayji; +aayjj; +aayjk; +aayjl; +aayjm; +aayjn; +aayjo; +aayjp; +aayjq; +aayjr; +aayjs; +aayjt; +aayju; +aayjv; +aayjw; +aayjx; +aayjy; +aayjz; +aayka; +aaykb; +aaykc; +aaykd; +aayke; +aaykf; +aaykg; +aaykh; +aayki; +aaykj; +aaykk; +aaykl; +aaykm; +aaykn; +aayko; +aaykp; +aaykq; +aaykr; +aayks; +aaykt; +aayku; +aaykv; +aaykw; +aaykx; +aayky; +aaykz; +aayla; +aaylb; +aaylc; +aayld; +aayle; +aaylf; +aaylg; +aaylh; +aayli; +aaylj; +aaylk; +aayll; +aaylm; +aayln; +aaylo; +aaylp; +aaylq; +aaylr; +aayls; +aaylt; +aaylu; +aaylv; +aaylw; +aaylx; +aayly; +aaylz; +aayma; +aaymb; +aaymc; +aaymd; +aayme; +aaymf; +aaymg; +aaymh; +aaymi; +aaymj; +aaymk; +aayml; +aaymm; +aaymn; +aaymo; +aaymp; +aaymq; +aaymr; +aayms; +aaymt; +aaymu; +aaymv; +aaymw; +aaymx; +aaymy; +aaymz; +aayna; +aaynb; +aaync; +aaynd; +aayne; +aaynf; +aayng; +aaynh; +aayni; +aaynj; +aaynk; +aaynl; +aaynm; +aaynn; +aayno; +aaynp; +aaynq; +aaynr; +aayns; +aaynt; +aaynu; +aaynv; +aaynw; +aaynx; +aayny; +aaynz; +aayoa; +aayob; +aayoc; +aayod; +aayoe; +aayof; +aayog; +aayoh; +aayoi; +aayoj; +aayok; +aayol; +aayom; +aayon; +aayoo; +aayop; +aayoq; +aayor; +aayos; +aayot; +aayou; +aayov; +aayow; +aayox; +aayoy; +aayoz; +aaypa; +aaypb; +aaypc; +aaypd; +aaype; +aaypf; +aaypg; +aayph; +aaypi; +aaypj; +aaypk; +aaypl; +aaypm; +aaypn; +aaypo; +aaypp; +aaypq; +aaypr; +aayps; +aaypt; +aaypu; +aaypv; +aaypw; +aaypx; +aaypy; +aaypz; +aayqa; +aayqb; +aayqc; +aayqd; +aayqe; +aayqf; +aayqg; +aayqh; +aayqi; +aayqj; +aayqk; +aayql; +aayqm; +aayqn; +aayqo; +aayqp; +aayqq; +aayqr; +aayqs; +aayqt; +aayqu; +aayqv; +aayqw; +aayqx; +aayqy; +aayqz; +aayra; +aayrb; +aayrc; +aayrd; +aayre; +aayrf; +aayrg; +aayrh; +aayri; +aayrj; +aayrk; +aayrl; +aayrm; +aayrn; +aayro; +aayrp; +aayrq; +aayrr; +aayrs; +aayrt; +aayru; +aayrv; +aayrw; +aayrx; +aayry; +aayrz; +aaysa; +aaysb; +aaysc; +aaysd; +aayse; +aaysf; +aaysg; +aaysh; +aaysi; +aaysj; +aaysk; +aaysl; +aaysm; +aaysn; +aayso; +aaysp; +aaysq; +aaysr; +aayss; +aayst; +aaysu; +aaysv; +aaysw; +aaysx; +aaysy; +aaysz; +aayta; +aaytb; +aaytc; +aaytd; +aayte; +aaytf; +aaytg; +aayth; +aayti; +aaytj; +aaytk; +aaytl; +aaytm; +aaytn; +aayto; +aaytp; +aaytq; +aaytr; +aayts; +aaytt; +aaytu; +aaytv; +aaytw; +aaytx; +aayty; +aaytz; +aayua; +aayub; +aayuc; +aayud; +aayue; +aayuf; +aayug; +aayuh; +aayui; +aayuj; +aayuk; +aayul; +aayum; +aayun; +aayuo; +aayup; +aayuq; +aayur; +aayus; +aayut; +aayuu; +aayuv; +aayuw; +aayux; +aayuy; +aayuz; +aayva; +aayvb; +aayvc; +aayvd; +aayve; +aayvf; +aayvg; +aayvh; +aayvi; +aayvj; +aayvk; +aayvl; +aayvm; +aayvn; +aayvo; +aayvp; +aayvq; +aayvr; +aayvs; +aayvt; +aayvu; +aayvv; +aayvw; +aayvx; +aayvy; +aayvz; +aaywa; +aaywb; +aaywc; +aaywd; +aaywe; +aaywf; +aaywg; +aaywh; +aaywi; +aaywj; +aaywk; +aaywl; +aaywm; +aaywn; +aaywo; +aaywp; +aaywq; +aaywr; +aayws; +aaywt; +aaywu; +aaywv; +aayww; +aaywx; +aaywy; +aaywz; +aayxa; +aayxb; +aayxc; +aayxd; +aayxe; +aayxf; +aayxg; +aayxh; +aayxi; +aayxj; +aayxk; +aayxl; +aayxm; +aayxn; +aayxo; +aayxp; +aayxq; +aayxr; +aayxs; +aayxt; +aayxu; +aayxv; +aayxw; +aayxx; +aayxy; +aayxz; +aayya; +aayyb; +aayyc; +aayyd; +aayye; +aayyf; +aayyg; +aayyh; +aayyi; +aayyj; +aayyk; +aayyl; +aayym; +aayyn; +aayyo; +aayyp; +aayyq; +aayyr; +aayys; +aayyt; +aayyu; +aayyv; +aayyw; +aayyx; +aayyy; +aayyz; +aayza; +aayzb; +aayzc; +aayzd; +aayze; +aayzf; +aayzg; +aayzh; +aayzi; +aayzj; +aayzk; +aayzl; +aayzm; +aayzn; +aayzo; +aayzp; +aayzq; +aayzr; +aayzs; +aayzt; +aayzu; +aayzv; +aayzw; +aayzx; +aayzy; +aayzz; +aazaa; +aazab; +aazac; +aazad; +aazae; +aazaf; +aazag; +aazah; +aazai; +aazaj; +aazak; +aazal; +aazam; +aazan; +aazao; +aazap; +aazaq; +aazar; +aazas; +aazat; +aazau; +aazav; +aazaw; +aazax; +aazay; +aazaz; +aazba; +aazbb; +aazbc; +aazbd; +aazbe; +aazbf; +aazbg; +aazbh; +aazbi; +aazbj; +aazbk; +aazbl; +aazbm; +aazbn; +aazbo; +aazbp; +aazbq; +aazbr; +aazbs; +aazbt; +aazbu; +aazbv; +aazbw; +aazbx; +aazby; +aazbz; +aazca; +aazcb; +aazcc; +aazcd; +aazce; +aazcf; +aazcg; +aazch; +aazci; +aazcj; +aazck; +aazcl; +aazcm; +aazcn; +aazco; +aazcp; +aazcq; +aazcr; +aazcs; +aazct; +aazcu; +aazcv; +aazcw; +aazcx; +aazcy; +aazcz; +aazda; +aazdb; +aazdc; +aazdd; +aazde; +aazdf; +aazdg; +aazdh; +aazdi; +aazdj; +aazdk; +aazdl; +aazdm; +aazdn; +aazdo; +aazdp; +aazdq; +aazdr; +aazds; +aazdt; +aazdu; +aazdv; +aazdw; +aazdx; +aazdy; +aazdz; +aazea; +aazeb; +aazec; +aazed; +aazee; +aazef; +aazeg; +aazeh; +aazei; +aazej; +aazek; +aazel; +aazem; +aazen; +aazeo; +aazep; +aazeq; +aazer; +aazes; +aazet; +aazeu; +aazev; +aazew; +aazex; +aazey; +aazez; +aazfa; +aazfb; +aazfc; +aazfd; +aazfe; +aazff; +aazfg; +aazfh; +aazfi; +aazfj; +aazfk; +aazfl; +aazfm; +aazfn; +aazfo; +aazfp; +aazfq; +aazfr; +aazfs; +aazft; +aazfu; +aazfv; +aazfw; +aazfx; +aazfy; +aazfz; +aazga; +aazgb; +aazgc; +aazgd; +aazge; +aazgf; +aazgg; +aazgh; +aazgi; +aazgj; +aazgk; +aazgl; +aazgm; +aazgn; +aazgo; +aazgp; +aazgq; +aazgr; +aazgs; +aazgt; +aazgu; +aazgv; +aazgw; +aazgx; +aazgy; +aazgz; +aazha; +aazhb; +aazhc; +aazhd; +aazhe; +aazhf; +aazhg; +aazhh; +aazhi; +aazhj; +aazhk; +aazhl; +aazhm; +aazhn; +aazho; +aazhp; +aazhq; +aazhr; +aazhs; +aazht; +aazhu; +aazhv; +aazhw; +aazhx; +aazhy; +aazhz; +aazia; +aazib; +aazic; +aazid; +aazie; +aazif; +aazig; +aazih; +aazii; +aazij; +aazik; +aazil; +aazim; +aazin; +aazio; +aazip; +aaziq; +aazir; +aazis; +aazit; +aaziu; +aaziv; +aaziw; +aazix; +aaziy; +aaziz; +aazja; +aazjb; +aazjc; +aazjd; +aazje; +aazjf; +aazjg; +aazjh; +aazji; +aazjj; +aazjk; +aazjl; +aazjm; +aazjn; +aazjo; +aazjp; +aazjq; +aazjr; +aazjs; +aazjt; +aazju; +aazjv; +aazjw; +aazjx; +aazjy; +aazjz; +aazka; +aazkb; +aazkc; +aazkd; +aazke; +aazkf; +aazkg; +aazkh; +aazki; +aazkj; +aazkk; +aazkl; +aazkm; +aazkn; +aazko; +aazkp; +aazkq; +aazkr; +aazks; +aazkt; +aazku; +aazkv; +aazkw; +aazkx; +aazky; +aazkz; +aazla; +aazlb; +aazlc; +aazld; +aazle; +aazlf; +aazlg; +aazlh; +aazli; +aazlj; +aazlk; +aazll; +aazlm; +aazln; +aazlo; +aazlp; +aazlq; +aazlr; +aazls; +aazlt; +aazlu; +aazlv; +aazlw; +aazlx; +aazly; +aazlz; +aazma; +aazmb; +aazmc; +aazmd; +aazme; +aazmf; +aazmg; +aazmh; +aazmi; +aazmj; +aazmk; +aazml; +aazmm; +aazmn; +aazmo; +aazmp; +aazmq; +aazmr; +aazms; +aazmt; +aazmu; +aazmv; +aazmw; +aazmx; +aazmy; +aazmz; +aazna; +aaznb; +aaznc; +aaznd; +aazne; +aaznf; +aazng; +aaznh; +aazni; +aaznj; +aaznk; +aaznl; +aaznm; +aaznn; +aazno; +aaznp; +aaznq; +aaznr; +aazns; +aaznt; +aaznu; +aaznv; +aaznw; +aaznx; +aazny; +aaznz; +aazoa; +aazob; +aazoc; +aazod; +aazoe; +aazof; +aazog; +aazoh; +aazoi; +aazoj; +aazok; +aazol; +aazom; +aazon; +aazoo; +aazop; +aazoq; +aazor; +aazos; +aazot; +aazou; +aazov; +aazow; +aazox; +aazoy; +aazoz; +aazpa; +aazpb; +aazpc; +aazpd; +aazpe; +aazpf; +aazpg; +aazph; +aazpi; +aazpj; +aazpk; +aazpl; +aazpm; +aazpn; +aazpo; +aazpp; +aazpq; +aazpr; +aazps; +aazpt; +aazpu; +aazpv; +aazpw; +aazpx; +aazpy; +aazpz; +aazqa; +aazqb; +aazqc; +aazqd; +aazqe; +aazqf; +aazqg; +aazqh; +aazqi; +aazqj; +aazqk; +aazql; +aazqm; +aazqn; +aazqo; +aazqp; +aazqq; +aazqr; +aazqs; +aazqt; +aazqu; +aazqv; +aazqw; +aazqx; +aazqy; +aazqz; +aazra; +aazrb; +aazrc; +aazrd; +aazre; +aazrf; +aazrg; +aazrh; +aazri; +aazrj; +aazrk; +aazrl; +aazrm; +aazrn; +aazro; +aazrp; +aazrq; +aazrr; +aazrs; +aazrt; +aazru; +aazrv; +aazrw; +aazrx; +aazry; +aazrz; +aazsa; +aazsb; +aazsc; +aazsd; +aazse; +aazsf; +aazsg; +aazsh; +aazsi; +aazsj; +aazsk; +aazsl; +aazsm; +aazsn; +aazso; +aazsp; +aazsq; +aazsr; +aazss; +aazst; +aazsu; +aazsv; +aazsw; +aazsx; +aazsy; +aazsz; +aazta; +aaztb; +aaztc; +aaztd; +aazte; +aaztf; +aaztg; +aazth; +aazti; +aaztj; +aaztk; +aaztl; +aaztm; +aaztn; +aazto; +aaztp; +aaztq; +aaztr; +aazts; +aaztt; +aaztu; +aaztv; +aaztw; +aaztx; +aazty; +aaztz; +aazua; +aazub; +aazuc; +aazud; +aazue; +aazuf; +aazug; +aazuh; +aazui; +aazuj; +aazuk; +aazul; +aazum; +aazun; +aazuo; +aazup; +aazuq; +aazur; +aazus; +aazut; +aazuu; +aazuv; +aazuw; +aazux; +aazuy; +aazuz; +aazva; +aazvb; +aazvc; +aazvd; +aazve; +aazvf; +aazvg; +aazvh; +aazvi; +aazvj; +aazvk; +aazvl; +aazvm; +aazvn; +aazvo; +aazvp; +aazvq; +aazvr; +aazvs; +aazvt; +aazvu; +aazvv; +aazvw; +aazvx; +aazvy; +aazvz; +aazwa; +aazwb; +aazwc; +aazwd; +aazwe; +aazwf; +aazwg; +aazwh; +aazwi; +aazwj; +aazwk; +aazwl; +aazwm; +aazwn; +aazwo; +aazwp; +aazwq; +aazwr; +aazws; +aazwt; +aazwu; +aazwv; +aazww; +aazwx; +aazwy; +aazwz; +aazxa; +aazxb; +aazxc; +aazxd; +aazxe; +aazxf; +aazxg; +aazxh; +aazxi; +aazxj; +aazxk; +aazxl; +aazxm; +aazxn; +aazxo; +aazxp; +aazxq; +aazxr; +aazxs; +aazxt; +aazxu; +aazxv; +aazxw; +aazxx; +aazxy; +aazxz; +aazya; +aazyb; +aazyc; +aazyd; +aazye; +aazyf; +aazyg; +aazyh; +aazyi; +aazyj; +aazyk; +aazyl; +aazym; +aazyn; +aazyo; +aazyp; +aazyq; +aazyr; +aazys; +aazyt; +aazyu; +aazyv; +aazyw; +aazyx; +aazyy; +aazyz; +aazza; +aazzb; +aazzc; +aazzd; +aazze; +aazzf; +aazzg; +aazzh; +aazzi; +aazzj; +aazzk; +aazzl; +aazzm; +aazzn; +aazzo; +aazzp; +aazzq; +aazzr; +aazzs; +aazzt; +aazzu; +aazzv; +aazzw; +aazzx; +aazzy; +aazzz; +abaaa; +abaab; +abaac; +abaad; +abaae; +abaaf; +abaag; +abaah; +abaai; +abaaj; +abaak; +abaal; +abaam; +abaan; +abaao; +abaap; +abaaq; +abaar; +abaas; +abaat; +abaau; +abaav; +abaaw; +abaax; +abaay; +abaaz; +ababa; +ababb; +ababc; +ababd; +ababe; +ababf; +ababg; +ababh; +ababi; +ababj; +ababk; +ababl; +ababm; +ababn; +ababo; +ababp; +ababq; +ababr; +ababs; +ababt; +ababu; +ababv; +ababw; +ababx; +ababy; +ababz; +abaca; +abacb; +abacc; +abacd; +abace; +abacf; +abacg; +abach; +abaci; +abacj; +aback; +abacl; +abacm; +abacn; +abaco; +abacp; +abacq; +abacr; +abacs; +abact; +abacu; +abacv; +abacw; +abacx; +abacy; +abacz; +abada; +abadb; +abadc; +abadd; +abade; +abadf; +abadg; +abadh; +abadi; +abadj; +abadk; +abadl; +abadm; +abadn; +abado; +abadp; +abadq; +abadr; +abads; +abadt; +abadu; +abadv; +abadw; +abadx; +abady; +abadz; +abaea; +abaeb; +abaec; +abaed; +abaee; +abaef; +abaeg; +abaeh; +abaei; +abaej; +abaek; +abael; +abaem; +abaen; +abaeo; +abaep; +abaeq; +abaer; +abaes; +abaet; +abaeu; +abaev; +abaew; +abaex; +abaey; +abaez; +abafa; +abafb; +abafc; +abafd; +abafe; +abaff; +abafg; +abafh; +abafi; +abafj; +abafk; +abafl; +abafm; +abafn; +abafo; +abafp; +abafq; +abafr; +abafs; +abaft; +abafu; +abafv; +abafw; +abafx; +abafy; +abafz; +abaga; +abagb; +abagc; +abagd; +abage; +abagf; +abagg; +abagh; +abagi; +abagj; +abagk; +abagl; +abagm; +abagn; +abago; +abagp; +abagq; +abagr; +abags; +abagt; +abagu; +abagv; +abagw; +abagx; +abagy; +abagz; +abaha; +abahb; +abahc; +abahd; +abahe; +abahf; +abahg; +abahh; +abahi; +abahj; +abahk; +abahl; +abahm; +abahn; +abaho; +abahp; +abahq; +abahr; +abahs; +abaht; +abahu; +abahv; +abahw; +abahx; +abahy; +abahz; +abaia; +abaib; +abaic; +abaid; +abaie; +abaif; +abaig; +abaih; +abaii; +abaij; +abaik; +abail; +abaim; +abain; +abaio; +abaip; +abaiq; +abair; +abais; +abait; +abaiu; +abaiv; +abaiw; +abaix; +abaiy; +abaiz; +abaja; +abajb; +abajc; +abajd; +abaje; +abajf; +abajg; +abajh; +abaji; +abajj; +abajk; +abajl; +abajm; +abajn; +abajo; +abajp; +abajq; +abajr; +abajs; +abajt; +abaju; +abajv; +abajw; +abajx; +abajy; +abajz; +abaka; +abakb; +abakc; +abakd; +abake; +abakf; +abakg; +abakh; +abaki; +abakj; +abakk; +abakl; +abakm; +abakn; +abako; +abakp; +abakq; +abakr; +abaks; +abakt; +abaku; +abakv; +abakw; +abakx; +abaky; +abakz; +abala; +abalb; +abalc; +abald; +abale; +abalf; +abalg; +abalh; +abali; +abalj; +abalk; +aball; +abalm; +abaln; +abalo; +abalp; +abalq; +abalr; +abals; +abalt; +abalu; +abalv; +abalw; +abalx; +abaly; +abalz; +abama; +abamb; +abamc; +abamd; +abame; +abamf; +abamg; +abamh; +abami; +abamj; +abamk; +abaml; +abamm; +abamn; +abamo; +abamp; +abamq; +abamr; +abams; +abamt; +abamu; +abamv; +abamw; +abamx; +abamy; +abamz; +abana; +abanb; +abanc; +aband; +abane; +abanf; +abang; +abanh; +abani; +abanj; +abank; +abanl; +abanm; +abann; +abano; +abanp; +abanq; +abanr; +abans; +abant; +abanu; +abanv; +abanw; +abanx; +abany; +abanz; +abaoa; +abaob; +abaoc; +abaod; +abaoe; +abaof; +abaog; +abaoh; +abaoi; +abaoj; +abaok; +abaol; +abaom; +abaon; +abaoo; +abaop; +abaoq; +abaor; +abaos; +abaot; +abaou; +abaov; +abaow; +abaox; +abaoy; +abaoz; +abapa; +abapb; +abapc; +abapd; +abape; +abapf; +abapg; +abaph; +abapi; +abapj; +abapk; +abapl; +abapm; +abapn; +abapo; +abapp; +abapq; +abapr; +abaps; +abapt; +abapu; +abapv; +abapw; +abapx; +abapy; +abapz; +abaqa; +abaqb; +abaqc; +abaqd; +abaqe; +abaqf; +abaqg; +abaqh; +abaqi; +abaqj; +abaqk; +abaql; +abaqm; +abaqn; +abaqo; +abaqp; +abaqq; +abaqr; +abaqs; +abaqt; +abaqu; +abaqv; +abaqw; +abaqx; +abaqy; +abaqz; +abara; +abarb; +abarc; +abard; +abare; +abarf; +abarg; +abarh; +abari; +abarj; +abark; +abarl; +abarm; +abarn; +abaro; +abarp; +abarq; +abarr; +abars; +abart; +abaru; +abarv; +abarw; +abarx; +abary; +abarz; +abasa; +abasb; +abasc; +abasd; +abase; +abasf; +abasg; +abash; +abasi; +abasj; +abask; +abasl; +abasm; +abasn; +abaso; +abasp; +abasq; +abasr; +abass; +abast; +abasu; +abasv; +abasw; +abasx; +abasy; +abasz; +abata; +abatb; +abatc; +abatd; +abate; +abatf; +abatg; +abath; +abati; +abatj; +abatk; +abatl; +abatm; +abatn; +abato; +abatp; +abatq; +abatr; +abats; +abatt; +abatu; +abatv; +abatw; +abatx; +abaty; +abatz; +abaua; +abaub; +abauc; +abaud; +abaue; +abauf; +abaug; +abauh; +abaui; +abauj; +abauk; +abaul; +abaum; +abaun; +abauo; +abaup; +abauq; +abaur; +abaus; +abaut; +abauu; +abauv; +abauw; +abaux; +abauy; +abauz; +abava; +abavb; +abavc; +abavd; +abave; +abavf; +abavg; +abavh; +abavi; +abavj; +abavk; +abavl; +abavm; +abavn; +abavo; +abavp; +abavq; +abavr; +abavs; +abavt; +abavu; +abavv; +abavw; +abavx; +abavy; +abavz; +abawa; +abawb; +abawc; +abawd; +abawe; +abawf; +abawg; +abawh; +abawi; +abawj; +abawk; +abawl; +abawm; +abawn; +abawo; +abawp; +abawq; +abawr; +abaws; +abawt; +abawu; +abawv; +abaww; +abawx; +abawy; +abawz; +abaxa; +abaxb; +abaxc; +abaxd; +abaxe; +abaxf; +abaxg; +abaxh; +abaxi; +abaxj; +abaxk; +abaxl; +abaxm; +abaxn; +abaxo; +abaxp; +abaxq; +abaxr; +abaxs; +abaxt; +abaxu; +abaxv; +abaxw; +abaxx; +abaxy; +abaxz; +abaya; +abayb; +abayc; +abayd; +abaye; +abayf; +abayg; +abayh; +abayi; +abayj; +abayk; +abayl; +abaym; +abayn; +abayo; +abayp; +abayq; +abayr; +abays; +abayt; +abayu; +abayv; +abayw; +abayx; +abayy; +abayz; +abaza; +abazb; +abazc; +abazd; +abaze; +abazf; +abazg; +abazh; +abazi; +abazj; +abazk; +abazl; +abazm; +abazn; +abazo; +abazp; +abazq; +abazr; +abazs; +abazt; +abazu; +abazv; +abazw; +abazx; +abazy; +abazz; +abbaa; +abbab; +abbac; +abbad; +abbae; +abbaf; +abbag; +abbah; +abbai; +abbaj; +abbak; +abbal; +abbam; +abban; +abbao; +abbap; +abbaq; +abbar; +abbas; +abbat; +abbau; +abbav; +abbaw; +abbax; +abbay; +abbaz; +abbba; +abbbb; +abbbc; +abbbd; +abbbe; +abbbf; +abbbg; +abbbh; +abbbi; +abbbj; +abbbk; +abbbl; +abbbm; +abbbn; +abbbo; +abbbp; +abbbq; +abbbr; +abbbs; +abbbt; +abbbu; +abbbv; +abbbw; +abbbx; +abbby; +abbbz; +abbca; +abbcb; +abbcc; +abbcd; +abbce; +abbcf; +abbcg; +abbch; +abbci; +abbcj; +abbck; +abbcl; +abbcm; +abbcn; +abbco; +abbcp; +abbcq; +abbcr; +abbcs; +abbct; +abbcu; +abbcv; +abbcw; +abbcx; +abbcy; +abbcz; +abbda; +abbdb; +abbdc; +abbdd; +abbde; +abbdf; +abbdg; +abbdh; +abbdi; +abbdj; +abbdk; +abbdl; +abbdm; +abbdn; +abbdo; +abbdp; +abbdq; +abbdr; +abbds; +abbdt; +abbdu; +abbdv; +abbdw; +abbdx; +abbdy; +abbdz; +abbea; +abbeb; +abbec; +abbed; +abbee; +abbef; +abbeg; +abbeh; +abbei; +abbej; +abbek; +abbel; +abbem; +abben; +abbeo; +abbep; +abbeq; +abber; +abbes; +abbet; +abbeu; +abbev; +abbew; +abbex; +abbey; +abbez; +abbfa; +abbfb; +abbfc; +abbfd; +abbfe; +abbff; +abbfg; +abbfh; +abbfi; +abbfj; +abbfk; +abbfl; +abbfm; +abbfn; +abbfo; +abbfp; +abbfq; +abbfr; +abbfs; +abbft; +abbfu; +abbfv; +abbfw; +abbfx; +abbfy; +abbfz; +abbga; +abbgb; +abbgc; +abbgd; +abbge; +abbgf; +abbgg; +abbgh; +abbgi; +abbgj; +abbgk; +abbgl; +abbgm; +abbgn; +abbgo; +abbgp; +abbgq; +abbgr; +abbgs; +abbgt; +abbgu; +abbgv; +abbgw; +abbgx; +abbgy; +abbgz; +abbha; +abbhb; +abbhc; +abbhd; +abbhe; +abbhf; +abbhg; +abbhh; +abbhi; +abbhj; +abbhk; +abbhl; +abbhm; +abbhn; +abbho; +abbhp; +abbhq; +abbhr; +abbhs; +abbht; +abbhu; +abbhv; +abbhw; +abbhx; +abbhy; +abbhz; +abbia; +abbib; +abbic; +abbid; +abbie; +abbif; +abbig; +abbih; +abbii; +abbij; +abbik; +abbil; +abbim; +abbin; +abbio; +abbip; +abbiq; +abbir; +abbis; +abbit; +abbiu; +abbiv; +abbiw; +abbix; +abbiy; +abbiz; +abbja; +abbjb; +abbjc; +abbjd; +abbje; +abbjf; +abbjg; +abbjh; +abbji; +abbjj; +abbjk; +abbjl; +abbjm; +abbjn; +abbjo; +abbjp; +abbjq; +abbjr; +abbjs; +abbjt; +abbju; +abbjv; +abbjw; +abbjx; +abbjy; +abbjz; +abbka; +abbkb; +abbkc; +abbkd; +abbke; +abbkf; +abbkg; +abbkh; +abbki; +abbkj; +abbkk; +abbkl; +abbkm; +abbkn; +abbko; +abbkp; +abbkq; +abbkr; +abbks; +abbkt; +abbku; +abbkv; +abbkw; +abbkx; +abbky; +abbkz; +abbla; +abblb; +abblc; +abbld; +abble; +abblf; +abblg; +abblh; +abbli; +abblj; +abblk; +abbll; +abblm; +abbln; +abblo; +abblp; +abblq; +abblr; +abbls; +abblt; +abblu; +abblv; +abblw; +abblx; +abbly; +abblz; +abbma; +abbmb; +abbmc; +abbmd; +abbme; +abbmf; +abbmg; +abbmh; +abbmi; +abbmj; +abbmk; +abbml; +abbmm; +abbmn; +abbmo; +abbmp; +abbmq; +abbmr; +abbms; +abbmt; +abbmu; +abbmv; +abbmw; +abbmx; +abbmy; +abbmz; +abbna; +abbnb; +abbnc; +abbnd; +abbne; +abbnf; +abbng; +abbnh; +abbni; +abbnj; +abbnk; +abbnl; +abbnm; +abbnn; +abbno; +abbnp; +abbnq; +abbnr; +abbns; +abbnt; +abbnu; +abbnv; +abbnw; +abbnx; +abbny; +abbnz; +abboa; +abbob; +abboc; +abbod; +abboe; +abbof; +abbog; +abboh; +abboi; +abboj; +abbok; +abbol; +abbom; +abbon; +abboo; +abbop; +abboq; +abbor; +abbos; +abbot; +abbou; +abbov; +abbow; +abbox; +abboy; +abboz; +abbpa; +abbpb; +abbpc; +abbpd; +abbpe; +abbpf; +abbpg; +abbph; +abbpi; +abbpj; +abbpk; +abbpl; +abbpm; +abbpn; +abbpo; +abbpp; +abbpq; +abbpr; +abbps; +abbpt; +abbpu; +abbpv; +abbpw; +abbpx; +abbpy; +abbpz; +abbqa; +abbqb; +abbqc; +abbqd; +abbqe; +abbqf; +abbqg; +abbqh; +abbqi; +abbqj; +abbqk; +abbql; +abbqm; +abbqn; +abbqo; +abbqp; +abbqq; +abbqr; +abbqs; +abbqt; +abbqu; +abbqv; +abbqw; +abbqx; +abbqy; +abbqz; +abbra; +abbrb; +abbrc; +abbrd; +abbre; +abbrf; +abbrg; +abbrh; +abbri; +abbrj; +abbrk; +abbrl; +abbrm; +abbrn; +abbro; +abbrp; +abbrq; +abbrr; +abbrs; +abbrt; +abbru; +abbrv; +abbrw; +abbrx; +abbry; +abbrz; +abbsa; +abbsb; +abbsc; +abbsd; +abbse; +abbsf; +abbsg; +abbsh; +abbsi; +abbsj; +abbsk; +abbsl; +abbsm; +abbsn; +abbso; +abbsp; +abbsq; +abbsr; +abbss; +abbst; +abbsu; +abbsv; +abbsw; +abbsx; +abbsy; +abbsz; +abbta; +abbtb; +abbtc; +abbtd; +abbte; +abbtf; +abbtg; +abbth; +abbti; +abbtj; +abbtk; +abbtl; +abbtm; +abbtn; +abbto; +abbtp; +abbtq; +abbtr; +abbts; +abbtt; +abbtu; +abbtv; +abbtw; +abbtx; +abbty; +abbtz; +abbua; +abbub; +abbuc; +abbud; +abbue; +abbuf; +abbug; +abbuh; +abbui; +abbuj; +abbuk; +abbul; +abbum; +abbun; +abbuo; +abbup; +abbuq; +abbur; +abbus; +abbut; +abbuu; +abbuv; +abbuw; +abbux; +abbuy; +abbuz; +abbva; +abbvb; +abbvc; +abbvd; +abbve; +abbvf; +abbvg; +abbvh; +abbvi; +abbvj; +abbvk; +abbvl; +abbvm; +abbvn; +abbvo; +abbvp; +abbvq; +abbvr; +abbvs; +abbvt; +abbvu; +abbvv; +abbvw; +abbvx; +abbvy; +abbvz; +abbwa; +abbwb; +abbwc; +abbwd; +abbwe; +abbwf; +abbwg; +abbwh; +abbwi; +abbwj; +abbwk; +abbwl; +abbwm; +abbwn; +abbwo; +abbwp; +abbwq; +abbwr; +abbws; +abbwt; +abbwu; +abbwv; +abbww; +abbwx; +abbwy; +abbwz; +abbxa; +abbxb; +abbxc; +abbxd; +abbxe; +abbxf; +abbxg; +abbxh; +abbxi; +abbxj; +abbxk; +abbxl; +abbxm; +abbxn; +abbxo; +abbxp; +abbxq; +abbxr; +abbxs; +abbxt; +abbxu; +abbxv; +abbxw; +abbxx; +abbxy; +abbxz; +abbya; +abbyb; +abbyc; +abbyd; +abbye; +abbyf; +abbyg; +abbyh; +abbyi; +abbyj; +abbyk; +abbyl; +abbym; +abbyn; +abbyo; +abbyp; +abbyq; +abbyr; +abbys; +abbyt; +abbyu; +abbyv; +abbyw; +abbyx; +abbyy; +abbyz; +abbza; +abbzb; +abbzc; +abbzd; +abbze; +abbzf; +abbzg; +abbzh; +abbzi; +abbzj; +abbzk; +abbzl; +abbzm; +abbzn; +abbzo; +abbzp; +abbzq; +abbzr; +abbzs; +abbzt; +abbzu; +abbzv; +abbzw; +abbzx; +abbzy; +abbzz; +abcaa; +abcab; +abcac; +abcad; +abcae; +abcaf; +abcag; +abcah; +abcai; +abcaj; +abcak; +abcal; +abcam; +abcan; +abcao; +abcap; +abcaq; +abcar; +abcas; +abcat; +abcau; +abcav; +abcaw; +abcax; +abcay; +abcaz; +abcba; +abcbb; +abcbc; +abcbd; +abcbe; +abcbf; +abcbg; +abcbh; +abcbi; +abcbj; +abcbk; +abcbl; +abcbm; +abcbn; +abcbo; +abcbp; +abcbq; +abcbr; +abcbs; +abcbt; +abcbu; +abcbv; +abcbw; +abcbx; +abcby; +abcbz; +abcca; +abccb; +abccc; +abccd; +abcce; +abccf; +abccg; +abcch; +abcci; +abccj; +abcck; +abccl; +abccm; +abccn; +abcco; +abccp; +abccq; +abccr; +abccs; +abcct; +abccu; +abccv; +abccw; +abccx; +abccy; +abccz; +abcda; +abcdb; +abcdc; +abcdd; +abcde; +abcdf; +abcdg; +abcdh; +abcdi; +abcdj; +abcdk; +abcdl; +abcdm; +abcdn; +abcdo; +abcdp; +abcdq; +abcdr; +abcds; +abcdt; +abcdu; +abcdv; +abcdw; +abcdx; +abcdy; +abcdz; +abcea; +abceb; +abcec; +abced; +abcee; +abcef; +abceg; +abceh; +abcei; +abcej; +abcek; +abcel; +abcem; +abcen; +abceo; +abcep; +abceq; +abcer; +abces; +abcet; +abceu; +abcev; +abcew; +abcex; +abcey; +abcez; +abcfa; +abcfb; +abcfc; +abcfd; +abcfe; +abcff; +abcfg; +abcfh; +abcfi; +abcfj; +abcfk; +abcfl; +abcfm; +abcfn; +abcfo; +abcfp; +abcfq; +abcfr; +abcfs; +abcft; +abcfu; +abcfv; +abcfw; +abcfx; +abcfy; +abcfz; +abcga; +abcgb; +abcgc; +abcgd; +abcge; +abcgf; +abcgg; +abcgh; +abcgi; +abcgj; +abcgk; +abcgl; +abcgm; +abcgn; +abcgo; +abcgp; +abcgq; +abcgr; +abcgs; +abcgt; +abcgu; +abcgv; +abcgw; +abcgx; +abcgy; +abcgz; +abcha; +abchb; +abchc; +abchd; +abche; +abchf; +abchg; +abchh; +abchi; +abchj; +abchk; +abchl; +abchm; +abchn; +abcho; +abchp; +abchq; +abchr; +abchs; +abcht; +abchu; +abchv; +abchw; +abchx; +abchy; +abchz; +abcia; +abcib; +abcic; +abcid; +abcie; +abcif; +abcig; +abcih; +abcii; +abcij; +abcik; +abcil; +abcim; +abcin; +abcio; +abcip; +abciq; +abcir; +abcis; +abcit; +abciu; +abciv; +abciw; +abcix; +abciy; +abciz; +abcja; +abcjb; +abcjc; +abcjd; +abcje; +abcjf; +abcjg; +abcjh; +abcji; +abcjj; +abcjk; +abcjl; +abcjm; +abcjn; +abcjo; +abcjp; +abcjq; +abcjr; +abcjs; +abcjt; +abcju; +abcjv; +abcjw; +abcjx; +abcjy; +abcjz; +abcka; +abckb; +abckc; +abckd; +abcke; +abckf; +abckg; +abckh; +abcki; +abckj; +abckk; +abckl; +abckm; +abckn; +abcko; +abckp; +abckq; +abckr; +abcks; +abckt; +abcku; +abckv; +abckw; +abckx; +abcky; +abckz; +abcla; +abclb; +abclc; +abcld; +abcle; +abclf; +abclg; +abclh; +abcli; +abclj; +abclk; +abcll; +abclm; +abcln; +abclo; +abclp; +abclq; +abclr; +abcls; +abclt; +abclu; +abclv; +abclw; +abclx; +abcly; +abclz; +abcma; +abcmb; +abcmc; +abcmd; +abcme; +abcmf; +abcmg; +abcmh; +abcmi; +abcmj; +abcmk; +abcml; +abcmm; +abcmn; +abcmo; +abcmp; +abcmq; +abcmr; +abcms; +abcmt; +abcmu; +abcmv; +abcmw; +abcmx; +abcmy; +abcmz; +abcna; +abcnb; +abcnc; +abcnd; +abcne; +abcnf; +abcng; +abcnh; +abcni; +abcnj; +abcnk; +abcnl; +abcnm; +abcnn; +abcno; +abcnp; +abcnq; +abcnr; +abcns; +abcnt; +abcnu; +abcnv; +abcnw; +abcnx; +abcny; +abcnz; +abcoa; +abcob; +abcoc; +abcod; +abcoe; +abcof; +abcog; +abcoh; +abcoi; +abcoj; +abcok; +abcol; +abcom; +abcon; +abcoo; +abcop; +abcoq; +abcor; +abcos; +abcot; +abcou; +abcov; +abcow; +abcox; +abcoy; +abcoz; +abcpa; +abcpb; +abcpc; +abcpd; +abcpe; +abcpf; +abcpg; +abcph; +abcpi; +abcpj; +abcpk; +abcpl; +abcpm; +abcpn; +abcpo; +abcpp; +abcpq; +abcpr; +abcps; +abcpt; +abcpu; +abcpv; +abcpw; +abcpx; +abcpy; +abcpz; +abcqa; +abcqb; +abcqc; +abcqd; +abcqe; +abcqf; +abcqg; +abcqh; +abcqi; +abcqj; +abcqk; +abcql; +abcqm; +abcqn; +abcqo; +abcqp; +abcqq; +abcqr; +abcqs; +abcqt; +abcqu; +abcqv; +abcqw; +abcqx; +abcqy; +abcqz; +abcra; +abcrb; +abcrc; +abcrd; +abcre; +abcrf; +abcrg; +abcrh; +abcri; +abcrj; +abcrk; +abcrl; +abcrm; +abcrn; +abcro; +abcrp; +abcrq; +abcrr; +abcrs; +abcrt; +abcru; +abcrv; +abcrw; +abcrx; +abcry; +abcrz; +abcsa; +abcsb; +abcsc; +abcsd; +abcse; +abcsf; +abcsg; +abcsh; +abcsi; +abcsj; +abcsk; +abcsl; +abcsm; +abcsn; +abcso; +abcsp; +abcsq; +abcsr; +abcss; +abcst; +abcsu; +abcsv; +abcsw; +abcsx; +abcsy; +abcsz; +abcta; +abctb; +abctc; +abctd; +abcte; +abctf; +abctg; +abcth; +abcti; +abctj; +abctk; +abctl; +abctm; +abctn; +abcto; +abctp; +abctq; +abctr; +abcts; +abctt; +abctu; +abctv; +abctw; +abctx; +abcty; +abctz; +abcua; +abcub; +abcuc; +abcud; +abcue; +abcuf; +abcug; +abcuh; +abcui; +abcuj; +abcuk; +abcul; +abcum; +abcun; +abcuo; +abcup; +abcuq; +abcur; +abcus; +abcut; +abcuu; +abcuv; +abcuw; +abcux; +abcuy; +abcuz; +abcva; +abcvb; +abcvc; +abcvd; +abcve; +abcvf; +abcvg; +abcvh; +abcvi; +abcvj; +abcvk; +abcvl; +abcvm; +abcvn; +abcvo; +abcvp; +abcvq; +abcvr; +abcvs; +abcvt; +abcvu; +abcvv; +abcvw; +abcvx; +abcvy; +abcvz; +abcwa; +abcwb; +abcwc; +abcwd; +abcwe; +abcwf; +abcwg; +abcwh; +abcwi; +abcwj; +abcwk; +abcwl; +abcwm; +abcwn; +abcwo; +abcwp; +abcwq; +abcwr; +abcws; +abcwt; +abcwu; +abcwv; +abcww; +abcwx; +abcwy; +abcwz; +abcxa; +abcxb; +abcxc; +abcxd; +abcxe; +abcxf; +abcxg; +abcxh; +abcxi; +abcxj; +abcxk; +abcxl; +abcxm; +abcxn; +abcxo; +abcxp; +abcxq; +abcxr; +abcxs; +abcxt; +abcxu; +abcxv; +abcxw; +abcxx; +abcxy; +abcxz; +abcya; +abcyb; +abcyc; +abcyd; +abcye; +abcyf; +abcyg; +abcyh; +abcyi; +abcyj; +abcyk; +abcyl; +abcym; +abcyn; +abcyo; +abcyp; +abcyq; +abcyr; +abcys; +abcyt; +abcyu; +abcyv; +abcyw; +abcyx; +abcyy; +abcyz; +abcza; +abczb; +abczc; +abczd; +abcze; +abczf; +abczg; +abczh; +abczi; +abczj; +abczk; +abczl; +abczm; +abczn; +abczo; +abczp; +abczq; +abczr; +abczs; +abczt; +abczu; +abczv; +abczw; +abczx; +abczy; +abczz; +abdaa; +abdab; +abdac; +abdad; +abdae; +abdaf; +abdag; +abdah; +abdai; +abdaj; +abdak; +abdal; +abdam; +abdan; +abdao; +abdap; +abdaq; +abdar; +abdas; +abdat; +abdau; +abdav; +abdaw; +abdax; +abday; +abdaz; +abdba; +abdbb; +abdbc; +abdbd; +abdbe; +abdbf; +abdbg; +abdbh; +abdbi; +abdbj; +abdbk; +abdbl; +abdbm; +abdbn; +abdbo; +abdbp; +abdbq; +abdbr; +abdbs; +abdbt; +abdbu; +abdbv; +abdbw; +abdbx; +abdby; +abdbz; +abdca; +abdcb; +abdcc; +abdcd; +abdce; +abdcf; +abdcg; +abdch; +abdci; +abdcj; +abdck; +abdcl; +abdcm; +abdcn; +abdco; +abdcp; +abdcq; +abdcr; +abdcs; +abdct; +abdcu; +abdcv; +abdcw; +abdcx; +abdcy; +abdcz; +abdda; +abddb; +abddc; +abddd; +abdde; +abddf; +abddg; +abddh; +abddi; +abddj; +abddk; +abddl; +abddm; +abddn; +abddo; +abddp; +abddq; +abddr; +abdds; +abddt; +abddu; +abddv; +abddw; +abddx; +abddy; +abddz; +abdea; +abdeb; +abdec; +abded; +abdee; +abdef; +abdeg; +abdeh; +abdei; +abdej; +abdek; +abdel; +abdem; +abden; +abdeo; +abdep; +abdeq; +abder; +abdes; +abdet; +abdeu; +abdev; +abdew; +abdex; +abdey; +abdez; +abdfa; +abdfb; +abdfc; +abdfd; +abdfe; +abdff; +abdfg; +abdfh; +abdfi; +abdfj; +abdfk; +abdfl; +abdfm; +abdfn; +abdfo; +abdfp; +abdfq; +abdfr; +abdfs; +abdft; +abdfu; +abdfv; +abdfw; +abdfx; +abdfy; +abdfz; +abdga; +abdgb; +abdgc; +abdgd; +abdge; +abdgf; +abdgg; +abdgh; +abdgi; +abdgj; +abdgk; +abdgl; +abdgm; +abdgn; +abdgo; +abdgp; +abdgq; +abdgr; +abdgs; +abdgt; +abdgu; +abdgv; +abdgw; +abdgx; +abdgy; +abdgz; +abdha; +abdhb; +abdhc; +abdhd; +abdhe; +abdhf; +abdhg; +abdhh; +abdhi; +abdhj; +abdhk; +abdhl; +abdhm; +abdhn; +abdho; +abdhp; +abdhq; +abdhr; +abdhs; +abdht; +abdhu; +abdhv; +abdhw; +abdhx; +abdhy; +abdhz; +abdia; +abdib; +abdic; +abdid; +abdie; +abdif; +abdig; +abdih; +abdii; +abdij; +abdik; +abdil; +abdim; +abdin; +abdio; +abdip; +abdiq; +abdir; +abdis; +abdit; +abdiu; +abdiv; +abdiw; +abdix; +abdiy; +abdiz; +abdja; +abdjb; +abdjc; +abdjd; +abdje; +abdjf; +abdjg; +abdjh; +abdji; +abdjj; +abdjk; +abdjl; +abdjm; +abdjn; +abdjo; +abdjp; +abdjq; +abdjr; +abdjs; +abdjt; +abdju; +abdjv; +abdjw; +abdjx; +abdjy; +abdjz; +abdka; +abdkb; +abdkc; +abdkd; +abdke; +abdkf; +abdkg; +abdkh; +abdki; +abdkj; +abdkk; +abdkl; +abdkm; +abdkn; +abdko; +abdkp; +abdkq; +abdkr; +abdks; +abdkt; +abdku; +abdkv; +abdkw; +abdkx; +abdky; +abdkz; +abdla; +abdlb; +abdlc; +abdld; +abdle; +abdlf; +abdlg; +abdlh; +abdli; +abdlj; +abdlk; +abdll; +abdlm; +abdln; +abdlo; +abdlp; +abdlq; +abdlr; +abdls; +abdlt; +abdlu; +abdlv; +abdlw; +abdlx; +abdly; +abdlz; +abdma; +abdmb; +abdmc; +abdmd; +abdme; +abdmf; +abdmg; +abdmh; +abdmi; +abdmj; +abdmk; +abdml; +abdmm; +abdmn; +abdmo; +abdmp; +abdmq; +abdmr; +abdms; +abdmt; +abdmu; +abdmv; +abdmw; +abdmx; +abdmy; +abdmz; +abdna; +abdnb; +abdnc; +abdnd; +abdne; +abdnf; +abdng; +abdnh; +abdni; +abdnj; +abdnk; +abdnl; +abdnm; +abdnn; +abdno; +abdnp; +abdnq; +abdnr; +abdns; +abdnt; +abdnu; +abdnv; +abdnw; +abdnx; +abdny; +abdnz; +abdoa; +abdob; +abdoc; +abdod; +abdoe; +abdof; +abdog; +abdoh; +abdoi; +abdoj; +abdok; +abdol; +abdom; +abdon; +abdoo; +abdop; +abdoq; +abdor; +abdos; +abdot; +abdou; +abdov; +abdow; +abdox; +abdoy; +abdoz; +abdpa; +abdpb; +abdpc; +abdpd; +aljwf +|]; diff --git a/camlp4/test/fixtures/bug-4058.ml b/camlp4/test/fixtures/bug-4058.ml new file mode 100644 index 00000000..f83322bb --- /dev/null +++ b/camlp4/test/fixtures/bug-4058.ml @@ -0,0 +1,4 @@ +let _ = (fun x -> x), 1 +let _ = (x := 1), 2 +let _ = (x <- 1), 2 +let _ = (if true then 1 else 2), 1 diff --git a/camlp4/test/fixtures/bug-4337.ml b/camlp4/test/fixtures/bug-4337.ml new file mode 100644 index 00000000..5a44ed0c --- /dev/null +++ b/camlp4/test/fixtures/bug-4337.ml @@ -0,0 +1 @@ +match [] with []°-> () | _ -> ();; diff --git a/camlp4/test/fixtures/bug-by-vincent-balat.ml b/camlp4/test/fixtures/bug-by-vincent-balat.ml new file mode 100644 index 00000000..ed75488a --- /dev/null +++ b/camlp4/test/fixtures/bug-by-vincent-balat.ml @@ -0,0 +1 @@ +fun a -> x <- !x + 1; x <- !x + 2 diff --git a/camlp4/test/fixtures/bug-camlp4o-benjamin-monate.ml b/camlp4/test/fixtures/bug-camlp4o-benjamin-monate.ml new file mode 100644 index 00000000..e7e583de --- /dev/null +++ b/camlp4/test/fixtures/bug-camlp4o-benjamin-monate.ml @@ -0,0 +1,15 @@ +type t = A of t | B ;; +let f = function A A B -> B | B | A B | A (A _) -> B ;; + +exception True +let qexists f q = + try + Queue.iter (fun v -> if f v then raise True) q; + false + with True -> true + +type u = True | False +let g x = function | True -> () | False -> () + +type v = [`True | `False] +let h x = function | `True -> () | `False -> () diff --git a/camlp4/test/fixtures/bug-camlp4o-constr-arity-expr.ml b/camlp4/test/fixtures/bug-camlp4o-constr-arity-expr.ml new file mode 100644 index 00000000..fc9b6ada --- /dev/null +++ b/camlp4/test/fixtures/bug-camlp4o-constr-arity-expr.ml @@ -0,0 +1,8 @@ +(* Some Some Some None;; *) +(* ((Some None) None) None;; *) +((Some) None);; +(* ((Some Some) Some) None;; *) +type t = A of int * int * int;; +A (1, 2, 3);; +(A) (1, 2, 3);; +(A (1, 2)) 3;; diff --git a/camlp4/test/fixtures/bug-camlp4o-constr-arity.ml b/camlp4/test/fixtures/bug-camlp4o-constr-arity.ml new file mode 100644 index 00000000..25efe042 --- /dev/null +++ b/camlp4/test/fixtures/bug-camlp4o-constr-arity.ml @@ -0,0 +1,75 @@ +type t = A of t * t | B;; +type t2 = C of (t2 * t2) | D;; +type 'a t3 = S of 'a | T;; + +fun B B B -> ();; + +fun B (A (B, B)) B -> ();; + +fun D (D, D) -> ();; + +fun (C (D, D)) -> ();; + +let A (b, B) = A (B, B);; + +let f (A (B, B)) = ();; + +let f B (A (B, B)) = ();; + +let (D, d) = (D, D);; + +let (C (D, d)) = (C (D, D));; + +function S S T -> ();; + +function Some (A (B, B)) -> ();; + +function S (A (B, B)) -> ();; + +function S (D, D) -> ();; + +function (C (D, D)) -> ();; + +function +| Some Some Some x -> x +(* | None None None x -> x *) +| _ -> assert false;; + +fun None None None -> ();; + +fun (Some None) None None -> ();; + +let Some a = Some 42;; +let Some a :: y = [Some 42];; +let Some a, b = Some 42, 43;; +let (Some a), b = Some 42, 43;; +let Some a as b = let _ = b = 42 in Some 42;; +(* let Some (a as b) = let _ = b = None in Some 42;; *) +(* let Some (a as b) = let _ = b = 42 in Some 42;; *) +(* let (Some a) as b = let _ = b = 42 in Some 42;; *) +(* let (Some a) as b = let _ = b = None in Some 42;; *) +let Some a | Some a = Some 42;; +let x,y as r = 1,2 ;; +let ((x, y) as r) = (1, 2);; + +type top = Top of (int * int);; + +match Top (1,2) with Top min as t -> ();; + +match Top (1,2) with Top (min,max) as t -> ();; + +(* let Some 'a' .. 'b' = Some 'b';; *) + +let rec f x y = ();; + +fun x y -> ();; + +fun (x, y) -> ();; + +function x, y -> ();; + +let rec next line pos0 = () in ();; + +(* fun Some None None None -> ();; *) +(* fun x, y -> ();; |+ syntax error +| *) + diff --git a/camlp4/test/fixtures/bug_escaping_quot.ml b/camlp4/test/fixtures/bug_escaping_quot.ml new file mode 100644 index 00000000..57e5ecdb --- /dev/null +++ b/camlp4/test/fixtures/bug_escaping_quot.ml @@ -0,0 +1,7 @@ +open Camlp4.PreCast;; +Camlp4_config.antiquotations := true;; +let expand_my_quot_expr _loc _loc_name_opt quotation_contents = + Printf.eprintf "%S\n%!" quotation_contents; + <:expr< dummy >> +;; +Syntax.Quotation.add "my" Syntax.Quotation.DynAst.expr_tag expand_my_quot_expr;; diff --git a/camlp4/test/fixtures/chars.ml b/camlp4/test/fixtures/chars.ml new file mode 100644 index 00000000..3d307f0a --- /dev/null +++ b/camlp4/test/fixtures/chars.ml @@ -0,0 +1 @@ +'"' diff --git a/camlp4/test/fixtures/class_expr_quot.ml b/camlp4/test/fixtures/class_expr_quot.ml new file mode 100644 index 00000000..f37e976b --- /dev/null +++ b/camlp4/test/fixtures/class_expr_quot.ml @@ -0,0 +1,27 @@ +<:class_expr< a >>; +<:class_expr< A.a B.b >>; +<:class_expr< a [ t ] >>; +<:class_expr< virtual a >>; +<:class_expr< virtual $a$ >>; +<:class_expr< virtual $lid:a$ >>; +<:class_expr< virtual $lid:a$ [ 't ] >>; +(* <:class_expr< virtual a [ t ] >>; *) +<:class_expr< $opt:v$ a >>; +<:class_expr< $opt:v$ a [ t ] >>; +<:class_expr< $opt:v$ $a$ >>; +<:class_expr< $opt:v$ $id:a$ >>; +<:class_expr< $opt:v$ $a$ [ $t$ ] >>; +(* <:class_expr< $opt:v$ a [ $t$ ] >>; *) +(* <:class_expr< $opt:v$ a $opt:t$ >>; *) +(* <:class_expr< $opt:v$ $a$ $opt:t$ >>; *) + +<:class_type< a >>; +<:class_type< a [ t ] >>; +<:class_type< virtual a >>; +<:class_type< virtual $a$ >>; +<:class_type< virtual $lid:a$ >>; +<:class_type< virtual $lid:a$ [ 't ] >>; +<:class_type< $opt:v$ a >>; +<:class_type< $opt:v$ a [ t ] >>; +<:class_type< $opt:v$ $a$ >>; +<:class_type< $opt:v$ $a$ [ $t$ ] >>; diff --git a/camlp4/test/fixtures/comments.ml b/camlp4/test/fixtures/comments.ml new file mode 100644 index 00000000..5a648766 --- /dev/null +++ b/camlp4/test/fixtures/comments.ml @@ -0,0 +1,66 @@ +(** The first special comment of the file is the comment associated + to the whole module.*) + +(** The comment for function f *) +let f x y = x + y + +(** This comment is not attached to any element since there is another + special comment just before the next element. *) + +(** Comment for exception My_exception, even with a simple comment + between the special comment and the exception.*) +(* A simple comment. *) +exception My_exception of (int -> int) * int + +(** Comment for type weather *) +type weather = +| Rain of int (** The comment for constructor Rain *) +| Sun (** The comment for constructor Sun *) + +(** The comment for type my_record *) +type my_record = { + foo : int ; (** Comment for field foo *) + bar : string ; (** Comment for field bar *) + } + +(** The comment for class my_class *) +class my_class = + object + (** A comment to describe inheritance from cl *) + inherit cl + + (** The comment for the instance variable tutu *) + val mutable tutu = "tutu" + (** The comment for toto *) + val toto = 1 + val titi = "titi" + (** Comment for method toto *) + method toto = tutu ^ "!" + (** Comment for method m *) + method m (f : float) = 1 + end + +(** The comment for class type my_class_type *) +class type my_class_type = + object + (** The comment for the instance variable x. *) + val mutable x : int + (** The commend for method m. *) + method m : int -> int + end + +(** The comment for module Foo *) +module Foo = + struct + (** The comment for x *) + let x = 42 + (** A special comment in the class, but not associated to any element. *) + end + +(** The comment for module type my_module_type. *) +module type MY_MODULE_TYPE = + sig + (* Comment for value x. *) + val x : int + (* ... *) + end diff --git a/camlp4/test/fixtures/comments.mli b/camlp4/test/fixtures/comments.mli new file mode 100644 index 00000000..33e1434b --- /dev/null +++ b/camlp4/test/fixtures/comments.mli @@ -0,0 +1,106 @@ +(** The first special comment of the file is the comment associated + with the whole module.*) + + +(** Special comments can be placed between elements and are kept + by the OCamldoc tool, but are not associated to any element. + @-tags in these comments are ignored.*) + +(*******************************************************************) +(** Comments like the one above, with more than two asterisks, + are ignored. *) + +(** The comment for function f. *) +val f : int -> int -> int +(** The continuation of the comment for function f. *) + +(** Comment for exception My_exception, even with a simple comment + between the special comment and the exception.*) +(* Hello, I'm a simple comment :-) *) +exception My_exception of (int -> int) * int + +(** Comment for type weather *) +type weather = +| Rain of int (** The comment for construtor Rain *) +| Sun (** The comment for constructor Sun *) + +(** Comment for type weather2 *) +type weather2 = +| Rain of int (** The comment for construtor Rain *) +| Sun (** The comment for constructor Sun *) +(** I can continue the comment for type weather2 here + because there is already a comment associated to the last constructor.*) + +(** The comment for type my_record *) +type my_record = { + foo : int ; (** Comment for field foo *) + bar : string ; (** Comment for field bar *) + } + (** Continuation of comment for type my_record *) + +(** Comment for foo *) +val foo : string +(** This comment is associated to foo and not to bar. *) +val bar : string +(** This comment is assciated to bar. *) + +(** The comment for class my_class *) +class my_class : + object + (** A comment to describe inheritance from cl *) + inherit cl + + (** The comment for attribute tutu *) + val mutable tutu : string + + (** The comment for attribute toto. *) + val toto : int + + (** This comment is not attached to titi since + there is a blank line before titi, but is kept + as a comment in the class. *) + + val titi : string + + (** Comment for method toto *) + method toto : string + + (** Comment for method m *) + method m : float -> int + end + +(** The comment for the class type my_class_type *) +class type my_class_type = + object + (** The comment for variable x. *) + val mutable x : int + + (** The commend for method m. *) + method m : int -> int +end + +(** The comment for module Foo *) +module Foo : + sig + (** The comment for x *) + val x : int + + (** A special comment that is kept but not associated to any element *) + end + +(** The comment for module type my_module_type. *) +module type MY_MODULE_TYPE = + sig + (** The comment for value x. *) + val x : int + + (** The comment for module M. *) + module M : + sig + (** The comment for value y. *) + val y : int + + (* ... *) + end + + end diff --git a/camlp4/test/fixtures/comments2.ml b/camlp4/test/fixtures/comments2.ml new file mode 100644 index 00000000..d99e851b --- /dev/null +++ b/camlp4/test/fixtures/comments2.ml @@ -0,0 +1,70 @@ +(** The first special comment of the file is the comment associated + to the whole module.*) + +(** The comment for function f *) +let f x y = x + y + +(** This comment is not attached to any element since there is another + special comment just before the next element. *) + +(** Comment for exception My_exception, even with a simple comment + between the special comment and the exception.*) +(* A simple comment. *) +exception My_exception of (int -> int) * int + +(** Comment for type weather *) +type weather = + (** The comment for constructor Rain *) +| Rain of int + (** The comment for constructor Sun *) +| Sun + +(** The comment for type my_record *) +type my_record = { + (** Comment for field foo *) + foo : int ; + (** Comment for field bar *) + bar : string ; + } + +(** The comment for class my_class *) +class my_class = + object + (** A comment to describe inheritance from cl *) + inherit cl + + (** The comment for the instance variable tutu *) + val mutable tutu = "tutu" + (** The comment for toto *) + val toto = 1 + val titi = "titi" + (** Comment for method toto *) + method toto = tutu ^ "!" + (** Comment for method m *) + method m (f : float) = 1 + end + +(** The comment for class type my_class_type *) +class type my_class_type = + object + (** The comment for the instance variable x. *) + val mutable x : int + (** The commend for method m. *) + method m : int -> int + end + +(** The comment for module Foo *) +module Foo = + struct + (** The comment for x *) + let x = 42 + (** A special comment in the class, but not associated to any element. *) + end + +(** The comment for module type my_module_type. *) +module type MY_MODULE_TYPE = + sig + (* Comment for value x. *) + val x : int + (* ... *) + end diff --git a/camlp4/test/fixtures/constant-parser.ml b/camlp4/test/fixtures/constant-parser.ml new file mode 100644 index 00000000..a91f54b5 --- /dev/null +++ b/camlp4/test/fixtures/constant-parser.ml @@ -0,0 +1,90 @@ +open Camlp4 + +module Id = struct + let name = "Camlp4Parsers.LoadCamlp4Ast" + let version = Sys.ocaml_version +end + +module Make (Ast : Camlp4.Sig.Camlp4Ast.S) = struct + module Ast = Ast + open Ast + + let _loc = Loc.ghost + + let parse_implem ?directive_handler:(_) _ _ = + let e = + Ast.ExApp (_loc, + Ast.ExApp (_loc, + Ast.ExId (_loc, + Ast.IdAcc (_loc, Ast.IdUid (_loc, "G"), Ast.IdLid (_loc, "extend"))), + Ast.ExTyc (_loc, Ast.ExId (_loc, Ast.IdLid (_loc, "expr")), + Ast.TyApp (_loc, + Ast.TyId (_loc, + Ast.IdAcc (_loc, Ast.IdUid (_loc, "G"), + Ast.IdAcc (_loc, Ast.IdUid (_loc, "Entry"), + Ast.IdLid (_loc, "t")))), + Ast.TyQuo (_loc, "expr")))), + Ast.ExTup (_loc, + Ast.ExCom (_loc, Ast.ExId (_loc, Ast.IdUid (_loc, "None")), + Ast.ExApp (_loc, + Ast.ExApp (_loc, Ast.ExId (_loc, Ast.IdUid (_loc, "::")), + Ast.ExTup (_loc, + Ast.ExCom (_loc, Ast.ExId (_loc, Ast.IdUid (_loc, "None")), + Ast.ExCom (_loc, Ast.ExId (_loc, Ast.IdUid (_loc, "None")), + Ast.ExApp (_loc, + Ast.ExApp (_loc, Ast.ExId (_loc, Ast.IdUid (_loc, "::")), + Ast.ExTup (_loc, + Ast.ExCom (_loc, + Ast.ExApp (_loc, + Ast.ExApp (_loc, + Ast.ExId (_loc, Ast.IdUid (_loc, "::")), + Ast.ExApp (_loc, + Ast.ExId (_loc, + Ast.IdAcc (_loc, Ast.IdUid (_loc, "G"), + Ast.IdUid (_loc, "Skeyword"))), + Ast.ExStr (_loc, "foo"))), + Ast.ExId (_loc, Ast.IdUid (_loc, "[]"))), + Ast.ExApp (_loc, + Ast.ExId (_loc, + Ast.IdAcc (_loc, Ast.IdUid (_loc, "G"), + Ast.IdAcc (_loc, Ast.IdUid (_loc, "Action"), + Ast.IdLid (_loc, "mk")))), + Ast.ExFun (_loc, + Ast.AsArr (_loc, Ast.PaAny _loc, Ast.ONone, + Ast.ExFun (_loc, + Ast.AsArr (_loc, + Ast.PaTyc (_loc, + Ast.PaId (_loc, + Ast.IdLid (_loc, "_loc")), + Ast.TyId (_loc, + Ast.IdAcc (_loc, + Ast.IdUid (_loc, "Loc"), + Ast.IdLid (_loc, "t")))), + Ast.ONone, + Ast.ExTyc (_loc, + Ast.ExApp (_loc, + Ast.ExApp (_loc, + Ast.ExId (_loc, + Ast.IdAcc (_loc, + Ast.IdUid (_loc, "Ast"), + Ast.IdUid (_loc, "ExId"))), + Ast.ExId (_loc, + Ast.IdLid (_loc, "_loc"))), + Ast.ExApp (_loc, + Ast.ExApp (_loc, + Ast.ExId (_loc, + Ast.IdAcc (_loc, + Ast.IdUid (_loc, "Ast"), + Ast.IdUid (_loc, "IdLid"))), + Ast.ExId (_loc, + Ast.IdLid (_loc, "_loc"))), + Ast.ExStr (_loc, "foo"))), + Ast.TyQuo (_loc, "expr")))))))))), + Ast.ExId (_loc, Ast.IdUid (_loc, "[]"))))))), + Ast.ExId (_loc, Ast.IdUid (_loc, "[]")))))) + in Ast.StExp (_loc, e) + let parse_interf ?directive_handler:(_) _ _ = assert false;; + +end;; + +let module M = Camlp4.Register.OCamlParser(Id)(Make) in () diff --git a/camlp4/test/fixtures/curry-constr.ml b/camlp4/test/fixtures/curry-constr.ml new file mode 100644 index 00000000..4443ece4 --- /dev/null +++ b/camlp4/test/fixtures/curry-constr.ml @@ -0,0 +1,3 @@ +type t = A of int +type u = B of t +let f = function B A x -> x diff --git a/camlp4/test/fixtures/default_quotation.ml b/camlp4/test/fixtures/default_quotation.ml new file mode 100644 index 00000000..c640507b --- /dev/null +++ b/camlp4/test/fixtures/default_quotation.ml @@ -0,0 +1,4 @@ +#default_quotation "expr"; +open Camlp4.PreCast; +fun [ << $x$ - $y$ >> when x = y -> << 0 >> + | e -> e ]; diff --git a/camlp4/test/fixtures/exception-with-eqn-bug.ml b/camlp4/test/fixtures/exception-with-eqn-bug.ml new file mode 100644 index 00000000..b93c2024 --- /dev/null +++ b/camlp4/test/fixtures/exception-with-eqn-bug.ml @@ -0,0 +1 @@ +exception Foo of string = Bar diff --git a/camlp4/test/fixtures/external.ml b/camlp4/test/fixtures/external.ml new file mode 100644 index 00000000..9ee32bba --- /dev/null +++ b/camlp4/test/fixtures/external.ml @@ -0,0 +1 @@ +external f : 'a -> 'b = "%identity"; diff --git a/camlp4/test/fixtures/fun.ml b/camlp4/test/fixtures/fun.ml new file mode 100644 index 00000000..6c3264df --- /dev/null +++ b/camlp4/test/fixtures/fun.ml @@ -0,0 +1,7 @@ +value f = fun []; +value f = fun [ [] -> fun [ 4 -> () ] ]; +value f = fun []; +value f = fun []; +value f = fun []; +value f = g x y; +value f = (g x) y; diff --git a/camlp4/test/fixtures/functor-perf.ml b/camlp4/test/fixtures/functor-perf.ml new file mode 100644 index 00000000..3e55acba --- /dev/null +++ b/camlp4/test/fixtures/functor-perf.ml @@ -0,0 +1,2019 @@ +module type S = sig +(* <%- for i in 0 .. 1000 do -%> + val f<%= i %> : int -> int -> int +<%- end -%> *) + val f0 : int -> int -> int + val f1 : int -> int -> int + val f2 : int -> int -> int + val f3 : int -> int -> int + val f4 : int -> int -> int + val f5 : int -> int -> int + val f6 : int -> int -> int + val f7 : int -> int -> int + val f8 : int -> int -> int + val f9 : int -> int -> int + val f10 : int -> int -> int + val f11 : int -> int -> int + val f12 : int -> int -> int + val f13 : int -> int -> int + val f14 : int -> int -> int + val f15 : int -> int -> int + val f16 : int -> int -> int + val f17 : int -> int -> int + val f18 : int -> int -> int + val f19 : int -> int -> int + val f20 : int -> int -> int + val f21 : int -> int -> int + val f22 : int -> int -> int + val f23 : int -> int -> int + val f24 : int -> int -> int + val f25 : int -> int -> int + val f26 : int -> int -> int + val f27 : int -> int -> int + val f28 : int -> int -> int + val f29 : int -> int -> int + val f30 : int -> int -> int + val f31 : int -> int -> int + val f32 : int -> int -> int + val f33 : int -> int -> int + val f34 : int -> int -> int + val f35 : int -> int -> int + val f36 : int -> int -> int + val f37 : int -> int -> int + val f38 : int -> int -> int + val f39 : int -> int -> int + val f40 : int -> int -> int + val f41 : int -> int -> int + val f42 : int -> int -> int + val f43 : int -> int -> int + val f44 : int -> int -> int + val f45 : int -> int -> int + val f46 : int -> int -> int + val f47 : int -> int -> int + val f48 : int -> int -> int + val f49 : int -> int -> int + val f50 : int -> int -> int + val f51 : int -> int -> int + val f52 : int -> int -> int + val f53 : int -> int -> int + val f54 : int -> int -> int + val f55 : int -> int -> int + val f56 : int -> int -> int + val f57 : int -> int -> int + val f58 : int -> int -> int + val f59 : int -> int -> int + val f60 : int -> int -> int + val f61 : int -> int -> int + val f62 : int -> int -> int + val f63 : int -> int -> int + val f64 : int -> int -> int + val f65 : int -> int -> int + val f66 : int -> int -> int + val f67 : int -> int -> int + val f68 : int -> int -> int + val f69 : int -> int -> int + val f70 : int -> int -> int + val f71 : int -> int -> int + val f72 : int -> int -> int + val f73 : int -> int -> int + val f74 : int -> int -> int + val f75 : int -> int -> int + val f76 : int -> int -> int + val f77 : int -> int -> int + val f78 : int -> int -> int + val f79 : int -> int -> int + val f80 : int -> int -> int + val f81 : int -> int -> int + val f82 : int -> int -> int + val f83 : int -> int -> int + val f84 : int -> int -> int + val f85 : int -> int -> int + val f86 : int -> int -> int + val f87 : int -> int -> int + val f88 : int -> int -> int + val f89 : int -> int -> int + val f90 : int -> int -> int + val f91 : int -> int -> int + val f92 : int -> int -> int + val f93 : int -> int -> int + val f94 : int -> int -> int + val f95 : int -> int -> int + val f96 : int -> int -> int + val f97 : int -> int -> int + val f98 : int -> int -> int + val f99 : int -> int -> int + val f100 : int -> int -> int + val f101 : int -> int -> int + val f102 : int -> int -> int + val f103 : int -> int -> int + val f104 : int -> int -> int + val f105 : int -> int -> int + val f106 : int -> int -> int + val f107 : int -> int -> int + val f108 : int -> int -> int + val f109 : int -> int -> int + val f110 : int -> int -> int + val f111 : int -> int -> int + val f112 : int -> int -> int + val f113 : int -> int -> int + val f114 : int -> int -> int + val f115 : int -> int -> int + val f116 : int -> int -> int + val f117 : int -> int -> int + val f118 : int -> int -> int + val f119 : int -> int -> int + val f120 : int -> int -> int + val f121 : int -> int -> int + val f122 : int -> int -> int + val f123 : int -> int -> int + val f124 : int -> int -> int + val f125 : int -> int -> int + val f126 : int -> int -> int + val f127 : int -> int -> int + val f128 : int -> int -> int + val f129 : int -> int -> int + val f130 : int -> int -> int + val f131 : int -> int -> int + val f132 : int -> int -> int + val f133 : int -> int -> int + val f134 : int -> int -> int + val f135 : int -> int -> int + val f136 : int -> int -> int + val f137 : int -> int -> int + val f138 : int -> int -> int + val f139 : int -> int -> int + val f140 : int -> int -> int + val f141 : int -> int -> int + val f142 : int -> int -> int + val f143 : int -> int -> int + val f144 : int -> int -> int + val f145 : int -> int -> int + val f146 : int -> int -> int + val f147 : int -> int -> int + val f148 : int -> int -> int + val f149 : int -> int -> int + val f150 : int -> int -> int + val f151 : int -> int -> int + val f152 : int -> int -> int + val f153 : int -> int -> int + val f154 : int -> int -> int + val f155 : int -> int -> int + val f156 : int -> int -> int + val f157 : int -> int -> int + val f158 : int -> int -> int + val f159 : int -> int -> int + val f160 : int -> int -> int + val f161 : int -> int -> int + val f162 : int -> int -> int + val f163 : int -> int -> int + val f164 : int -> int -> int + val f165 : int -> int -> int + val f166 : int -> int -> int + val f167 : int -> int -> int + val f168 : int -> int -> int + val f169 : int -> int -> int + val f170 : int -> int -> int + val f171 : int -> int -> int + val f172 : int -> int -> int + val f173 : int -> int -> int + val f174 : int -> int -> int + val f175 : int -> int -> int + val f176 : int -> int -> int + val f177 : int -> int -> int + val f178 : int -> int -> int + val f179 : int -> int -> int + val f180 : int -> int -> int + val f181 : int -> int -> int + val f182 : int -> int -> int + val f183 : int -> int -> int + val f184 : int -> int -> int + val f185 : int -> int -> int + val f186 : int -> int -> int + val f187 : int -> int -> int + val f188 : int -> int -> int + val f189 : int -> int -> int + val f190 : int -> int -> int + val f191 : int -> int -> int + val f192 : int -> int -> int + val f193 : int -> int -> int + val f194 : int -> int -> int + val f195 : int -> int -> int + val f196 : int -> int -> int + val f197 : int -> int -> int + val f198 : int -> int -> int + val f199 : int -> int -> int + val f200 : int -> int -> int + val f201 : int -> int -> int + val f202 : int -> int -> int + val f203 : int -> int -> int + val f204 : int -> int -> int + val f205 : int -> int -> int + val f206 : int -> int -> int + val f207 : int -> int -> int + val f208 : int -> int -> int + val f209 : int -> int -> int + val f210 : int -> int -> int + val f211 : int -> int -> int + val f212 : int -> int -> int + val f213 : int -> int -> int + val f214 : int -> int -> int + val f215 : int -> int -> int + val f216 : int -> int -> int + val f217 : int -> int -> int + val f218 : int -> int -> int + val f219 : int -> int -> int + val f220 : int -> int -> int + val f221 : int -> int -> int + val f222 : int -> int -> int + val f223 : int -> int -> int + val f224 : int -> int -> int + val f225 : int -> int -> int + val f226 : int -> int -> int + val f227 : int -> int -> int + val f228 : int -> int -> int + val f229 : int -> int -> int + val f230 : int -> int -> int + val f231 : int -> int -> int + val f232 : int -> int -> int + val f233 : int -> int -> int + val f234 : int -> int -> int + val f235 : int -> int -> int + val f236 : int -> int -> int + val f237 : int -> int -> int + val f238 : int -> int -> int + val f239 : int -> int -> int + val f240 : int -> int -> int + val f241 : int -> int -> int + val f242 : int -> int -> int + val f243 : int -> int -> int + val f244 : int -> int -> int + val f245 : int -> int -> int + val f246 : int -> int -> int + val f247 : int -> int -> int + val f248 : int -> int -> int + val f249 : int -> int -> int + val f250 : int -> int -> int + val f251 : int -> int -> int + val f252 : int -> int -> int + val f253 : int -> int -> int + val f254 : int -> int -> int + val f255 : int -> int -> int + val f256 : int -> int -> int + val f257 : int -> int -> int + val f258 : int -> int -> int + val f259 : int -> int -> int + val f260 : int -> int -> int + val f261 : int -> int -> int + val f262 : int -> int -> int + val f263 : int -> int -> int + val f264 : int -> int -> int + val f265 : int -> int -> int + val f266 : int -> int -> int + val f267 : int -> int -> int + val f268 : int -> int -> int + val f269 : int -> int -> int + val f270 : int -> int -> int + val f271 : int -> int -> int + val f272 : int -> int -> int + val f273 : int -> int -> int + val f274 : int -> int -> int + val f275 : int -> int -> int + val f276 : int -> int -> int + val f277 : int -> int -> int + val f278 : int -> int -> int + val f279 : int -> int -> int + val f280 : int -> int -> int + val f281 : int -> int -> int + val f282 : int -> int -> int + val f283 : int -> int -> int + val f284 : int -> int -> int + val f285 : int -> int -> int + val f286 : int -> int -> int + val f287 : int -> int -> int + val f288 : int -> int -> int + val f289 : int -> int -> int + val f290 : int -> int -> int + val f291 : int -> int -> int + val f292 : int -> int -> int + val f293 : int -> int -> int + val f294 : int -> int -> int + val f295 : int -> int -> int + val f296 : int -> int -> int + val f297 : int -> int -> int + val f298 : int -> int -> int + val f299 : int -> int -> int + val f300 : int -> int -> int + val f301 : int -> int -> int + val f302 : int -> int -> int + val f303 : int -> int -> int + val f304 : int -> int -> int + val f305 : int -> int -> int + val f306 : int -> int -> int + val f307 : int -> int -> int + val f308 : int -> int -> int + val f309 : int -> int -> int + val f310 : int -> int -> int + val f311 : int -> int -> int + val f312 : int -> int -> int + val f313 : int -> int -> int + val f314 : int -> int -> int + val f315 : int -> int -> int + val f316 : int -> int -> int + val f317 : int -> int -> int + val f318 : int -> int -> int + val f319 : int -> int -> int + val f320 : int -> int -> int + val f321 : int -> int -> int + val f322 : int -> int -> int + val f323 : int -> int -> int + val f324 : int -> int -> int + val f325 : int -> int -> int + val f326 : int -> int -> int + val f327 : int -> int -> int + val f328 : int -> int -> int + val f329 : int -> int -> int + val f330 : int -> int -> int + val f331 : int -> int -> int + val f332 : int -> int -> int + val f333 : int -> int -> int + val f334 : int -> int -> int + val f335 : int -> int -> int + val f336 : int -> int -> int + val f337 : int -> int -> int + val f338 : int -> int -> int + val f339 : int -> int -> int + val f340 : int -> int -> int + val f341 : int -> int -> int + val f342 : int -> int -> int + val f343 : int -> int -> int + val f344 : int -> int -> int + val f345 : int -> int -> int + val f346 : int -> int -> int + val f347 : int -> int -> int + val f348 : int -> int -> int + val f349 : int -> int -> int + val f350 : int -> int -> int + val f351 : int -> int -> int + val f352 : int -> int -> int + val f353 : int -> int -> int + val f354 : int -> int -> int + val f355 : int -> int -> int + val f356 : int -> int -> int + val f357 : int -> int -> int + val f358 : int -> int -> int + val f359 : int -> int -> int + val f360 : int -> int -> int + val f361 : int -> int -> int + val f362 : int -> int -> int + val f363 : int -> int -> int + val f364 : int -> int -> int + val f365 : int -> int -> int + val f366 : int -> int -> int + val f367 : int -> int -> int + val f368 : int -> int -> int + val f369 : int -> int -> int + val f370 : int -> int -> int + val f371 : int -> int -> int + val f372 : int -> int -> int + val f373 : int -> int -> int + val f374 : int -> int -> int + val f375 : int -> int -> int + val f376 : int -> int -> int + val f377 : int -> int -> int + val f378 : int -> int -> int + val f379 : int -> int -> int + val f380 : int -> int -> int + val f381 : int -> int -> int + val f382 : int -> int -> int + val f383 : int -> int -> int + val f384 : int -> int -> int + val f385 : int -> int -> int + val f386 : int -> int -> int + val f387 : int -> int -> int + val f388 : int -> int -> int + val f389 : int -> int -> int + val f390 : int -> int -> int + val f391 : int -> int -> int + val f392 : int -> int -> int + val f393 : int -> int -> int + val f394 : int -> int -> int + val f395 : int -> int -> int + val f396 : int -> int -> int + val f397 : int -> int -> int + val f398 : int -> int -> int + val f399 : int -> int -> int + val f400 : int -> int -> int + val f401 : int -> int -> int + val f402 : int -> int -> int + val f403 : int -> int -> int + val f404 : int -> int -> int + val f405 : int -> int -> int + val f406 : int -> int -> int + val f407 : int -> int -> int + val f408 : int -> int -> int + val f409 : int -> int -> int + val f410 : int -> int -> int + val f411 : int -> int -> int + val f412 : int -> int -> int + val f413 : int -> int -> int + val f414 : int -> int -> int + val f415 : int -> int -> int + val f416 : int -> int -> int + val f417 : int -> int -> int + val f418 : int -> int -> int + val f419 : int -> int -> int + val f420 : int -> int -> int + val f421 : int -> int -> int + val f422 : int -> int -> int + val f423 : int -> int -> int + val f424 : int -> int -> int + val f425 : int -> int -> int + val f426 : int -> int -> int + val f427 : int -> int -> int + val f428 : int -> int -> int + val f429 : int -> int -> int + val f430 : int -> int -> int + val f431 : int -> int -> int + val f432 : int -> int -> int + val f433 : int -> int -> int + val f434 : int -> int -> int + val f435 : int -> int -> int + val f436 : int -> int -> int + val f437 : int -> int -> int + val f438 : int -> int -> int + val f439 : int -> int -> int + val f440 : int -> int -> int + val f441 : int -> int -> int + val f442 : int -> int -> int + val f443 : int -> int -> int + val f444 : int -> int -> int + val f445 : int -> int -> int + val f446 : int -> int -> int + val f447 : int -> int -> int + val f448 : int -> int -> int + val f449 : int -> int -> int + val f450 : int -> int -> int + val f451 : int -> int -> int + val f452 : int -> int -> int + val f453 : int -> int -> int + val f454 : int -> int -> int + val f455 : int -> int -> int + val f456 : int -> int -> int + val f457 : int -> int -> int + val f458 : int -> int -> int + val f459 : int -> int -> int + val f460 : int -> int -> int + val f461 : int -> int -> int + val f462 : int -> int -> int + val f463 : int -> int -> int + val f464 : int -> int -> int + val f465 : int -> int -> int + val f466 : int -> int -> int + val f467 : int -> int -> int + val f468 : int -> int -> int + val f469 : int -> int -> int + val f470 : int -> int -> int + val f471 : int -> int -> int + val f472 : int -> int -> int + val f473 : int -> int -> int + val f474 : int -> int -> int + val f475 : int -> int -> int + val f476 : int -> int -> int + val f477 : int -> int -> int + val f478 : int -> int -> int + val f479 : int -> int -> int + val f480 : int -> int -> int + val f481 : int -> int -> int + val f482 : int -> int -> int + val f483 : int -> int -> int + val f484 : int -> int -> int + val f485 : int -> int -> int + val f486 : int -> int -> int + val f487 : int -> int -> int + val f488 : int -> int -> int + val f489 : int -> int -> int + val f490 : int -> int -> int + val f491 : int -> int -> int + val f492 : int -> int -> int + val f493 : int -> int -> int + val f494 : int -> int -> int + val f495 : int -> int -> int + val f496 : int -> int -> int + val f497 : int -> int -> int + val f498 : int -> int -> int + val f499 : int -> int -> int + val f500 : int -> int -> int + val f501 : int -> int -> int + val f502 : int -> int -> int + val f503 : int -> int -> int + val f504 : int -> int -> int + val f505 : int -> int -> int + val f506 : int -> int -> int + val f507 : int -> int -> int + val f508 : int -> int -> int + val f509 : int -> int -> int + val f510 : int -> int -> int + val f511 : int -> int -> int + val f512 : int -> int -> int + val f513 : int -> int -> int + val f514 : int -> int -> int + val f515 : int -> int -> int + val f516 : int -> int -> int + val f517 : int -> int -> int + val f518 : int -> int -> int + val f519 : int -> int -> int + val f520 : int -> int -> int + val f521 : int -> int -> int + val f522 : int -> int -> int + val f523 : int -> int -> int + val f524 : int -> int -> int + val f525 : int -> int -> int + val f526 : int -> int -> int + val f527 : int -> int -> int + val f528 : int -> int -> int + val f529 : int -> int -> int + val f530 : int -> int -> int + val f531 : int -> int -> int + val f532 : int -> int -> int + val f533 : int -> int -> int + val f534 : int -> int -> int + val f535 : int -> int -> int + val f536 : int -> int -> int + val f537 : int -> int -> int + val f538 : int -> int -> int + val f539 : int -> int -> int + val f540 : int -> int -> int + val f541 : int -> int -> int + val f542 : int -> int -> int + val f543 : int -> int -> int + val f544 : int -> int -> int + val f545 : int -> int -> int + val f546 : int -> int -> int + val f547 : int -> int -> int + val f548 : int -> int -> int + val f549 : int -> int -> int + val f550 : int -> int -> int + val f551 : int -> int -> int + val f552 : int -> int -> int + val f553 : int -> int -> int + val f554 : int -> int -> int + val f555 : int -> int -> int + val f556 : int -> int -> int + val f557 : int -> int -> int + val f558 : int -> int -> int + val f559 : int -> int -> int + val f560 : int -> int -> int + val f561 : int -> int -> int + val f562 : int -> int -> int + val f563 : int -> int -> int + val f564 : int -> int -> int + val f565 : int -> int -> int + val f566 : int -> int -> int + val f567 : int -> int -> int + val f568 : int -> int -> int + val f569 : int -> int -> int + val f570 : int -> int -> int + val f571 : int -> int -> int + val f572 : int -> int -> int + val f573 : int -> int -> int + val f574 : int -> int -> int + val f575 : int -> int -> int + val f576 : int -> int -> int + val f577 : int -> int -> int + val f578 : int -> int -> int + val f579 : int -> int -> int + val f580 : int -> int -> int + val f581 : int -> int -> int + val f582 : int -> int -> int + val f583 : int -> int -> int + val f584 : int -> int -> int + val f585 : int -> int -> int + val f586 : int -> int -> int + val f587 : int -> int -> int + val f588 : int -> int -> int + val f589 : int -> int -> int + val f590 : int -> int -> int + val f591 : int -> int -> int + val f592 : int -> int -> int + val f593 : int -> int -> int + val f594 : int -> int -> int + val f595 : int -> int -> int + val f596 : int -> int -> int + val f597 : int -> int -> int + val f598 : int -> int -> int + val f599 : int -> int -> int + val f600 : int -> int -> int + val f601 : int -> int -> int + val f602 : int -> int -> int + val f603 : int -> int -> int + val f604 : int -> int -> int + val f605 : int -> int -> int + val f606 : int -> int -> int + val f607 : int -> int -> int + val f608 : int -> int -> int + val f609 : int -> int -> int + val f610 : int -> int -> int + val f611 : int -> int -> int + val f612 : int -> int -> int + val f613 : int -> int -> int + val f614 : int -> int -> int + val f615 : int -> int -> int + val f616 : int -> int -> int + val f617 : int -> int -> int + val f618 : int -> int -> int + val f619 : int -> int -> int + val f620 : int -> int -> int + val f621 : int -> int -> int + val f622 : int -> int -> int + val f623 : int -> int -> int + val f624 : int -> int -> int + val f625 : int -> int -> int + val f626 : int -> int -> int + val f627 : int -> int -> int + val f628 : int -> int -> int + val f629 : int -> int -> int + val f630 : int -> int -> int + val f631 : int -> int -> int + val f632 : int -> int -> int + val f633 : int -> int -> int + val f634 : int -> int -> int + val f635 : int -> int -> int + val f636 : int -> int -> int + val f637 : int -> int -> int + val f638 : int -> int -> int + val f639 : int -> int -> int + val f640 : int -> int -> int + val f641 : int -> int -> int + val f642 : int -> int -> int + val f643 : int -> int -> int + val f644 : int -> int -> int + val f645 : int -> int -> int + val f646 : int -> int -> int + val f647 : int -> int -> int + val f648 : int -> int -> int + val f649 : int -> int -> int + val f650 : int -> int -> int + val f651 : int -> int -> int + val f652 : int -> int -> int + val f653 : int -> int -> int + val f654 : int -> int -> int + val f655 : int -> int -> int + val f656 : int -> int -> int + val f657 : int -> int -> int + val f658 : int -> int -> int + val f659 : int -> int -> int + val f660 : int -> int -> int + val f661 : int -> int -> int + val f662 : int -> int -> int + val f663 : int -> int -> int + val f664 : int -> int -> int + val f665 : int -> int -> int + val f666 : int -> int -> int + val f667 : int -> int -> int + val f668 : int -> int -> int + val f669 : int -> int -> int + val f670 : int -> int -> int + val f671 : int -> int -> int + val f672 : int -> int -> int + val f673 : int -> int -> int + val f674 : int -> int -> int + val f675 : int -> int -> int + val f676 : int -> int -> int + val f677 : int -> int -> int + val f678 : int -> int -> int + val f679 : int -> int -> int + val f680 : int -> int -> int + val f681 : int -> int -> int + val f682 : int -> int -> int + val f683 : int -> int -> int + val f684 : int -> int -> int + val f685 : int -> int -> int + val f686 : int -> int -> int + val f687 : int -> int -> int + val f688 : int -> int -> int + val f689 : int -> int -> int + val f690 : int -> int -> int + val f691 : int -> int -> int + val f692 : int -> int -> int + val f693 : int -> int -> int + val f694 : int -> int -> int + val f695 : int -> int -> int + val f696 : int -> int -> int + val f697 : int -> int -> int + val f698 : int -> int -> int + val f699 : int -> int -> int + val f700 : int -> int -> int + val f701 : int -> int -> int + val f702 : int -> int -> int + val f703 : int -> int -> int + val f704 : int -> int -> int + val f705 : int -> int -> int + val f706 : int -> int -> int + val f707 : int -> int -> int + val f708 : int -> int -> int + val f709 : int -> int -> int + val f710 : int -> int -> int + val f711 : int -> int -> int + val f712 : int -> int -> int + val f713 : int -> int -> int + val f714 : int -> int -> int + val f715 : int -> int -> int + val f716 : int -> int -> int + val f717 : int -> int -> int + val f718 : int -> int -> int + val f719 : int -> int -> int + val f720 : int -> int -> int + val f721 : int -> int -> int + val f722 : int -> int -> int + val f723 : int -> int -> int + val f724 : int -> int -> int + val f725 : int -> int -> int + val f726 : int -> int -> int + val f727 : int -> int -> int + val f728 : int -> int -> int + val f729 : int -> int -> int + val f730 : int -> int -> int + val f731 : int -> int -> int + val f732 : int -> int -> int + val f733 : int -> int -> int + val f734 : int -> int -> int + val f735 : int -> int -> int + val f736 : int -> int -> int + val f737 : int -> int -> int + val f738 : int -> int -> int + val f739 : int -> int -> int + val f740 : int -> int -> int + val f741 : int -> int -> int + val f742 : int -> int -> int + val f743 : int -> int -> int + val f744 : int -> int -> int + val f745 : int -> int -> int + val f746 : int -> int -> int + val f747 : int -> int -> int + val f748 : int -> int -> int + val f749 : int -> int -> int + val f750 : int -> int -> int + val f751 : int -> int -> int + val f752 : int -> int -> int + val f753 : int -> int -> int + val f754 : int -> int -> int + val f755 : int -> int -> int + val f756 : int -> int -> int + val f757 : int -> int -> int + val f758 : int -> int -> int + val f759 : int -> int -> int + val f760 : int -> int -> int + val f761 : int -> int -> int + val f762 : int -> int -> int + val f763 : int -> int -> int + val f764 : int -> int -> int + val f765 : int -> int -> int + val f766 : int -> int -> int + val f767 : int -> int -> int + val f768 : int -> int -> int + val f769 : int -> int -> int + val f770 : int -> int -> int + val f771 : int -> int -> int + val f772 : int -> int -> int + val f773 : int -> int -> int + val f774 : int -> int -> int + val f775 : int -> int -> int + val f776 : int -> int -> int + val f777 : int -> int -> int + val f778 : int -> int -> int + val f779 : int -> int -> int + val f780 : int -> int -> int + val f781 : int -> int -> int + val f782 : int -> int -> int + val f783 : int -> int -> int + val f784 : int -> int -> int + val f785 : int -> int -> int + val f786 : int -> int -> int + val f787 : int -> int -> int + val f788 : int -> int -> int + val f789 : int -> int -> int + val f790 : int -> int -> int + val f791 : int -> int -> int + val f792 : int -> int -> int + val f793 : int -> int -> int + val f794 : int -> int -> int + val f795 : int -> int -> int + val f796 : int -> int -> int + val f797 : int -> int -> int + val f798 : int -> int -> int + val f799 : int -> int -> int + val f800 : int -> int -> int + val f801 : int -> int -> int + val f802 : int -> int -> int + val f803 : int -> int -> int + val f804 : int -> int -> int + val f805 : int -> int -> int + val f806 : int -> int -> int + val f807 : int -> int -> int + val f808 : int -> int -> int + val f809 : int -> int -> int + val f810 : int -> int -> int + val f811 : int -> int -> int + val f812 : int -> int -> int + val f813 : int -> int -> int + val f814 : int -> int -> int + val f815 : int -> int -> int + val f816 : int -> int -> int + val f817 : int -> int -> int + val f818 : int -> int -> int + val f819 : int -> int -> int + val f820 : int -> int -> int + val f821 : int -> int -> int + val f822 : int -> int -> int + val f823 : int -> int -> int + val f824 : int -> int -> int + val f825 : int -> int -> int + val f826 : int -> int -> int + val f827 : int -> int -> int + val f828 : int -> int -> int + val f829 : int -> int -> int + val f830 : int -> int -> int + val f831 : int -> int -> int + val f832 : int -> int -> int + val f833 : int -> int -> int + val f834 : int -> int -> int + val f835 : int -> int -> int + val f836 : int -> int -> int + val f837 : int -> int -> int + val f838 : int -> int -> int + val f839 : int -> int -> int + val f840 : int -> int -> int + val f841 : int -> int -> int + val f842 : int -> int -> int + val f843 : int -> int -> int + val f844 : int -> int -> int + val f845 : int -> int -> int + val f846 : int -> int -> int + val f847 : int -> int -> int + val f848 : int -> int -> int + val f849 : int -> int -> int + val f850 : int -> int -> int + val f851 : int -> int -> int + val f852 : int -> int -> int + val f853 : int -> int -> int + val f854 : int -> int -> int + val f855 : int -> int -> int + val f856 : int -> int -> int + val f857 : int -> int -> int + val f858 : int -> int -> int + val f859 : int -> int -> int + val f860 : int -> int -> int + val f861 : int -> int -> int + val f862 : int -> int -> int + val f863 : int -> int -> int + val f864 : int -> int -> int + val f865 : int -> int -> int + val f866 : int -> int -> int + val f867 : int -> int -> int + val f868 : int -> int -> int + val f869 : int -> int -> int + val f870 : int -> int -> int + val f871 : int -> int -> int + val f872 : int -> int -> int + val f873 : int -> int -> int + val f874 : int -> int -> int + val f875 : int -> int -> int + val f876 : int -> int -> int + val f877 : int -> int -> int + val f878 : int -> int -> int + val f879 : int -> int -> int + val f880 : int -> int -> int + val f881 : int -> int -> int + val f882 : int -> int -> int + val f883 : int -> int -> int + val f884 : int -> int -> int + val f885 : int -> int -> int + val f886 : int -> int -> int + val f887 : int -> int -> int + val f888 : int -> int -> int + val f889 : int -> int -> int + val f890 : int -> int -> int + val f891 : int -> int -> int + val f892 : int -> int -> int + val f893 : int -> int -> int + val f894 : int -> int -> int + val f895 : int -> int -> int + val f896 : int -> int -> int + val f897 : int -> int -> int + val f898 : int -> int -> int + val f899 : int -> int -> int + val f900 : int -> int -> int + val f901 : int -> int -> int + val f902 : int -> int -> int + val f903 : int -> int -> int + val f904 : int -> int -> int + val f905 : int -> int -> int + val f906 : int -> int -> int + val f907 : int -> int -> int + val f908 : int -> int -> int + val f909 : int -> int -> int + val f910 : int -> int -> int + val f911 : int -> int -> int + val f912 : int -> int -> int + val f913 : int -> int -> int + val f914 : int -> int -> int + val f915 : int -> int -> int + val f916 : int -> int -> int + val f917 : int -> int -> int + val f918 : int -> int -> int + val f919 : int -> int -> int + val f920 : int -> int -> int + val f921 : int -> int -> int + val f922 : int -> int -> int + val f923 : int -> int -> int + val f924 : int -> int -> int + val f925 : int -> int -> int + val f926 : int -> int -> int + val f927 : int -> int -> int + val f928 : int -> int -> int + val f929 : int -> int -> int + val f930 : int -> int -> int + val f931 : int -> int -> int + val f932 : int -> int -> int + val f933 : int -> int -> int + val f934 : int -> int -> int + val f935 : int -> int -> int + val f936 : int -> int -> int + val f937 : int -> int -> int + val f938 : int -> int -> int + val f939 : int -> int -> int + val f940 : int -> int -> int + val f941 : int -> int -> int + val f942 : int -> int -> int + val f943 : int -> int -> int + val f944 : int -> int -> int + val f945 : int -> int -> int + val f946 : int -> int -> int + val f947 : int -> int -> int + val f948 : int -> int -> int + val f949 : int -> int -> int + val f950 : int -> int -> int + val f951 : int -> int -> int + val f952 : int -> int -> int + val f953 : int -> int -> int + val f954 : int -> int -> int + val f955 : int -> int -> int + val f956 : int -> int -> int + val f957 : int -> int -> int + val f958 : int -> int -> int + val f959 : int -> int -> int + val f960 : int -> int -> int + val f961 : int -> int -> int + val f962 : int -> int -> int + val f963 : int -> int -> int + val f964 : int -> int -> int + val f965 : int -> int -> int + val f966 : int -> int -> int + val f967 : int -> int -> int + val f968 : int -> int -> int + val f969 : int -> int -> int + val f970 : int -> int -> int + val f971 : int -> int -> int + val f972 : int -> int -> int + val f973 : int -> int -> int + val f974 : int -> int -> int + val f975 : int -> int -> int + val f976 : int -> int -> int + val f977 : int -> int -> int + val f978 : int -> int -> int + val f979 : int -> int -> int + val f980 : int -> int -> int + val f981 : int -> int -> int + val f982 : int -> int -> int + val f983 : int -> int -> int + val f984 : int -> int -> int + val f985 : int -> int -> int + val f986 : int -> int -> int + val f987 : int -> int -> int + val f988 : int -> int -> int + val f989 : int -> int -> int + val f990 : int -> int -> int + val f991 : int -> int -> int + val f992 : int -> int -> int + val f993 : int -> int -> int + val f994 : int -> int -> int + val f995 : int -> int -> int + val f996 : int -> int -> int + val f997 : int -> int -> int + val f998 : int -> int -> int + val f999 : int -> int -> int + val f1000 : int -> int -> int +end + +module Make (M : S) = struct + include M +end + +module M = struct +(* <%- for i in 0 .. 1000 do -%> + let f<%= i %> = ( + ) +<%- end -%> *) + let f0 = ( + ) + let f1 = ( + ) + let f2 = ( + ) + let f3 = ( + ) + let f4 = ( + ) + let f5 = ( + ) + let f6 = ( + ) + let f7 = ( + ) + let f8 = ( + ) + let f9 = ( + ) + let f10 = ( + ) + let f11 = ( + ) + let f12 = ( + ) + let f13 = ( + ) + let f14 = ( + ) + let f15 = ( + ) + let f16 = ( + ) + let f17 = ( + ) + let f18 = ( + ) + let f19 = ( + ) + let f20 = ( + ) + let f21 = ( + ) + let f22 = ( + ) + let f23 = ( + ) + let f24 = ( + ) + let f25 = ( + ) + let f26 = ( + ) + let f27 = ( + ) + let f28 = ( + ) + let f29 = ( + ) + let f30 = ( + ) + let f31 = ( + ) + let f32 = ( + ) + let f33 = ( + ) + let f34 = ( + ) + let f35 = ( + ) + let f36 = ( + ) + let f37 = ( + ) + let f38 = ( + ) + let f39 = ( + ) + let f40 = ( + ) + let f41 = ( + ) + let f42 = ( + ) + let f43 = ( + ) + let f44 = ( + ) + let f45 = ( + ) + let f46 = ( + ) + let f47 = ( + ) + let f48 = ( + ) + let f49 = ( + ) + let f50 = ( + ) + let f51 = ( + ) + let f52 = ( + ) + let f53 = ( + ) + let f54 = ( + ) + let f55 = ( + ) + let f56 = ( + ) + let f57 = ( + ) + let f58 = ( + ) + let f59 = ( + ) + let f60 = ( + ) + let f61 = ( + ) + let f62 = ( + ) + let f63 = ( + ) + let f64 = ( + ) + let f65 = ( + ) + let f66 = ( + ) + let f67 = ( + ) + let f68 = ( + ) + let f69 = ( + ) + let f70 = ( + ) + let f71 = ( + ) + let f72 = ( + ) + let f73 = ( + ) + let f74 = ( + ) + let f75 = ( + ) + let f76 = ( + ) + let f77 = ( + ) + let f78 = ( + ) + let f79 = ( + ) + let f80 = ( + ) + let f81 = ( + ) + let f82 = ( + ) + let f83 = ( + ) + let f84 = ( + ) + let f85 = ( + ) + let f86 = ( + ) + let f87 = ( + ) + let f88 = ( + ) + let f89 = ( + ) + let f90 = ( + ) + let f91 = ( + ) + let f92 = ( + ) + let f93 = ( + ) + let f94 = ( + ) + let f95 = ( + ) + let f96 = ( + ) + let f97 = ( + ) + let f98 = ( + ) + let f99 = ( + ) + let f100 = ( + ) + let f101 = ( + ) + let f102 = ( + ) + let f103 = ( + ) + let f104 = ( + ) + let f105 = ( + ) + let f106 = ( + ) + let f107 = ( + ) + let f108 = ( + ) + let f109 = ( + ) + let f110 = ( + ) + let f111 = ( + ) + let f112 = ( + ) + let f113 = ( + ) + let f114 = ( + ) + let f115 = ( + ) + let f116 = ( + ) + let f117 = ( + ) + let f118 = ( + ) + let f119 = ( + ) + let f120 = ( + ) + let f121 = ( + ) + let f122 = ( + ) + let f123 = ( + ) + let f124 = ( + ) + let f125 = ( + ) + let f126 = ( + ) + let f127 = ( + ) + let f128 = ( + ) + let f129 = ( + ) + let f130 = ( + ) + let f131 = ( + ) + let f132 = ( + ) + let f133 = ( + ) + let f134 = ( + ) + let f135 = ( + ) + let f136 = ( + ) + let f137 = ( + ) + let f138 = ( + ) + let f139 = ( + ) + let f140 = ( + ) + let f141 = ( + ) + let f142 = ( + ) + let f143 = ( + ) + let f144 = ( + ) + let f145 = ( + ) + let f146 = ( + ) + let f147 = ( + ) + let f148 = ( + ) + let f149 = ( + ) + let f150 = ( + ) + let f151 = ( + ) + let f152 = ( + ) + let f153 = ( + ) + let f154 = ( + ) + let f155 = ( + ) + let f156 = ( + ) + let f157 = ( + ) + let f158 = ( + ) + let f159 = ( + ) + let f160 = ( + ) + let f161 = ( + ) + let f162 = ( + ) + let f163 = ( + ) + let f164 = ( + ) + let f165 = ( + ) + let f166 = ( + ) + let f167 = ( + ) + let f168 = ( + ) + let f169 = ( + ) + let f170 = ( + ) + let f171 = ( + ) + let f172 = ( + ) + let f173 = ( + ) + let f174 = ( + ) + let f175 = ( + ) + let f176 = ( + ) + let f177 = ( + ) + let f178 = ( + ) + let f179 = ( + ) + let f180 = ( + ) + let f181 = ( + ) + let f182 = ( + ) + let f183 = ( + ) + let f184 = ( + ) + let f185 = ( + ) + let f186 = ( + ) + let f187 = ( + ) + let f188 = ( + ) + let f189 = ( + ) + let f190 = ( + ) + let f191 = ( + ) + let f192 = ( + ) + let f193 = ( + ) + let f194 = ( + ) + let f195 = ( + ) + let f196 = ( + ) + let f197 = ( + ) + let f198 = ( + ) + let f199 = ( + ) + let f200 = ( + ) + let f201 = ( + ) + let f202 = ( + ) + let f203 = ( + ) + let f204 = ( + ) + let f205 = ( + ) + let f206 = ( + ) + let f207 = ( + ) + let f208 = ( + ) + let f209 = ( + ) + let f210 = ( + ) + let f211 = ( + ) + let f212 = ( + ) + let f213 = ( + ) + let f214 = ( + ) + let f215 = ( + ) + let f216 = ( + ) + let f217 = ( + ) + let f218 = ( + ) + let f219 = ( + ) + let f220 = ( + ) + let f221 = ( + ) + let f222 = ( + ) + let f223 = ( + ) + let f224 = ( + ) + let f225 = ( + ) + let f226 = ( + ) + let f227 = ( + ) + let f228 = ( + ) + let f229 = ( + ) + let f230 = ( + ) + let f231 = ( + ) + let f232 = ( + ) + let f233 = ( + ) + let f234 = ( + ) + let f235 = ( + ) + let f236 = ( + ) + let f237 = ( + ) + let f238 = ( + ) + let f239 = ( + ) + let f240 = ( + ) + let f241 = ( + ) + let f242 = ( + ) + let f243 = ( + ) + let f244 = ( + ) + let f245 = ( + ) + let f246 = ( + ) + let f247 = ( + ) + let f248 = ( + ) + let f249 = ( + ) + let f250 = ( + ) + let f251 = ( + ) + let f252 = ( + ) + let f253 = ( + ) + let f254 = ( + ) + let f255 = ( + ) + let f256 = ( + ) + let f257 = ( + ) + let f258 = ( + ) + let f259 = ( + ) + let f260 = ( + ) + let f261 = ( + ) + let f262 = ( + ) + let f263 = ( + ) + let f264 = ( + ) + let f265 = ( + ) + let f266 = ( + ) + let f267 = ( + ) + let f268 = ( + ) + let f269 = ( + ) + let f270 = ( + ) + let f271 = ( + ) + let f272 = ( + ) + let f273 = ( + ) + let f274 = ( + ) + let f275 = ( + ) + let f276 = ( + ) + let f277 = ( + ) + let f278 = ( + ) + let f279 = ( + ) + let f280 = ( + ) + let f281 = ( + ) + let f282 = ( + ) + let f283 = ( + ) + let f284 = ( + ) + let f285 = ( + ) + let f286 = ( + ) + let f287 = ( + ) + let f288 = ( + ) + let f289 = ( + ) + let f290 = ( + ) + let f291 = ( + ) + let f292 = ( + ) + let f293 = ( + ) + let f294 = ( + ) + let f295 = ( + ) + let f296 = ( + ) + let f297 = ( + ) + let f298 = ( + ) + let f299 = ( + ) + let f300 = ( + ) + let f301 = ( + ) + let f302 = ( + ) + let f303 = ( + ) + let f304 = ( + ) + let f305 = ( + ) + let f306 = ( + ) + let f307 = ( + ) + let f308 = ( + ) + let f309 = ( + ) + let f310 = ( + ) + let f311 = ( + ) + let f312 = ( + ) + let f313 = ( + ) + let f314 = ( + ) + let f315 = ( + ) + let f316 = ( + ) + let f317 = ( + ) + let f318 = ( + ) + let f319 = ( + ) + let f320 = ( + ) + let f321 = ( + ) + let f322 = ( + ) + let f323 = ( + ) + let f324 = ( + ) + let f325 = ( + ) + let f326 = ( + ) + let f327 = ( + ) + let f328 = ( + ) + let f329 = ( + ) + let f330 = ( + ) + let f331 = ( + ) + let f332 = ( + ) + let f333 = ( + ) + let f334 = ( + ) + let f335 = ( + ) + let f336 = ( + ) + let f337 = ( + ) + let f338 = ( + ) + let f339 = ( + ) + let f340 = ( + ) + let f341 = ( + ) + let f342 = ( + ) + let f343 = ( + ) + let f344 = ( + ) + let f345 = ( + ) + let f346 = ( + ) + let f347 = ( + ) + let f348 = ( + ) + let f349 = ( + ) + let f350 = ( + ) + let f351 = ( + ) + let f352 = ( + ) + let f353 = ( + ) + let f354 = ( + ) + let f355 = ( + ) + let f356 = ( + ) + let f357 = ( + ) + let f358 = ( + ) + let f359 = ( + ) + let f360 = ( + ) + let f361 = ( + ) + let f362 = ( + ) + let f363 = ( + ) + let f364 = ( + ) + let f365 = ( + ) + let f366 = ( + ) + let f367 = ( + ) + let f368 = ( + ) + let f369 = ( + ) + let f370 = ( + ) + let f371 = ( + ) + let f372 = ( + ) + let f373 = ( + ) + let f374 = ( + ) + let f375 = ( + ) + let f376 = ( + ) + let f377 = ( + ) + let f378 = ( + ) + let f379 = ( + ) + let f380 = ( + ) + let f381 = ( + ) + let f382 = ( + ) + let f383 = ( + ) + let f384 = ( + ) + let f385 = ( + ) + let f386 = ( + ) + let f387 = ( + ) + let f388 = ( + ) + let f389 = ( + ) + let f390 = ( + ) + let f391 = ( + ) + let f392 = ( + ) + let f393 = ( + ) + let f394 = ( + ) + let f395 = ( + ) + let f396 = ( + ) + let f397 = ( + ) + let f398 = ( + ) + let f399 = ( + ) + let f400 = ( + ) + let f401 = ( + ) + let f402 = ( + ) + let f403 = ( + ) + let f404 = ( + ) + let f405 = ( + ) + let f406 = ( + ) + let f407 = ( + ) + let f408 = ( + ) + let f409 = ( + ) + let f410 = ( + ) + let f411 = ( + ) + let f412 = ( + ) + let f413 = ( + ) + let f414 = ( + ) + let f415 = ( + ) + let f416 = ( + ) + let f417 = ( + ) + let f418 = ( + ) + let f419 = ( + ) + let f420 = ( + ) + let f421 = ( + ) + let f422 = ( + ) + let f423 = ( + ) + let f424 = ( + ) + let f425 = ( + ) + let f426 = ( + ) + let f427 = ( + ) + let f428 = ( + ) + let f429 = ( + ) + let f430 = ( + ) + let f431 = ( + ) + let f432 = ( + ) + let f433 = ( + ) + let f434 = ( + ) + let f435 = ( + ) + let f436 = ( + ) + let f437 = ( + ) + let f438 = ( + ) + let f439 = ( + ) + let f440 = ( + ) + let f441 = ( + ) + let f442 = ( + ) + let f443 = ( + ) + let f444 = ( + ) + let f445 = ( + ) + let f446 = ( + ) + let f447 = ( + ) + let f448 = ( + ) + let f449 = ( + ) + let f450 = ( + ) + let f451 = ( + ) + let f452 = ( + ) + let f453 = ( + ) + let f454 = ( + ) + let f455 = ( + ) + let f456 = ( + ) + let f457 = ( + ) + let f458 = ( + ) + let f459 = ( + ) + let f460 = ( + ) + let f461 = ( + ) + let f462 = ( + ) + let f463 = ( + ) + let f464 = ( + ) + let f465 = ( + ) + let f466 = ( + ) + let f467 = ( + ) + let f468 = ( + ) + let f469 = ( + ) + let f470 = ( + ) + let f471 = ( + ) + let f472 = ( + ) + let f473 = ( + ) + let f474 = ( + ) + let f475 = ( + ) + let f476 = ( + ) + let f477 = ( + ) + let f478 = ( + ) + let f479 = ( + ) + let f480 = ( + ) + let f481 = ( + ) + let f482 = ( + ) + let f483 = ( + ) + let f484 = ( + ) + let f485 = ( + ) + let f486 = ( + ) + let f487 = ( + ) + let f488 = ( + ) + let f489 = ( + ) + let f490 = ( + ) + let f491 = ( + ) + let f492 = ( + ) + let f493 = ( + ) + let f494 = ( + ) + let f495 = ( + ) + let f496 = ( + ) + let f497 = ( + ) + let f498 = ( + ) + let f499 = ( + ) + let f500 = ( + ) + let f501 = ( + ) + let f502 = ( + ) + let f503 = ( + ) + let f504 = ( + ) + let f505 = ( + ) + let f506 = ( + ) + let f507 = ( + ) + let f508 = ( + ) + let f509 = ( + ) + let f510 = ( + ) + let f511 = ( + ) + let f512 = ( + ) + let f513 = ( + ) + let f514 = ( + ) + let f515 = ( + ) + let f516 = ( + ) + let f517 = ( + ) + let f518 = ( + ) + let f519 = ( + ) + let f520 = ( + ) + let f521 = ( + ) + let f522 = ( + ) + let f523 = ( + ) + let f524 = ( + ) + let f525 = ( + ) + let f526 = ( + ) + let f527 = ( + ) + let f528 = ( + ) + let f529 = ( + ) + let f530 = ( + ) + let f531 = ( + ) + let f532 = ( + ) + let f533 = ( + ) + let f534 = ( + ) + let f535 = ( + ) + let f536 = ( + ) + let f537 = ( + ) + let f538 = ( + ) + let f539 = ( + ) + let f540 = ( + ) + let f541 = ( + ) + let f542 = ( + ) + let f543 = ( + ) + let f544 = ( + ) + let f545 = ( + ) + let f546 = ( + ) + let f547 = ( + ) + let f548 = ( + ) + let f549 = ( + ) + let f550 = ( + ) + let f551 = ( + ) + let f552 = ( + ) + let f553 = ( + ) + let f554 = ( + ) + let f555 = ( + ) + let f556 = ( + ) + let f557 = ( + ) + let f558 = ( + ) + let f559 = ( + ) + let f560 = ( + ) + let f561 = ( + ) + let f562 = ( + ) + let f563 = ( + ) + let f564 = ( + ) + let f565 = ( + ) + let f566 = ( + ) + let f567 = ( + ) + let f568 = ( + ) + let f569 = ( + ) + let f570 = ( + ) + let f571 = ( + ) + let f572 = ( + ) + let f573 = ( + ) + let f574 = ( + ) + let f575 = ( + ) + let f576 = ( + ) + let f577 = ( + ) + let f578 = ( + ) + let f579 = ( + ) + let f580 = ( + ) + let f581 = ( + ) + let f582 = ( + ) + let f583 = ( + ) + let f584 = ( + ) + let f585 = ( + ) + let f586 = ( + ) + let f587 = ( + ) + let f588 = ( + ) + let f589 = ( + ) + let f590 = ( + ) + let f591 = ( + ) + let f592 = ( + ) + let f593 = ( + ) + let f594 = ( + ) + let f595 = ( + ) + let f596 = ( + ) + let f597 = ( + ) + let f598 = ( + ) + let f599 = ( + ) + let f600 = ( + ) + let f601 = ( + ) + let f602 = ( + ) + let f603 = ( + ) + let f604 = ( + ) + let f605 = ( + ) + let f606 = ( + ) + let f607 = ( + ) + let f608 = ( + ) + let f609 = ( + ) + let f610 = ( + ) + let f611 = ( + ) + let f612 = ( + ) + let f613 = ( + ) + let f614 = ( + ) + let f615 = ( + ) + let f616 = ( + ) + let f617 = ( + ) + let f618 = ( + ) + let f619 = ( + ) + let f620 = ( + ) + let f621 = ( + ) + let f622 = ( + ) + let f623 = ( + ) + let f624 = ( + ) + let f625 = ( + ) + let f626 = ( + ) + let f627 = ( + ) + let f628 = ( + ) + let f629 = ( + ) + let f630 = ( + ) + let f631 = ( + ) + let f632 = ( + ) + let f633 = ( + ) + let f634 = ( + ) + let f635 = ( + ) + let f636 = ( + ) + let f637 = ( + ) + let f638 = ( + ) + let f639 = ( + ) + let f640 = ( + ) + let f641 = ( + ) + let f642 = ( + ) + let f643 = ( + ) + let f644 = ( + ) + let f645 = ( + ) + let f646 = ( + ) + let f647 = ( + ) + let f648 = ( + ) + let f649 = ( + ) + let f650 = ( + ) + let f651 = ( + ) + let f652 = ( + ) + let f653 = ( + ) + let f654 = ( + ) + let f655 = ( + ) + let f656 = ( + ) + let f657 = ( + ) + let f658 = ( + ) + let f659 = ( + ) + let f660 = ( + ) + let f661 = ( + ) + let f662 = ( + ) + let f663 = ( + ) + let f664 = ( + ) + let f665 = ( + ) + let f666 = ( + ) + let f667 = ( + ) + let f668 = ( + ) + let f669 = ( + ) + let f670 = ( + ) + let f671 = ( + ) + let f672 = ( + ) + let f673 = ( + ) + let f674 = ( + ) + let f675 = ( + ) + let f676 = ( + ) + let f677 = ( + ) + let f678 = ( + ) + let f679 = ( + ) + let f680 = ( + ) + let f681 = ( + ) + let f682 = ( + ) + let f683 = ( + ) + let f684 = ( + ) + let f685 = ( + ) + let f686 = ( + ) + let f687 = ( + ) + let f688 = ( + ) + let f689 = ( + ) + let f690 = ( + ) + let f691 = ( + ) + let f692 = ( + ) + let f693 = ( + ) + let f694 = ( + ) + let f695 = ( + ) + let f696 = ( + ) + let f697 = ( + ) + let f698 = ( + ) + let f699 = ( + ) + let f700 = ( + ) + let f701 = ( + ) + let f702 = ( + ) + let f703 = ( + ) + let f704 = ( + ) + let f705 = ( + ) + let f706 = ( + ) + let f707 = ( + ) + let f708 = ( + ) + let f709 = ( + ) + let f710 = ( + ) + let f711 = ( + ) + let f712 = ( + ) + let f713 = ( + ) + let f714 = ( + ) + let f715 = ( + ) + let f716 = ( + ) + let f717 = ( + ) + let f718 = ( + ) + let f719 = ( + ) + let f720 = ( + ) + let f721 = ( + ) + let f722 = ( + ) + let f723 = ( + ) + let f724 = ( + ) + let f725 = ( + ) + let f726 = ( + ) + let f727 = ( + ) + let f728 = ( + ) + let f729 = ( + ) + let f730 = ( + ) + let f731 = ( + ) + let f732 = ( + ) + let f733 = ( + ) + let f734 = ( + ) + let f735 = ( + ) + let f736 = ( + ) + let f737 = ( + ) + let f738 = ( + ) + let f739 = ( + ) + let f740 = ( + ) + let f741 = ( + ) + let f742 = ( + ) + let f743 = ( + ) + let f744 = ( + ) + let f745 = ( + ) + let f746 = ( + ) + let f747 = ( + ) + let f748 = ( + ) + let f749 = ( + ) + let f750 = ( + ) + let f751 = ( + ) + let f752 = ( + ) + let f753 = ( + ) + let f754 = ( + ) + let f755 = ( + ) + let f756 = ( + ) + let f757 = ( + ) + let f758 = ( + ) + let f759 = ( + ) + let f760 = ( + ) + let f761 = ( + ) + let f762 = ( + ) + let f763 = ( + ) + let f764 = ( + ) + let f765 = ( + ) + let f766 = ( + ) + let f767 = ( + ) + let f768 = ( + ) + let f769 = ( + ) + let f770 = ( + ) + let f771 = ( + ) + let f772 = ( + ) + let f773 = ( + ) + let f774 = ( + ) + let f775 = ( + ) + let f776 = ( + ) + let f777 = ( + ) + let f778 = ( + ) + let f779 = ( + ) + let f780 = ( + ) + let f781 = ( + ) + let f782 = ( + ) + let f783 = ( + ) + let f784 = ( + ) + let f785 = ( + ) + let f786 = ( + ) + let f787 = ( + ) + let f788 = ( + ) + let f789 = ( + ) + let f790 = ( + ) + let f791 = ( + ) + let f792 = ( + ) + let f793 = ( + ) + let f794 = ( + ) + let f795 = ( + ) + let f796 = ( + ) + let f797 = ( + ) + let f798 = ( + ) + let f799 = ( + ) + let f800 = ( + ) + let f801 = ( + ) + let f802 = ( + ) + let f803 = ( + ) + let f804 = ( + ) + let f805 = ( + ) + let f806 = ( + ) + let f807 = ( + ) + let f808 = ( + ) + let f809 = ( + ) + let f810 = ( + ) + let f811 = ( + ) + let f812 = ( + ) + let f813 = ( + ) + let f814 = ( + ) + let f815 = ( + ) + let f816 = ( + ) + let f817 = ( + ) + let f818 = ( + ) + let f819 = ( + ) + let f820 = ( + ) + let f821 = ( + ) + let f822 = ( + ) + let f823 = ( + ) + let f824 = ( + ) + let f825 = ( + ) + let f826 = ( + ) + let f827 = ( + ) + let f828 = ( + ) + let f829 = ( + ) + let f830 = ( + ) + let f831 = ( + ) + let f832 = ( + ) + let f833 = ( + ) + let f834 = ( + ) + let f835 = ( + ) + let f836 = ( + ) + let f837 = ( + ) + let f838 = ( + ) + let f839 = ( + ) + let f840 = ( + ) + let f841 = ( + ) + let f842 = ( + ) + let f843 = ( + ) + let f844 = ( + ) + let f845 = ( + ) + let f846 = ( + ) + let f847 = ( + ) + let f848 = ( + ) + let f849 = ( + ) + let f850 = ( + ) + let f851 = ( + ) + let f852 = ( + ) + let f853 = ( + ) + let f854 = ( + ) + let f855 = ( + ) + let f856 = ( + ) + let f857 = ( + ) + let f858 = ( + ) + let f859 = ( + ) + let f860 = ( + ) + let f861 = ( + ) + let f862 = ( + ) + let f863 = ( + ) + let f864 = ( + ) + let f865 = ( + ) + let f866 = ( + ) + let f867 = ( + ) + let f868 = ( + ) + let f869 = ( + ) + let f870 = ( + ) + let f871 = ( + ) + let f872 = ( + ) + let f873 = ( + ) + let f874 = ( + ) + let f875 = ( + ) + let f876 = ( + ) + let f877 = ( + ) + let f878 = ( + ) + let f879 = ( + ) + let f880 = ( + ) + let f881 = ( + ) + let f882 = ( + ) + let f883 = ( + ) + let f884 = ( + ) + let f885 = ( + ) + let f886 = ( + ) + let f887 = ( + ) + let f888 = ( + ) + let f889 = ( + ) + let f890 = ( + ) + let f891 = ( + ) + let f892 = ( + ) + let f893 = ( + ) + let f894 = ( + ) + let f895 = ( + ) + let f896 = ( + ) + let f897 = ( + ) + let f898 = ( + ) + let f899 = ( + ) + let f900 = ( + ) + let f901 = ( + ) + let f902 = ( + ) + let f903 = ( + ) + let f904 = ( + ) + let f905 = ( + ) + let f906 = ( + ) + let f907 = ( + ) + let f908 = ( + ) + let f909 = ( + ) + let f910 = ( + ) + let f911 = ( + ) + let f912 = ( + ) + let f913 = ( + ) + let f914 = ( + ) + let f915 = ( + ) + let f916 = ( + ) + let f917 = ( + ) + let f918 = ( + ) + let f919 = ( + ) + let f920 = ( + ) + let f921 = ( + ) + let f922 = ( + ) + let f923 = ( + ) + let f924 = ( + ) + let f925 = ( + ) + let f926 = ( + ) + let f927 = ( + ) + let f928 = ( + ) + let f929 = ( + ) + let f930 = ( + ) + let f931 = ( + ) + let f932 = ( + ) + let f933 = ( + ) + let f934 = ( + ) + let f935 = ( + ) + let f936 = ( + ) + let f937 = ( + ) + let f938 = ( + ) + let f939 = ( + ) + let f940 = ( + ) + let f941 = ( + ) + let f942 = ( + ) + let f943 = ( + ) + let f944 = ( + ) + let f945 = ( + ) + let f946 = ( + ) + let f947 = ( + ) + let f948 = ( + ) + let f949 = ( + ) + let f950 = ( + ) + let f951 = ( + ) + let f952 = ( + ) + let f953 = ( + ) + let f954 = ( + ) + let f955 = ( + ) + let f956 = ( + ) + let f957 = ( + ) + let f958 = ( + ) + let f959 = ( + ) + let f960 = ( + ) + let f961 = ( + ) + let f962 = ( + ) + let f963 = ( + ) + let f964 = ( + ) + let f965 = ( + ) + let f966 = ( + ) + let f967 = ( + ) + let f968 = ( + ) + let f969 = ( + ) + let f970 = ( + ) + let f971 = ( + ) + let f972 = ( + ) + let f973 = ( + ) + let f974 = ( + ) + let f975 = ( + ) + let f976 = ( + ) + let f977 = ( + ) + let f978 = ( + ) + let f979 = ( + ) + let f980 = ( + ) + let f981 = ( + ) + let f982 = ( + ) + let f983 = ( + ) + let f984 = ( + ) + let f985 = ( + ) + let f986 = ( + ) + let f987 = ( + ) + let f988 = ( + ) + let f989 = ( + ) + let f990 = ( + ) + let f991 = ( + ) + let f992 = ( + ) + let f993 = ( + ) + let f994 = ( + ) + let f995 = ( + ) + let f996 = ( + ) + let f997 = ( + ) + let f998 = ( + ) + let f999 = ( + ) + let f1000 = ( + ) +end + +module X = Make(Make(Make(M))) diff --git a/camlp4/test/fixtures/functor-perf2.gen.ml b/camlp4/test/fixtures/functor-perf2.gen.ml new file mode 100644 index 00000000..730a1bf8 --- /dev/null +++ b/camlp4/test/fixtures/functor-perf2.gen.ml @@ -0,0 +1,3029 @@ + + +module type S = sig + type t0 + type t1 + type t2 + type t3 + type t4 + type t5 + type t6 + type t7 + type t8 + type t9 + type t10 + type t11 + type t12 + type t13 + type t14 + type t15 + type t16 + type t17 + type t18 + type t19 + type t20 + type t21 + type t22 + type t23 + type t24 + type t25 + type t26 + type t27 + type t28 + type t29 + type t30 + type t31 + type t32 + type t33 + type t34 + type t35 + type t36 + type t37 + type t38 + type t39 + type t40 + type t41 + type t42 + type t43 + type t44 + type t45 + type t46 + type t47 + type t48 + type t49 + type t50 + type t51 + type t52 + type t53 + type t54 + type t55 + type t56 + type t57 + type t58 + type t59 + type t60 + type t61 + type t62 + type t63 + type t64 + type t65 + type t66 + type t67 + type t68 + type t69 + type t70 + type t71 + type t72 + type t73 + type t74 + type t75 + type t76 + type t77 + type t78 + type t79 + type t80 + type t81 + type t82 + type t83 + type t84 + type t85 + type t86 + type t87 + type t88 + type t89 + type t90 + type t91 + type t92 + type t93 + type t94 + type t95 + type t96 + type t97 + type t98 + type t99 + type t100 + type t101 + type t102 + type t103 + type t104 + type t105 + type t106 + type t107 + type t108 + type t109 + type t110 + type t111 + type t112 + type t113 + type t114 + type t115 + type t116 + type t117 + type t118 + type t119 + type t120 + type t121 + type t122 + type t123 + type t124 + type t125 + type t126 + type t127 + type t128 + type t129 + type t130 + type t131 + type t132 + type t133 + type t134 + type t135 + type t136 + type t137 + type t138 + type t139 + type t140 + type t141 + type t142 + type t143 + type t144 + type t145 + type t146 + type t147 + type t148 + type t149 + type t150 + type t151 + type t152 + type t153 + type t154 + type t155 + type t156 + type t157 + type t158 + type t159 + type t160 + type t161 + type t162 + type t163 + type t164 + type t165 + type t166 + type t167 + type t168 + type t169 + type t170 + type t171 + type t172 + type t173 + type t174 + type t175 + type t176 + type t177 + type t178 + type t179 + type t180 + type t181 + type t182 + type t183 + type t184 + type t185 + type t186 + type t187 + type t188 + type t189 + type t190 + type t191 + type t192 + type t193 + type t194 + type t195 + type t196 + type t197 + type t198 + type t199 + type t200 + type t201 + type t202 + type t203 + type t204 + type t205 + type t206 + type t207 + type t208 + type t209 + type t210 + type t211 + type t212 + type t213 + type t214 + type t215 + type t216 + type t217 + type t218 + type t219 + type t220 + type t221 + type t222 + type t223 + type t224 + type t225 + type t226 + type t227 + type t228 + type t229 + type t230 + type t231 + type t232 + type t233 + type t234 + type t235 + type t236 + type t237 + type t238 + type t239 + type t240 + type t241 + type t242 + type t243 + type t244 + type t245 + type t246 + type t247 + type t248 + type t249 + type t250 + type t251 + type t252 + type t253 + type t254 + type t255 + type t256 + type t257 + type t258 + type t259 + type t260 + type t261 + type t262 + type t263 + type t264 + type t265 + type t266 + type t267 + type t268 + type t269 + type t270 + type t271 + type t272 + type t273 + type t274 + type t275 + type t276 + type t277 + type t278 + type t279 + type t280 + type t281 + type t282 + type t283 + type t284 + type t285 + type t286 + type t287 + type t288 + type t289 + type t290 + type t291 + type t292 + type t293 + type t294 + type t295 + type t296 + type t297 + type t298 + type t299 + type t300 + type t301 + type t302 + type t303 + type t304 + type t305 + type t306 + type t307 + type t308 + type t309 + type t310 + type t311 + type t312 + type t313 + type t314 + type t315 + type t316 + type t317 + type t318 + type t319 + type t320 + type t321 + type t322 + type t323 + type t324 + type t325 + type t326 + type t327 + type t328 + type t329 + type t330 + type t331 + type t332 + type t333 + type t334 + type t335 + type t336 + type t337 + type t338 + type t339 + type t340 + type t341 + type t342 + type t343 + type t344 + type t345 + type t346 + type t347 + type t348 + type t349 + type t350 + type t351 + type t352 + type t353 + type t354 + type t355 + type t356 + type t357 + type t358 + type t359 + type t360 + type t361 + type t362 + type t363 + type t364 + type t365 + type t366 + type t367 + type t368 + type t369 + type t370 + type t371 + type t372 + type t373 + type t374 + type t375 + type t376 + type t377 + type t378 + type t379 + type t380 + type t381 + type t382 + type t383 + type t384 + type t385 + type t386 + type t387 + type t388 + type t389 + type t390 + type t391 + type t392 + type t393 + type t394 + type t395 + type t396 + type t397 + type t398 + type t399 + type t400 + type t401 + type t402 + type t403 + type t404 + type t405 + type t406 + type t407 + type t408 + type t409 + type t410 + type t411 + type t412 + type t413 + type t414 + type t415 + type t416 + type t417 + type t418 + type t419 + type t420 + type t421 + type t422 + type t423 + type t424 + type t425 + type t426 + type t427 + type t428 + type t429 + type t430 + type t431 + type t432 + type t433 + type t434 + type t435 + type t436 + type t437 + type t438 + type t439 + type t440 + type t441 + type t442 + type t443 + type t444 + type t445 + type t446 + type t447 + type t448 + type t449 + type t450 + type t451 + type t452 + type t453 + type t454 + type t455 + type t456 + type t457 + type t458 + type t459 + type t460 + type t461 + type t462 + type t463 + type t464 + type t465 + type t466 + type t467 + type t468 + type t469 + type t470 + type t471 + type t472 + type t473 + type t474 + type t475 + type t476 + type t477 + type t478 + type t479 + type t480 + type t481 + type t482 + type t483 + type t484 + type t485 + type t486 + type t487 + type t488 + type t489 + type t490 + type t491 + type t492 + type t493 + type t494 + type t495 + type t496 + type t497 + type t498 + type t499 + type t500 + type t501 + type t502 + type t503 + type t504 + type t505 + type t506 + type t507 + type t508 + type t509 + type t510 + type t511 + type t512 + type t513 + type t514 + type t515 + type t516 + type t517 + type t518 + type t519 + type t520 + type t521 + type t522 + type t523 + type t524 + type t525 + type t526 + type t527 + type t528 + type t529 + type t530 + type t531 + type t532 + type t533 + type t534 + type t535 + type t536 + type t537 + type t538 + type t539 + type t540 + type t541 + type t542 + type t543 + type t544 + type t545 + type t546 + type t547 + type t548 + type t549 + type t550 + type t551 + type t552 + type t553 + type t554 + type t555 + type t556 + type t557 + type t558 + type t559 + type t560 + type t561 + type t562 + type t563 + type t564 + type t565 + type t566 + type t567 + type t568 + type t569 + type t570 + type t571 + type t572 + type t573 + type t574 + type t575 + type t576 + type t577 + type t578 + type t579 + type t580 + type t581 + type t582 + type t583 + type t584 + type t585 + type t586 + type t587 + type t588 + type t589 + type t590 + type t591 + type t592 + type t593 + type t594 + type t595 + type t596 + type t597 + type t598 + type t599 + type t600 + type t601 + type t602 + type t603 + type t604 + type t605 + type t606 + type t607 + type t608 + type t609 + type t610 + type t611 + type t612 + type t613 + type t614 + type t615 + type t616 + type t617 + type t618 + type t619 + type t620 + type t621 + type t622 + type t623 + type t624 + type t625 + type t626 + type t627 + type t628 + type t629 + type t630 + type t631 + type t632 + type t633 + type t634 + type t635 + type t636 + type t637 + type t638 + type t639 + type t640 + type t641 + type t642 + type t643 + type t644 + type t645 + type t646 + type t647 + type t648 + type t649 + type t650 + type t651 + type t652 + type t653 + type t654 + type t655 + type t656 + type t657 + type t658 + type t659 + type t660 + type t661 + type t662 + type t663 + type t664 + type t665 + type t666 + type t667 + type t668 + type t669 + type t670 + type t671 + type t672 + type t673 + type t674 + type t675 + type t676 + type t677 + type t678 + type t679 + type t680 + type t681 + type t682 + type t683 + type t684 + type t685 + type t686 + type t687 + type t688 + type t689 + type t690 + type t691 + type t692 + type t693 + type t694 + type t695 + type t696 + type t697 + type t698 + type t699 + type t700 + type t701 + type t702 + type t703 + type t704 + type t705 + type t706 + type t707 + type t708 + type t709 + type t710 + type t711 + type t712 + type t713 + type t714 + type t715 + type t716 + type t717 + type t718 + type t719 + type t720 + type t721 + type t722 + type t723 + type t724 + type t725 + type t726 + type t727 + type t728 + type t729 + type t730 + type t731 + type t732 + type t733 + type t734 + type t735 + type t736 + type t737 + type t738 + type t739 + type t740 + type t741 + type t742 + type t743 + type t744 + type t745 + type t746 + type t747 + type t748 + type t749 + type t750 + type t751 + type t752 + type t753 + type t754 + type t755 + type t756 + type t757 + type t758 + type t759 + type t760 + type t761 + type t762 + type t763 + type t764 + type t765 + type t766 + type t767 + type t768 + type t769 + type t770 + type t771 + type t772 + type t773 + type t774 + type t775 + type t776 + type t777 + type t778 + type t779 + type t780 + type t781 + type t782 + type t783 + type t784 + type t785 + type t786 + type t787 + type t788 + type t789 + type t790 + type t791 + type t792 + type t793 + type t794 + type t795 + type t796 + type t797 + type t798 + type t799 + type t800 + type t801 + type t802 + type t803 + type t804 + type t805 + type t806 + type t807 + type t808 + type t809 + type t810 + type t811 + type t812 + type t813 + type t814 + type t815 + type t816 + type t817 + type t818 + type t819 + type t820 + type t821 + type t822 + type t823 + type t824 + type t825 + type t826 + type t827 + type t828 + type t829 + type t830 + type t831 + type t832 + type t833 + type t834 + type t835 + type t836 + type t837 + type t838 + type t839 + type t840 + type t841 + type t842 + type t843 + type t844 + type t845 + type t846 + type t847 + type t848 + type t849 + type t850 + type t851 + type t852 + type t853 + type t854 + type t855 + type t856 + type t857 + type t858 + type t859 + type t860 + type t861 + type t862 + type t863 + type t864 + type t865 + type t866 + type t867 + type t868 + type t869 + type t870 + type t871 + type t872 + type t873 + type t874 + type t875 + type t876 + type t877 + type t878 + type t879 + type t880 + type t881 + type t882 + type t883 + type t884 + type t885 + type t886 + type t887 + type t888 + type t889 + type t890 + type t891 + type t892 + type t893 + type t894 + type t895 + type t896 + type t897 + type t898 + type t899 + type t900 + type t901 + type t902 + type t903 + type t904 + type t905 + type t906 + type t907 + type t908 + type t909 + type t910 + type t911 + type t912 + type t913 + type t914 + type t915 + type t916 + type t917 + type t918 + type t919 + type t920 + type t921 + type t922 + type t923 + type t924 + type t925 + type t926 + type t927 + type t928 + type t929 + type t930 + type t931 + type t932 + type t933 + type t934 + type t935 + type t936 + type t937 + type t938 + type t939 + type t940 + type t941 + type t942 + type t943 + type t944 + type t945 + type t946 + type t947 + type t948 + type t949 + type t950 + type t951 + type t952 + type t953 + type t954 + type t955 + type t956 + type t957 + type t958 + type t959 + type t960 + type t961 + type t962 + type t963 + type t964 + type t965 + type t966 + type t967 + type t968 + type t969 + type t970 + type t971 + type t972 + type t973 + type t974 + type t975 + type t976 + type t977 + type t978 + type t979 + type t980 + type t981 + type t982 + type t983 + type t984 + type t985 + type t986 + type t987 + type t988 + type t989 + type t990 + type t991 + type t992 + type t993 + type t994 + type t995 + type t996 + type t997 + type t998 + type t999 + type t1000 +end + +module Make (M : S) +: S with type t0 = M.t0 + and type t1 = M.t1 + and type t2 = M.t2 + and type t3 = M.t3 + and type t4 = M.t4 + and type t5 = M.t5 + and type t6 = M.t6 + and type t7 = M.t7 + and type t8 = M.t8 + and type t9 = M.t9 + and type t10 = M.t10 + and type t11 = M.t11 + and type t12 = M.t12 + and type t13 = M.t13 + and type t14 = M.t14 + and type t15 = M.t15 + and type t16 = M.t16 + and type t17 = M.t17 + and type t18 = M.t18 + and type t19 = M.t19 + and type t20 = M.t20 + and type t21 = M.t21 + and type t22 = M.t22 + and type t23 = M.t23 + and type t24 = M.t24 + and type t25 = M.t25 + and type t26 = M.t26 + and type t27 = M.t27 + and type t28 = M.t28 + and type t29 = M.t29 + and type t30 = M.t30 + and type t31 = M.t31 + and type t32 = M.t32 + and type t33 = M.t33 + and type t34 = M.t34 + and type t35 = M.t35 + and type t36 = M.t36 + and type t37 = M.t37 + and type t38 = M.t38 + and type t39 = M.t39 + and type t40 = M.t40 + and type t41 = M.t41 + and type t42 = M.t42 + and type t43 = M.t43 + and type t44 = M.t44 + and type t45 = M.t45 + and type t46 = M.t46 + and type t47 = M.t47 + and type t48 = M.t48 + and type t49 = M.t49 + and type t50 = M.t50 + and type t51 = M.t51 + and type t52 = M.t52 + and type t53 = M.t53 + and type t54 = M.t54 + and type t55 = M.t55 + and type t56 = M.t56 + and type t57 = M.t57 + and type t58 = M.t58 + and type t59 = M.t59 + and type t60 = M.t60 + and type t61 = M.t61 + and type t62 = M.t62 + and type t63 = M.t63 + and type t64 = M.t64 + and type t65 = M.t65 + and type t66 = M.t66 + and type t67 = M.t67 + and type t68 = M.t68 + and type t69 = M.t69 + and type t70 = M.t70 + and type t71 = M.t71 + and type t72 = M.t72 + and type t73 = M.t73 + and type t74 = M.t74 + and type t75 = M.t75 + and type t76 = M.t76 + and type t77 = M.t77 + and type t78 = M.t78 + and type t79 = M.t79 + and type t80 = M.t80 + and type t81 = M.t81 + and type t82 = M.t82 + and type t83 = M.t83 + and type t84 = M.t84 + and type t85 = M.t85 + and type t86 = M.t86 + and type t87 = M.t87 + and type t88 = M.t88 + and type t89 = M.t89 + and type t90 = M.t90 + and type t91 = M.t91 + and type t92 = M.t92 + and type t93 = M.t93 + and type t94 = M.t94 + and type t95 = M.t95 + and type t96 = M.t96 + and type t97 = M.t97 + and type t98 = M.t98 + and type t99 = M.t99 + and type t100 = M.t100 + and type t101 = M.t101 + and type t102 = M.t102 + and type t103 = M.t103 + and type t104 = M.t104 + and type t105 = M.t105 + and type t106 = M.t106 + and type t107 = M.t107 + and type t108 = M.t108 + and type t109 = M.t109 + and type t110 = M.t110 + and type t111 = M.t111 + and type t112 = M.t112 + and type t113 = M.t113 + and type t114 = M.t114 + and type t115 = M.t115 + and type t116 = M.t116 + and type t117 = M.t117 + and type t118 = M.t118 + and type t119 = M.t119 + and type t120 = M.t120 + and type t121 = M.t121 + and type t122 = M.t122 + and type t123 = M.t123 + and type t124 = M.t124 + and type t125 = M.t125 + and type t126 = M.t126 + and type t127 = M.t127 + and type t128 = M.t128 + and type t129 = M.t129 + and type t130 = M.t130 + and type t131 = M.t131 + and type t132 = M.t132 + and type t133 = M.t133 + and type t134 = M.t134 + and type t135 = M.t135 + and type t136 = M.t136 + and type t137 = M.t137 + and type t138 = M.t138 + and type t139 = M.t139 + and type t140 = M.t140 + and type t141 = M.t141 + and type t142 = M.t142 + and type t143 = M.t143 + and type t144 = M.t144 + and type t145 = M.t145 + and type t146 = M.t146 + and type t147 = M.t147 + and type t148 = M.t148 + and type t149 = M.t149 + and type t150 = M.t150 + and type t151 = M.t151 + and type t152 = M.t152 + and type t153 = M.t153 + and type t154 = M.t154 + and type t155 = M.t155 + and type t156 = M.t156 + and type t157 = M.t157 + and type t158 = M.t158 + and type t159 = M.t159 + and type t160 = M.t160 + and type t161 = M.t161 + and type t162 = M.t162 + and type t163 = M.t163 + and type t164 = M.t164 + and type t165 = M.t165 + and type t166 = M.t166 + and type t167 = M.t167 + and type t168 = M.t168 + and type t169 = M.t169 + and type t170 = M.t170 + and type t171 = M.t171 + and type t172 = M.t172 + and type t173 = M.t173 + and type t174 = M.t174 + and type t175 = M.t175 + and type t176 = M.t176 + and type t177 = M.t177 + and type t178 = M.t178 + and type t179 = M.t179 + and type t180 = M.t180 + and type t181 = M.t181 + and type t182 = M.t182 + and type t183 = M.t183 + and type t184 = M.t184 + and type t185 = M.t185 + and type t186 = M.t186 + and type t187 = M.t187 + and type t188 = M.t188 + and type t189 = M.t189 + and type t190 = M.t190 + and type t191 = M.t191 + and type t192 = M.t192 + and type t193 = M.t193 + and type t194 = M.t194 + and type t195 = M.t195 + and type t196 = M.t196 + and type t197 = M.t197 + and type t198 = M.t198 + and type t199 = M.t199 + and type t200 = M.t200 + and type t201 = M.t201 + and type t202 = M.t202 + and type t203 = M.t203 + and type t204 = M.t204 + and type t205 = M.t205 + and type t206 = M.t206 + and type t207 = M.t207 + and type t208 = M.t208 + and type t209 = M.t209 + and type t210 = M.t210 + and type t211 = M.t211 + and type t212 = M.t212 + and type t213 = M.t213 + and type t214 = M.t214 + and type t215 = M.t215 + and type t216 = M.t216 + and type t217 = M.t217 + and type t218 = M.t218 + and type t219 = M.t219 + and type t220 = M.t220 + and type t221 = M.t221 + and type t222 = M.t222 + and type t223 = M.t223 + and type t224 = M.t224 + and type t225 = M.t225 + and type t226 = M.t226 + and type t227 = M.t227 + and type t228 = M.t228 + and type t229 = M.t229 + and type t230 = M.t230 + and type t231 = M.t231 + and type t232 = M.t232 + and type t233 = M.t233 + and type t234 = M.t234 + and type t235 = M.t235 + and type t236 = M.t236 + and type t237 = M.t237 + and type t238 = M.t238 + and type t239 = M.t239 + and type t240 = M.t240 + and type t241 = M.t241 + and type t242 = M.t242 + and type t243 = M.t243 + and type t244 = M.t244 + and type t245 = M.t245 + and type t246 = M.t246 + and type t247 = M.t247 + and type t248 = M.t248 + and type t249 = M.t249 + and type t250 = M.t250 + and type t251 = M.t251 + and type t252 = M.t252 + and type t253 = M.t253 + and type t254 = M.t254 + and type t255 = M.t255 + and type t256 = M.t256 + and type t257 = M.t257 + and type t258 = M.t258 + and type t259 = M.t259 + and type t260 = M.t260 + and type t261 = M.t261 + and type t262 = M.t262 + and type t263 = M.t263 + and type t264 = M.t264 + and type t265 = M.t265 + and type t266 = M.t266 + and type t267 = M.t267 + and type t268 = M.t268 + and type t269 = M.t269 + and type t270 = M.t270 + and type t271 = M.t271 + and type t272 = M.t272 + and type t273 = M.t273 + and type t274 = M.t274 + and type t275 = M.t275 + and type t276 = M.t276 + and type t277 = M.t277 + and type t278 = M.t278 + and type t279 = M.t279 + and type t280 = M.t280 + and type t281 = M.t281 + and type t282 = M.t282 + and type t283 = M.t283 + and type t284 = M.t284 + and type t285 = M.t285 + and type t286 = M.t286 + and type t287 = M.t287 + and type t288 = M.t288 + and type t289 = M.t289 + and type t290 = M.t290 + and type t291 = M.t291 + and type t292 = M.t292 + and type t293 = M.t293 + and type t294 = M.t294 + and type t295 = M.t295 + and type t296 = M.t296 + and type t297 = M.t297 + and type t298 = M.t298 + and type t299 = M.t299 + and type t300 = M.t300 + and type t301 = M.t301 + and type t302 = M.t302 + and type t303 = M.t303 + and type t304 = M.t304 + and type t305 = M.t305 + and type t306 = M.t306 + and type t307 = M.t307 + and type t308 = M.t308 + and type t309 = M.t309 + and type t310 = M.t310 + and type t311 = M.t311 + and type t312 = M.t312 + and type t313 = M.t313 + and type t314 = M.t314 + and type t315 = M.t315 + and type t316 = M.t316 + and type t317 = M.t317 + and type t318 = M.t318 + and type t319 = M.t319 + and type t320 = M.t320 + and type t321 = M.t321 + and type t322 = M.t322 + and type t323 = M.t323 + and type t324 = M.t324 + and type t325 = M.t325 + and type t326 = M.t326 + and type t327 = M.t327 + and type t328 = M.t328 + and type t329 = M.t329 + and type t330 = M.t330 + and type t331 = M.t331 + and type t332 = M.t332 + and type t333 = M.t333 + and type t334 = M.t334 + and type t335 = M.t335 + and type t336 = M.t336 + and type t337 = M.t337 + and type t338 = M.t338 + and type t339 = M.t339 + and type t340 = M.t340 + and type t341 = M.t341 + and type t342 = M.t342 + and type t343 = M.t343 + and type t344 = M.t344 + and type t345 = M.t345 + and type t346 = M.t346 + and type t347 = M.t347 + and type t348 = M.t348 + and type t349 = M.t349 + and type t350 = M.t350 + and type t351 = M.t351 + and type t352 = M.t352 + and type t353 = M.t353 + and type t354 = M.t354 + and type t355 = M.t355 + and type t356 = M.t356 + and type t357 = M.t357 + and type t358 = M.t358 + and type t359 = M.t359 + and type t360 = M.t360 + and type t361 = M.t361 + and type t362 = M.t362 + and type t363 = M.t363 + and type t364 = M.t364 + and type t365 = M.t365 + and type t366 = M.t366 + and type t367 = M.t367 + and type t368 = M.t368 + and type t369 = M.t369 + and type t370 = M.t370 + and type t371 = M.t371 + and type t372 = M.t372 + and type t373 = M.t373 + and type t374 = M.t374 + and type t375 = M.t375 + and type t376 = M.t376 + and type t377 = M.t377 + and type t378 = M.t378 + and type t379 = M.t379 + and type t380 = M.t380 + and type t381 = M.t381 + and type t382 = M.t382 + and type t383 = M.t383 + and type t384 = M.t384 + and type t385 = M.t385 + and type t386 = M.t386 + and type t387 = M.t387 + and type t388 = M.t388 + and type t389 = M.t389 + and type t390 = M.t390 + and type t391 = M.t391 + and type t392 = M.t392 + and type t393 = M.t393 + and type t394 = M.t394 + and type t395 = M.t395 + and type t396 = M.t396 + and type t397 = M.t397 + and type t398 = M.t398 + and type t399 = M.t399 + and type t400 = M.t400 + and type t401 = M.t401 + and type t402 = M.t402 + and type t403 = M.t403 + and type t404 = M.t404 + and type t405 = M.t405 + and type t406 = M.t406 + and type t407 = M.t407 + and type t408 = M.t408 + and type t409 = M.t409 + and type t410 = M.t410 + and type t411 = M.t411 + and type t412 = M.t412 + and type t413 = M.t413 + and type t414 = M.t414 + and type t415 = M.t415 + and type t416 = M.t416 + and type t417 = M.t417 + and type t418 = M.t418 + and type t419 = M.t419 + and type t420 = M.t420 + and type t421 = M.t421 + and type t422 = M.t422 + and type t423 = M.t423 + and type t424 = M.t424 + and type t425 = M.t425 + and type t426 = M.t426 + and type t427 = M.t427 + and type t428 = M.t428 + and type t429 = M.t429 + and type t430 = M.t430 + and type t431 = M.t431 + and type t432 = M.t432 + and type t433 = M.t433 + and type t434 = M.t434 + and type t435 = M.t435 + and type t436 = M.t436 + and type t437 = M.t437 + and type t438 = M.t438 + and type t439 = M.t439 + and type t440 = M.t440 + and type t441 = M.t441 + and type t442 = M.t442 + and type t443 = M.t443 + and type t444 = M.t444 + and type t445 = M.t445 + and type t446 = M.t446 + and type t447 = M.t447 + and type t448 = M.t448 + and type t449 = M.t449 + and type t450 = M.t450 + and type t451 = M.t451 + and type t452 = M.t452 + and type t453 = M.t453 + and type t454 = M.t454 + and type t455 = M.t455 + and type t456 = M.t456 + and type t457 = M.t457 + and type t458 = M.t458 + and type t459 = M.t459 + and type t460 = M.t460 + and type t461 = M.t461 + and type t462 = M.t462 + and type t463 = M.t463 + and type t464 = M.t464 + and type t465 = M.t465 + and type t466 = M.t466 + and type t467 = M.t467 + and type t468 = M.t468 + and type t469 = M.t469 + and type t470 = M.t470 + and type t471 = M.t471 + and type t472 = M.t472 + and type t473 = M.t473 + and type t474 = M.t474 + and type t475 = M.t475 + and type t476 = M.t476 + and type t477 = M.t477 + and type t478 = M.t478 + and type t479 = M.t479 + and type t480 = M.t480 + and type t481 = M.t481 + and type t482 = M.t482 + and type t483 = M.t483 + and type t484 = M.t484 + and type t485 = M.t485 + and type t486 = M.t486 + and type t487 = M.t487 + and type t488 = M.t488 + and type t489 = M.t489 + and type t490 = M.t490 + and type t491 = M.t491 + and type t492 = M.t492 + and type t493 = M.t493 + and type t494 = M.t494 + and type t495 = M.t495 + and type t496 = M.t496 + and type t497 = M.t497 + and type t498 = M.t498 + and type t499 = M.t499 + and type t500 = M.t500 + and type t501 = M.t501 + and type t502 = M.t502 + and type t503 = M.t503 + and type t504 = M.t504 + and type t505 = M.t505 + and type t506 = M.t506 + and type t507 = M.t507 + and type t508 = M.t508 + and type t509 = M.t509 + and type t510 = M.t510 + and type t511 = M.t511 + and type t512 = M.t512 + and type t513 = M.t513 + and type t514 = M.t514 + and type t515 = M.t515 + and type t516 = M.t516 + and type t517 = M.t517 + and type t518 = M.t518 + and type t519 = M.t519 + and type t520 = M.t520 + and type t521 = M.t521 + and type t522 = M.t522 + and type t523 = M.t523 + and type t524 = M.t524 + and type t525 = M.t525 + and type t526 = M.t526 + and type t527 = M.t527 + and type t528 = M.t528 + and type t529 = M.t529 + and type t530 = M.t530 + and type t531 = M.t531 + and type t532 = M.t532 + and type t533 = M.t533 + and type t534 = M.t534 + and type t535 = M.t535 + and type t536 = M.t536 + and type t537 = M.t537 + and type t538 = M.t538 + and type t539 = M.t539 + and type t540 = M.t540 + and type t541 = M.t541 + and type t542 = M.t542 + and type t543 = M.t543 + and type t544 = M.t544 + and type t545 = M.t545 + and type t546 = M.t546 + and type t547 = M.t547 + and type t548 = M.t548 + and type t549 = M.t549 + and type t550 = M.t550 + and type t551 = M.t551 + and type t552 = M.t552 + and type t553 = M.t553 + and type t554 = M.t554 + and type t555 = M.t555 + and type t556 = M.t556 + and type t557 = M.t557 + and type t558 = M.t558 + and type t559 = M.t559 + and type t560 = M.t560 + and type t561 = M.t561 + and type t562 = M.t562 + and type t563 = M.t563 + and type t564 = M.t564 + and type t565 = M.t565 + and type t566 = M.t566 + and type t567 = M.t567 + and type t568 = M.t568 + and type t569 = M.t569 + and type t570 = M.t570 + and type t571 = M.t571 + and type t572 = M.t572 + and type t573 = M.t573 + and type t574 = M.t574 + and type t575 = M.t575 + and type t576 = M.t576 + and type t577 = M.t577 + and type t578 = M.t578 + and type t579 = M.t579 + and type t580 = M.t580 + and type t581 = M.t581 + and type t582 = M.t582 + and type t583 = M.t583 + and type t584 = M.t584 + and type t585 = M.t585 + and type t586 = M.t586 + and type t587 = M.t587 + and type t588 = M.t588 + and type t589 = M.t589 + and type t590 = M.t590 + and type t591 = M.t591 + and type t592 = M.t592 + and type t593 = M.t593 + and type t594 = M.t594 + and type t595 = M.t595 + and type t596 = M.t596 + and type t597 = M.t597 + and type t598 = M.t598 + and type t599 = M.t599 + and type t600 = M.t600 + and type t601 = M.t601 + and type t602 = M.t602 + and type t603 = M.t603 + and type t604 = M.t604 + and type t605 = M.t605 + and type t606 = M.t606 + and type t607 = M.t607 + and type t608 = M.t608 + and type t609 = M.t609 + and type t610 = M.t610 + and type t611 = M.t611 + and type t612 = M.t612 + and type t613 = M.t613 + and type t614 = M.t614 + and type t615 = M.t615 + and type t616 = M.t616 + and type t617 = M.t617 + and type t618 = M.t618 + and type t619 = M.t619 + and type t620 = M.t620 + and type t621 = M.t621 + and type t622 = M.t622 + and type t623 = M.t623 + and type t624 = M.t624 + and type t625 = M.t625 + and type t626 = M.t626 + and type t627 = M.t627 + and type t628 = M.t628 + and type t629 = M.t629 + and type t630 = M.t630 + and type t631 = M.t631 + and type t632 = M.t632 + and type t633 = M.t633 + and type t634 = M.t634 + and type t635 = M.t635 + and type t636 = M.t636 + and type t637 = M.t637 + and type t638 = M.t638 + and type t639 = M.t639 + and type t640 = M.t640 + and type t641 = M.t641 + and type t642 = M.t642 + and type t643 = M.t643 + and type t644 = M.t644 + and type t645 = M.t645 + and type t646 = M.t646 + and type t647 = M.t647 + and type t648 = M.t648 + and type t649 = M.t649 + and type t650 = M.t650 + and type t651 = M.t651 + and type t652 = M.t652 + and type t653 = M.t653 + and type t654 = M.t654 + and type t655 = M.t655 + and type t656 = M.t656 + and type t657 = M.t657 + and type t658 = M.t658 + and type t659 = M.t659 + and type t660 = M.t660 + and type t661 = M.t661 + and type t662 = M.t662 + and type t663 = M.t663 + and type t664 = M.t664 + and type t665 = M.t665 + and type t666 = M.t666 + and type t667 = M.t667 + and type t668 = M.t668 + and type t669 = M.t669 + and type t670 = M.t670 + and type t671 = M.t671 + and type t672 = M.t672 + and type t673 = M.t673 + and type t674 = M.t674 + and type t675 = M.t675 + and type t676 = M.t676 + and type t677 = M.t677 + and type t678 = M.t678 + and type t679 = M.t679 + and type t680 = M.t680 + and type t681 = M.t681 + and type t682 = M.t682 + and type t683 = M.t683 + and type t684 = M.t684 + and type t685 = M.t685 + and type t686 = M.t686 + and type t687 = M.t687 + and type t688 = M.t688 + and type t689 = M.t689 + and type t690 = M.t690 + and type t691 = M.t691 + and type t692 = M.t692 + and type t693 = M.t693 + and type t694 = M.t694 + and type t695 = M.t695 + and type t696 = M.t696 + and type t697 = M.t697 + and type t698 = M.t698 + and type t699 = M.t699 + and type t700 = M.t700 + and type t701 = M.t701 + and type t702 = M.t702 + and type t703 = M.t703 + and type t704 = M.t704 + and type t705 = M.t705 + and type t706 = M.t706 + and type t707 = M.t707 + and type t708 = M.t708 + and type t709 = M.t709 + and type t710 = M.t710 + and type t711 = M.t711 + and type t712 = M.t712 + and type t713 = M.t713 + and type t714 = M.t714 + and type t715 = M.t715 + and type t716 = M.t716 + and type t717 = M.t717 + and type t718 = M.t718 + and type t719 = M.t719 + and type t720 = M.t720 + and type t721 = M.t721 + and type t722 = M.t722 + and type t723 = M.t723 + and type t724 = M.t724 + and type t725 = M.t725 + and type t726 = M.t726 + and type t727 = M.t727 + and type t728 = M.t728 + and type t729 = M.t729 + and type t730 = M.t730 + and type t731 = M.t731 + and type t732 = M.t732 + and type t733 = M.t733 + and type t734 = M.t734 + and type t735 = M.t735 + and type t736 = M.t736 + and type t737 = M.t737 + and type t738 = M.t738 + and type t739 = M.t739 + and type t740 = M.t740 + and type t741 = M.t741 + and type t742 = M.t742 + and type t743 = M.t743 + and type t744 = M.t744 + and type t745 = M.t745 + and type t746 = M.t746 + and type t747 = M.t747 + and type t748 = M.t748 + and type t749 = M.t749 + and type t750 = M.t750 + and type t751 = M.t751 + and type t752 = M.t752 + and type t753 = M.t753 + and type t754 = M.t754 + and type t755 = M.t755 + and type t756 = M.t756 + and type t757 = M.t757 + and type t758 = M.t758 + and type t759 = M.t759 + and type t760 = M.t760 + and type t761 = M.t761 + and type t762 = M.t762 + and type t763 = M.t763 + and type t764 = M.t764 + and type t765 = M.t765 + and type t766 = M.t766 + and type t767 = M.t767 + and type t768 = M.t768 + and type t769 = M.t769 + and type t770 = M.t770 + and type t771 = M.t771 + and type t772 = M.t772 + and type t773 = M.t773 + and type t774 = M.t774 + and type t775 = M.t775 + and type t776 = M.t776 + and type t777 = M.t777 + and type t778 = M.t778 + and type t779 = M.t779 + and type t780 = M.t780 + and type t781 = M.t781 + and type t782 = M.t782 + and type t783 = M.t783 + and type t784 = M.t784 + and type t785 = M.t785 + and type t786 = M.t786 + and type t787 = M.t787 + and type t788 = M.t788 + and type t789 = M.t789 + and type t790 = M.t790 + and type t791 = M.t791 + and type t792 = M.t792 + and type t793 = M.t793 + and type t794 = M.t794 + and type t795 = M.t795 + and type t796 = M.t796 + and type t797 = M.t797 + and type t798 = M.t798 + and type t799 = M.t799 + and type t800 = M.t800 + and type t801 = M.t801 + and type t802 = M.t802 + and type t803 = M.t803 + and type t804 = M.t804 + and type t805 = M.t805 + and type t806 = M.t806 + and type t807 = M.t807 + and type t808 = M.t808 + and type t809 = M.t809 + and type t810 = M.t810 + and type t811 = M.t811 + and type t812 = M.t812 + and type t813 = M.t813 + and type t814 = M.t814 + and type t815 = M.t815 + and type t816 = M.t816 + and type t817 = M.t817 + and type t818 = M.t818 + and type t819 = M.t819 + and type t820 = M.t820 + and type t821 = M.t821 + and type t822 = M.t822 + and type t823 = M.t823 + and type t824 = M.t824 + and type t825 = M.t825 + and type t826 = M.t826 + and type t827 = M.t827 + and type t828 = M.t828 + and type t829 = M.t829 + and type t830 = M.t830 + and type t831 = M.t831 + and type t832 = M.t832 + and type t833 = M.t833 + and type t834 = M.t834 + and type t835 = M.t835 + and type t836 = M.t836 + and type t837 = M.t837 + and type t838 = M.t838 + and type t839 = M.t839 + and type t840 = M.t840 + and type t841 = M.t841 + and type t842 = M.t842 + and type t843 = M.t843 + and type t844 = M.t844 + and type t845 = M.t845 + and type t846 = M.t846 + and type t847 = M.t847 + and type t848 = M.t848 + and type t849 = M.t849 + and type t850 = M.t850 + and type t851 = M.t851 + and type t852 = M.t852 + and type t853 = M.t853 + and type t854 = M.t854 + and type t855 = M.t855 + and type t856 = M.t856 + and type t857 = M.t857 + and type t858 = M.t858 + and type t859 = M.t859 + and type t860 = M.t860 + and type t861 = M.t861 + and type t862 = M.t862 + and type t863 = M.t863 + and type t864 = M.t864 + and type t865 = M.t865 + and type t866 = M.t866 + and type t867 = M.t867 + and type t868 = M.t868 + and type t869 = M.t869 + and type t870 = M.t870 + and type t871 = M.t871 + and type t872 = M.t872 + and type t873 = M.t873 + and type t874 = M.t874 + and type t875 = M.t875 + and type t876 = M.t876 + and type t877 = M.t877 + and type t878 = M.t878 + and type t879 = M.t879 + and type t880 = M.t880 + and type t881 = M.t881 + and type t882 = M.t882 + and type t883 = M.t883 + and type t884 = M.t884 + and type t885 = M.t885 + and type t886 = M.t886 + and type t887 = M.t887 + and type t888 = M.t888 + and type t889 = M.t889 + and type t890 = M.t890 + and type t891 = M.t891 + and type t892 = M.t892 + and type t893 = M.t893 + and type t894 = M.t894 + and type t895 = M.t895 + and type t896 = M.t896 + and type t897 = M.t897 + and type t898 = M.t898 + and type t899 = M.t899 + and type t900 = M.t900 + and type t901 = M.t901 + and type t902 = M.t902 + and type t903 = M.t903 + and type t904 = M.t904 + and type t905 = M.t905 + and type t906 = M.t906 + and type t907 = M.t907 + and type t908 = M.t908 + and type t909 = M.t909 + and type t910 = M.t910 + and type t911 = M.t911 + and type t912 = M.t912 + and type t913 = M.t913 + and type t914 = M.t914 + and type t915 = M.t915 + and type t916 = M.t916 + and type t917 = M.t917 + and type t918 = M.t918 + and type t919 = M.t919 + and type t920 = M.t920 + and type t921 = M.t921 + and type t922 = M.t922 + and type t923 = M.t923 + and type t924 = M.t924 + and type t925 = M.t925 + and type t926 = M.t926 + and type t927 = M.t927 + and type t928 = M.t928 + and type t929 = M.t929 + and type t930 = M.t930 + and type t931 = M.t931 + and type t932 = M.t932 + and type t933 = M.t933 + and type t934 = M.t934 + and type t935 = M.t935 + and type t936 = M.t936 + and type t937 = M.t937 + and type t938 = M.t938 + and type t939 = M.t939 + and type t940 = M.t940 + and type t941 = M.t941 + and type t942 = M.t942 + and type t943 = M.t943 + and type t944 = M.t944 + and type t945 = M.t945 + and type t946 = M.t946 + and type t947 = M.t947 + and type t948 = M.t948 + and type t949 = M.t949 + and type t950 = M.t950 + and type t951 = M.t951 + and type t952 = M.t952 + and type t953 = M.t953 + and type t954 = M.t954 + and type t955 = M.t955 + and type t956 = M.t956 + and type t957 = M.t957 + and type t958 = M.t958 + and type t959 = M.t959 + and type t960 = M.t960 + and type t961 = M.t961 + and type t962 = M.t962 + and type t963 = M.t963 + and type t964 = M.t964 + and type t965 = M.t965 + and type t966 = M.t966 + and type t967 = M.t967 + and type t968 = M.t968 + and type t969 = M.t969 + and type t970 = M.t970 + and type t971 = M.t971 + and type t972 = M.t972 + and type t973 = M.t973 + and type t974 = M.t974 + and type t975 = M.t975 + and type t976 = M.t976 + and type t977 = M.t977 + and type t978 = M.t978 + and type t979 = M.t979 + and type t980 = M.t980 + and type t981 = M.t981 + and type t982 = M.t982 + and type t983 = M.t983 + and type t984 = M.t984 + and type t985 = M.t985 + and type t986 = M.t986 + and type t987 = M.t987 + and type t988 = M.t988 + and type t989 = M.t989 + and type t990 = M.t990 + and type t991 = M.t991 + and type t992 = M.t992 + and type t993 = M.t993 + and type t994 = M.t994 + and type t995 = M.t995 + and type t996 = M.t996 + and type t997 = M.t997 + and type t998 = M.t998 + and type t999 = M.t999 + and type t1000 = M.t1000 += struct + include M +end + +module M = struct + type t0 = int -> int -> int + type t1 = int -> int -> int + type t2 = int -> int -> int + type t3 = int -> int -> int + type t4 = int -> int -> int + type t5 = int -> int -> int + type t6 = int -> int -> int + type t7 = int -> int -> int + type t8 = int -> int -> int + type t9 = int -> int -> int + type t10 = int -> int -> int + type t11 = int -> int -> int + type t12 = int -> int -> int + type t13 = int -> int -> int + type t14 = int -> int -> int + type t15 = int -> int -> int + type t16 = int -> int -> int + type t17 = int -> int -> int + type t18 = int -> int -> int + type t19 = int -> int -> int + type t20 = int -> int -> int + type t21 = int -> int -> int + type t22 = int -> int -> int + type t23 = int -> int -> int + type t24 = int -> int -> int + type t25 = int -> int -> int + type t26 = int -> int -> int + type t27 = int -> int -> int + type t28 = int -> int -> int + type t29 = int -> int -> int + type t30 = int -> int -> int + type t31 = int -> int -> int + type t32 = int -> int -> int + type t33 = int -> int -> int + type t34 = int -> int -> int + type t35 = int -> int -> int + type t36 = int -> int -> int + type t37 = int -> int -> int + type t38 = int -> int -> int + type t39 = int -> int -> int + type t40 = int -> int -> int + type t41 = int -> int -> int + type t42 = int -> int -> int + type t43 = int -> int -> int + type t44 = int -> int -> int + type t45 = int -> int -> int + type t46 = int -> int -> int + type t47 = int -> int -> int + type t48 = int -> int -> int + type t49 = int -> int -> int + type t50 = int -> int -> int + type t51 = int -> int -> int + type t52 = int -> int -> int + type t53 = int -> int -> int + type t54 = int -> int -> int + type t55 = int -> int -> int + type t56 = int -> int -> int + type t57 = int -> int -> int + type t58 = int -> int -> int + type t59 = int -> int -> int + type t60 = int -> int -> int + type t61 = int -> int -> int + type t62 = int -> int -> int + type t63 = int -> int -> int + type t64 = int -> int -> int + type t65 = int -> int -> int + type t66 = int -> int -> int + type t67 = int -> int -> int + type t68 = int -> int -> int + type t69 = int -> int -> int + type t70 = int -> int -> int + type t71 = int -> int -> int + type t72 = int -> int -> int + type t73 = int -> int -> int + type t74 = int -> int -> int + type t75 = int -> int -> int + type t76 = int -> int -> int + type t77 = int -> int -> int + type t78 = int -> int -> int + type t79 = int -> int -> int + type t80 = int -> int -> int + type t81 = int -> int -> int + type t82 = int -> int -> int + type t83 = int -> int -> int + type t84 = int -> int -> int + type t85 = int -> int -> int + type t86 = int -> int -> int + type t87 = int -> int -> int + type t88 = int -> int -> int + type t89 = int -> int -> int + type t90 = int -> int -> int + type t91 = int -> int -> int + type t92 = int -> int -> int + type t93 = int -> int -> int + type t94 = int -> int -> int + type t95 = int -> int -> int + type t96 = int -> int -> int + type t97 = int -> int -> int + type t98 = int -> int -> int + type t99 = int -> int -> int + type t100 = int -> int -> int + type t101 = int -> int -> int + type t102 = int -> int -> int + type t103 = int -> int -> int + type t104 = int -> int -> int + type t105 = int -> int -> int + type t106 = int -> int -> int + type t107 = int -> int -> int + type t108 = int -> int -> int + type t109 = int -> int -> int + type t110 = int -> int -> int + type t111 = int -> int -> int + type t112 = int -> int -> int + type t113 = int -> int -> int + type t114 = int -> int -> int + type t115 = int -> int -> int + type t116 = int -> int -> int + type t117 = int -> int -> int + type t118 = int -> int -> int + type t119 = int -> int -> int + type t120 = int -> int -> int + type t121 = int -> int -> int + type t122 = int -> int -> int + type t123 = int -> int -> int + type t124 = int -> int -> int + type t125 = int -> int -> int + type t126 = int -> int -> int + type t127 = int -> int -> int + type t128 = int -> int -> int + type t129 = int -> int -> int + type t130 = int -> int -> int + type t131 = int -> int -> int + type t132 = int -> int -> int + type t133 = int -> int -> int + type t134 = int -> int -> int + type t135 = int -> int -> int + type t136 = int -> int -> int + type t137 = int -> int -> int + type t138 = int -> int -> int + type t139 = int -> int -> int + type t140 = int -> int -> int + type t141 = int -> int -> int + type t142 = int -> int -> int + type t143 = int -> int -> int + type t144 = int -> int -> int + type t145 = int -> int -> int + type t146 = int -> int -> int + type t147 = int -> int -> int + type t148 = int -> int -> int + type t149 = int -> int -> int + type t150 = int -> int -> int + type t151 = int -> int -> int + type t152 = int -> int -> int + type t153 = int -> int -> int + type t154 = int -> int -> int + type t155 = int -> int -> int + type t156 = int -> int -> int + type t157 = int -> int -> int + type t158 = int -> int -> int + type t159 = int -> int -> int + type t160 = int -> int -> int + type t161 = int -> int -> int + type t162 = int -> int -> int + type t163 = int -> int -> int + type t164 = int -> int -> int + type t165 = int -> int -> int + type t166 = int -> int -> int + type t167 = int -> int -> int + type t168 = int -> int -> int + type t169 = int -> int -> int + type t170 = int -> int -> int + type t171 = int -> int -> int + type t172 = int -> int -> int + type t173 = int -> int -> int + type t174 = int -> int -> int + type t175 = int -> int -> int + type t176 = int -> int -> int + type t177 = int -> int -> int + type t178 = int -> int -> int + type t179 = int -> int -> int + type t180 = int -> int -> int + type t181 = int -> int -> int + type t182 = int -> int -> int + type t183 = int -> int -> int + type t184 = int -> int -> int + type t185 = int -> int -> int + type t186 = int -> int -> int + type t187 = int -> int -> int + type t188 = int -> int -> int + type t189 = int -> int -> int + type t190 = int -> int -> int + type t191 = int -> int -> int + type t192 = int -> int -> int + type t193 = int -> int -> int + type t194 = int -> int -> int + type t195 = int -> int -> int + type t196 = int -> int -> int + type t197 = int -> int -> int + type t198 = int -> int -> int + type t199 = int -> int -> int + type t200 = int -> int -> int + type t201 = int -> int -> int + type t202 = int -> int -> int + type t203 = int -> int -> int + type t204 = int -> int -> int + type t205 = int -> int -> int + type t206 = int -> int -> int + type t207 = int -> int -> int + type t208 = int -> int -> int + type t209 = int -> int -> int + type t210 = int -> int -> int + type t211 = int -> int -> int + type t212 = int -> int -> int + type t213 = int -> int -> int + type t214 = int -> int -> int + type t215 = int -> int -> int + type t216 = int -> int -> int + type t217 = int -> int -> int + type t218 = int -> int -> int + type t219 = int -> int -> int + type t220 = int -> int -> int + type t221 = int -> int -> int + type t222 = int -> int -> int + type t223 = int -> int -> int + type t224 = int -> int -> int + type t225 = int -> int -> int + type t226 = int -> int -> int + type t227 = int -> int -> int + type t228 = int -> int -> int + type t229 = int -> int -> int + type t230 = int -> int -> int + type t231 = int -> int -> int + type t232 = int -> int -> int + type t233 = int -> int -> int + type t234 = int -> int -> int + type t235 = int -> int -> int + type t236 = int -> int -> int + type t237 = int -> int -> int + type t238 = int -> int -> int + type t239 = int -> int -> int + type t240 = int -> int -> int + type t241 = int -> int -> int + type t242 = int -> int -> int + type t243 = int -> int -> int + type t244 = int -> int -> int + type t245 = int -> int -> int + type t246 = int -> int -> int + type t247 = int -> int -> int + type t248 = int -> int -> int + type t249 = int -> int -> int + type t250 = int -> int -> int + type t251 = int -> int -> int + type t252 = int -> int -> int + type t253 = int -> int -> int + type t254 = int -> int -> int + type t255 = int -> int -> int + type t256 = int -> int -> int + type t257 = int -> int -> int + type t258 = int -> int -> int + type t259 = int -> int -> int + type t260 = int -> int -> int + type t261 = int -> int -> int + type t262 = int -> int -> int + type t263 = int -> int -> int + type t264 = int -> int -> int + type t265 = int -> int -> int + type t266 = int -> int -> int + type t267 = int -> int -> int + type t268 = int -> int -> int + type t269 = int -> int -> int + type t270 = int -> int -> int + type t271 = int -> int -> int + type t272 = int -> int -> int + type t273 = int -> int -> int + type t274 = int -> int -> int + type t275 = int -> int -> int + type t276 = int -> int -> int + type t277 = int -> int -> int + type t278 = int -> int -> int + type t279 = int -> int -> int + type t280 = int -> int -> int + type t281 = int -> int -> int + type t282 = int -> int -> int + type t283 = int -> int -> int + type t284 = int -> int -> int + type t285 = int -> int -> int + type t286 = int -> int -> int + type t287 = int -> int -> int + type t288 = int -> int -> int + type t289 = int -> int -> int + type t290 = int -> int -> int + type t291 = int -> int -> int + type t292 = int -> int -> int + type t293 = int -> int -> int + type t294 = int -> int -> int + type t295 = int -> int -> int + type t296 = int -> int -> int + type t297 = int -> int -> int + type t298 = int -> int -> int + type t299 = int -> int -> int + type t300 = int -> int -> int + type t301 = int -> int -> int + type t302 = int -> int -> int + type t303 = int -> int -> int + type t304 = int -> int -> int + type t305 = int -> int -> int + type t306 = int -> int -> int + type t307 = int -> int -> int + type t308 = int -> int -> int + type t309 = int -> int -> int + type t310 = int -> int -> int + type t311 = int -> int -> int + type t312 = int -> int -> int + type t313 = int -> int -> int + type t314 = int -> int -> int + type t315 = int -> int -> int + type t316 = int -> int -> int + type t317 = int -> int -> int + type t318 = int -> int -> int + type t319 = int -> int -> int + type t320 = int -> int -> int + type t321 = int -> int -> int + type t322 = int -> int -> int + type t323 = int -> int -> int + type t324 = int -> int -> int + type t325 = int -> int -> int + type t326 = int -> int -> int + type t327 = int -> int -> int + type t328 = int -> int -> int + type t329 = int -> int -> int + type t330 = int -> int -> int + type t331 = int -> int -> int + type t332 = int -> int -> int + type t333 = int -> int -> int + type t334 = int -> int -> int + type t335 = int -> int -> int + type t336 = int -> int -> int + type t337 = int -> int -> int + type t338 = int -> int -> int + type t339 = int -> int -> int + type t340 = int -> int -> int + type t341 = int -> int -> int + type t342 = int -> int -> int + type t343 = int -> int -> int + type t344 = int -> int -> int + type t345 = int -> int -> int + type t346 = int -> int -> int + type t347 = int -> int -> int + type t348 = int -> int -> int + type t349 = int -> int -> int + type t350 = int -> int -> int + type t351 = int -> int -> int + type t352 = int -> int -> int + type t353 = int -> int -> int + type t354 = int -> int -> int + type t355 = int -> int -> int + type t356 = int -> int -> int + type t357 = int -> int -> int + type t358 = int -> int -> int + type t359 = int -> int -> int + type t360 = int -> int -> int + type t361 = int -> int -> int + type t362 = int -> int -> int + type t363 = int -> int -> int + type t364 = int -> int -> int + type t365 = int -> int -> int + type t366 = int -> int -> int + type t367 = int -> int -> int + type t368 = int -> int -> int + type t369 = int -> int -> int + type t370 = int -> int -> int + type t371 = int -> int -> int + type t372 = int -> int -> int + type t373 = int -> int -> int + type t374 = int -> int -> int + type t375 = int -> int -> int + type t376 = int -> int -> int + type t377 = int -> int -> int + type t378 = int -> int -> int + type t379 = int -> int -> int + type t380 = int -> int -> int + type t381 = int -> int -> int + type t382 = int -> int -> int + type t383 = int -> int -> int + type t384 = int -> int -> int + type t385 = int -> int -> int + type t386 = int -> int -> int + type t387 = int -> int -> int + type t388 = int -> int -> int + type t389 = int -> int -> int + type t390 = int -> int -> int + type t391 = int -> int -> int + type t392 = int -> int -> int + type t393 = int -> int -> int + type t394 = int -> int -> int + type t395 = int -> int -> int + type t396 = int -> int -> int + type t397 = int -> int -> int + type t398 = int -> int -> int + type t399 = int -> int -> int + type t400 = int -> int -> int + type t401 = int -> int -> int + type t402 = int -> int -> int + type t403 = int -> int -> int + type t404 = int -> int -> int + type t405 = int -> int -> int + type t406 = int -> int -> int + type t407 = int -> int -> int + type t408 = int -> int -> int + type t409 = int -> int -> int + type t410 = int -> int -> int + type t411 = int -> int -> int + type t412 = int -> int -> int + type t413 = int -> int -> int + type t414 = int -> int -> int + type t415 = int -> int -> int + type t416 = int -> int -> int + type t417 = int -> int -> int + type t418 = int -> int -> int + type t419 = int -> int -> int + type t420 = int -> int -> int + type t421 = int -> int -> int + type t422 = int -> int -> int + type t423 = int -> int -> int + type t424 = int -> int -> int + type t425 = int -> int -> int + type t426 = int -> int -> int + type t427 = int -> int -> int + type t428 = int -> int -> int + type t429 = int -> int -> int + type t430 = int -> int -> int + type t431 = int -> int -> int + type t432 = int -> int -> int + type t433 = int -> int -> int + type t434 = int -> int -> int + type t435 = int -> int -> int + type t436 = int -> int -> int + type t437 = int -> int -> int + type t438 = int -> int -> int + type t439 = int -> int -> int + type t440 = int -> int -> int + type t441 = int -> int -> int + type t442 = int -> int -> int + type t443 = int -> int -> int + type t444 = int -> int -> int + type t445 = int -> int -> int + type t446 = int -> int -> int + type t447 = int -> int -> int + type t448 = int -> int -> int + type t449 = int -> int -> int + type t450 = int -> int -> int + type t451 = int -> int -> int + type t452 = int -> int -> int + type t453 = int -> int -> int + type t454 = int -> int -> int + type t455 = int -> int -> int + type t456 = int -> int -> int + type t457 = int -> int -> int + type t458 = int -> int -> int + type t459 = int -> int -> int + type t460 = int -> int -> int + type t461 = int -> int -> int + type t462 = int -> int -> int + type t463 = int -> int -> int + type t464 = int -> int -> int + type t465 = int -> int -> int + type t466 = int -> int -> int + type t467 = int -> int -> int + type t468 = int -> int -> int + type t469 = int -> int -> int + type t470 = int -> int -> int + type t471 = int -> int -> int + type t472 = int -> int -> int + type t473 = int -> int -> int + type t474 = int -> int -> int + type t475 = int -> int -> int + type t476 = int -> int -> int + type t477 = int -> int -> int + type t478 = int -> int -> int + type t479 = int -> int -> int + type t480 = int -> int -> int + type t481 = int -> int -> int + type t482 = int -> int -> int + type t483 = int -> int -> int + type t484 = int -> int -> int + type t485 = int -> int -> int + type t486 = int -> int -> int + type t487 = int -> int -> int + type t488 = int -> int -> int + type t489 = int -> int -> int + type t490 = int -> int -> int + type t491 = int -> int -> int + type t492 = int -> int -> int + type t493 = int -> int -> int + type t494 = int -> int -> int + type t495 = int -> int -> int + type t496 = int -> int -> int + type t497 = int -> int -> int + type t498 = int -> int -> int + type t499 = int -> int -> int + type t500 = int -> int -> int + type t501 = int -> int -> int + type t502 = int -> int -> int + type t503 = int -> int -> int + type t504 = int -> int -> int + type t505 = int -> int -> int + type t506 = int -> int -> int + type t507 = int -> int -> int + type t508 = int -> int -> int + type t509 = int -> int -> int + type t510 = int -> int -> int + type t511 = int -> int -> int + type t512 = int -> int -> int + type t513 = int -> int -> int + type t514 = int -> int -> int + type t515 = int -> int -> int + type t516 = int -> int -> int + type t517 = int -> int -> int + type t518 = int -> int -> int + type t519 = int -> int -> int + type t520 = int -> int -> int + type t521 = int -> int -> int + type t522 = int -> int -> int + type t523 = int -> int -> int + type t524 = int -> int -> int + type t525 = int -> int -> int + type t526 = int -> int -> int + type t527 = int -> int -> int + type t528 = int -> int -> int + type t529 = int -> int -> int + type t530 = int -> int -> int + type t531 = int -> int -> int + type t532 = int -> int -> int + type t533 = int -> int -> int + type t534 = int -> int -> int + type t535 = int -> int -> int + type t536 = int -> int -> int + type t537 = int -> int -> int + type t538 = int -> int -> int + type t539 = int -> int -> int + type t540 = int -> int -> int + type t541 = int -> int -> int + type t542 = int -> int -> int + type t543 = int -> int -> int + type t544 = int -> int -> int + type t545 = int -> int -> int + type t546 = int -> int -> int + type t547 = int -> int -> int + type t548 = int -> int -> int + type t549 = int -> int -> int + type t550 = int -> int -> int + type t551 = int -> int -> int + type t552 = int -> int -> int + type t553 = int -> int -> int + type t554 = int -> int -> int + type t555 = int -> int -> int + type t556 = int -> int -> int + type t557 = int -> int -> int + type t558 = int -> int -> int + type t559 = int -> int -> int + type t560 = int -> int -> int + type t561 = int -> int -> int + type t562 = int -> int -> int + type t563 = int -> int -> int + type t564 = int -> int -> int + type t565 = int -> int -> int + type t566 = int -> int -> int + type t567 = int -> int -> int + type t568 = int -> int -> int + type t569 = int -> int -> int + type t570 = int -> int -> int + type t571 = int -> int -> int + type t572 = int -> int -> int + type t573 = int -> int -> int + type t574 = int -> int -> int + type t575 = int -> int -> int + type t576 = int -> int -> int + type t577 = int -> int -> int + type t578 = int -> int -> int + type t579 = int -> int -> int + type t580 = int -> int -> int + type t581 = int -> int -> int + type t582 = int -> int -> int + type t583 = int -> int -> int + type t584 = int -> int -> int + type t585 = int -> int -> int + type t586 = int -> int -> int + type t587 = int -> int -> int + type t588 = int -> int -> int + type t589 = int -> int -> int + type t590 = int -> int -> int + type t591 = int -> int -> int + type t592 = int -> int -> int + type t593 = int -> int -> int + type t594 = int -> int -> int + type t595 = int -> int -> int + type t596 = int -> int -> int + type t597 = int -> int -> int + type t598 = int -> int -> int + type t599 = int -> int -> int + type t600 = int -> int -> int + type t601 = int -> int -> int + type t602 = int -> int -> int + type t603 = int -> int -> int + type t604 = int -> int -> int + type t605 = int -> int -> int + type t606 = int -> int -> int + type t607 = int -> int -> int + type t608 = int -> int -> int + type t609 = int -> int -> int + type t610 = int -> int -> int + type t611 = int -> int -> int + type t612 = int -> int -> int + type t613 = int -> int -> int + type t614 = int -> int -> int + type t615 = int -> int -> int + type t616 = int -> int -> int + type t617 = int -> int -> int + type t618 = int -> int -> int + type t619 = int -> int -> int + type t620 = int -> int -> int + type t621 = int -> int -> int + type t622 = int -> int -> int + type t623 = int -> int -> int + type t624 = int -> int -> int + type t625 = int -> int -> int + type t626 = int -> int -> int + type t627 = int -> int -> int + type t628 = int -> int -> int + type t629 = int -> int -> int + type t630 = int -> int -> int + type t631 = int -> int -> int + type t632 = int -> int -> int + type t633 = int -> int -> int + type t634 = int -> int -> int + type t635 = int -> int -> int + type t636 = int -> int -> int + type t637 = int -> int -> int + type t638 = int -> int -> int + type t639 = int -> int -> int + type t640 = int -> int -> int + type t641 = int -> int -> int + type t642 = int -> int -> int + type t643 = int -> int -> int + type t644 = int -> int -> int + type t645 = int -> int -> int + type t646 = int -> int -> int + type t647 = int -> int -> int + type t648 = int -> int -> int + type t649 = int -> int -> int + type t650 = int -> int -> int + type t651 = int -> int -> int + type t652 = int -> int -> int + type t653 = int -> int -> int + type t654 = int -> int -> int + type t655 = int -> int -> int + type t656 = int -> int -> int + type t657 = int -> int -> int + type t658 = int -> int -> int + type t659 = int -> int -> int + type t660 = int -> int -> int + type t661 = int -> int -> int + type t662 = int -> int -> int + type t663 = int -> int -> int + type t664 = int -> int -> int + type t665 = int -> int -> int + type t666 = int -> int -> int + type t667 = int -> int -> int + type t668 = int -> int -> int + type t669 = int -> int -> int + type t670 = int -> int -> int + type t671 = int -> int -> int + type t672 = int -> int -> int + type t673 = int -> int -> int + type t674 = int -> int -> int + type t675 = int -> int -> int + type t676 = int -> int -> int + type t677 = int -> int -> int + type t678 = int -> int -> int + type t679 = int -> int -> int + type t680 = int -> int -> int + type t681 = int -> int -> int + type t682 = int -> int -> int + type t683 = int -> int -> int + type t684 = int -> int -> int + type t685 = int -> int -> int + type t686 = int -> int -> int + type t687 = int -> int -> int + type t688 = int -> int -> int + type t689 = int -> int -> int + type t690 = int -> int -> int + type t691 = int -> int -> int + type t692 = int -> int -> int + type t693 = int -> int -> int + type t694 = int -> int -> int + type t695 = int -> int -> int + type t696 = int -> int -> int + type t697 = int -> int -> int + type t698 = int -> int -> int + type t699 = int -> int -> int + type t700 = int -> int -> int + type t701 = int -> int -> int + type t702 = int -> int -> int + type t703 = int -> int -> int + type t704 = int -> int -> int + type t705 = int -> int -> int + type t706 = int -> int -> int + type t707 = int -> int -> int + type t708 = int -> int -> int + type t709 = int -> int -> int + type t710 = int -> int -> int + type t711 = int -> int -> int + type t712 = int -> int -> int + type t713 = int -> int -> int + type t714 = int -> int -> int + type t715 = int -> int -> int + type t716 = int -> int -> int + type t717 = int -> int -> int + type t718 = int -> int -> int + type t719 = int -> int -> int + type t720 = int -> int -> int + type t721 = int -> int -> int + type t722 = int -> int -> int + type t723 = int -> int -> int + type t724 = int -> int -> int + type t725 = int -> int -> int + type t726 = int -> int -> int + type t727 = int -> int -> int + type t728 = int -> int -> int + type t729 = int -> int -> int + type t730 = int -> int -> int + type t731 = int -> int -> int + type t732 = int -> int -> int + type t733 = int -> int -> int + type t734 = int -> int -> int + type t735 = int -> int -> int + type t736 = int -> int -> int + type t737 = int -> int -> int + type t738 = int -> int -> int + type t739 = int -> int -> int + type t740 = int -> int -> int + type t741 = int -> int -> int + type t742 = int -> int -> int + type t743 = int -> int -> int + type t744 = int -> int -> int + type t745 = int -> int -> int + type t746 = int -> int -> int + type t747 = int -> int -> int + type t748 = int -> int -> int + type t749 = int -> int -> int + type t750 = int -> int -> int + type t751 = int -> int -> int + type t752 = int -> int -> int + type t753 = int -> int -> int + type t754 = int -> int -> int + type t755 = int -> int -> int + type t756 = int -> int -> int + type t757 = int -> int -> int + type t758 = int -> int -> int + type t759 = int -> int -> int + type t760 = int -> int -> int + type t761 = int -> int -> int + type t762 = int -> int -> int + type t763 = int -> int -> int + type t764 = int -> int -> int + type t765 = int -> int -> int + type t766 = int -> int -> int + type t767 = int -> int -> int + type t768 = int -> int -> int + type t769 = int -> int -> int + type t770 = int -> int -> int + type t771 = int -> int -> int + type t772 = int -> int -> int + type t773 = int -> int -> int + type t774 = int -> int -> int + type t775 = int -> int -> int + type t776 = int -> int -> int + type t777 = int -> int -> int + type t778 = int -> int -> int + type t779 = int -> int -> int + type t780 = int -> int -> int + type t781 = int -> int -> int + type t782 = int -> int -> int + type t783 = int -> int -> int + type t784 = int -> int -> int + type t785 = int -> int -> int + type t786 = int -> int -> int + type t787 = int -> int -> int + type t788 = int -> int -> int + type t789 = int -> int -> int + type t790 = int -> int -> int + type t791 = int -> int -> int + type t792 = int -> int -> int + type t793 = int -> int -> int + type t794 = int -> int -> int + type t795 = int -> int -> int + type t796 = int -> int -> int + type t797 = int -> int -> int + type t798 = int -> int -> int + type t799 = int -> int -> int + type t800 = int -> int -> int + type t801 = int -> int -> int + type t802 = int -> int -> int + type t803 = int -> int -> int + type t804 = int -> int -> int + type t805 = int -> int -> int + type t806 = int -> int -> int + type t807 = int -> int -> int + type t808 = int -> int -> int + type t809 = int -> int -> int + type t810 = int -> int -> int + type t811 = int -> int -> int + type t812 = int -> int -> int + type t813 = int -> int -> int + type t814 = int -> int -> int + type t815 = int -> int -> int + type t816 = int -> int -> int + type t817 = int -> int -> int + type t818 = int -> int -> int + type t819 = int -> int -> int + type t820 = int -> int -> int + type t821 = int -> int -> int + type t822 = int -> int -> int + type t823 = int -> int -> int + type t824 = int -> int -> int + type t825 = int -> int -> int + type t826 = int -> int -> int + type t827 = int -> int -> int + type t828 = int -> int -> int + type t829 = int -> int -> int + type t830 = int -> int -> int + type t831 = int -> int -> int + type t832 = int -> int -> int + type t833 = int -> int -> int + type t834 = int -> int -> int + type t835 = int -> int -> int + type t836 = int -> int -> int + type t837 = int -> int -> int + type t838 = int -> int -> int + type t839 = int -> int -> int + type t840 = int -> int -> int + type t841 = int -> int -> int + type t842 = int -> int -> int + type t843 = int -> int -> int + type t844 = int -> int -> int + type t845 = int -> int -> int + type t846 = int -> int -> int + type t847 = int -> int -> int + type t848 = int -> int -> int + type t849 = int -> int -> int + type t850 = int -> int -> int + type t851 = int -> int -> int + type t852 = int -> int -> int + type t853 = int -> int -> int + type t854 = int -> int -> int + type t855 = int -> int -> int + type t856 = int -> int -> int + type t857 = int -> int -> int + type t858 = int -> int -> int + type t859 = int -> int -> int + type t860 = int -> int -> int + type t861 = int -> int -> int + type t862 = int -> int -> int + type t863 = int -> int -> int + type t864 = int -> int -> int + type t865 = int -> int -> int + type t866 = int -> int -> int + type t867 = int -> int -> int + type t868 = int -> int -> int + type t869 = int -> int -> int + type t870 = int -> int -> int + type t871 = int -> int -> int + type t872 = int -> int -> int + type t873 = int -> int -> int + type t874 = int -> int -> int + type t875 = int -> int -> int + type t876 = int -> int -> int + type t877 = int -> int -> int + type t878 = int -> int -> int + type t879 = int -> int -> int + type t880 = int -> int -> int + type t881 = int -> int -> int + type t882 = int -> int -> int + type t883 = int -> int -> int + type t884 = int -> int -> int + type t885 = int -> int -> int + type t886 = int -> int -> int + type t887 = int -> int -> int + type t888 = int -> int -> int + type t889 = int -> int -> int + type t890 = int -> int -> int + type t891 = int -> int -> int + type t892 = int -> int -> int + type t893 = int -> int -> int + type t894 = int -> int -> int + type t895 = int -> int -> int + type t896 = int -> int -> int + type t897 = int -> int -> int + type t898 = int -> int -> int + type t899 = int -> int -> int + type t900 = int -> int -> int + type t901 = int -> int -> int + type t902 = int -> int -> int + type t903 = int -> int -> int + type t904 = int -> int -> int + type t905 = int -> int -> int + type t906 = int -> int -> int + type t907 = int -> int -> int + type t908 = int -> int -> int + type t909 = int -> int -> int + type t910 = int -> int -> int + type t911 = int -> int -> int + type t912 = int -> int -> int + type t913 = int -> int -> int + type t914 = int -> int -> int + type t915 = int -> int -> int + type t916 = int -> int -> int + type t917 = int -> int -> int + type t918 = int -> int -> int + type t919 = int -> int -> int + type t920 = int -> int -> int + type t921 = int -> int -> int + type t922 = int -> int -> int + type t923 = int -> int -> int + type t924 = int -> int -> int + type t925 = int -> int -> int + type t926 = int -> int -> int + type t927 = int -> int -> int + type t928 = int -> int -> int + type t929 = int -> int -> int + type t930 = int -> int -> int + type t931 = int -> int -> int + type t932 = int -> int -> int + type t933 = int -> int -> int + type t934 = int -> int -> int + type t935 = int -> int -> int + type t936 = int -> int -> int + type t937 = int -> int -> int + type t938 = int -> int -> int + type t939 = int -> int -> int + type t940 = int -> int -> int + type t941 = int -> int -> int + type t942 = int -> int -> int + type t943 = int -> int -> int + type t944 = int -> int -> int + type t945 = int -> int -> int + type t946 = int -> int -> int + type t947 = int -> int -> int + type t948 = int -> int -> int + type t949 = int -> int -> int + type t950 = int -> int -> int + type t951 = int -> int -> int + type t952 = int -> int -> int + type t953 = int -> int -> int + type t954 = int -> int -> int + type t955 = int -> int -> int + type t956 = int -> int -> int + type t957 = int -> int -> int + type t958 = int -> int -> int + type t959 = int -> int -> int + type t960 = int -> int -> int + type t961 = int -> int -> int + type t962 = int -> int -> int + type t963 = int -> int -> int + type t964 = int -> int -> int + type t965 = int -> int -> int + type t966 = int -> int -> int + type t967 = int -> int -> int + type t968 = int -> int -> int + type t969 = int -> int -> int + type t970 = int -> int -> int + type t971 = int -> int -> int + type t972 = int -> int -> int + type t973 = int -> int -> int + type t974 = int -> int -> int + type t975 = int -> int -> int + type t976 = int -> int -> int + type t977 = int -> int -> int + type t978 = int -> int -> int + type t979 = int -> int -> int + type t980 = int -> int -> int + type t981 = int -> int -> int + type t982 = int -> int -> int + type t983 = int -> int -> int + type t984 = int -> int -> int + type t985 = int -> int -> int + type t986 = int -> int -> int + type t987 = int -> int -> int + type t988 = int -> int -> int + type t989 = int -> int -> int + type t990 = int -> int -> int + type t991 = int -> int -> int + type t992 = int -> int -> int + type t993 = int -> int -> int + type t994 = int -> int -> int + type t995 = int -> int -> int + type t996 = int -> int -> int + type t997 = int -> int -> int + type t998 = int -> int -> int + type t999 = int -> int -> int + type t1000 = int -> int -> int +end + +module X = + Make + (Make + (Make + (Make + (Make + (Make + (Make + (Make + (Make + (Make + (Make + (M))))))))))) diff --git a/camlp4/test/fixtures/functor-perf2.ml b/camlp4/test/fixtures/functor-perf2.ml new file mode 100644 index 00000000..57b8bbad --- /dev/null +++ b/camlp4/test/fixtures/functor-perf2.ml @@ -0,0 +1,29 @@ +<% types, with_constrs, module_application = ARGV.map { |x| x.to_i } %> + +module type S = sig +<%- for i in 0 .. types do -%> + type t<%= i %> +<%- end -%> +end + +module Make (M : S) +: S with type t0 = M.t0 + <%- for i in 1 .. with_constrs do -%> + and type t<%= i %> = M.t<%= i %> + <%- end -%> += struct + include M +end + +module M = struct +<%- for i in 0 .. types do -%> + type t<%= i %> = int -> int -> int +<%- end -%> +end + +module X = + Make +<%- module_application.times do -%> + (Make +<%- end -%> + (M)<%= ')' * module_application %> diff --git a/camlp4/test/fixtures/functor-perf3.ml b/camlp4/test/fixtures/functor-perf3.ml new file mode 100644 index 00000000..5bf5359c --- /dev/null +++ b/camlp4/test/fixtures/functor-perf3.ml @@ -0,0 +1,50 @@ +<% types, with_constrs, make, make2 = ARGV.map { |x| x.to_i } %> + +module type S = sig +<%- for i in 0 .. types do -%> + type t<%= i %> +<%- end -%> +end + +module Make (M : S) +: S with type t0 = M.t0 + <%- for i in 1 .. with_constrs do -%> + and type t<%= i %> = M.t<%= i %> + <%- end -%> += struct + include M +end + +module type S2 = sig + module M : S +end + +module Make2 (M2 : S2) +: S2 with module M = M2.M += struct + include M2 +end + +module M = struct +<%- for i in 0 .. types do -%> + type t<%= i %> = int -> int -> int +<%- end -%> +end + +module M1 = + Make +<%- make.times do -%> + (Make +<%- end -%> + (M)<%= ')' * make %> + +module M2 = struct + module M = M1 +end + +module X = + Make2 +<%- make2.times do -%> + (Make2 +<%- end -%> + (M2)<%= ')' * make2 %> diff --git a/camlp4/test/fixtures/gen_map.ml b/camlp4/test/fixtures/gen_map.ml new file mode 100644 index 00000000..86557520 --- /dev/null +++ b/camlp4/test/fixtures/gen_map.ml @@ -0,0 +1,8 @@ +type t = + A of int * t * t +| B of int list +| C of option t + +module Map = struct + module T = Camlp4Filters.GenerateMap.Generated +end diff --git a/camlp4/test/fixtures/gram-fold.ml b/camlp4/test/fixtures/gram-fold.ml new file mode 100644 index 00000000..5cd53b17 --- /dev/null +++ b/camlp4/test/fixtures/gram-fold.ml @@ -0,0 +1,21 @@ +open Camlp4.PreCast; +module G = MakeGram Lexer; +type t = [ A of t and t | B of string | C ]; +value main = G.Entry.mk "main"; +value rec length x acc = + match x with + [ A x y -> length x (length y acc) + | B _ -> succ acc + | C -> acc ]; +EXTEND G + GLOBAL: main; + main: + [ [ + l = FOLD1 (fun a b -> A (B a) b) (C) ident -> l + ] ]; + ident: + [ [ `LIDENT s -> s ] ]; +END; +let f = Sys.argv.(1) in +Format.printf "%d@." + (length (G.parse main (Loc.mk f) (Stream.of_channel (open_in f))) 0); diff --git a/camlp4/test/fixtures/gram-list.ml b/camlp4/test/fixtures/gram-list.ml new file mode 100644 index 00000000..f3df766e --- /dev/null +++ b/camlp4/test/fixtures/gram-list.ml @@ -0,0 +1,13 @@ +open Camlp4.PreCast; +module G = MakeGram Lexer; +value main = G.Entry.mk "main"; +EXTEND G + GLOBAL: main; + main: + [ [ l = LIST1 ident -> l ] ]; + ident: + [ [ `LIDENT s -> s ] ]; +END; +let f = Sys.argv.(1) in +Format.printf "%d@." + (List.length (G.parse main (Loc.mk f) (Stream.of_channel (open_in f)))); diff --git a/camlp4/test/fixtures/gram-loc-lost.ml b/camlp4/test/fixtures/gram-loc-lost.ml new file mode 100644 index 00000000..38b164e5 --- /dev/null +++ b/camlp4/test/fixtures/gram-loc-lost.ml @@ -0,0 +1,30 @@ +open Camlp4.PreCast; +module G = MakeGram Lexer; +(* type t = [ A of Loc.t and t and t | B of Loc.t and string ]; *) +value main = G.Entry.mk "main"; +(* value rec length x acc = + match x with + [ A x y -> length x (length y acc) + | B _ -> succ acc ]; +value length _ _ = -1; *) +EXTEND G + GLOBAL: main; + main: + [ RIGHTA + [ x = SELF; y = SELF -> + let l = Loc.merge x y in + if l = _loc then _loc + else do { + Format.eprintf "bad loc: %a <> %a + %a@." + Loc.dump _loc Loc.dump x Loc.dump y; + _loc + } + | i = ident -> i ] ]; + ident: + [ [ `LIDENT _ -> _loc ] ]; +END; +try + let f = Sys.argv.(1) in + Format.printf "%a@." + Loc.dump (G.parse main (Loc.mk f) (Stream.of_channel (open_in f))) +with e -> Format.eprintf "error: %a@." Camlp4.ErrorHandler.print e; diff --git a/camlp4/test/fixtures/gram-sub-rule.ml b/camlp4/test/fixtures/gram-sub-rule.ml new file mode 100644 index 00000000..4066caee --- /dev/null +++ b/camlp4/test/fixtures/gram-sub-rule.ml @@ -0,0 +1,33 @@ +open Camlp4.PreCast.Syntax; + +value mo _loc = + fun + [ None -> <:expr< None >> + | Some e -> <:expr< Some $e$ >> ]; + +EXTEND Gram +GLOBAL: expr; +expr: + [ [ "testbegin"; + lb = [ "("; l = LIST0 a_LIDENT SEP ","; ")" -> l | "()" -> [] ]; + b = bar; + "testend" -> + let e = + List.fold_right (fun i acc -> <:expr< [ $lid:i$ :: $acc$ ] >>) lb <:expr< [] >> + in <:expr< ($e$, $b$) >> + ] ]; +bar: + [ [ x = OPT [ o = OPT [ x = "testb" -> + <:expr< $str:Token.extract_string x$ >> ]; "testc"; b = baz -> + <:expr< ($mo _loc o$, $b$) >> ] -> mo _loc x + ] ]; +(* bar: + [ [ o = OPT [ o = OPT [ "bar" -> <:expr< bar >> ]; b = baz -> <:expr< ($mo _loc o$, $b$) >> ] -> + mo _loc o + ] ]; *) +(* bar: + [ [ o = OPT [ "bar" -> <:expr< bar >> ]; b = baz -> <:expr< ($mo _loc o$, $b$) >> + ] ]; *) +baz: + [ [ "baz" -> <:expr< baz >> ] ]; +END; diff --git a/camlp4/test/fixtures/gram-tree.ml b/camlp4/test/fixtures/gram-tree.ml new file mode 100644 index 00000000..ec1dd05d --- /dev/null +++ b/camlp4/test/fixtures/gram-tree.ml @@ -0,0 +1,22 @@ +open Camlp4.PreCast; +module G = MakeGram Lexer; +type t = [ A of t and t | B of string ]; +value main = G.Entry.mk "main"; +(* value rec length x acc = + match x with + [ A x y -> length x (length y acc) + | B _ -> succ acc ]; *) +value length _ _ = -1; +EXTEND G + GLOBAL: main; + main: + [ [ x = SELF; y = SELF -> A x y + | i = ident -> B i ] ]; + ident: + [ [ `LIDENT s -> s ] ]; +END; +try + let f = Sys.argv.(1) in + Format.printf "%d@." + (length (G.parse main (Loc.mk f) (Stream.of_channel (open_in f))) 0) +with e -> Format.eprintf "error: %a@." Camlp4.ErrorHandler.print e; diff --git a/camlp4/test/fixtures/gram-tree2.ml b/camlp4/test/fixtures/gram-tree2.ml new file mode 100644 index 00000000..68f8b0ac --- /dev/null +++ b/camlp4/test/fixtures/gram-tree2.ml @@ -0,0 +1,22 @@ +open Camlp4.PreCast; +module G = MakeGram Lexer; +type t = [ A of t and t | B of string ]; +value main = G.Entry.mk "main"; +(* value rec length x acc = + match x with + [ A x y -> length x (length y acc) + | B _ -> succ acc ]; *) +value length _ _ = -1; +EXTEND G + GLOBAL: main; + main: + [ [ i = ident; x = SELF -> A (B i) x + | i = ident -> B i ] ]; + ident: + [ [ `LIDENT s -> s ] ]; +END; +try + let f = Sys.argv.(1) in + Format.printf "%d@." + (length (G.parse main (Loc.mk f) (Stream.of_channel (open_in f))) 0) +with e -> Format.eprintf "error: %a@." Camlp4.ErrorHandler.print e; diff --git a/camlp4/test/fixtures/gram-tree3.ml b/camlp4/test/fixtures/gram-tree3.ml new file mode 100644 index 00000000..06af8dd2 --- /dev/null +++ b/camlp4/test/fixtures/gram-tree3.ml @@ -0,0 +1,23 @@ +open Camlp4.PreCast; +module G = MakeGram Lexer; +type t = [ A of t and t | B of string ]; +value main = G.Entry.mk "main"; +(* value rec length x acc = + match x with + [ A x y -> length x (length y acc) + | B _ -> succ acc ]; *) +value length _ _ = -1; +EXTEND G + GLOBAL: main; + main: + [ RIGHTA + [ x = SELF; y = SELF -> A x y + | i = ident -> B i ] ]; + ident: + [ [ `LIDENT s -> s ] ]; +END; +try + let f = Sys.argv.(1) in + Format.printf "%d@." + (length (G.parse main (Loc.mk f) (Stream.of_channel (open_in f))) 0) +with e -> Format.eprintf "error: %a@." Camlp4.ErrorHandler.print e; diff --git a/camlp4/test/fixtures/gram.ml b/camlp4/test/fixtures/gram.ml new file mode 100644 index 00000000..6a5f7e34 --- /dev/null +++ b/camlp4/test/fixtures/gram.ml @@ -0,0 +1,2 @@ +EXTEND G expr: [[ l = LIST0 STRING -> l ]]; END; +EXTEND G expr: [[ l = LIST0 [ x = STRING -> x ] -> l ]]; END; diff --git a/camlp4/test/fixtures/idents b/camlp4/test/fixtures/idents new file mode 100644 index 00000000..de414688 --- /dev/null +++ b/camlp4/test/fixtures/idents @@ -0,0 +1,38 @@ +aaa aab aac aad aae aaf aag aah aai aaj aak aal aam aan aao aap aaq aar aas +aat aau aav aaw aax aay aaz aba abb abc abd abe abf abg abh abi abj abk abl +abm abn abo abp abq abr abs abt abu abv abw abx aby abz aca acb acc acd ace +acf acg ach aci acj ack acl acm acn aco acp acq acr acs act acu acv acw acx +acy acz ada adb adc add ade adf adg adh adi adj adk adl adm adn ado adp adq +adr ads adt adu adv adw adx ady adz aea aeb aec aed aee aef aeg aeh aei aej +aek ael aem aen aeo aep aeq aer aes aet aeu aev aew aex aey aez afa afb afc +afd afe aff afg afh afi afj afk afl afm afn afo afp afq afr afs aft afu afv +afw afx afy afz aga agb agc agd age agf agg agh agi agj agk agl agm agn ago +agp agq agr ags agt agu agv agw agx agy agz aha ahb ahc ahd ahe ahf ahg ahh +ahi ahj ahk ahl ahm ahn aho ahp ahq ahr ahs aht ahu ahv ahw ahx ahy ahz aia +aib aic aid aie aif aig aih aii aij aik ail aim ain aio aip aiq air ais ait +aiu aiv aiw aix aiy aiz aja ajb ajc ajd aje ajf ajg ajh aji ajj ajk ajl ajm +ajn ajo ajp ajq ajr ajs ajt aju ajv ajw ajx ajy ajz aka akb akc akd ake akf +akg akh aki akj akk akl akm akn ako akp akq akr aks akt aku akv akw akx aky +akz ala alb alc ald ale alf alg alh ali alj alk all alm aln alo alp alq alr +als alt alu alv alw alx aly alz ama amb amc amd ame amf amg amh ami amj amk +aml amm amn amo amp amq amr ams amt amu amv amw amx amy amz ana anb anc and +ane anf ang anh ani anj ank anl anm ann ano anp anq anr ans ant anu anv anw +anx any anz aoa aob aoc aod aoe aof aog aoh aoi aoj aok aol aom aon aoo aop +aoq aor aos aot aou aov aow aox aoy aoz apa apb apc apd ape apf apg aph api +apj apk apl apm apn apo app apq apr aps apt apu apv apw apx apy apz aqa aqb +aqc aqd aqe aqf aqg aqh aqi aqj aqk aql aqm aqn aqo aqp aqq aqr aqs aqt aqu +aqv aqw aqx aqy aqz ara arb arc ard are arf arg arh ari arj ark arl arm arn +aro arp arq arr ars art aru arv arw arx ary arz asa asb asc asd ase asf asg +ash asi asj ask asl asm asn aso asp asq asr ass ast asu asv asw asx asy asz +ata atb atc atd ate atf atg ath ati atj atk atl atm atn ato atp atq atr ats +att atu atv atw atx aty atz aua aub auc aud aue auf aug auh aui auj auk aul +aum aun auo aup auq aur aus aut auu auv auw aux auy auz ava avb avc avd ave +avf avg avh avi avj avk avl avm avn avo avp avq avr avs avt avu avv avw avx +avy avz awa awb awc awd awe awf awg awh awi awj awk awl awm awn awo awp awq +awr aws awt awu awv aww awx awy awz axa axb axc axd axe axf axg axh axi axj +axk axl axm axn axo axp axq axr axs axt axu axv axw axx axy axz aya ayb ayc +ayd aye ayf ayg ayh ayi ayj ayk ayl aym ayn ayo ayp ayq ayr ays ayt ayu ayv +ayw ayx ayy ayz aza azb azc azd aze azf azg azh azi azj azk azl azm azn azo +azp azq azr azs azt azu azv azw azx azy azz baa bab bac bad bae baf bag bah +bai baj bak bal bam ban bao bap baq bar bas bat bau bav baw bax bay baz bba +bbb diff --git a/camlp4/test/fixtures/idents1 b/camlp4/test/fixtures/idents1 new file mode 100644 index 00000000..5da54402 --- /dev/null +++ b/camlp4/test/fixtures/idents1 @@ -0,0 +1,499 @@ +aaaa aaab aaac aaad aaae aaaf aaag aaah aaai aaaj aaak aaal aaam aaan aaao +aaap aaaq aaar aaas aaat aaau aaav aaaw aaax aaay aaaz aaba aabb aabc aabd +aabe aabf aabg aabh aabi aabj aabk aabl aabm aabn aabo aabp aabq aabr aabs +aabt aabu aabv aabw aabx aaby aabz aaca aacb aacc aacd aace aacf aacg aach +aaci aacj aack aacl aacm aacn aaco aacp aacq aacr aacs aact aacu aacv aacw +aacx aacy aacz aada aadb aadc aadd aade aadf aadg aadh aadi aadj aadk aadl +aadm aadn aado aadp aadq aadr aads aadt aadu aadv aadw aadx aady aadz aaea +aaeb aaec aaed aaee aaef aaeg aaeh aaei aaej aaek aael aaem aaen aaeo aaep +aaeq aaer aaes aaet aaeu aaev aaew aaex aaey aaez aafa aafb aafc aafd aafe +aaff aafg aafh aafi aafj aafk aafl aafm aafn aafo aafp aafq aafr aafs aaft +aafu aafv aafw aafx aafy aafz aaga aagb aagc aagd aage aagf aagg aagh aagi +aagj aagk aagl aagm aagn aago aagp aagq aagr aags aagt aagu aagv aagw aagx +aagy aagz aaha aahb aahc aahd aahe aahf aahg aahh aahi aahj aahk aahl aahm +aahn aaho aahp aahq aahr aahs aaht aahu aahv aahw aahx aahy aahz aaia aaib +aaic aaid aaie aaif aaig aaih aaii aaij aaik aail aaim aain aaio aaip aaiq +aair aais aait aaiu aaiv aaiw aaix aaiy aaiz aaja aajb aajc aajd aaje aajf +aajg aajh aaji aajj aajk aajl aajm aajn aajo aajp aajq aajr aajs aajt aaju +aajv aajw aajx aajy aajz aaka aakb aakc aakd aake aakf aakg aakh aaki aakj +aakk aakl aakm aakn aako aakp aakq aakr aaks aakt aaku aakv aakw aakx aaky +aakz aala aalb aalc aald aale aalf aalg aalh aali aalj aalk aall aalm aaln +aalo aalp aalq aalr aals aalt aalu aalv aalw aalx aaly aalz aama aamb aamc +aamd aame aamf aamg aamh aami aamj aamk aaml aamm aamn aamo aamp aamq aamr +aams aamt aamu aamv aamw aamx aamy aamz aana aanb aanc aand aane aanf aang +aanh aani aanj aank aanl aanm aann aano aanp aanq aanr aans aant aanu aanv +aanw aanx aany aanz aaoa aaob aaoc aaod aaoe aaof aaog aaoh aaoi aaoj aaok +aaol aaom aaon aaoo aaop aaoq aaor aaos aaot aaou aaov aaow aaox aaoy aaoz +aapa aapb aapc aapd aape aapf aapg aaph aapi aapj aapk aapl aapm aapn aapo +aapp aapq aapr aaps aapt aapu aapv aapw aapx aapy aapz aaqa aaqb aaqc aaqd +aaqe aaqf aaqg aaqh aaqi aaqj aaqk aaql aaqm aaqn aaqo aaqp aaqq aaqr aaqs +aaqt aaqu aaqv aaqw aaqx aaqy aaqz aara aarb aarc aard aare aarf aarg aarh +aari aarj aark aarl aarm aarn aaro aarp aarq aarr aars aart aaru aarv aarw +aarx aary aarz aasa aasb aasc aasd aase aasf aasg aash aasi aasj aask aasl +aasm aasn aaso aasp aasq aasr aass aast aasu aasv aasw aasx aasy aasz aata +aatb aatc aatd aate aatf aatg aath aati aatj aatk aatl aatm aatn aato aatp +aatq aatr aats aatt aatu aatv aatw aatx aaty aatz aaua aaub aauc aaud aaue +aauf aaug aauh aaui aauj aauk aaul aaum aaun aauo aaup aauq aaur aaus aaut +aauu aauv aauw aaux aauy aauz aava aavb aavc aavd aave aavf aavg aavh aavi +aavj aavk aavl aavm aavn aavo aavp aavq aavr aavs aavt aavu aavv aavw aavx +aavy aavz aawa aawb aawc aawd aawe aawf aawg aawh aawi aawj aawk aawl aawm +aawn aawo aawp aawq aawr aaws aawt aawu aawv aaww aawx aawy aawz aaxa aaxb +aaxc aaxd aaxe aaxf aaxg aaxh aaxi aaxj aaxk aaxl aaxm aaxn aaxo aaxp aaxq +aaxr aaxs aaxt aaxu aaxv aaxw aaxx aaxy aaxz aaya aayb aayc aayd aaye aayf +aayg aayh aayi aayj aayk aayl aaym aayn aayo aayp aayq aayr aays aayt aayu +aayv aayw aayx aayy aayz aaza aazb aazc aazd aaze aazf aazg aazh aazi aazj +aazk aazl aazm aazn aazo aazp aazq aazr aazs aazt aazu aazv aazw aazx aazy +aazz abaa abab abac abad abae abaf abag abah abai abaj abak abal abam aban +abao abap abaq abar abas abat abau abav abaw abax abay abaz abba abbb abbc +abbd abbe abbf abbg abbh abbi abbj abbk abbl abbm abbn abbo abbp abbq abbr +abbs abbt abbu abbv abbw abbx abby abbz abca abcb abcc abcd abce abcf abcg +abch abci abcj abck abcl abcm abcn abco abcp abcq abcr abcs abct abcu abcv +abcw abcx abcy abcz abda abdb abdc abdd abde abdf abdg abdh abdi abdj abdk +abdl abdm abdn abdo abdp abdq abdr abds abdt abdu abdv abdw abdx abdy abdz +abea abeb abec abed abee abef abeg abeh abei abej abek abel abem aben abeo +abep abeq aber abes abet abeu abev abew abex abey abez abfa abfb abfc abfd +abfe abff abfg abfh abfi abfj abfk abfl abfm abfn abfo abfp abfq abfr abfs +abft abfu abfv abfw abfx abfy abfz abga abgb abgc abgd abge abgf abgg abgh +abgi abgj abgk abgl abgm abgn abgo abgp abgq abgr abgs abgt abgu abgv abgw +abgx abgy abgz abha abhb abhc abhd abhe abhf abhg abhh abhi abhj abhk abhl +abhm abhn abho abhp abhq abhr abhs abht abhu abhv abhw abhx abhy abhz abia +abib abic abid abie abif abig abih abii abij abik abil abim abin abio abip +abiq abir abis abit abiu abiv abiw abix abiy abiz abja abjb abjc abjd abje +abjf abjg abjh abji abjj abjk abjl abjm abjn abjo abjp abjq abjr abjs abjt +abju abjv abjw abjx abjy abjz abka abkb abkc abkd abke abkf abkg abkh abki +abkj abkk abkl abkm abkn abko abkp abkq abkr abks abkt abku abkv abkw abkx +abky abkz abla ablb ablc abld able ablf ablg ablh abli ablj ablk abll ablm +abln ablo ablp ablq ablr abls ablt ablu ablv ablw ablx ably ablz abma abmb +abmc abmd abme abmf abmg abmh abmi abmj abmk abml abmm abmn abmo abmp abmq +abmr abms abmt abmu abmv abmw abmx abmy abmz abna abnb abnc abnd abne abnf +abng abnh abni abnj abnk abnl abnm abnn abno abnp abnq abnr abns abnt abnu +abnv abnw abnx abny abnz aboa abob aboc abod aboe abof abog aboh aboi aboj +abok abol abom abon aboo abop aboq abor abos abot abou abov abow abox aboy +aboz abpa abpb abpc abpd abpe abpf abpg abph abpi abpj abpk abpl abpm abpn +abpo abpp abpq abpr abps abpt abpu abpv abpw abpx abpy abpz abqa abqb abqc +abqd abqe abqf abqg abqh abqi abqj abqk abql abqm abqn abqo abqp abqq abqr +abqs abqt abqu abqv abqw abqx abqy abqz abra abrb abrc abrd abre abrf abrg +abrh abri abrj abrk abrl abrm abrn abro abrp abrq abrr abrs abrt abru abrv +abrw abrx abry abrz absa absb absc absd abse absf absg absh absi absj absk +absl absm absn abso absp absq absr abss abst absu absv absw absx absy absz +abta abtb abtc abtd abte abtf abtg abth abti abtj abtk abtl abtm abtn abto +abtp abtq abtr abts abtt abtu abtv abtw abtx abty abtz abua abub abuc abud +abue abuf abug abuh abui abuj abuk abul abum abun abuo abup abuq abur abus +abut abuu abuv abuw abux abuy abuz abva abvb abvc abvd abve abvf abvg abvh +abvi abvj abvk abvl abvm abvn abvo abvp abvq abvr abvs abvt abvu abvv abvw +abvx abvy abvz abwa abwb abwc abwd abwe abwf abwg abwh abwi abwj abwk abwl +abwm abwn abwo abwp abwq abwr abws abwt abwu abwv abww abwx abwy abwz abxa +abxb abxc abxd abxe abxf abxg abxh abxi abxj abxk abxl abxm abxn abxo abxp +abxq abxr abxs abxt abxu abxv abxw abxx abxy abxz abya abyb abyc abyd abye +abyf abyg abyh abyi abyj abyk abyl abym abyn abyo abyp abyq abyr abys abyt +abyu abyv abyw abyx abyy abyz abza abzb abzc abzd abze abzf abzg abzh abzi +abzj abzk abzl abzm abzn abzo abzp abzq abzr abzs abzt abzu abzv abzw abzx +abzy abzz acaa acab acac acad acae acaf acag acah acai acaj acak acal acam +acan acao acap acaq acar acas acat acau acav acaw acax acay acaz acba acbb +acbc acbd acbe acbf acbg acbh acbi acbj acbk acbl acbm acbn acbo acbp acbq +acbr acbs acbt acbu acbv acbw acbx acby acbz acca accb accc accd acce accf +accg acch acci accj acck accl accm accn acco accp accq accr accs acct accu +accv accw accx accy accz acda acdb acdc acdd acde acdf acdg acdh acdi acdj +acdk acdl acdm acdn acdo acdp acdq acdr acds acdt acdu acdv acdw acdx acdy +acdz acea aceb acec aced acee acef aceg aceh acei acej acek acel acem acen +aceo acep aceq acer aces acet aceu acev acew acex acey acez acfa acfb acfc +acfd acfe acff acfg acfh acfi acfj acfk acfl acfm acfn acfo acfp acfq acfr +acfs acft acfu acfv acfw acfx acfy acfz acga acgb acgc acgd acge acgf acgg +acgh acgi acgj acgk acgl acgm acgn acgo acgp acgq acgr acgs acgt acgu acgv +acgw acgx acgy acgz acha achb achc achd ache achf achg achh achi achj achk +achl achm achn acho achp achq achr achs acht achu achv achw achx achy achz +acia acib acic acid acie acif acig acih acii acij acik acil acim acin acio +acip aciq acir acis acit aciu aciv aciw acix aciy aciz acja acjb acjc acjd +acje acjf acjg acjh acji acjj acjk acjl acjm acjn acjo acjp acjq acjr acjs +acjt acju acjv acjw acjx acjy acjz acka ackb ackc ackd acke ackf ackg ackh +acki ackj ackk ackl ackm ackn acko ackp ackq ackr acks ackt acku ackv ackw +ackx acky ackz acla aclb aclc acld acle aclf aclg aclh acli aclj aclk acll +aclm acln aclo aclp aclq aclr acls aclt aclu aclv aclw aclx acly aclz acma +acmb acmc acmd acme acmf acmg acmh acmi acmj acmk acml acmm acmn acmo acmp +acmq acmr acms acmt acmu acmv acmw acmx acmy acmz acna acnb acnc acnd acne +acnf acng acnh acni acnj acnk acnl acnm acnn acno acnp acnq acnr acns acnt +acnu acnv acnw acnx acny acnz acoa acob acoc acod acoe acof acog acoh acoi +acoj acok acol acom acon acoo acop acoq acor acos acot acou acov acow acox +acoy acoz acpa acpb acpc acpd acpe acpf acpg acph acpi acpj acpk acpl acpm +acpn acpo acpp acpq acpr acps acpt acpu acpv acpw acpx acpy acpz acqa acqb +acqc acqd acqe acqf acqg acqh acqi acqj acqk acql acqm acqn acqo acqp acqq +acqr acqs acqt acqu acqv acqw acqx acqy acqz acra acrb acrc acrd acre acrf +acrg acrh acri acrj acrk acrl acrm acrn acro acrp acrq acrr acrs acrt acru +acrv acrw acrx acry acrz acsa acsb acsc acsd acse acsf acsg acsh acsi acsj +acsk acsl acsm acsn acso acsp acsq acsr acss acst acsu acsv acsw acsx acsy +acsz acta actb actc actd acte actf actg acth acti actj actk actl actm actn +acto actp actq actr acts actt actu actv actw actx acty actz acua acub acuc +acud acue acuf acug acuh acui acuj acuk acul acum acun acuo acup acuq acur +acus acut acuu acuv acuw acux acuy acuz acva acvb acvc acvd acve acvf acvg +acvh acvi acvj acvk acvl acvm acvn acvo acvp acvq acvr acvs acvt acvu acvv +acvw acvx acvy acvz acwa acwb acwc acwd acwe acwf acwg acwh acwi acwj acwk +acwl acwm acwn acwo acwp acwq acwr acws acwt acwu acwv acww acwx acwy acwz +acxa acxb acxc acxd acxe acxf acxg acxh acxi acxj acxk acxl acxm acxn acxo +acxp acxq acxr acxs acxt acxu acxv acxw acxx acxy acxz acya acyb acyc acyd +acye acyf acyg acyh acyi acyj acyk acyl acym acyn acyo acyp acyq acyr acys +acyt acyu acyv acyw acyx acyy acyz acza aczb aczc aczd acze aczf aczg aczh +aczi aczj aczk aczl aczm aczn aczo aczp aczq aczr aczs aczt aczu aczv aczw +aczx aczy aczz adaa adab adac adad adae adaf adag adah adai adaj adak adal +adam adan adao adap adaq adar adas adat adau adav adaw adax aday adaz adba +adbb adbc adbd adbe adbf adbg adbh adbi adbj adbk adbl adbm adbn adbo adbp +adbq adbr adbs adbt adbu adbv adbw adbx adby adbz adca adcb adcc adcd adce +adcf adcg adch adci adcj adck adcl adcm adcn adco adcp adcq adcr adcs adct +adcu adcv adcw adcx adcy adcz adda addb addc addd adde addf addg addh addi +addj addk addl addm addn addo addp addq addr adds addt addu addv addw addx +addy addz adea adeb adec aded adee adef adeg adeh adei adej adek adel adem +aden adeo adep adeq ader ades adet adeu adev adew adex adey adez adfa adfb +adfc adfd adfe adff adfg adfh adfi adfj adfk adfl adfm adfn adfo adfp adfq +adfr adfs adft adfu adfv adfw adfx adfy adfz adga adgb adgc adgd adge adgf +adgg adgh adgi adgj adgk adgl adgm adgn adgo adgp adgq adgr adgs adgt adgu +adgv adgw adgx adgy adgz adha adhb adhc adhd adhe adhf adhg adhh adhi adhj +adhk adhl adhm adhn adho adhp adhq adhr adhs adht adhu adhv adhw adhx adhy +adhz adia adib adic adid adie adif adig adih adii adij adik adil adim adin +adio adip adiq adir adis adit adiu adiv adiw adix adiy adiz adja adjb adjc +adjd adje adjf adjg adjh adji adjj adjk adjl adjm adjn adjo adjp adjq adjr +adjs adjt adju adjv adjw adjx adjy adjz adka adkb adkc adkd adke adkf adkg +adkh adki adkj adkk adkl adkm adkn adko adkp adkq adkr adks adkt adku adkv +adkw adkx adky adkz adla adlb adlc adld adle adlf adlg adlh adli adlj adlk +adll adlm adln adlo adlp adlq adlr adls adlt adlu adlv adlw adlx adly adlz +adma admb admc admd adme admf admg admh admi admj admk adml admm admn admo +admp admq admr adms admt admu admv admw admx admy admz adna adnb adnc adnd +adne adnf adng adnh adni adnj adnk adnl adnm adnn adno adnp adnq adnr adns +adnt adnu adnv adnw adnx adny adnz adoa adob adoc adod adoe adof adog adoh +adoi adoj adok adol adom adon adoo adop adoq ador ados adot adou adov adow +adox adoy adoz adpa adpb adpc adpd adpe adpf adpg adph adpi adpj adpk adpl +adpm adpn adpo adpp adpq adpr adps adpt adpu adpv adpw adpx adpy adpz adqa +adqb adqc adqd adqe adqf adqg adqh adqi adqj adqk adql adqm adqn adqo adqp +adqq adqr adqs adqt adqu adqv adqw adqx adqy adqz adra adrb adrc adrd adre +adrf adrg adrh adri adrj adrk adrl adrm adrn adro adrp adrq adrr adrs adrt +adru adrv adrw adrx adry adrz adsa adsb adsc adsd adse adsf adsg adsh adsi +adsj adsk adsl adsm adsn adso adsp adsq adsr adss adst adsu adsv adsw adsx +adsy adsz adta adtb adtc adtd adte adtf adtg adth adti adtj adtk adtl adtm +adtn adto adtp adtq adtr adts adtt adtu adtv adtw adtx adty adtz adua adub +aduc adud adue aduf adug aduh adui aduj aduk adul adum adun aduo adup aduq +adur adus adut aduu aduv aduw adux aduy aduz adva advb advc advd adve advf +advg advh advi advj advk advl advm advn advo advp advq advr advs advt advu +advv advw advx advy advz adwa adwb adwc adwd adwe adwf adwg adwh adwi adwj +adwk adwl adwm adwn adwo adwp adwq adwr adws adwt adwu adwv adww adwx adwy +adwz adxa adxb adxc adxd adxe adxf adxg adxh adxi adxj adxk adxl adxm adxn +adxo adxp adxq adxr adxs adxt adxu adxv adxw adxx adxy adxz adya adyb adyc +adyd adye adyf adyg adyh adyi adyj adyk adyl adym adyn adyo adyp adyq adyr +adys adyt adyu adyv adyw adyx adyy adyz adza adzb adzc adzd adze adzf adzg +adzh adzi adzj adzk adzl adzm adzn adzo adzp adzq adzr adzs adzt adzu adzv +adzw adzx adzy adzz aeaa aeab aeac aead aeae aeaf aeag aeah aeai aeaj aeak +aeal aeam aean aeao aeap aeaq aear aeas aeat aeau aeav aeaw aeax aeay aeaz +aeba aebb aebc aebd aebe aebf aebg aebh aebi aebj aebk aebl aebm aebn aebo +aebp aebq aebr aebs aebt aebu aebv aebw aebx aeby aebz aeca aecb aecc aecd +aece aecf aecg aech aeci aecj aeck aecl aecm aecn aeco aecp aecq aecr aecs +aect aecu aecv aecw aecx aecy aecz aeda aedb aedc aedd aede aedf aedg aedh +aedi aedj aedk aedl aedm aedn aedo aedp aedq aedr aeds aedt aedu aedv aedw +aedx aedy aedz aeea aeeb aeec aeed aeee aeef aeeg aeeh aeei aeej aeek aeel +aeem aeen aeeo aeep aeeq aeer aees aeet aeeu aeev aeew aeex aeey aeez aefa +aefb aefc aefd aefe aeff aefg aefh aefi aefj aefk aefl aefm aefn aefo aefp +aefq aefr aefs aeft aefu aefv aefw aefx aefy aefz aega aegb aegc aegd aege +aegf aegg aegh aegi aegj aegk aegl aegm aegn aego aegp aegq aegr aegs aegt +aegu aegv aegw aegx aegy aegz aeha aehb aehc aehd aehe aehf aehg aehh aehi +aehj aehk aehl aehm aehn aeho aehp aehq aehr aehs aeht aehu aehv aehw aehx +aehy aehz aeia aeib aeic aeid aeie aeif aeig aeih aeii aeij aeik aeil aeim +aein aeio aeip aeiq aeir aeis aeit aeiu aeiv aeiw aeix aeiy aeiz aeja aejb +aejc aejd aeje aejf aejg aejh aeji aejj aejk aejl aejm aejn aejo aejp aejq +aejr aejs aejt aeju aejv aejw aejx aejy aejz aeka aekb aekc aekd aeke aekf +aekg aekh aeki aekj aekk aekl aekm aekn aeko aekp aekq aekr aeks aekt aeku +aekv aekw aekx aeky aekz aela aelb aelc aeld aele aelf aelg aelh aeli aelj +aelk aell aelm aeln aelo aelp aelq aelr aels aelt aelu aelv aelw aelx aely +aelz aema aemb aemc aemd aeme aemf aemg aemh aemi aemj aemk aeml aemm aemn +aemo aemp aemq aemr aems aemt aemu aemv aemw aemx aemy aemz aena aenb aenc +aend aene aenf aeng aenh aeni aenj aenk aenl aenm aenn aeno aenp aenq aenr +aens aent aenu aenv aenw aenx aeny aenz aeoa aeob aeoc aeod aeoe aeof aeog +aeoh aeoi aeoj aeok aeol aeom aeon aeoo aeop aeoq aeor aeos aeot aeou aeov +aeow aeox aeoy aeoz aepa aepb aepc aepd aepe aepf aepg aeph aepi aepj aepk +aepl aepm aepn aepo aepp aepq aepr aeps aept aepu aepv aepw aepx aepy aepz +aeqa aeqb aeqc aeqd aeqe aeqf aeqg aeqh aeqi aeqj aeqk aeql aeqm aeqn aeqo +aeqp aeqq aeqr aeqs aeqt aequ aeqv aeqw aeqx aeqy aeqz aera aerb aerc aerd +aere aerf aerg aerh aeri aerj aerk aerl aerm aern aero aerp aerq aerr aers +aert aeru aerv aerw aerx aery aerz aesa aesb aesc aesd aese aesf aesg aesh +aesi aesj aesk aesl aesm aesn aeso aesp aesq aesr aess aest aesu aesv aesw +aesx aesy aesz aeta aetb aetc aetd aete aetf aetg aeth aeti aetj aetk aetl +aetm aetn aeto aetp aetq aetr aets aett aetu aetv aetw aetx aety aetz aeua +aeub aeuc aeud aeue aeuf aeug aeuh aeui aeuj aeuk aeul aeum aeun aeuo aeup +aeuq aeur aeus aeut aeuu aeuv aeuw aeux aeuy aeuz aeva aevb aevc aevd aeve +aevf aevg aevh aevi aevj aevk aevl aevm aevn aevo aevp aevq aevr aevs aevt +aevu aevv aevw aevx aevy aevz aewa aewb aewc aewd aewe aewf aewg aewh aewi +aewj aewk aewl aewm aewn aewo aewp aewq aewr aews aewt aewu aewv aeww aewx +aewy aewz aexa aexb aexc aexd aexe aexf aexg aexh aexi aexj aexk aexl aexm +aexn aexo aexp aexq aexr aexs aext aexu aexv aexw aexx aexy aexz aeya aeyb +aeyc aeyd aeye aeyf aeyg aeyh aeyi aeyj aeyk aeyl aeym aeyn aeyo aeyp aeyq +aeyr aeys aeyt aeyu aeyv aeyw aeyx aeyy aeyz aeza aezb aezc aezd aeze aezf +aezg aezh aezi aezj aezk aezl aezm aezn aezo aezp aezq aezr aezs aezt aezu +aezv aezw aezx aezy aezz afaa afab afac afad afae afaf afag afah afai afaj +afak afal afam afan afao afap afaq afar afas afat afau afav afaw afax afay +afaz afba afbb afbc afbd afbe afbf afbg afbh afbi afbj afbk afbl afbm afbn +afbo afbp afbq afbr afbs afbt afbu afbv afbw afbx afby afbz afca afcb afcc +afcd afce afcf afcg afch afci afcj afck afcl afcm afcn afco afcp afcq afcr +afcs afct afcu afcv afcw afcx afcy afcz afda afdb afdc afdd afde afdf afdg +afdh afdi afdj afdk afdl afdm afdn afdo afdp afdq afdr afds afdt afdu afdv +afdw afdx afdy afdz afea afeb afec afed afee afef afeg afeh afei afej afek +afel afem afen afeo afep afeq afer afes afet afeu afev afew afex afey afez +affa affb affc affd affe afff affg affh affi affj affk affl affm affn affo +affp affq affr affs afft affu affv affw affx affy affz afga afgb afgc afgd +afge afgf afgg afgh afgi afgj afgk afgl afgm afgn afgo afgp afgq afgr afgs +afgt afgu afgv afgw afgx afgy afgz afha afhb afhc afhd afhe afhf afhg afhh +afhi afhj afhk afhl afhm afhn afho afhp afhq afhr afhs afht afhu afhv afhw +afhx afhy afhz afia afib afic afid afie afif afig afih afii afij afik afil +afim afin afio afip afiq afir afis afit afiu afiv afiw afix afiy afiz afja +afjb afjc afjd afje afjf afjg afjh afji afjj afjk afjl afjm afjn afjo afjp +afjq afjr afjs afjt afju afjv afjw afjx afjy afjz afka afkb afkc afkd afke +afkf afkg afkh afki afkj afkk afkl afkm afkn afko afkp afkq afkr afks afkt +afku afkv afkw afkx afky afkz afla aflb aflc afld afle aflf aflg aflh afli +aflj aflk afll aflm afln aflo aflp aflq aflr afls aflt aflu aflv aflw aflx +afly aflz afma afmb afmc afmd afme afmf afmg afmh afmi afmj afmk afml afmm +afmn afmo afmp afmq afmr afms afmt afmu afmv afmw afmx afmy afmz afna afnb +afnc afnd afne afnf afng afnh afni afnj afnk afnl afnm afnn afno afnp afnq +afnr afns afnt afnu afnv afnw afnx afny afnz afoa afob afoc afod afoe afof +afog afoh afoi afoj afok afol afom afon afoo afop afoq afor afos afot afou +afov afow afox afoy afoz afpa afpb afpc afpd afpe afpf afpg afph afpi afpj +afpk afpl afpm afpn afpo afpp afpq afpr afps afpt afpu afpv afpw afpx afpy +afpz afqa afqb afqc afqd afqe afqf afqg afqh afqi afqj afqk afql afqm afqn +afqo afqp afqq afqr afqs afqt afqu afqv afqw afqx afqy afqz afra afrb afrc +afrd afre afrf afrg afrh afri afrj afrk afrl afrm afrn afro afrp afrq afrr +afrs afrt afru afrv afrw afrx afry afrz afsa afsb afsc afsd afse afsf afsg +afsh afsi afsj afsk afsl afsm afsn afso afsp afsq afsr afss afst afsu afsv +afsw afsx afsy afsz afta aftb aftc aftd afte aftf aftg afth afti aftj aftk +aftl aftm aftn afto aftp aftq aftr afts aftt aftu aftv aftw aftx afty aftz +afua afub afuc afud afue afuf afug afuh afui afuj afuk aful afum afun afuo +afup afuq afur afus afut afuu afuv afuw afux afuy afuz afva afvb afvc afvd +afve afvf afvg afvh afvi afvj afvk afvl afvm afvn afvo afvp afvq afvr afvs +afvt afvu afvv afvw afvx afvy afvz afwa afwb afwc afwd afwe afwf afwg afwh +afwi afwj afwk afwl afwm afwn afwo afwp afwq afwr afws afwt afwu afwv afww +afwx afwy afwz afxa afxb afxc afxd afxe afxf afxg afxh afxi afxj afxk afxl +afxm afxn afxo afxp afxq afxr afxs afxt afxu afxv afxw afxx afxy afxz afya +afyb afyc afyd afye afyf afyg afyh afyi afyj afyk afyl afym afyn afyo afyp +afyq afyr afys afyt afyu afyv afyw afyx afyy afyz afza afzb afzc afzd afze +afzf afzg afzh afzi afzj afzk afzl afzm afzn afzo afzp afzq afzr afzs afzt +afzu afzv afzw afzx afzy afzz agaa agab agac agad agae agaf agag agah agai +agaj agak agal agam agan agao agap agaq agar agas agat agau agav agaw agax +agay agaz agba agbb agbc agbd agbe agbf agbg agbh agbi agbj agbk agbl agbm +agbn agbo agbp agbq agbr agbs agbt agbu agbv agbw agbx agby agbz agca agcb +agcc agcd agce agcf agcg agch agci agcj agck agcl agcm agcn agco agcp agcq +agcr agcs agct agcu agcv agcw agcx agcy agcz agda agdb agdc agdd agde agdf +agdg agdh agdi agdj agdk agdl agdm agdn agdo agdp agdq agdr agds agdt agdu +agdv agdw agdx agdy agdz agea ageb agec aged agee agef ageg ageh agei agej +agek agel agem agen ageo agep ageq ager ages aget ageu agev agew agex agey +agez agfa agfb agfc agfd agfe agff agfg agfh agfi agfj agfk agfl agfm agfn +agfo agfp agfq agfr agfs agft agfu agfv agfw agfx agfy agfz agga aggb aggc +aggd agge aggf aggg aggh aggi aggj aggk aggl aggm aggn aggo aggp aggq aggr +aggs aggt aggu aggv aggw aggx aggy aggz agha aghb aghc aghd aghe aghf aghg +aghh aghi aghj aghk aghl aghm aghn agho aghp aghq aghr aghs aght aghu aghv +aghw aghx aghy aghz agia agib agic agid agie agif agig agih agii agij agik +agil agim agin agio agip agiq agir agis agit agiu agiv agiw agix agiy agiz +agja agjb agjc agjd agje agjf agjg agjh agji agjj agjk agjl agjm agjn agjo +agjp agjq agjr agjs agjt agju agjv agjw agjx agjy agjz agka agkb agkc agkd +agke agkf agkg agkh agki agkj agkk agkl agkm agkn agko agkp agkq agkr agks +agkt agku agkv agkw agkx agky agkz agla aglb aglc agld agle aglf aglg aglh +agli aglj aglk agll aglm agln aglo aglp aglq aglr agls aglt aglu aglv aglw +aglx agly aglz agma agmb agmc agmd agme agmf agmg agmh agmi agmj agmk agml +agmm agmn agmo agmp agmq agmr agms agmt agmu agmv agmw agmx agmy agmz agna +agnb agnc agnd agne agnf agng agnh agni agnj agnk agnl agnm agnn agno agnp +agnq agnr agns agnt agnu agnv agnw agnx agny agnz agoa agob agoc agod agoe +agof agog agoh agoi agoj agok agol agom agon agoo agop agoq agor agos agot +agou agov agow agox agoy agoz agpa agpb agpc agpd agpe agpf agpg agph agpi +agpj agpk agpl agpm agpn agpo agpp agpq agpr agps agpt agpu agpv agpw agpx +agpy agpz agqa agqb agqc agqd agqe agqf agqg agqh agqi agqj agqk agql agqm +agqn agqo agqp agqq agqr agqs agqt agqu agqv agqw agqx agqy agqz agra agrb +agrc agrd agre agrf agrg agrh agri agrj agrk agrl agrm agrn agro agrp agrq +agrr agrs agrt agru agrv agrw agrx agry agrz agsa agsb agsc agsd agse agsf +agsg agsh agsi agsj agsk agsl agsm agsn agso agsp agsq agsr agss agst agsu +agsv agsw agsx agsy agsz agta agtb agtc agtd agte agtf agtg agth agti agtj +agtk agtl agtm agtn agto agtp agtq agtr agts agtt agtu agtv agtw agtx agty +agtz agua agub aguc agud ague aguf agug aguh agui aguj aguk agul agum agun +aguo agup aguq agur agus agut aguu aguv aguw agux aguy aguz agva agvb agvc +agvd agve agvf agvg agvh agvi agvj agvk agvl agvm agvn agvo agvp agvq agvr +agvs agvt agvu agvv agvw agvx agvy agvz agwa agwb agwc agwd agwe agwf agwg +agwh agwi agwj agwk agwl agwm agwn agwo agwp agwq agwr agws agwt agwu agwv +agww agwx agwy agwz agxa agxb agxc agxd agxe agxf agxg agxh agxi agxj agxk +agxl agxm agxn agxo agxp agxq agxr agxs agxt agxu agxv agxw agxx agxy agxz +agya agyb agyc agyd agye agyf agyg agyh agyi agyj agyk agyl agym agyn agyo +agyp agyq agyr agys agyt agyu agyv agyw agyx agyy agyz agza agzb agzc agzd +agze agzf agzg agzh agzi agzj agzk agzl agzm agzn agzo agzp agzq agzr agzs +agzt agzu agzv agzw agzx agzy agzz ahaa ahab ahac ahad ahae ahaf ahag ahah +ahai ahaj ahak ahal aham ahan ahao ahap ahaq ahar ahas ahat ahau ahav ahaw +ahax ahay ahaz ahba ahbb ahbc ahbd ahbe ahbf ahbg ahbh ahbi ahbj ahbk ahbl +ahbm ahbn ahbo ahbp ahbq ahbr ahbs ahbt ahbu ahbv ahbw ahbx ahby ahbz ahca +ahcb ahcc ahcd ahce ahcf ahcg ahch ahci ahcj ahck ahcl ahcm ahcn ahco ahcp +ahcq ahcr ahcs ahct ahcu ahcv ahcw ahcx ahcy ahcz ahda ahdb ahdc ahdd ahde +ahdf ahdg ahdh ahdi ahdj ahdk ahdl ahdm ahdn ahdo ahdp ahdq ahdr ahds ahdt +ahdu ahdv ahdw ahdx ahdy ahdz ahea aheb ahec ahed ahee ahef aheg aheh ahei +ahej ahek ahel ahem ahen aheo ahep aheq aher ahes ahet aheu ahev ahew ahex +ahey ahez ahfa ahfb ahfc ahfd ahfe ahff ahfg ahfh ahfi ahfj ahfk ahfl ahfm +ahfn ahfo ahfp ahfq ahfr ahfs ahft ahfu ahfv ahfw ahfx ahfy ahfz ahga ahgb +ahgc ahgd ahge ahgf ahgg ahgh ahgi ahgj ahgk ahgl ahgm ahgn ahgo ahgp ahgq +ahgr ahgs ahgt ahgu ahgv ahgw ahgx ahgy ahgz ahha ahhb ahhc ahhd ahhe ahhf +ahhg ahhh ahhi ahhj ahhk ahhl ahhm ahhn ahho ahhp ahhq ahhr ahhs ahht ahhu +ahhv ahhw ahhx ahhy ahhz ahia ahib ahic ahid ahie ahif ahig ahih ahii ahij +ahik ahil ahim ahin ahio ahip ahiq ahir ahis ahit ahiu ahiv ahiw ahix ahiy +ahiz ahja ahjb ahjc ahjd ahje ahjf ahjg ahjh ahji ahjj ahjk ahjl ahjm ahjn +ahjo ahjp ahjq ahjr ahjs ahjt ahju ahjv ahjw ahjx ahjy ahjz ahka ahkb ahkc +ahkd ahke ahkf ahkg ahkh ahki ahkj ahkk ahkl ahkm ahkn ahko ahkp ahkq ahkr +ahks ahkt ahku ahkv ahkw ahkx ahky ahkz ahla ahlb ahlc ahld ahle ahlf ahlg +ahlh ahli ahlj ahlk ahll ahlm ahln ahlo ahlp ahlq ahlr ahls ahlt ahlu ahlv +ahlw ahlx ahly ahlz ahma ahmb ahmc ahmd ahme ahmf ahmg ahmh ahmi ahmj ahmk +ahml ahmm ahmn ahmo ahmp ahmq ahmr ahms ahmt ahmu ahmv ahmw ahmx ahmy ahmz +ahna ahnb ahnc ahnd ahne ahnf ahng ahnh ahni ahnj ahnk ahnl ahnm ahnn ahno +ahnp ahnq ahnr ahns ahnt ahnu ahnv ahnw ahnx ahny ahnz ahoa ahob ahoc ahod +ahoe ahof ahog ahoh ahoi ahoj ahok ahol ahom ahon ahoo ahop ahoq ahor ahos +ahot ahou ahov ahow ahox ahoy ahoz ahpa ahpb ahpc ahpd ahpe ahpf ahpg ahph +ahpi ahpj ahpk ahpl ahpm ahpn ahpo ahpp ahpq ahpr ahps ahpt ahpu ahpv ahpw +ahpx ahpy ahpz ahqa ahqb ahqc ahqd ahqe ahqf ahqg ahqh ahqi ahqj ahqk ahql +ahqm ahqn ahqo ahqp ahqq ahqr ahqs ahqt ahqu ahqv ahqw ahqx ahqy ahqz ahra +ahrb ahrc ahrd ahre ahrf ahrg ahrh ahri ahrj ahrk ahrl ahrm ahrn ahro ahrp +ahrq ahrr ahrs ahrt ahru ahrv ahrw ahrx ahry ahrz ahsa ahsb ahsc ahsd ahse +ahsf ahsg ahsh ahsi ahsj ahsk ahsl ahsm ahsn ahso ahsp ahsq ahsr ahss ahst +ahsu ahsv ahsw ahsx ahsy ahsz ahta ahtb ahtc ahtd ahte ahtf ahtg ahth ahti +ahtj ahtk ahtl ahtm ahtn ahto ahtp ahtq ahtr ahts ahtt ahtu ahtv ahtw ahtx +ahty ahtz ahua ahub ahuc ahud ahue ahuf ahug ahuh ahui ahuj ahuk ahul ahum +ahun ahuo ahup ahuq ahur ahus ahut ahuu ahuv ahuw ahux ahuy ahuz ahva ahvb +ahvc ahvd ahve ahvf ahvg ahvh ahvi ahvj ahvk ahvl ahvm ahvn ahvo ahvp ahvq +ahvr ahvs ahvt ahvu ahvv ahvw ahvx ahvy ahvz ahwa ahwb ahwc ahwd ahwe ahwf +ahwg ahwh ahwi ahwj ahwk ahwl ahwm ahwn ahwo ahwp ahwq ahwr ahws ahwt ahwu +ahwv ahww ahwx ahwy ahwz ahxa ahxb ahxc ahxd ahxe ahxf ahxg ahxh ahxi ahxj +ahxk ahxl ahxm ahxn ahxo ahxp ahxq ahxr ahxs ahxt ahxu ahxv ahxw ahxx ahxy +ahxz ahya ahyb ahyc ahyd ahye ahyf ahyg ahyh ahyi ahyj ahyk ahyl ahym ahyn +ahyo ahyp ahyq ahyr ahys ahyt ahyu ahyv ahyw ahyx ahyy ahyz ahza ahzb ahzc +ahzd ahze ahzf ahzg ahzh ahzi ahzj ahzk ahzl ahzm ahzn ahzo ahzp ahzq ahzr +ahzs ahzt ahzu ahzv ahzw ahzx ahzy ahzz aiaa aiab aiac aiad aiae aiaf aiag +aiah aiai aiaj aiak aial aiam aian aiao aiap aiaq aiar aias aiat aiau aiav +aiaw aiax aiay aiaz aiba aibb aibc aibd aibe aibf aibg aibh aibi aibj aibk +aibl aibm aibn aibo aibp aibq aibr aibs aibt aibu aibv aibw aibx aiby aibz +aica aicb aicc aicd aice aicf aicg aich aici aicj aick aicl aicm aicn aico +aicp aicq aicr aics aict aicu aicv aicw aicx aicy aicz aida aidb aidc aidd +aide aidf aidg aidh aidi aidj aidk aidl aidm aidn aido aidp aidq aidr aids +aidt aidu aidv aidw aidx aidy aidz aiea aieb aiec aied aiee aief aieg aieh +aiei aiej aiek aiel aiem aien aieo aiep aieq aier aies aiet aieu aiev aiew +aiex aiey aiez aifa aifb aifc aifd aife aiff aifg aifh aifi aifj aifk aifl +aifm aifn aifo aifp aifq aifr aifs aift aifu aifv aifw aifx aify aifz aiga +aigb aigc aigd aige aigf aigg aigh aigi aigj aigk aigl aigm aign aigo aigp +aigq aigr aigs aigt aigu aigv aigw aigx aigy aigz aiha aihb aihc aihd aihe +aihf aihg aihh aihi aihj aihk aihl aihm aihn aiho aihp aihq aihr aihs aiht +aihu aihv aihw aihx aihy aihz aiia aiib aiic aiid aiie aiif aiig aiih aiii +aiij aiik aiil aiim aiin aiio aiip aiiq aiir aiis aiit aiiu aiiv aiiw aiix +aiiy aiiz aija aijb aijc aijd aije aijf aijg aijh aiji aijj aijk aijl aijm +aijn aijo aijp aijq aijr aijs aijt aiju aijv aijw aijx aijy aijz aika aikb +aikc aikd aike aikf aikg aikh aiki aikj aikk aikl aikm aikn aiko aikp aikq +aikr aiks aikt aiku aikv aikw aikx aiky aikz aila ailb ailc aild aile ailf +ailg ailh aili ailj ailk aill ailm ailn ailo ailp ailq ailr ails ailt ailu +ailv ailw ailx aily ailz aima aimb aimc aimd aime aimf aimg aimh aimi aimj +aimk aiml aimm aimn aimo aimp aimq aimr aims aimt aimu aimv aimw aimx aimy +aimz aina ainb ainc aind aine ainf aing ainh aini ainj aink ainl ainm ainn +aino ainp ainq ainr ains aint ainu ainv ainw ainx ainy ainz aioa aiob aioc +aiod aioe aiof aiog aioh aioi aioj aiok aiol aiom aion aioo aiop aioq aior +aios aiot aiou aiov aiow aiox aioy aioz aipa aipb aipc aipd aipe aipf aipg +aiph aipi aipj aipk aipl aipm aipn aipo aipp aipq aipr aips aipt aipu aipv +aipw aipx aipy aipz aiqa aiqb aiqc aiqd aiqe aiqf aiqg aiqh aiqi aiqj aiqk +aiql aiqm aiqn aiqo aiqp aiqq aiqr aiqs aiqt aiqu aiqv aiqw aiqx aiqy aiqz +aira airb airc aird aire airf airg airh airi airj airk airl airm airn airo +airp airq airr airs airt airu airv airw airx airy airz aisa aisb aisc aisd +aise aisf aisg aish aisi aisj aisk aisl aism aisn aiso aisp aisq aisr aiss +aist aisu aisv aisw aisx aisy aisz aita aitb aitc aitd aite aitf aitg aith +aiti aitj aitk aitl aitm aitn aito aitp aitq aitr aits aitt aitu aitv aitw +aitx aity aitz aiua aiub aiuc aiud aiue aiuf aiug aiuh aiui aiuj aiuk aiul +aium aiun aiuo aiup aiuq aiur aius aiut aiuu aiuv aiuw aiux aiuy aiuz aiva +aivb aivc aivd aive aivf aivg aivh aivi aivj aivk aivl aivm aivn aivo aivp +aivq aivr aivs aivt aivu aivv aivw aivx aivy aivz aiwa aiwb aiwc aiwd aiwe +aiwf aiwg aiwh aiwi aiwj aiwk aiwl aiwm aiwn aiwo aiwp aiwq aiwr aiws aiwt +aiwu aiwv aiww aiwx aiwy aiwz aixa aixb aixc aixd aixe aixf aixg aixh aixi +aixj aixk aixl aixm aixn aixo aixp aixq aixr aixs aixt aixu aixv aixw aixx +aixy aixz aiya aiyb aiyc aiyd aiye aiyf aiyg aiyh aiyi aiyj aiyk aiyl aiym +aiyn aiyo aiyp aiyq aiyr aiys aiyt aiyu aiyv aiyw aiyx aiyy aiyz aiza aizb +aizc aizd aize aizf aizg aizh aizi aizj aizk aizl aizm aizn aizo aizp aizq +aizr aizs aizt aizu aizv aizw aizx aizy aizz ajaa ajab ajac ajad ajae ajaf +ajag ajah ajai ajaj ajak ajal ajam ajan ajao ajap ajaq ajar ajas ajat ajau +ajav ajaw ajax ajay ajaz ajba ajbb ajbc ajbd ajbe ajbf ajbg ajbh ajbi ajbj +ajbk ajbl ajbm ajbn ajbo ajbp ajbq ajbr ajbs ajbt ajbu ajbv ajbw ajbx ajby +ajbz ajca ajcb ajcc ajcd ajce ajcf ajcg ajch ajci ajcj ajck ajcl ajcm ajcn +ajco ajcp ajcq ajcr ajcs ajct ajcu ajcv ajcw ajcx ajcy ajcz ajda ajdb ajdc +ajdd ajde ajdf ajdg ajdh ajdi ajdj ajdk ajdl ajdm ajdn ajdo ajdp ajdq ajdr +ajds ajdt ajdu ajdv ajdw ajdx ajdy ajdz ajea ajeb ajec ajed ajee ajef ajeg +ajeh ajei ajej ajek ajel ajem ajen ajeo ajep ajeq ajer ajes ajet ajeu ajev +ajew ajex ajey ajez ajfa ajfb ajfc ajfd ajfe ajff ajfg ajfh ajfi ajfj ajfk +ajfl ajfm ajfn ajfo ajfp ajfq ajfr ajfs ajft ajfu ajfv ajfw ajfx ajfy ajfz +ajga ajgb ajgc ajgd ajge ajgf ajgg ajgh ajgi ajgj ajgk ajgl ajgm ajgn ajgo +ajgp ajgq ajgr ajgs ajgt ajgu ajgv ajgw ajgx ajgy ajgz ajha ajhb ajhc ajhd +ajhe ajhf ajhg ajhh ajhi ajhj ajhk ajhl ajhm ajhn ajho ajhp ajhq ajhr ajhs +ajht ajhu ajhv ajhw ajhx ajhy ajhz ajia ajib ajic ajid ajie ajif ajig ajih +ajii ajij ajik ajil ajim ajin ajio ajip ajiq ajir ajis ajit ajiu ajiv ajiw +ajix ajiy ajiz ajja ajjb ajjc ajjd ajje ajjf ajjg ajjh ajji ajjj ajjk ajjl +ajjm ajjn ajjo ajjp ajjq ajjr ajjs ajjt ajju ajjv ajjw ajjx ajjy ajjz ajka +ajkb ajkc ajkd ajke ajkf ajkg ajkh ajki ajkj ajkk ajkl ajkm ajkn ajko ajkp +ajkq ajkr ajks ajkt ajku ajkv ajkw ajkx ajky ajkz ajla ajlb ajlc ajld ajle +ajlf ajlg ajlh ajli ajlj ajlk ajll ajlm ajln ajlo ajlp ajlq ajlr ajls ajlt +ajlu ajlv ajlw ajlx ajly ajlz ajma ajmb ajmc ajmd ajme ajmf ajmg ajmh ajmi +ajmj ajmk ajml ajmm ajmn ajmo ajmp ajmq ajmr ajms ajmt ajmu ajmv ajmw ajmx +ajmy ajmz ajna ajnb ajnc ajnd ajne ajnf ajng ajnh ajni ajnj ajnk ajnl ajnm +ajnn ajno ajnp ajnq ajnr ajns ajnt ajnu ajnv ajnw ajnx ajny ajnz ajoa ajob +ajoc ajod ajoe ajof ajog ajoh ajoi ajoj ajok ajol ajom ajon ajoo ajop ajoq +ajor ajos ajot ajou ajov ajow ajox ajoy ajoz ajpa ajpb ajpc ajpd ajpe ajpf +ajpg ajph ajpi ajpj ajpk ajpl ajpm ajpn ajpo ajpp ajpq ajpr ajps ajpt ajpu +ajpv ajpw ajpx ajpy ajpz ajqa ajqb ajqc ajqd ajqe ajqf ajqg ajqh ajqi ajqj +ajqk ajql ajqm ajqn ajqo ajqp ajqq ajqr ajqs ajqt ajqu ajqv ajqw ajqx ajqy +ajqz ajra ajrb ajrc ajrd ajre ajrf ajrg ajrh ajri ajrj ajrk ajrl ajrm ajrn +ajro ajrp ajrq ajrr ajrs ajrt ajru ajrv ajrw ajrx ajry ajrz ajsa ajsb ajsc +ajsd ajse ajsf ajsg ajsh ajsi ajsj ajsk ajsl ajsm ajsn ajso ajsp ajsq ajsr +ajss ajst ajsu ajsv ajsw ajsx ajsy ajsz ajta ajtb ajtc ajtd ajte ajtf ajtg +ajth ajti ajtj ajtk ajtl ajtm ajtn ajto ajtp ajtq ajtr ajts ajtt ajtu ajtv +ajtw ajtx ajty ajtz ajua ajub ajuc ajud ajue ajuf ajug ajuh ajui ajuj ajuk +ajul ajum ajun ajuo ajup ajuq ajur ajus ajut ajuu ajuv ajuw ajux ajuy ajuz +ajva ajvb ajvc ajvd ajve ajvf ajvg ajvh ajvi ajvj ajvk ajvl ajvm ajvn ajvo +ajvp ajvq ajvr ajvs ajvt ajvu ajvv ajvw ajvx ajvy ajvz ajwa ajwb ajwc ajwd +ajwe ajwf ajwg ajwh ajwi ajwj ajwk ajwl ajwm ajwn ajwo ajwp ajwq ajwr ajws +ajwt ajwu ajwv ajww ajwx ajwy ajwz ajxa ajxb ajxc ajxd ajxe ajxf ajxg ajxh +ajxi ajxj ajxk ajxl ajxm ajxn ajxo ajxp ajxq ajxr ajxs ajxt ajxu ajxv ajxw +ajxx ajxy ajxz ajya ajyb ajyc ajyd ajye ajyf ajyg ajyh ajyi ajyj ajyk ajyl +ajym ajyn ajyo ajyp ajyq ajyr ajys ajyt ajyu ajyv ajyw ajyx ajyy ajyz ajza +ajzb ajzc ajzd ajze ajzf ajzg ajzh ajzi ajzj ajzk ajzl ajzm ajzn ajzo ajzp +ajzq ajzr ajzs ajzt ajzu ajzv ajzw ajzx ajzy ajzz akaa akab akac akad akae +akaf akag akah akai akaj akak akal akam akan akao akap akaq akar akas akat +akau akav akaw akax akay akaz akba akbb akbc akbd akbe akbf akbg akbh akbi +akbj akbk akbl akbm akbn akbo akbp akbq akbr akbs akbt akbu akbv akbw akbx +akby akbz akca akcb akcc akcd akce akcf akcg akch akci akcj akck akcl akcm +akcn akco akcp akcq akcr akcs akct akcu akcv akcw akcx akcy akcz akda akdb +akdc akdd akde akdf akdg akdh akdi akdj akdk akdl akdm akdn akdo akdp akdq +akdr akds akdt akdu akdv akdw akdx akdy akdz akea akeb akec aked akee akef +akeg akeh akei akej akek akel akem aken akeo akep akeq aker akes aket akeu +akev akew akex akey akez akfa akfb akfc akfd akfe akff akfg akfh akfi akfj +akfk akfl akfm akfn akfo akfp akfq akfr akfs akft akfu akfv akfw akfx akfy +akfz akga akgb akgc akgd akge akgf akgg akgh akgi akgj akgk akgl akgm akgn +akgo akgp akgq akgr akgs akgt akgu akgv akgw akgx akgy akgz akha akhb akhc +akhd akhe akhf akhg akhh akhi akhj akhk akhl akhm akhn akho akhp akhq akhr +akhs akht akhu akhv akhw akhx akhy akhz akia akib akic akid akie akif akig +akih akii akij akik akil akim akin akio akip akiq akir akis akit akiu akiv +akiw akix akiy akiz akja akjb akjc akjd akje akjf akjg akjh akji akjj akjk +akjl akjm akjn akjo akjp akjq akjr akjs akjt akju akjv akjw akjx akjy akjz +akka akkb akkc akkd akke akkf akkg akkh akki akkj akkk akkl akkm akkn akko +akkp akkq akkr akks akkt akku akkv akkw akkx akky akkz akla aklb aklc akld +akle aklf aklg aklh akli aklj aklk akll aklm akln aklo aklp aklq aklr akls +aklt aklu aklv aklw aklx akly aklz akma akmb akmc akmd akme akmf akmg akmh +akmi akmj akmk akml akmm akmn akmo akmp akmq akmr akms akmt akmu akmv akmw +akmx akmy akmz akna aknb aknc aknd akne aknf akng aknh akni aknj aknk aknl +aknm aknn akno aknp aknq aknr akns aknt aknu aknv aknw aknx akny aknz akoa +akob akoc akod akoe akof akog akoh akoi akoj akok akol akom akon akoo akop +akoq akor akos akot akou akov akow akox akoy akoz akpa akpb akpc akpd akpe +akpf akpg akph akpi akpj akpk akpl akpm akpn akpo akpp akpq akpr akps akpt +akpu akpv akpw akpx akpy akpz akqa akqb akqc akqd akqe akqf akqg akqh akqi +akqj akqk akql akqm akqn akqo akqp akqq akqr akqs akqt akqu akqv akqw akqx +akqy akqz akra akrb akrc akrd akre akrf akrg akrh akri akrj akrk akrl akrm +akrn akro akrp akrq akrr akrs akrt akru akrv akrw akrx akry akrz aksa aksb +aksc aksd akse aksf aksg aksh aksi aksj aksk aksl aksm aksn akso aksp aksq +aksr akss akst aksu aksv aksw aksx aksy aksz akta aktb aktc aktd akte aktf +aktg akth akti aktj aktk aktl aktm aktn akto aktp aktq aktr akts aktt aktu +aktv aktw aktx akty aktz akua akub akuc akud akue akuf akug akuh akui akuj +akuk akul akum akun akuo akup akuq akur akus akut akuu akuv akuw akux akuy +akuz akva akvb akvc akvd akve akvf akvg akvh akvi akvj akvk akvl akvm akvn +akvo akvp akvq akvr akvs akvt akvu akvv akvw akvx akvy akvz akwa akwb akwc +akwd akwe akwf akwg akwh akwi akwj akwk akwl akwm akwn akwo akwp akwq akwr +akws akwt akwu akwv akww akwx akwy akwz akxa akxb akxc akxd akxe akxf akxg +akxh akxi akxj akxk akxl akxm akxn akxo akxp akxq akxr akxs akxt akxu akxv +akxw akxx akxy akxz akya akyb akyc akyd akye akyf akyg akyh akyi akyj akyk +akyl akym akyn akyo akyp akyq akyr akys akyt akyu akyv akyw akyx akyy akyz +akza akzb akzc akzd akze akzf akzg akzh akzi akzj akzk akzl akzm akzn akzo +akzp akzq akzr akzs akzt akzu akzv akzw akzx akzy akzz alaa alab alac alad +alae alaf alag alah alai alaj alak alal alam alan alao alap alaq alar alas +alat alau alav alaw alax alay alaz alba albb albc albd albe albf albg albh +albi albj albk albl albm albn albo albp albq albr albs albt albu albv albw diff --git a/camlp4/test/fixtures/idents2 b/camlp4/test/fixtures/idents2 new file mode 100644 index 00000000..ef07f3e1 --- /dev/null +++ b/camlp4/test/fixtures/idents2 @@ -0,0 +1,1219 @@ +aaaa aaab aaac aaad aaae aaaf aaag aaah aaai aaaj aaak aaal aaam aaan aaao +aaap aaaq aaar aaas aaat aaau aaav aaaw aaax aaay aaaz aaba aabb aabc aabd +aabe aabf aabg aabh aabi aabj aabk aabl aabm aabn aabo aabp aabq aabr aabs +aabt aabu aabv aabw aabx aaby aabz aaca aacb aacc aacd aace aacf aacg aach +aaci aacj aack aacl aacm aacn aaco aacp aacq aacr aacs aact aacu aacv aacw +aacx aacy aacz aada aadb aadc aadd aade aadf aadg aadh aadi aadj aadk aadl +aadm aadn aado aadp aadq aadr aads aadt aadu aadv aadw aadx aady aadz aaea +aaeb aaec aaed aaee aaef aaeg aaeh aaei aaej aaek aael aaem aaen aaeo aaep +aaeq aaer aaes aaet aaeu aaev aaew aaex aaey aaez aafa aafb aafc aafd aafe +aaff aafg aafh aafi aafj aafk aafl aafm aafn aafo aafp aafq aafr aafs aaft +aafu aafv aafw aafx aafy aafz aaga aagb aagc aagd aage aagf aagg aagh aagi +aagj aagk aagl aagm aagn aago aagp aagq aagr aags aagt aagu aagv aagw aagx +aagy aagz aaha aahb aahc aahd aahe aahf aahg aahh aahi aahj aahk aahl aahm +aahn aaho aahp aahq aahr aahs aaht aahu aahv aahw aahx aahy aahz aaia aaib +aaic aaid aaie aaif aaig aaih aaii aaij aaik aail aaim aain aaio aaip aaiq +aair aais aait aaiu aaiv aaiw aaix aaiy aaiz aaja aajb aajc aajd aaje aajf +aajg aajh aaji aajj aajk aajl aajm aajn aajo aajp aajq aajr aajs aajt aaju +aajv aajw aajx aajy aajz aaka aakb aakc aakd aake aakf aakg aakh aaki aakj +aakk aakl aakm aakn aako aakp aakq aakr aaks aakt aaku aakv aakw aakx aaky +aakz aala aalb aalc aald aale aalf aalg aalh aali aalj aalk aall aalm aaln +aalo aalp aalq aalr aals aalt aalu aalv aalw aalx aaly aalz aama aamb aamc +aamd aame aamf aamg aamh aami aamj aamk aaml aamm aamn aamo aamp aamq aamr +aams aamt aamu aamv aamw aamx aamy aamz aana aanb aanc aand aane aanf aang +aanh aani aanj aank aanl aanm aann aano aanp aanq aanr aans aant aanu aanv +aanw aanx aany aanz aaoa aaob aaoc aaod aaoe aaof aaog aaoh aaoi aaoj aaok +aaol aaom aaon aaoo aaop aaoq aaor aaos aaot aaou aaov aaow aaox aaoy aaoz +aapa aapb aapc aapd aape aapf aapg aaph aapi aapj aapk aapl aapm aapn aapo +aapp aapq aapr aaps aapt aapu aapv aapw aapx aapy aapz aaqa aaqb aaqc aaqd +aaqe aaqf aaqg aaqh aaqi aaqj aaqk aaql aaqm aaqn aaqo aaqp aaqq aaqr aaqs +aaqt aaqu aaqv aaqw aaqx aaqy aaqz aara aarb aarc aard aare aarf aarg aarh +aari aarj aark aarl aarm aarn aaro aarp aarq aarr aars aart aaru aarv aarw +aarx aary aarz aasa aasb aasc aasd aase aasf aasg aash aasi aasj aask aasl +aasm aasn aaso aasp aasq aasr aass aast aasu aasv aasw aasx aasy aasz aata +aatb aatc aatd aate aatf aatg aath aati aatj aatk aatl aatm aatn aato aatp +aatq aatr aats aatt aatu aatv aatw aatx aaty aatz aaua aaub aauc aaud aaue +aauf aaug aauh aaui aauj aauk aaul aaum aaun aauo aaup aauq aaur aaus aaut +aauu aauv aauw aaux aauy aauz aava aavb aavc aavd aave aavf aavg aavh aavi +aavj aavk aavl aavm aavn aavo aavp aavq aavr aavs aavt aavu aavv aavw aavx +aavy aavz aawa aawb aawc aawd aawe aawf aawg aawh aawi aawj aawk aawl aawm +aawn aawo aawp aawq aawr aaws aawt aawu aawv aaww aawx aawy aawz aaxa aaxb +aaxc aaxd aaxe aaxf aaxg aaxh aaxi aaxj aaxk aaxl aaxm aaxn aaxo aaxp aaxq +aaxr aaxs aaxt aaxu aaxv aaxw aaxx aaxy aaxz aaya aayb aayc aayd aaye aayf +aayg aayh aayi aayj aayk aayl aaym aayn aayo aayp aayq aayr aays aayt aayu +aayv aayw aayx aayy aayz aaza aazb aazc aazd aaze aazf aazg aazh aazi aazj +aazk aazl aazm aazn aazo aazp aazq aazr aazs aazt aazu aazv aazw aazx aazy +aazz abaa abab abac abad abae abaf abag abah abai abaj abak abal abam aban +abao abap abaq abar abas abat abau abav abaw abax abay abaz abba abbb abbc +abbd abbe abbf abbg abbh abbi abbj abbk abbl abbm abbn abbo abbp abbq abbr +abbs abbt abbu abbv abbw abbx abby abbz abca abcb abcc abcd abce abcf abcg +abch abci abcj abck abcl abcm abcn abco abcp abcq abcr abcs abct abcu abcv +abcw abcx abcy abcz abda abdb abdc abdd abde abdf abdg abdh abdi abdj abdk +abdl abdm abdn abdo abdp abdq abdr abds abdt abdu abdv abdw abdx abdy abdz +abea abeb abec abed abee abef abeg abeh abei abej abek abel abem aben abeo +abep abeq aber abes abet abeu abev abew abex abey abez abfa abfb abfc abfd +abfe abff abfg abfh abfi abfj abfk abfl abfm abfn abfo abfp abfq abfr abfs +abft abfu abfv abfw abfx abfy abfz abga abgb abgc abgd abge abgf abgg abgh +abgi abgj abgk abgl abgm abgn abgo abgp abgq abgr abgs abgt abgu abgv abgw +abgx abgy abgz abha abhb abhc abhd abhe abhf abhg abhh abhi abhj abhk abhl +abhm abhn abho abhp abhq abhr abhs abht abhu abhv abhw abhx abhy abhz abia +abib abic abid abie abif abig abih abii abij abik abil abim abin abio abip +abiq abir abis abit abiu abiv abiw abix abiy abiz abja abjb abjc abjd abje +abjf abjg abjh abji abjj abjk abjl abjm abjn abjo abjp abjq abjr abjs abjt +abju abjv abjw abjx abjy abjz abka abkb abkc abkd abke abkf abkg abkh abki +abkj abkk abkl abkm abkn abko abkp abkq abkr abks abkt abku abkv abkw abkx +abky abkz abla ablb ablc abld able ablf ablg ablh abli ablj ablk abll ablm +abln ablo ablp ablq ablr abls ablt ablu ablv ablw ablx ably ablz abma abmb +abmc abmd abme abmf abmg abmh abmi abmj abmk abml abmm abmn abmo abmp abmq +abmr abms abmt abmu abmv abmw abmx abmy abmz abna abnb abnc abnd abne abnf +abng abnh abni abnj abnk abnl abnm abnn abno abnp abnq abnr abns abnt abnu +abnv abnw abnx abny abnz aboa abob aboc abod aboe abof abog aboh aboi aboj +abok abol abom abon aboo abop aboq abor abos abot abou abov abow abox aboy +aboz abpa abpb abpc abpd abpe abpf abpg abph abpi abpj abpk abpl abpm abpn +abpo abpp abpq abpr abps abpt abpu abpv abpw abpx abpy abpz abqa abqb abqc +abqd abqe abqf abqg abqh abqi abqj abqk abql abqm abqn abqo abqp abqq abqr +abqs abqt abqu abqv abqw abqx abqy abqz abra abrb abrc abrd abre abrf abrg +abrh abri abrj abrk abrl abrm abrn abro abrp abrq abrr abrs abrt abru abrv +abrw abrx abry abrz absa absb absc absd abse absf absg absh absi absj absk +absl absm absn abso absp absq absr abss abst absu absv absw absx absy absz +abta abtb abtc abtd abte abtf abtg abth abti abtj abtk abtl abtm abtn abto +abtp abtq abtr abts abtt abtu abtv abtw abtx abty abtz abua abub abuc abud +abue abuf abug abuh abui abuj abuk abul abum abun abuo abup abuq abur abus +abut abuu abuv abuw abux abuy abuz abva abvb abvc abvd abve abvf abvg abvh +abvi abvj abvk abvl abvm abvn abvo abvp abvq abvr abvs abvt abvu abvv abvw +abvx abvy abvz abwa abwb abwc abwd abwe abwf abwg abwh abwi abwj abwk abwl +abwm abwn abwo abwp abwq abwr abws abwt abwu abwv abww abwx abwy abwz abxa +abxb abxc abxd abxe abxf abxg abxh abxi abxj abxk abxl abxm abxn abxo abxp +abxq abxr abxs abxt abxu abxv abxw abxx abxy abxz abya abyb abyc abyd abye +abyf abyg abyh abyi abyj abyk abyl abym abyn abyo abyp abyq abyr abys abyt +abyu abyv abyw abyx abyy abyz abza abzb abzc abzd abze abzf abzg abzh abzi +abzj abzk abzl abzm abzn abzo abzp abzq abzr abzs abzt abzu abzv abzw abzx +abzy abzz acaa acab acac acad acae acaf acag acah acai acaj acak acal acam +acan acao acap acaq acar acas acat acau acav acaw acax acay acaz acba acbb +acbc acbd acbe acbf acbg acbh acbi acbj acbk acbl acbm acbn acbo acbp acbq +acbr acbs acbt acbu acbv acbw acbx acby acbz acca accb accc accd acce accf +accg acch acci accj acck accl accm accn acco accp accq accr accs acct accu +accv accw accx accy accz acda acdb acdc acdd acde acdf acdg acdh acdi acdj +acdk acdl acdm acdn acdo acdp acdq acdr acds acdt acdu acdv acdw acdx acdy +acdz acea aceb acec aced acee acef aceg aceh acei acej acek acel acem acen +aceo acep aceq acer aces acet aceu acev acew acex acey acez acfa acfb acfc +acfd acfe acff acfg acfh acfi acfj acfk acfl acfm acfn acfo acfp acfq acfr +acfs acft acfu acfv acfw acfx acfy acfz acga acgb acgc acgd acge acgf acgg +acgh acgi acgj acgk acgl acgm acgn acgo acgp acgq acgr acgs acgt acgu acgv +acgw acgx acgy acgz acha achb achc achd ache achf achg achh achi achj achk +achl achm achn acho achp achq achr achs acht achu achv achw achx achy achz +acia acib acic acid acie acif acig acih acii acij acik acil acim acin acio +acip aciq acir acis acit aciu aciv aciw acix aciy aciz acja acjb acjc acjd +acje acjf acjg acjh acji acjj acjk acjl acjm acjn acjo acjp acjq acjr acjs +acjt acju acjv acjw acjx acjy acjz acka ackb ackc ackd acke ackf ackg ackh +acki ackj ackk ackl ackm ackn acko ackp ackq ackr acks ackt acku ackv ackw +ackx acky ackz acla aclb aclc acld acle aclf aclg aclh acli aclj aclk acll +aclm acln aclo aclp aclq aclr acls aclt aclu aclv aclw aclx acly aclz acma +acmb acmc acmd acme acmf acmg acmh acmi acmj acmk acml acmm acmn acmo acmp +acmq acmr acms acmt acmu acmv acmw acmx acmy acmz acna acnb acnc acnd acne +acnf acng acnh acni acnj acnk acnl acnm acnn acno acnp acnq acnr acns acnt +acnu acnv acnw acnx acny acnz acoa acob acoc acod acoe acof acog acoh acoi +acoj acok acol acom acon acoo acop acoq acor acos acot acou acov acow acox +acoy acoz acpa acpb acpc acpd acpe acpf acpg acph acpi acpj acpk acpl acpm +acpn acpo acpp acpq acpr acps acpt acpu acpv acpw acpx acpy acpz acqa acqb +acqc acqd acqe acqf acqg acqh acqi acqj acqk acql acqm acqn acqo acqp acqq +acqr acqs acqt acqu acqv acqw acqx acqy acqz acra acrb acrc acrd acre acrf +acrg acrh acri acrj acrk acrl acrm acrn acro acrp acrq acrr acrs acrt acru +acrv acrw acrx acry acrz acsa acsb acsc acsd acse acsf acsg acsh acsi acsj +acsk acsl acsm acsn acso acsp acsq acsr acss acst acsu acsv acsw acsx acsy +acsz acta actb actc actd acte actf actg acth acti actj actk actl actm actn +acto actp actq actr acts actt actu actv actw actx acty actz acua acub acuc +acud acue acuf acug acuh acui acuj acuk acul acum acun acuo acup acuq acur +acus acut acuu acuv acuw acux acuy acuz acva acvb acvc acvd acve acvf acvg +acvh acvi acvj acvk acvl acvm acvn acvo acvp acvq acvr acvs acvt acvu acvv +acvw acvx acvy acvz acwa acwb acwc acwd acwe acwf acwg acwh acwi acwj acwk +acwl acwm acwn acwo acwp acwq acwr acws acwt acwu acwv acww acwx acwy acwz +acxa acxb acxc acxd acxe acxf acxg acxh acxi acxj acxk acxl acxm acxn acxo +acxp acxq acxr acxs acxt acxu acxv acxw acxx acxy acxz acya acyb acyc acyd +acye acyf acyg acyh acyi acyj acyk acyl acym acyn acyo acyp acyq acyr acys +acyt acyu acyv acyw acyx acyy acyz acza aczb aczc aczd acze aczf aczg aczh +aczi aczj aczk aczl aczm aczn aczo aczp aczq aczr aczs aczt aczu aczv aczw +aczx aczy aczz adaa adab adac adad adae adaf adag adah adai adaj adak adal +adam adan adao adap adaq adar adas adat adau adav adaw adax aday adaz adba +adbb adbc adbd adbe adbf adbg adbh adbi adbj adbk adbl adbm adbn adbo adbp +adbq adbr adbs adbt adbu adbv adbw adbx adby adbz adca adcb adcc adcd adce +adcf adcg adch adci adcj adck adcl adcm adcn adco adcp adcq adcr adcs adct +adcu adcv adcw adcx adcy adcz adda addb addc addd adde addf addg addh addi +addj addk addl addm addn addo addp addq addr adds addt addu addv addw addx +addy addz adea adeb adec aded adee adef adeg adeh adei adej adek adel adem +aden adeo adep adeq ader ades adet adeu adev adew adex adey adez adfa adfb +adfc adfd adfe adff adfg adfh adfi adfj adfk adfl adfm adfn adfo adfp adfq +adfr adfs adft adfu adfv adfw adfx adfy adfz adga adgb adgc adgd adge adgf +adgg adgh adgi adgj adgk adgl adgm adgn adgo adgp adgq adgr adgs adgt adgu +adgv adgw adgx adgy adgz adha adhb adhc adhd adhe adhf adhg adhh adhi adhj +adhk adhl adhm adhn adho adhp adhq adhr adhs adht adhu adhv adhw adhx adhy +adhz adia adib adic adid adie adif adig adih adii adij adik adil adim adin +adio adip adiq adir adis adit adiu adiv adiw adix adiy adiz adja adjb adjc +adjd adje adjf adjg adjh adji adjj adjk adjl adjm adjn adjo adjp adjq adjr +adjs adjt adju adjv adjw adjx adjy adjz adka adkb adkc adkd adke adkf adkg +adkh adki adkj adkk adkl adkm adkn adko adkp adkq adkr adks adkt adku adkv +adkw adkx adky adkz adla adlb adlc adld adle adlf adlg adlh adli adlj adlk +adll adlm adln adlo adlp adlq adlr adls adlt adlu adlv adlw adlx adly adlz +adma admb admc admd adme admf admg admh admi admj admk adml admm admn admo +admp admq admr adms admt admu admv admw admx admy admz adna adnb adnc adnd +adne adnf adng adnh adni adnj adnk adnl adnm adnn adno adnp adnq adnr adns +adnt adnu adnv adnw adnx adny adnz adoa adob adoc adod adoe adof adog adoh +adoi adoj adok adol adom adon adoo adop adoq ador ados adot adou adov adow +adox adoy adoz adpa adpb adpc adpd adpe adpf adpg adph adpi adpj adpk adpl +adpm adpn adpo adpp adpq adpr adps adpt adpu adpv adpw adpx adpy adpz adqa +adqb adqc adqd adqe adqf adqg adqh adqi adqj adqk adql adqm adqn adqo adqp +adqq adqr adqs adqt adqu adqv adqw adqx adqy adqz adra adrb adrc adrd adre +adrf adrg adrh adri adrj adrk adrl adrm adrn adro adrp adrq adrr adrs adrt +adru adrv adrw adrx adry adrz adsa adsb adsc adsd adse adsf adsg adsh adsi +adsj adsk adsl adsm adsn adso adsp adsq adsr adss adst adsu adsv adsw adsx +adsy adsz adta adtb adtc adtd adte adtf adtg adth adti adtj adtk adtl adtm +adtn adto adtp adtq adtr adts adtt adtu adtv adtw adtx adty adtz adua adub +aduc adud adue aduf adug aduh adui aduj aduk adul adum adun aduo adup aduq +adur adus adut aduu aduv aduw adux aduy aduz adva advb advc advd adve advf +advg advh advi advj advk advl advm advn advo advp advq advr advs advt advu +advv advw advx advy advz adwa adwb adwc adwd adwe adwf adwg adwh adwi adwj +adwk adwl adwm adwn adwo adwp adwq adwr adws adwt adwu adwv adww adwx adwy +adwz adxa adxb adxc adxd adxe adxf adxg adxh adxi adxj adxk adxl adxm adxn +adxo adxp adxq adxr adxs adxt adxu adxv adxw adxx adxy adxz adya adyb adyc +adyd adye adyf adyg adyh adyi adyj adyk adyl adym adyn adyo adyp adyq adyr +adys adyt adyu adyv adyw adyx adyy adyz adza adzb adzc adzd adze adzf adzg +adzh adzi adzj adzk adzl adzm adzn adzo adzp adzq adzr adzs adzt adzu adzv +adzw adzx adzy adzz aeaa aeab aeac aead aeae aeaf aeag aeah aeai aeaj aeak +aeal aeam aean aeao aeap aeaq aear aeas aeat aeau aeav aeaw aeax aeay aeaz +aeba aebb aebc aebd aebe aebf aebg aebh aebi aebj aebk aebl aebm aebn aebo +aebp aebq aebr aebs aebt aebu aebv aebw aebx aeby aebz aeca aecb aecc aecd +aece aecf aecg aech aeci aecj aeck aecl aecm aecn aeco aecp aecq aecr aecs +aect aecu aecv aecw aecx aecy aecz aeda aedb aedc aedd aede aedf aedg aedh +aedi aedj aedk aedl aedm aedn aedo aedp aedq aedr aeds aedt aedu aedv aedw +aedx aedy aedz aeea aeeb aeec aeed aeee aeef aeeg aeeh aeei aeej aeek aeel +aeem aeen aeeo aeep aeeq aeer aees aeet aeeu aeev aeew aeex aeey aeez aefa +aefb aefc aefd aefe aeff aefg aefh aefi aefj aefk aefl aefm aefn aefo aefp +aefq aefr aefs aeft aefu aefv aefw aefx aefy aefz aega aegb aegc aegd aege +aegf aegg aegh aegi aegj aegk aegl aegm aegn aego aegp aegq aegr aegs aegt +aegu aegv aegw aegx aegy aegz aeha aehb aehc aehd aehe aehf aehg aehh aehi +aehj aehk aehl aehm aehn aeho aehp aehq aehr aehs aeht aehu aehv aehw aehx +aehy aehz aeia aeib aeic aeid aeie aeif aeig aeih aeii aeij aeik aeil aeim +aein aeio aeip aeiq aeir aeis aeit aeiu aeiv aeiw aeix aeiy aeiz aeja aejb +aejc aejd aeje aejf aejg aejh aeji aejj aejk aejl aejm aejn aejo aejp aejq +aejr aejs aejt aeju aejv aejw aejx aejy aejz aeka aekb aekc aekd aeke aekf +aekg aekh aeki aekj aekk aekl aekm aekn aeko aekp aekq aekr aeks aekt aeku +aekv aekw aekx aeky aekz aela aelb aelc aeld aele aelf aelg aelh aeli aelj +aelk aell aelm aeln aelo aelp aelq aelr aels aelt aelu aelv aelw aelx aely +aelz aema aemb aemc aemd aeme aemf aemg aemh aemi aemj aemk aeml aemm aemn +aemo aemp aemq aemr aems aemt aemu aemv aemw aemx aemy aemz aena aenb aenc +aend aene aenf aeng aenh aeni aenj aenk aenl aenm aenn aeno aenp aenq aenr +aens aent aenu aenv aenw aenx aeny aenz aeoa aeob aeoc aeod aeoe aeof aeog +aeoh aeoi aeoj aeok aeol aeom aeon aeoo aeop aeoq aeor aeos aeot aeou aeov +aeow aeox aeoy aeoz aepa aepb aepc aepd aepe aepf aepg aeph aepi aepj aepk +aepl aepm aepn aepo aepp aepq aepr aeps aept aepu aepv aepw aepx aepy aepz +aeqa aeqb aeqc aeqd aeqe aeqf aeqg aeqh aeqi aeqj aeqk aeql aeqm aeqn aeqo +aeqp aeqq aeqr aeqs aeqt aequ aeqv aeqw aeqx aeqy aeqz aera aerb aerc aerd +aere aerf aerg aerh aeri aerj aerk aerl aerm aern aero aerp aerq aerr aers +aert aeru aerv aerw aerx aery aerz aesa aesb aesc aesd aese aesf aesg aesh +aesi aesj aesk aesl aesm aesn aeso aesp aesq aesr aess aest aesu aesv aesw +aesx aesy aesz aeta aetb aetc aetd aete aetf aetg aeth aeti aetj aetk aetl +aetm aetn aeto aetp aetq aetr aets aett aetu aetv aetw aetx aety aetz aeua +aeub aeuc aeud aeue aeuf aeug aeuh aeui aeuj aeuk aeul aeum aeun aeuo aeup +aeuq aeur aeus aeut aeuu aeuv aeuw aeux aeuy aeuz aeva aevb aevc aevd aeve +aevf aevg aevh aevi aevj aevk aevl aevm aevn aevo aevp aevq aevr aevs aevt +aevu aevv aevw aevx aevy aevz aewa aewb aewc aewd aewe aewf aewg aewh aewi +aewj aewk aewl aewm aewn aewo aewp aewq aewr aews aewt aewu aewv aeww aewx +aewy aewz aexa aexb aexc aexd aexe aexf aexg aexh aexi aexj aexk aexl aexm +aexn aexo aexp aexq aexr aexs aext aexu aexv aexw aexx aexy aexz aeya aeyb +aeyc aeyd aeye aeyf aeyg aeyh aeyi aeyj aeyk aeyl aeym aeyn aeyo aeyp aeyq +aeyr aeys aeyt aeyu aeyv aeyw aeyx aeyy aeyz aeza aezb aezc aezd aeze aezf +aezg aezh aezi aezj aezk aezl aezm aezn aezo aezp aezq aezr aezs aezt aezu +aezv aezw aezx aezy aezz afaa afab afac afad afae afaf afag afah afai afaj +afak afal afam afan afao afap afaq afar afas afat afau afav afaw afax afay +afaz afba afbb afbc afbd afbe afbf afbg afbh afbi afbj afbk afbl afbm afbn +afbo afbp afbq afbr afbs afbt afbu afbv afbw afbx afby afbz afca afcb afcc +afcd afce afcf afcg afch afci afcj afck afcl afcm afcn afco afcp afcq afcr +afcs afct afcu afcv afcw afcx afcy afcz afda afdb afdc afdd afde afdf afdg +afdh afdi afdj afdk afdl afdm afdn afdo afdp afdq afdr afds afdt afdu afdv +afdw afdx afdy afdz afea afeb afec afed afee afef afeg afeh afei afej afek +afel afem afen afeo afep afeq afer afes afet afeu afev afew afex afey afez +affa affb affc affd affe afff affg affh affi affj affk affl affm affn affo +affp affq affr affs afft affu affv affw affx affy affz afga afgb afgc afgd +afge afgf afgg afgh afgi afgj afgk afgl afgm afgn afgo afgp afgq afgr afgs +afgt afgu afgv afgw afgx afgy afgz afha afhb afhc afhd afhe afhf afhg afhh +afhi afhj afhk afhl afhm afhn afho afhp afhq afhr afhs afht afhu afhv afhw +afhx afhy afhz afia afib afic afid afie afif afig afih afii afij afik afil +afim afin afio afip afiq afir afis afit afiu afiv afiw afix afiy afiz afja +afjb afjc afjd afje afjf afjg afjh afji afjj afjk afjl afjm afjn afjo afjp +afjq afjr afjs afjt afju afjv afjw afjx afjy afjz afka afkb afkc afkd afke +afkf afkg afkh afki afkj afkk afkl afkm afkn afko afkp afkq afkr afks afkt +afku afkv afkw afkx afky afkz afla aflb aflc afld afle aflf aflg aflh afli +aflj aflk afll aflm afln aflo aflp aflq aflr afls aflt aflu aflv aflw aflx +afly aflz afma afmb afmc afmd afme afmf afmg afmh afmi afmj afmk afml afmm +afmn afmo afmp afmq afmr afms afmt afmu afmv afmw afmx afmy afmz afna afnb +afnc afnd afne afnf afng afnh afni afnj afnk afnl afnm afnn afno afnp afnq +afnr afns afnt afnu afnv afnw afnx afny afnz afoa afob afoc afod afoe afof +afog afoh afoi afoj afok afol afom afon afoo afop afoq afor afos afot afou +afov afow afox afoy afoz afpa afpb afpc afpd afpe afpf afpg afph afpi afpj +afpk afpl afpm afpn afpo afpp afpq afpr afps afpt afpu afpv afpw afpx afpy +afpz afqa afqb afqc afqd afqe afqf afqg afqh afqi afqj afqk afql afqm afqn +afqo afqp afqq afqr afqs afqt afqu afqv afqw afqx afqy afqz afra afrb afrc +afrd afre afrf afrg afrh afri afrj afrk afrl afrm afrn afro afrp afrq afrr +afrs afrt afru afrv afrw afrx afry afrz afsa afsb afsc afsd afse afsf afsg +afsh afsi afsj afsk afsl afsm afsn afso afsp afsq afsr afss afst afsu afsv +afsw afsx afsy afsz afta aftb aftc aftd afte aftf aftg afth afti aftj aftk +aftl aftm aftn afto aftp aftq aftr afts aftt aftu aftv aftw aftx afty aftz +afua afub afuc afud afue afuf afug afuh afui afuj afuk aful afum afun afuo +afup afuq afur afus afut afuu afuv afuw afux afuy afuz afva afvb afvc afvd +afve afvf afvg afvh afvi afvj afvk afvl afvm afvn afvo afvp afvq afvr afvs +afvt afvu afvv afvw afvx afvy afvz afwa afwb afwc afwd afwe afwf afwg afwh +afwi afwj afwk afwl afwm afwn afwo afwp afwq afwr afws afwt afwu afwv afww +afwx afwy afwz afxa afxb afxc afxd afxe afxf afxg afxh afxi afxj afxk afxl +afxm afxn afxo afxp afxq afxr afxs afxt afxu afxv afxw afxx afxy afxz afya +afyb afyc afyd afye afyf afyg afyh afyi afyj afyk afyl afym afyn afyo afyp +afyq afyr afys afyt afyu afyv afyw afyx afyy afyz afza afzb afzc afzd afze +afzf afzg afzh afzi afzj afzk afzl afzm afzn afzo afzp afzq afzr afzs afzt +afzu afzv afzw afzx afzy afzz agaa agab agac agad agae agaf agag agah agai +agaj agak agal agam agan agao agap agaq agar agas agat agau agav agaw agax +agay agaz agba agbb agbc agbd agbe agbf agbg agbh agbi agbj agbk agbl agbm +agbn agbo agbp agbq agbr agbs agbt agbu agbv agbw agbx agby agbz agca agcb +agcc agcd agce agcf agcg agch agci agcj agck agcl agcm agcn agco agcp agcq +agcr agcs agct agcu agcv agcw agcx agcy agcz agda agdb agdc agdd agde agdf +agdg agdh agdi agdj agdk agdl agdm agdn agdo agdp agdq agdr agds agdt agdu +agdv agdw agdx agdy agdz agea ageb agec aged agee agef ageg ageh agei agej +agek agel agem agen ageo agep ageq ager ages aget ageu agev agew agex agey +agez agfa agfb agfc agfd agfe agff agfg agfh agfi agfj agfk agfl agfm agfn +agfo agfp agfq agfr agfs agft agfu agfv agfw agfx agfy agfz agga aggb aggc +aggd agge aggf aggg aggh aggi aggj aggk aggl aggm aggn aggo aggp aggq aggr +aggs aggt aggu aggv aggw aggx aggy aggz agha aghb aghc aghd aghe aghf aghg +aghh aghi aghj aghk aghl aghm aghn agho aghp aghq aghr aghs aght aghu aghv +aghw aghx aghy aghz agia agib agic agid agie agif agig agih agii agij agik +agil agim agin agio agip agiq agir agis agit agiu agiv agiw agix agiy agiz +agja agjb agjc agjd agje agjf agjg agjh agji agjj agjk agjl agjm agjn agjo +agjp agjq agjr agjs agjt agju agjv agjw agjx agjy agjz agka agkb agkc agkd +agke agkf agkg agkh agki agkj agkk agkl agkm agkn agko agkp agkq agkr agks +agkt agku agkv agkw agkx agky agkz agla aglb aglc agld agle aglf aglg aglh +agli aglj aglk agll aglm agln aglo aglp aglq aglr agls aglt aglu aglv aglw +aglx agly aglz agma agmb agmc agmd agme agmf agmg agmh agmi agmj agmk agml +agmm agmn agmo agmp agmq agmr agms agmt agmu agmv agmw agmx agmy agmz agna +agnb agnc agnd agne agnf agng agnh agni agnj agnk agnl agnm agnn agno agnp +agnq agnr agns agnt agnu agnv agnw agnx agny agnz agoa agob agoc agod agoe +agof agog agoh agoi agoj agok agol agom agon agoo agop agoq agor agos agot +agou agov agow agox agoy agoz agpa agpb agpc agpd agpe agpf agpg agph agpi +agpj agpk agpl agpm agpn agpo agpp agpq agpr agps agpt agpu agpv agpw agpx +agpy agpz agqa agqb agqc agqd agqe agqf agqg agqh agqi agqj agqk agql agqm +agqn agqo agqp agqq agqr agqs agqt agqu agqv agqw agqx agqy agqz agra agrb +agrc agrd agre agrf agrg agrh agri agrj agrk agrl agrm agrn agro agrp agrq +agrr agrs agrt agru agrv agrw agrx agry agrz agsa agsb agsc agsd agse agsf +agsg agsh agsi agsj agsk agsl agsm agsn agso agsp agsq agsr agss agst agsu +agsv agsw agsx agsy agsz agta agtb agtc agtd agte agtf agtg agth agti agtj +agtk agtl agtm agtn agto agtp agtq agtr agts agtt agtu agtv agtw agtx agty +agtz agua agub aguc agud ague aguf agug aguh agui aguj aguk agul agum agun +aguo agup aguq agur agus agut aguu aguv aguw agux aguy aguz agva agvb agvc +agvd agve agvf agvg agvh agvi agvj agvk agvl agvm agvn agvo agvp agvq agvr +agvs agvt agvu agvv agvw agvx agvy agvz agwa agwb agwc agwd agwe agwf agwg +agwh agwi agwj agwk agwl agwm agwn agwo agwp agwq agwr agws agwt agwu agwv +agww agwx agwy agwz agxa agxb agxc agxd agxe agxf agxg agxh agxi agxj agxk +agxl agxm agxn agxo agxp agxq agxr agxs agxt agxu agxv agxw agxx agxy agxz +agya agyb agyc agyd agye agyf agyg agyh agyi agyj agyk agyl agym agyn agyo +agyp agyq agyr agys agyt agyu agyv agyw agyx agyy agyz agza agzb agzc agzd +agze agzf agzg agzh agzi agzj agzk agzl agzm agzn agzo agzp agzq agzr agzs +agzt agzu agzv agzw agzx agzy agzz ahaa ahab ahac ahad ahae ahaf ahag ahah +ahai ahaj ahak ahal aham ahan ahao ahap ahaq ahar ahas ahat ahau ahav ahaw +ahax ahay ahaz ahba ahbb ahbc ahbd ahbe ahbf ahbg ahbh ahbi ahbj ahbk ahbl +ahbm ahbn ahbo ahbp ahbq ahbr ahbs ahbt ahbu ahbv ahbw ahbx ahby ahbz ahca +ahcb ahcc ahcd ahce ahcf ahcg ahch ahci ahcj ahck ahcl ahcm ahcn ahco ahcp +ahcq ahcr ahcs ahct ahcu ahcv ahcw ahcx ahcy ahcz ahda ahdb ahdc ahdd ahde +ahdf ahdg ahdh ahdi ahdj ahdk ahdl ahdm ahdn ahdo ahdp ahdq ahdr ahds ahdt +ahdu ahdv ahdw ahdx ahdy ahdz ahea aheb ahec ahed ahee ahef aheg aheh ahei +ahej ahek ahel ahem ahen aheo ahep aheq aher ahes ahet aheu ahev ahew ahex +ahey ahez ahfa ahfb ahfc ahfd ahfe ahff ahfg ahfh ahfi ahfj ahfk ahfl ahfm +ahfn ahfo ahfp ahfq ahfr ahfs ahft ahfu ahfv ahfw ahfx ahfy ahfz ahga ahgb +ahgc ahgd ahge ahgf ahgg ahgh ahgi ahgj ahgk ahgl ahgm ahgn ahgo ahgp ahgq +ahgr ahgs ahgt ahgu ahgv ahgw ahgx ahgy ahgz ahha ahhb ahhc ahhd ahhe ahhf +ahhg ahhh ahhi ahhj ahhk ahhl ahhm ahhn ahho ahhp ahhq ahhr ahhs ahht ahhu +ahhv ahhw ahhx ahhy ahhz ahia ahib ahic ahid ahie ahif ahig ahih ahii ahij +ahik ahil ahim ahin ahio ahip ahiq ahir ahis ahit ahiu ahiv ahiw ahix ahiy +ahiz ahja ahjb ahjc ahjd ahje ahjf ahjg ahjh ahji ahjj ahjk ahjl ahjm ahjn +ahjo ahjp ahjq ahjr ahjs ahjt ahju ahjv ahjw ahjx ahjy ahjz ahka ahkb ahkc +ahkd ahke ahkf ahkg ahkh ahki ahkj ahkk ahkl ahkm ahkn ahko ahkp ahkq ahkr +ahks ahkt ahku ahkv ahkw ahkx ahky ahkz ahla ahlb ahlc ahld ahle ahlf ahlg +ahlh ahli ahlj ahlk ahll ahlm ahln ahlo ahlp ahlq ahlr ahls ahlt ahlu ahlv +ahlw ahlx ahly ahlz ahma ahmb ahmc ahmd ahme ahmf ahmg ahmh ahmi ahmj ahmk +ahml ahmm ahmn ahmo ahmp ahmq ahmr ahms ahmt ahmu ahmv ahmw ahmx ahmy ahmz +ahna ahnb ahnc ahnd ahne ahnf ahng ahnh ahni ahnj ahnk ahnl ahnm ahnn ahno +ahnp ahnq ahnr ahns ahnt ahnu ahnv ahnw ahnx ahny ahnz ahoa ahob ahoc ahod +ahoe ahof ahog ahoh ahoi ahoj ahok ahol ahom ahon ahoo ahop ahoq ahor ahos +ahot ahou ahov ahow ahox ahoy ahoz ahpa ahpb ahpc ahpd ahpe ahpf ahpg ahph +ahpi ahpj ahpk ahpl ahpm ahpn ahpo ahpp ahpq ahpr ahps ahpt ahpu ahpv ahpw +ahpx ahpy ahpz ahqa ahqb ahqc ahqd ahqe ahqf ahqg ahqh ahqi ahqj ahqk ahql +ahqm ahqn ahqo ahqp ahqq ahqr ahqs ahqt ahqu ahqv ahqw ahqx ahqy ahqz ahra +ahrb ahrc ahrd ahre ahrf ahrg ahrh ahri ahrj ahrk ahrl ahrm ahrn ahro ahrp +ahrq ahrr ahrs ahrt ahru ahrv ahrw ahrx ahry ahrz ahsa ahsb ahsc ahsd ahse +ahsf ahsg ahsh ahsi ahsj ahsk ahsl ahsm ahsn ahso ahsp ahsq ahsr ahss ahst +ahsu ahsv ahsw ahsx ahsy ahsz ahta ahtb ahtc ahtd ahte ahtf ahtg ahth ahti +ahtj ahtk ahtl ahtm ahtn ahto ahtp ahtq ahtr ahts ahtt ahtu ahtv ahtw ahtx +ahty ahtz ahua ahub ahuc ahud ahue ahuf ahug ahuh ahui ahuj ahuk ahul ahum +ahun ahuo ahup ahuq ahur ahus ahut ahuu ahuv ahuw ahux ahuy ahuz ahva ahvb +ahvc ahvd ahve ahvf ahvg ahvh ahvi ahvj ahvk ahvl ahvm ahvn ahvo ahvp ahvq +ahvr ahvs ahvt ahvu ahvv ahvw ahvx ahvy ahvz ahwa ahwb ahwc ahwd ahwe ahwf +ahwg ahwh ahwi ahwj ahwk ahwl ahwm ahwn ahwo ahwp ahwq ahwr ahws ahwt ahwu +ahwv ahww ahwx ahwy ahwz ahxa ahxb ahxc ahxd ahxe ahxf ahxg ahxh ahxi ahxj +ahxk ahxl ahxm ahxn ahxo ahxp ahxq ahxr ahxs ahxt ahxu ahxv ahxw ahxx ahxy +ahxz ahya ahyb ahyc ahyd ahye ahyf ahyg ahyh ahyi ahyj ahyk ahyl ahym ahyn +ahyo ahyp ahyq ahyr ahys ahyt ahyu ahyv ahyw ahyx ahyy ahyz ahza ahzb ahzc +ahzd ahze ahzf ahzg ahzh ahzi ahzj ahzk ahzl ahzm ahzn ahzo ahzp ahzq ahzr +ahzs ahzt ahzu ahzv ahzw ahzx ahzy ahzz aiaa aiab aiac aiad aiae aiaf aiag +aiah aiai aiaj aiak aial aiam aian aiao aiap aiaq aiar aias aiat aiau aiav +aiaw aiax aiay aiaz aiba aibb aibc aibd aibe aibf aibg aibh aibi aibj aibk +aibl aibm aibn aibo aibp aibq aibr aibs aibt aibu aibv aibw aibx aiby aibz +aica aicb aicc aicd aice aicf aicg aich aici aicj aick aicl aicm aicn aico +aicp aicq aicr aics aict aicu aicv aicw aicx aicy aicz aida aidb aidc aidd +aide aidf aidg aidh aidi aidj aidk aidl aidm aidn aido aidp aidq aidr aids +aidt aidu aidv aidw aidx aidy aidz aiea aieb aiec aied aiee aief aieg aieh +aiei aiej aiek aiel aiem aien aieo aiep aieq aier aies aiet aieu aiev aiew +aiex aiey aiez aifa aifb aifc aifd aife aiff aifg aifh aifi aifj aifk aifl +aifm aifn aifo aifp aifq aifr aifs aift aifu aifv aifw aifx aify aifz aiga +aigb aigc aigd aige aigf aigg aigh aigi aigj aigk aigl aigm aign aigo aigp +aigq aigr aigs aigt aigu aigv aigw aigx aigy aigz aiha aihb aihc aihd aihe +aihf aihg aihh aihi aihj aihk aihl aihm aihn aiho aihp aihq aihr aihs aiht +aihu aihv aihw aihx aihy aihz aiia aiib aiic aiid aiie aiif aiig aiih aiii +aiij aiik aiil aiim aiin aiio aiip aiiq aiir aiis aiit aiiu aiiv aiiw aiix +aiiy aiiz aija aijb aijc aijd aije aijf aijg aijh aiji aijj aijk aijl aijm +aijn aijo aijp aijq aijr aijs aijt aiju aijv aijw aijx aijy aijz aika aikb +aikc aikd aike aikf aikg aikh aiki aikj aikk aikl aikm aikn aiko aikp aikq +aikr aiks aikt aiku aikv aikw aikx aiky aikz aila ailb ailc aild aile ailf +ailg ailh aili ailj ailk aill ailm ailn ailo ailp ailq ailr ails ailt ailu +ailv ailw ailx aily ailz aima aimb aimc aimd aime aimf aimg aimh aimi aimj +aimk aiml aimm aimn aimo aimp aimq aimr aims aimt aimu aimv aimw aimx aimy +aimz aina ainb ainc aind aine ainf aing ainh aini ainj aink ainl ainm ainn +aino ainp ainq ainr ains aint ainu ainv ainw ainx ainy ainz aioa aiob aioc +aiod aioe aiof aiog aioh aioi aioj aiok aiol aiom aion aioo aiop aioq aior +aios aiot aiou aiov aiow aiox aioy aioz aipa aipb aipc aipd aipe aipf aipg +aiph aipi aipj aipk aipl aipm aipn aipo aipp aipq aipr aips aipt aipu aipv +aipw aipx aipy aipz aiqa aiqb aiqc aiqd aiqe aiqf aiqg aiqh aiqi aiqj aiqk +aiql aiqm aiqn aiqo aiqp aiqq aiqr aiqs aiqt aiqu aiqv aiqw aiqx aiqy aiqz +aira airb airc aird aire airf airg airh airi airj airk airl airm airn airo +airp airq airr airs airt airu airv airw airx airy airz aisa aisb aisc aisd +aise aisf aisg aish aisi aisj aisk aisl aism aisn aiso aisp aisq aisr aiss +aist aisu aisv aisw aisx aisy aisz aita aitb aitc aitd aite aitf aitg aith +aiti aitj aitk aitl aitm aitn aito aitp aitq aitr aits aitt aitu aitv aitw +aitx aity aitz aiua aiub aiuc aiud aiue aiuf aiug aiuh aiui aiuj aiuk aiul +aium aiun aiuo aiup aiuq aiur aius aiut aiuu aiuv aiuw aiux aiuy aiuz aiva +aivb aivc aivd aive aivf aivg aivh aivi aivj aivk aivl aivm aivn aivo aivp +aivq aivr aivs aivt aivu aivv aivw aivx aivy aivz aiwa aiwb aiwc aiwd aiwe +aiwf aiwg aiwh aiwi aiwj aiwk aiwl aiwm aiwn aiwo aiwp aiwq aiwr aiws aiwt +aiwu aiwv aiww aiwx aiwy aiwz aixa aixb aixc aixd aixe aixf aixg aixh aixi +aixj aixk aixl aixm aixn aixo aixp aixq aixr aixs aixt aixu aixv aixw aixx +aixy aixz aiya aiyb aiyc aiyd aiye aiyf aiyg aiyh aiyi aiyj aiyk aiyl aiym +aiyn aiyo aiyp aiyq aiyr aiys aiyt aiyu aiyv aiyw aiyx aiyy aiyz aiza aizb +aizc aizd aize aizf aizg aizh aizi aizj aizk aizl aizm aizn aizo aizp aizq +aizr aizs aizt aizu aizv aizw aizx aizy aizz ajaa ajab ajac ajad ajae ajaf +ajag ajah ajai ajaj ajak ajal ajam ajan ajao ajap ajaq ajar ajas ajat ajau +ajav ajaw ajax ajay ajaz ajba ajbb ajbc ajbd ajbe ajbf ajbg ajbh ajbi ajbj +ajbk ajbl ajbm ajbn ajbo ajbp ajbq ajbr ajbs ajbt ajbu ajbv ajbw ajbx ajby +ajbz ajca ajcb ajcc ajcd ajce ajcf ajcg ajch ajci ajcj ajck ajcl ajcm ajcn +ajco ajcp ajcq ajcr ajcs ajct ajcu ajcv ajcw ajcx ajcy ajcz ajda ajdb ajdc +ajdd ajde ajdf ajdg ajdh ajdi ajdj ajdk ajdl ajdm ajdn ajdo ajdp ajdq ajdr +ajds ajdt ajdu ajdv ajdw ajdx ajdy ajdz ajea ajeb ajec ajed ajee ajef ajeg +ajeh ajei ajej ajek ajel ajem ajen ajeo ajep ajeq ajer ajes ajet ajeu ajev +ajew ajex ajey ajez ajfa ajfb ajfc ajfd ajfe ajff ajfg ajfh ajfi ajfj ajfk +ajfl ajfm ajfn ajfo ajfp ajfq ajfr ajfs ajft ajfu ajfv ajfw ajfx ajfy ajfz +ajga ajgb ajgc ajgd ajge ajgf ajgg ajgh ajgi ajgj ajgk ajgl ajgm ajgn ajgo +ajgp ajgq ajgr ajgs ajgt ajgu ajgv ajgw ajgx ajgy ajgz ajha ajhb ajhc ajhd +ajhe ajhf ajhg ajhh ajhi ajhj ajhk ajhl ajhm ajhn ajho ajhp ajhq ajhr ajhs +ajht ajhu ajhv ajhw ajhx ajhy ajhz ajia ajib ajic ajid ajie ajif ajig ajih +ajii ajij ajik ajil ajim ajin ajio ajip ajiq ajir ajis ajit ajiu ajiv ajiw +ajix ajiy ajiz ajja ajjb ajjc ajjd ajje ajjf ajjg ajjh ajji ajjj ajjk ajjl +ajjm ajjn ajjo ajjp ajjq ajjr ajjs ajjt ajju ajjv ajjw ajjx ajjy ajjz ajka +ajkb ajkc ajkd ajke ajkf ajkg ajkh ajki ajkj ajkk ajkl ajkm ajkn ajko ajkp +ajkq ajkr ajks ajkt ajku ajkv ajkw ajkx ajky ajkz ajla ajlb ajlc ajld ajle +ajlf ajlg ajlh ajli ajlj ajlk ajll ajlm ajln ajlo ajlp ajlq ajlr ajls ajlt +ajlu ajlv ajlw ajlx ajly ajlz ajma ajmb ajmc ajmd ajme ajmf ajmg ajmh ajmi +ajmj ajmk ajml ajmm ajmn ajmo ajmp ajmq ajmr ajms ajmt ajmu ajmv ajmw ajmx +ajmy ajmz ajna ajnb ajnc ajnd ajne ajnf ajng ajnh ajni ajnj ajnk ajnl ajnm +ajnn ajno ajnp ajnq ajnr ajns ajnt ajnu ajnv ajnw ajnx ajny ajnz ajoa ajob +ajoc ajod ajoe ajof ajog ajoh ajoi ajoj ajok ajol ajom ajon ajoo ajop ajoq +ajor ajos ajot ajou ajov ajow ajox ajoy ajoz ajpa ajpb ajpc ajpd ajpe ajpf +ajpg ajph ajpi ajpj ajpk ajpl ajpm ajpn ajpo ajpp ajpq ajpr ajps ajpt ajpu +ajpv ajpw ajpx ajpy ajpz ajqa ajqb ajqc ajqd ajqe ajqf ajqg ajqh ajqi ajqj +ajqk ajql ajqm ajqn ajqo ajqp ajqq ajqr ajqs ajqt ajqu ajqv ajqw ajqx ajqy +ajqz ajra ajrb ajrc ajrd ajre ajrf ajrg ajrh ajri ajrj ajrk ajrl ajrm ajrn +ajro ajrp ajrq ajrr ajrs ajrt ajru ajrv ajrw ajrx ajry ajrz ajsa ajsb ajsc +ajsd ajse ajsf ajsg ajsh ajsi ajsj ajsk ajsl ajsm ajsn ajso ajsp ajsq ajsr +ajss ajst ajsu ajsv ajsw ajsx ajsy ajsz ajta ajtb ajtc ajtd ajte ajtf ajtg +ajth ajti ajtj ajtk ajtl ajtm ajtn ajto ajtp ajtq ajtr ajts ajtt ajtu ajtv +ajtw ajtx ajty ajtz ajua ajub ajuc ajud ajue ajuf ajug ajuh ajui ajuj ajuk +ajul ajum ajun ajuo ajup ajuq ajur ajus ajut ajuu ajuv ajuw ajux ajuy ajuz +ajva ajvb ajvc ajvd ajve ajvf ajvg ajvh ajvi ajvj ajvk ajvl ajvm ajvn ajvo +ajvp ajvq ajvr ajvs ajvt ajvu ajvv ajvw ajvx ajvy ajvz ajwa ajwb ajwc ajwd +ajwe ajwf ajwg ajwh ajwi ajwj ajwk ajwl ajwm ajwn ajwo ajwp ajwq ajwr ajws +ajwt ajwu ajwv ajww ajwx ajwy ajwz ajxa ajxb ajxc ajxd ajxe ajxf ajxg ajxh +ajxi ajxj ajxk ajxl ajxm ajxn ajxo ajxp ajxq ajxr ajxs ajxt ajxu ajxv ajxw +ajxx ajxy ajxz ajya ajyb ajyc ajyd ajye ajyf ajyg ajyh ajyi ajyj ajyk ajyl +ajym ajyn ajyo ajyp ajyq ajyr ajys ajyt ajyu ajyv ajyw ajyx ajyy ajyz ajza +ajzb ajzc ajzd ajze ajzf ajzg ajzh ajzi ajzj ajzk ajzl ajzm ajzn ajzo ajzp +ajzq ajzr ajzs ajzt ajzu ajzv ajzw ajzx ajzy ajzz akaa akab akac akad akae +akaf akag akah akai akaj akak akal akam akan akao akap akaq akar akas akat +akau akav akaw akax akay akaz akba akbb akbc akbd akbe akbf akbg akbh akbi +akbj akbk akbl akbm akbn akbo akbp akbq akbr akbs akbt akbu akbv akbw akbx +akby akbz akca akcb akcc akcd akce akcf akcg akch akci akcj akck akcl akcm +akcn akco akcp akcq akcr akcs akct akcu akcv akcw akcx akcy akcz akda akdb +akdc akdd akde akdf akdg akdh akdi akdj akdk akdl akdm akdn akdo akdp akdq +akdr akds akdt akdu akdv akdw akdx akdy akdz akea akeb akec aked akee akef +akeg akeh akei akej akek akel akem aken akeo akep akeq aker akes aket akeu +akev akew akex akey akez akfa akfb akfc akfd akfe akff akfg akfh akfi akfj +akfk akfl akfm akfn akfo akfp akfq akfr akfs akft akfu akfv akfw akfx akfy +akfz akga akgb akgc akgd akge akgf akgg akgh akgi akgj akgk akgl akgm akgn +akgo akgp akgq akgr akgs akgt akgu akgv akgw akgx akgy akgz akha akhb akhc +akhd akhe akhf akhg akhh akhi akhj akhk akhl akhm akhn akho akhp akhq akhr +akhs akht akhu akhv akhw akhx akhy akhz akia akib akic akid akie akif akig +akih akii akij akik akil akim akin akio akip akiq akir akis akit akiu akiv +akiw akix akiy akiz akja akjb akjc akjd akje akjf akjg akjh akji akjj akjk +akjl akjm akjn akjo akjp akjq akjr akjs akjt akju akjv akjw akjx akjy akjz +akka akkb akkc akkd akke akkf akkg akkh akki akkj akkk akkl akkm akkn akko +akkp akkq akkr akks akkt akku akkv akkw akkx akky akkz akla aklb aklc akld +akle aklf aklg aklh akli aklj aklk akll aklm akln aklo aklp aklq aklr akls +aklt aklu aklv aklw aklx akly aklz akma akmb akmc akmd akme akmf akmg akmh +akmi akmj akmk akml akmm akmn akmo akmp akmq akmr akms akmt akmu akmv akmw +akmx akmy akmz akna aknb aknc aknd akne aknf akng aknh akni aknj aknk aknl +aknm aknn akno aknp aknq aknr akns aknt aknu aknv aknw aknx akny aknz akoa +akob akoc akod akoe akof akog akoh akoi akoj akok akol akom akon akoo akop +akoq akor akos akot akou akov akow akox akoy akoz akpa akpb akpc akpd akpe +akpf akpg akph akpi akpj akpk akpl akpm akpn akpo akpp akpq akpr akps akpt +akpu akpv akpw akpx akpy akpz akqa akqb akqc akqd akqe akqf akqg akqh akqi +akqj akqk akql akqm akqn akqo akqp akqq akqr akqs akqt akqu akqv akqw akqx +akqy akqz akra akrb akrc akrd akre akrf akrg akrh akri akrj akrk akrl akrm +akrn akro akrp akrq akrr akrs akrt akru akrv akrw akrx akry akrz aksa aksb +aksc aksd akse aksf aksg aksh aksi aksj aksk aksl aksm aksn akso aksp aksq +aksr akss akst aksu aksv aksw aksx aksy aksz akta aktb aktc aktd akte aktf +aktg akth akti aktj aktk aktl aktm aktn akto aktp aktq aktr akts aktt aktu +aktv aktw aktx akty aktz akua akub akuc akud akue akuf akug akuh akui akuj +akuk akul akum akun akuo akup akuq akur akus akut akuu akuv akuw akux akuy +akuz akva akvb akvc akvd akve akvf akvg akvh akvi akvj akvk akvl akvm akvn +akvo akvp akvq akvr akvs akvt akvu akvv akvw akvx akvy akvz akwa akwb akwc +akwd akwe akwf akwg akwh akwi akwj akwk akwl akwm akwn akwo akwp akwq akwr +akws akwt akwu akwv akww akwx akwy akwz akxa akxb akxc akxd akxe akxf akxg +akxh akxi akxj akxk akxl akxm akxn akxo akxp akxq akxr akxs akxt akxu akxv +akxw akxx akxy akxz akya akyb akyc akyd akye akyf akyg akyh akyi akyj akyk +akyl akym akyn akyo akyp akyq akyr akys akyt akyu akyv akyw akyx akyy akyz +akza akzb akzc akzd akze akzf akzg akzh akzi akzj akzk akzl akzm akzn akzo +akzp akzq akzr akzs akzt akzu akzv akzw akzx akzy akzz alaa alab alac alad +alae alaf alag alah alai alaj alak alal alam alan alao alap alaq alar alas +alat alau alav alaw alax alay alaz alba albb albc albd albe albf albg albh +albi albj albk albl albm albn albo albp albq albr albs albt albu albv albw +albx alby albz alca alcb alcc alcd alce alcf alcg alch alci alcj alck alcl +alcm alcn alco alcp alcq alcr alcs alct alcu alcv alcw alcx alcy alcz alda +aldb aldc aldd alde aldf aldg aldh aldi aldj aldk aldl aldm aldn aldo aldp +aldq aldr alds aldt aldu aldv aldw aldx aldy aldz alea aleb alec aled alee +alef aleg aleh alei alej alek alel alem alen aleo alep aleq aler ales alet +aleu alev alew alex aley alez alfa alfb alfc alfd alfe alff alfg alfh alfi +alfj alfk alfl alfm alfn alfo alfp alfq alfr alfs alft alfu alfv alfw alfx +alfy alfz alga algb algc algd alge algf algg algh algi algj algk algl algm +algn algo algp algq algr algs algt algu algv algw algx algy algz alha alhb +alhc alhd alhe alhf alhg alhh alhi alhj alhk alhl alhm alhn alho alhp alhq +alhr alhs alht alhu alhv alhw alhx alhy alhz alia alib alic alid alie alif +alig alih alii alij alik alil alim alin alio alip aliq alir alis alit aliu +aliv aliw alix aliy aliz alja aljb aljc aljd alje aljf aljg aljh alji aljj +aljk aljl aljm aljn aljo aljp aljq aljr aljs aljt alju aljv aljw aljx aljy +aljz alka alkb alkc alkd alke alkf alkg alkh alki alkj alkk alkl alkm alkn +alko alkp alkq alkr alks alkt alku alkv alkw alkx alky alkz alla allb allc +alld alle allf allg allh alli allj allk alll allm alln allo allp allq allr +alls allt allu allv allw allx ally allz alma almb almc almd alme almf almg +almh almi almj almk alml almm almn almo almp almq almr alms almt almu almv +almw almx almy almz alna alnb alnc alnd alne alnf alng alnh alni alnj alnk +alnl alnm alnn alno alnp alnq alnr alns alnt alnu alnv alnw alnx alny alnz +aloa alob aloc alod aloe alof alog aloh aloi aloj alok alol alom alon aloo +alop aloq alor alos alot alou alov alow alox aloy aloz alpa alpb alpc alpd +alpe alpf alpg alph alpi alpj alpk alpl alpm alpn alpo alpp alpq alpr alps +alpt alpu alpv alpw alpx alpy alpz alqa alqb alqc alqd alqe alqf alqg alqh +alqi alqj alqk alql alqm alqn alqo alqp alqq alqr alqs alqt alqu alqv alqw +alqx alqy alqz alra alrb alrc alrd alre alrf alrg alrh alri alrj alrk alrl +alrm alrn alro alrp alrq alrr alrs alrt alru alrv alrw alrx alry alrz alsa +alsb alsc alsd alse alsf alsg alsh alsi alsj alsk alsl alsm alsn also alsp +alsq alsr alss alst alsu alsv alsw alsx alsy alsz alta altb altc altd alte +altf altg alth alti altj altk altl altm altn alto altp altq altr alts altt +altu altv altw altx alty altz alua alub aluc alud alue aluf alug aluh alui +aluj aluk alul alum alun aluo alup aluq alur alus alut aluu aluv aluw alux +aluy aluz alva alvb alvc alvd alve alvf alvg alvh alvi alvj alvk alvl alvm +alvn alvo alvp alvq alvr alvs alvt alvu alvv alvw alvx alvy alvz alwa alwb +alwc alwd alwe alwf alwg alwh alwi alwj alwk alwl alwm alwn alwo alwp alwq +alwr alws alwt alwu alwv alww alwx alwy alwz alxa alxb alxc alxd alxe alxf +alxg alxh alxi alxj alxk alxl alxm alxn alxo alxp alxq alxr alxs alxt alxu +alxv alxw alxx alxy alxz alya alyb alyc alyd alye alyf alyg alyh alyi alyj +alyk alyl alym alyn alyo alyp alyq alyr alys alyt alyu alyv alyw alyx alyy +alyz alza alzb alzc alzd alze alzf alzg alzh alzi alzj alzk alzl alzm alzn +alzo alzp alzq alzr alzs alzt alzu alzv alzw alzx alzy alzz amaa amab amac +amad amae amaf amag amah amai amaj amak amal amam aman amao amap amaq amar +amas amat amau amav amaw amax amay amaz amba ambb ambc ambd ambe ambf ambg +ambh ambi ambj ambk ambl ambm ambn ambo ambp ambq ambr ambs ambt ambu ambv +ambw ambx amby ambz amca amcb amcc amcd amce amcf amcg amch amci amcj amck +amcl amcm amcn amco amcp amcq amcr amcs amct amcu amcv amcw amcx amcy amcz +amda amdb amdc amdd amde amdf amdg amdh amdi amdj amdk amdl amdm amdn amdo +amdp amdq amdr amds amdt amdu amdv amdw amdx amdy amdz amea ameb amec amed +amee amef ameg ameh amei amej amek amel amem amen ameo amep ameq amer ames +amet ameu amev amew amex amey amez amfa amfb amfc amfd amfe amff amfg amfh +amfi amfj amfk amfl amfm amfn amfo amfp amfq amfr amfs amft amfu amfv amfw +amfx amfy amfz amga amgb amgc amgd amge amgf amgg amgh amgi amgj amgk amgl +amgm amgn amgo amgp amgq amgr amgs amgt amgu amgv amgw amgx amgy amgz amha +amhb amhc amhd amhe amhf amhg amhh amhi amhj amhk amhl amhm amhn amho amhp +amhq amhr amhs amht amhu amhv amhw amhx amhy amhz amia amib amic amid amie +amif amig amih amii amij amik amil amim amin amio amip amiq amir amis amit +amiu amiv amiw amix amiy amiz amja amjb amjc amjd amje amjf amjg amjh amji +amjj amjk amjl amjm amjn amjo amjp amjq amjr amjs amjt amju amjv amjw amjx +amjy amjz amka amkb amkc amkd amke amkf amkg amkh amki amkj amkk amkl amkm +amkn amko amkp amkq amkr amks amkt amku amkv amkw amkx amky amkz amla amlb +amlc amld amle amlf amlg amlh amli amlj amlk amll amlm amln amlo amlp amlq +amlr amls amlt amlu amlv amlw amlx amly amlz amma ammb ammc ammd amme ammf +ammg ammh ammi ammj ammk amml ammm ammn ammo ammp ammq ammr amms ammt ammu +ammv ammw ammx ammy ammz amna amnb amnc amnd amne amnf amng amnh amni amnj +amnk amnl amnm amnn amno amnp amnq amnr amns amnt amnu amnv amnw amnx amny +amnz amoa amob amoc amod amoe amof amog amoh amoi amoj amok amol amom amon +amoo amop amoq amor amos amot amou amov amow amox amoy amoz ampa ampb ampc +ampd ampe ampf ampg amph ampi ampj ampk ampl ampm ampn ampo ampp ampq ampr +amps ampt ampu ampv ampw ampx ampy ampz amqa amqb amqc amqd amqe amqf amqg +amqh amqi amqj amqk amql amqm amqn amqo amqp amqq amqr amqs amqt amqu amqv +amqw amqx amqy amqz amra amrb amrc amrd amre amrf amrg amrh amri amrj amrk +amrl amrm amrn amro amrp amrq amrr amrs amrt amru amrv amrw amrx amry amrz +amsa amsb amsc amsd amse amsf amsg amsh amsi amsj amsk amsl amsm amsn amso +amsp amsq amsr amss amst amsu amsv amsw amsx amsy amsz amta amtb amtc amtd +amte amtf amtg amth amti amtj amtk amtl amtm amtn amto amtp amtq amtr amts +amtt amtu amtv amtw amtx amty amtz amua amub amuc amud amue amuf amug amuh +amui amuj amuk amul amum amun amuo amup amuq amur amus amut amuu amuv amuw +amux amuy amuz amva amvb amvc amvd amve amvf amvg amvh amvi amvj amvk amvl +amvm amvn amvo amvp amvq amvr amvs amvt amvu amvv amvw amvx amvy amvz amwa +amwb amwc amwd amwe amwf amwg amwh amwi amwj amwk amwl amwm amwn amwo amwp +amwq amwr amws amwt amwu amwv amww amwx amwy amwz amxa amxb amxc amxd amxe +amxf amxg amxh amxi amxj amxk amxl amxm amxn amxo amxp amxq amxr amxs amxt +amxu amxv amxw amxx amxy amxz amya amyb amyc amyd amye amyf amyg amyh amyi +amyj amyk amyl amym amyn amyo amyp amyq amyr amys amyt amyu amyv amyw amyx +amyy amyz amza amzb amzc amzd amze amzf amzg amzh amzi amzj amzk amzl amzm +amzn amzo amzp amzq amzr amzs amzt amzu amzv amzw amzx amzy amzz anaa anab +anac anad anae anaf anag anah anai anaj anak anal anam anan anao anap anaq +anar anas anat anau anav anaw anax anay anaz anba anbb anbc anbd anbe anbf +anbg anbh anbi anbj anbk anbl anbm anbn anbo anbp anbq anbr anbs anbt anbu +anbv anbw anbx anby anbz anca ancb ancc ancd ance ancf ancg anch anci ancj +anck ancl ancm ancn anco ancp ancq ancr ancs anct ancu ancv ancw ancx ancy +ancz anda andb andc andd ande andf andg andh andi andj andk andl andm andn +ando andp andq andr ands andt andu andv andw andx andy andz anea aneb anec +aned anee anef aneg aneh anei anej anek anel anem anen aneo anep aneq aner +anes anet aneu anev anew anex aney anez anfa anfb anfc anfd anfe anff anfg +anfh anfi anfj anfk anfl anfm anfn anfo anfp anfq anfr anfs anft anfu anfv +anfw anfx anfy anfz anga angb angc angd ange angf angg angh angi angj angk +angl angm angn ango angp angq angr angs angt angu angv angw angx angy angz +anha anhb anhc anhd anhe anhf anhg anhh anhi anhj anhk anhl anhm anhn anho +anhp anhq anhr anhs anht anhu anhv anhw anhx anhy anhz ania anib anic anid +anie anif anig anih anii anij anik anil anim anin anio anip aniq anir anis +anit aniu aniv aniw anix aniy aniz anja anjb anjc anjd anje anjf anjg anjh +anji anjj anjk anjl anjm anjn anjo anjp anjq anjr anjs anjt anju anjv anjw +anjx anjy anjz anka ankb ankc ankd anke ankf ankg ankh anki ankj ankk ankl +ankm ankn anko ankp ankq ankr anks ankt anku ankv ankw ankx anky ankz anla +anlb anlc anld anle anlf anlg anlh anli anlj anlk anll anlm anln anlo anlp +anlq anlr anls anlt anlu anlv anlw anlx anly anlz anma anmb anmc anmd anme +anmf anmg anmh anmi anmj anmk anml anmm anmn anmo anmp anmq anmr anms anmt +anmu anmv anmw anmx anmy anmz anna annb annc annd anne annf anng annh anni +annj annk annl annm annn anno annp annq annr anns annt annu annv annw annx +anny annz anoa anob anoc anod anoe anof anog anoh anoi anoj anok anol anom +anon anoo anop anoq anor anos anot anou anov anow anox anoy anoz anpa anpb +anpc anpd anpe anpf anpg anph anpi anpj anpk anpl anpm anpn anpo anpp anpq +anpr anps anpt anpu anpv anpw anpx anpy anpz anqa anqb anqc anqd anqe anqf +anqg anqh anqi anqj anqk anql anqm anqn anqo anqp anqq anqr anqs anqt anqu +anqv anqw anqx anqy anqz anra anrb anrc anrd anre anrf anrg anrh anri anrj +anrk anrl anrm anrn anro anrp anrq anrr anrs anrt anru anrv anrw anrx anry +anrz ansa ansb ansc ansd anse ansf ansg ansh ansi ansj ansk ansl ansm ansn +anso ansp ansq ansr anss anst ansu ansv answ ansx ansy ansz anta antb antc +antd ante antf antg anth anti antj antk antl antm antn anto antp antq antr +ants antt antu antv antw antx anty antz anua anub anuc anud anue anuf anug +anuh anui anuj anuk anul anum anun anuo anup anuq anur anus anut anuu anuv +anuw anux anuy anuz anva anvb anvc anvd anve anvf anvg anvh anvi anvj anvk +anvl anvm anvn anvo anvp anvq anvr anvs anvt anvu anvv anvw anvx anvy anvz +anwa anwb anwc anwd anwe anwf anwg anwh anwi anwj anwk anwl anwm anwn anwo +anwp anwq anwr anws anwt anwu anwv anww anwx anwy anwz anxa anxb anxc anxd +anxe anxf anxg anxh anxi anxj anxk anxl anxm anxn anxo anxp anxq anxr anxs +anxt anxu anxv anxw anxx anxy anxz anya anyb anyc anyd anye anyf anyg anyh +anyi anyj anyk anyl anym anyn anyo anyp anyq anyr anys anyt anyu anyv anyw +anyx anyy anyz anza anzb anzc anzd anze anzf anzg anzh anzi anzj anzk anzl +anzm anzn anzo anzp anzq anzr anzs anzt anzu anzv anzw anzx anzy anzz aoaa +aoab aoac aoad aoae aoaf aoag aoah aoai aoaj aoak aoal aoam aoan aoao aoap +aoaq aoar aoas aoat aoau aoav aoaw aoax aoay aoaz aoba aobb aobc aobd aobe +aobf aobg aobh aobi aobj aobk aobl aobm aobn aobo aobp aobq aobr aobs aobt +aobu aobv aobw aobx aoby aobz aoca aocb aocc aocd aoce aocf aocg aoch aoci +aocj aock aocl aocm aocn aoco aocp aocq aocr aocs aoct aocu aocv aocw aocx +aocy aocz aoda aodb aodc aodd aode aodf aodg aodh aodi aodj aodk aodl aodm +aodn aodo aodp aodq aodr aods aodt aodu aodv aodw aodx aody aodz aoea aoeb +aoec aoed aoee aoef aoeg aoeh aoei aoej aoek aoel aoem aoen aoeo aoep aoeq +aoer aoes aoet aoeu aoev aoew aoex aoey aoez aofa aofb aofc aofd aofe aoff +aofg aofh aofi aofj aofk aofl aofm aofn aofo aofp aofq aofr aofs aoft aofu +aofv aofw aofx aofy aofz aoga aogb aogc aogd aoge aogf aogg aogh aogi aogj +aogk aogl aogm aogn aogo aogp aogq aogr aogs aogt aogu aogv aogw aogx aogy +aogz aoha aohb aohc aohd aohe aohf aohg aohh aohi aohj aohk aohl aohm aohn +aoho aohp aohq aohr aohs aoht aohu aohv aohw aohx aohy aohz aoia aoib aoic +aoid aoie aoif aoig aoih aoii aoij aoik aoil aoim aoin aoio aoip aoiq aoir +aois aoit aoiu aoiv aoiw aoix aoiy aoiz aoja aojb aojc aojd aoje aojf aojg +aojh aoji aojj aojk aojl aojm aojn aojo aojp aojq aojr aojs aojt aoju aojv +aojw aojx aojy aojz aoka aokb aokc aokd aoke aokf aokg aokh aoki aokj aokk +aokl aokm aokn aoko aokp aokq aokr aoks aokt aoku aokv aokw aokx aoky aokz +aola aolb aolc aold aole aolf aolg aolh aoli aolj aolk aoll aolm aoln aolo +aolp aolq aolr aols aolt aolu aolv aolw aolx aoly aolz aoma aomb aomc aomd +aome aomf aomg aomh aomi aomj aomk aoml aomm aomn aomo aomp aomq aomr aoms +aomt aomu aomv aomw aomx aomy aomz aona aonb aonc aond aone aonf aong aonh +aoni aonj aonk aonl aonm aonn aono aonp aonq aonr aons aont aonu aonv aonw +aonx aony aonz aooa aoob aooc aood aooe aoof aoog aooh aooi aooj aook aool +aoom aoon aooo aoop aooq aoor aoos aoot aoou aoov aoow aoox aooy aooz aopa +aopb aopc aopd aope aopf aopg aoph aopi aopj aopk aopl aopm aopn aopo aopp +aopq aopr aops aopt aopu aopv aopw aopx aopy aopz aoqa aoqb aoqc aoqd aoqe +aoqf aoqg aoqh aoqi aoqj aoqk aoql aoqm aoqn aoqo aoqp aoqq aoqr aoqs aoqt +aoqu aoqv aoqw aoqx aoqy aoqz aora aorb aorc aord aore aorf aorg aorh aori +aorj aork aorl aorm aorn aoro aorp aorq aorr aors aort aoru aorv aorw aorx +aory aorz aosa aosb aosc aosd aose aosf aosg aosh aosi aosj aosk aosl aosm +aosn aoso aosp aosq aosr aoss aost aosu aosv aosw aosx aosy aosz aota aotb +aotc aotd aote aotf aotg aoth aoti aotj aotk aotl aotm aotn aoto aotp aotq +aotr aots aott aotu aotv aotw aotx aoty aotz aoua aoub aouc aoud aoue aouf +aoug aouh aoui aouj aouk aoul aoum aoun aouo aoup aouq aour aous aout aouu +aouv aouw aoux aouy aouz aova aovb aovc aovd aove aovf aovg aovh aovi aovj +aovk aovl aovm aovn aovo aovp aovq aovr aovs aovt aovu aovv aovw aovx aovy +aovz aowa aowb aowc aowd aowe aowf aowg aowh aowi aowj aowk aowl aowm aown +aowo aowp aowq aowr aows aowt aowu aowv aoww aowx aowy aowz aoxa aoxb aoxc +aoxd aoxe aoxf aoxg aoxh aoxi aoxj aoxk aoxl aoxm aoxn aoxo aoxp aoxq aoxr +aoxs aoxt aoxu aoxv aoxw aoxx aoxy aoxz aoya aoyb aoyc aoyd aoye aoyf aoyg +aoyh aoyi aoyj aoyk aoyl aoym aoyn aoyo aoyp aoyq aoyr aoys aoyt aoyu aoyv +aoyw aoyx aoyy aoyz aoza aozb aozc aozd aoze aozf aozg aozh aozi aozj aozk +aozl aozm aozn aozo aozp aozq aozr aozs aozt aozu aozv aozw aozx aozy aozz +apaa apab apac apad apae apaf apag apah apai apaj apak apal apam apan apao +apap apaq apar apas apat apau apav apaw apax apay apaz apba apbb apbc apbd +apbe apbf apbg apbh apbi apbj apbk apbl apbm apbn apbo apbp apbq apbr apbs +apbt apbu apbv apbw apbx apby apbz apca apcb apcc apcd apce apcf apcg apch +apci apcj apck apcl apcm apcn apco apcp apcq apcr apcs apct apcu apcv apcw +apcx apcy apcz apda apdb apdc apdd apde apdf apdg apdh apdi apdj apdk apdl +apdm apdn apdo apdp apdq apdr apds apdt apdu apdv apdw apdx apdy apdz apea +apeb apec aped apee apef apeg apeh apei apej apek apel apem apen apeo apep +apeq aper apes apet apeu apev apew apex apey apez apfa apfb apfc apfd apfe +apff apfg apfh apfi apfj apfk apfl apfm apfn apfo apfp apfq apfr apfs apft +apfu apfv apfw apfx apfy apfz apga apgb apgc apgd apge apgf apgg apgh apgi +apgj apgk apgl apgm apgn apgo apgp apgq apgr apgs apgt apgu apgv apgw apgx +apgy apgz apha aphb aphc aphd aphe aphf aphg aphh aphi aphj aphk aphl aphm +aphn apho aphp aphq aphr aphs apht aphu aphv aphw aphx aphy aphz apia apib +apic apid apie apif apig apih apii apij apik apil apim apin apio apip apiq +apir apis apit apiu apiv apiw apix apiy apiz apja apjb apjc apjd apje apjf +apjg apjh apji apjj apjk apjl apjm apjn apjo apjp apjq apjr apjs apjt apju +apjv apjw apjx apjy apjz apka apkb apkc apkd apke apkf apkg apkh apki apkj +apkk apkl apkm apkn apko apkp apkq apkr apks apkt apku apkv apkw apkx apky +apkz apla aplb aplc apld aple aplf aplg aplh apli aplj aplk apll aplm apln +aplo aplp aplq aplr apls aplt aplu aplv aplw aplx aply aplz apma apmb apmc +apmd apme apmf apmg apmh apmi apmj apmk apml apmm apmn apmo apmp apmq apmr +apms apmt apmu apmv apmw apmx apmy apmz apna apnb apnc apnd apne apnf apng +apnh apni apnj apnk apnl apnm apnn apno apnp apnq apnr apns apnt apnu apnv +apnw apnx apny apnz apoa apob apoc apod apoe apof apog apoh apoi apoj apok +apol apom apon apoo apop apoq apor apos apot apou apov apow apox apoy apoz +appa appb appc appd appe appf appg apph appi appj appk appl appm appn appo +appp appq appr apps appt appu appv appw appx appy appz apqa apqb apqc apqd +apqe apqf apqg apqh apqi apqj apqk apql apqm apqn apqo apqp apqq apqr apqs +apqt apqu apqv apqw apqx apqy apqz apra aprb aprc aprd apre aprf aprg aprh +apri aprj aprk aprl aprm aprn apro aprp aprq aprr aprs aprt apru aprv aprw +aprx apry aprz apsa apsb apsc apsd apse apsf apsg apsh apsi apsj apsk apsl +apsm apsn apso apsp apsq apsr apss apst apsu apsv apsw apsx apsy apsz apta +aptb aptc aptd apte aptf aptg apth apti aptj aptk aptl aptm aptn apto aptp +aptq aptr apts aptt aptu aptv aptw aptx apty aptz apua apub apuc apud apue +apuf apug apuh apui apuj apuk apul apum apun apuo apup apuq apur apus aput +apuu apuv apuw apux apuy apuz apva apvb apvc apvd apve apvf apvg apvh apvi +apvj apvk apvl apvm apvn apvo apvp apvq apvr apvs apvt apvu apvv apvw apvx +apvy apvz apwa apwb apwc apwd apwe apwf apwg apwh apwi apwj apwk apwl apwm +apwn apwo apwp apwq apwr apws apwt apwu apwv apww apwx apwy apwz apxa apxb +apxc apxd apxe apxf apxg apxh apxi apxj apxk apxl apxm apxn apxo apxp apxq +apxr apxs apxt apxu apxv apxw apxx apxy apxz apya apyb apyc apyd apye apyf +apyg apyh apyi apyj apyk apyl apym apyn apyo apyp apyq apyr apys apyt apyu +apyv apyw apyx apyy apyz apza apzb apzc apzd apze apzf apzg apzh apzi apzj +apzk apzl apzm apzn apzo apzp apzq apzr apzs apzt apzu apzv apzw apzx apzy +apzz aqaa aqab aqac aqad aqae aqaf aqag aqah aqai aqaj aqak aqal aqam aqan +aqao aqap aqaq aqar aqas aqat aqau aqav aqaw aqax aqay aqaz aqba aqbb aqbc +aqbd aqbe aqbf aqbg aqbh aqbi aqbj aqbk aqbl aqbm aqbn aqbo aqbp aqbq aqbr +aqbs aqbt aqbu aqbv aqbw aqbx aqby aqbz aqca aqcb aqcc aqcd aqce aqcf aqcg +aqch aqci aqcj aqck aqcl aqcm aqcn aqco aqcp aqcq aqcr aqcs aqct aqcu aqcv +aqcw aqcx aqcy aqcz aqda aqdb aqdc aqdd aqde aqdf aqdg aqdh aqdi aqdj aqdk +aqdl aqdm aqdn aqdo aqdp aqdq aqdr aqds aqdt aqdu aqdv aqdw aqdx aqdy aqdz +aqea aqeb aqec aqed aqee aqef aqeg aqeh aqei aqej aqek aqel aqem aqen aqeo +aqep aqeq aqer aqes aqet aqeu aqev aqew aqex aqey aqez aqfa aqfb aqfc aqfd +aqfe aqff aqfg aqfh aqfi aqfj aqfk aqfl aqfm aqfn aqfo aqfp aqfq aqfr aqfs +aqft aqfu aqfv aqfw aqfx aqfy aqfz aqga aqgb aqgc aqgd aqge aqgf aqgg aqgh +aqgi aqgj aqgk aqgl aqgm aqgn aqgo aqgp aqgq aqgr aqgs aqgt aqgu aqgv aqgw +aqgx aqgy aqgz aqha aqhb aqhc aqhd aqhe aqhf aqhg aqhh aqhi aqhj aqhk aqhl +aqhm aqhn aqho aqhp aqhq aqhr aqhs aqht aqhu aqhv aqhw aqhx aqhy aqhz aqia +aqib aqic aqid aqie aqif aqig aqih aqii aqij aqik aqil aqim aqin aqio aqip +aqiq aqir aqis aqit aqiu aqiv aqiw aqix aqiy aqiz aqja aqjb aqjc aqjd aqje +aqjf aqjg aqjh aqji aqjj aqjk aqjl aqjm aqjn aqjo aqjp aqjq aqjr aqjs aqjt +aqju aqjv aqjw aqjx aqjy aqjz aqka aqkb aqkc aqkd aqke aqkf aqkg aqkh aqki +aqkj aqkk aqkl aqkm aqkn aqko aqkp aqkq aqkr aqks aqkt aqku aqkv aqkw aqkx +aqky aqkz aqla aqlb aqlc aqld aqle aqlf aqlg aqlh aqli aqlj aqlk aqll aqlm +aqln aqlo aqlp aqlq aqlr aqls aqlt aqlu aqlv aqlw aqlx aqly aqlz aqma aqmb +aqmc aqmd aqme aqmf aqmg aqmh aqmi aqmj aqmk aqml aqmm aqmn aqmo aqmp aqmq +aqmr aqms aqmt aqmu aqmv aqmw aqmx aqmy aqmz aqna aqnb aqnc aqnd aqne aqnf +aqng aqnh aqni aqnj aqnk aqnl aqnm aqnn aqno aqnp aqnq aqnr aqns aqnt aqnu +aqnv aqnw aqnx aqny aqnz aqoa aqob aqoc aqod aqoe aqof aqog aqoh aqoi aqoj +aqok aqol aqom aqon aqoo aqop aqoq aqor aqos aqot aqou aqov aqow aqox aqoy +aqoz aqpa aqpb aqpc aqpd aqpe aqpf aqpg aqph aqpi aqpj aqpk aqpl aqpm aqpn +aqpo aqpp aqpq aqpr aqps aqpt aqpu aqpv aqpw aqpx aqpy aqpz aqqa aqqb aqqc +aqqd aqqe aqqf aqqg aqqh aqqi aqqj aqqk aqql aqqm aqqn aqqo aqqp aqqq aqqr +aqqs aqqt aqqu aqqv aqqw aqqx aqqy aqqz aqra aqrb aqrc aqrd aqre aqrf aqrg +aqrh aqri aqrj aqrk aqrl aqrm aqrn aqro aqrp aqrq aqrr aqrs aqrt aqru aqrv +aqrw aqrx aqry aqrz aqsa aqsb aqsc aqsd aqse aqsf aqsg aqsh aqsi aqsj aqsk +aqsl aqsm aqsn aqso aqsp aqsq aqsr aqss aqst aqsu aqsv aqsw aqsx aqsy aqsz +aqta aqtb aqtc aqtd aqte aqtf aqtg aqth aqti aqtj aqtk aqtl aqtm aqtn aqto +aqtp aqtq aqtr aqts aqtt aqtu aqtv aqtw aqtx aqty aqtz aqua aqub aquc aqud +aque aquf aqug aquh aqui aquj aquk aqul aqum aqun aquo aqup aquq aqur aqus +aqut aquu aquv aquw aqux aquy aquz aqva aqvb aqvc aqvd aqve aqvf aqvg aqvh +aqvi aqvj aqvk aqvl aqvm aqvn aqvo aqvp aqvq aqvr aqvs aqvt aqvu aqvv aqvw +aqvx aqvy aqvz aqwa aqwb aqwc aqwd aqwe aqwf aqwg aqwh aqwi aqwj aqwk aqwl +aqwm aqwn aqwo aqwp aqwq aqwr aqws aqwt aqwu aqwv aqww aqwx aqwy aqwz aqxa +aqxb aqxc aqxd aqxe aqxf aqxg aqxh aqxi aqxj aqxk aqxl aqxm aqxn aqxo aqxp +aqxq aqxr aqxs aqxt aqxu aqxv aqxw aqxx aqxy aqxz aqya aqyb aqyc aqyd aqye +aqyf aqyg aqyh aqyi aqyj aqyk aqyl aqym aqyn aqyo aqyp aqyq aqyr aqys aqyt +aqyu aqyv aqyw aqyx aqyy aqyz aqza aqzb aqzc aqzd aqze aqzf aqzg aqzh aqzi +aqzj aqzk aqzl aqzm aqzn aqzo aqzp aqzq aqzr aqzs aqzt aqzu aqzv aqzw aqzx +aqzy aqzz araa arab arac arad arae araf arag arah arai araj arak aral aram +aran arao arap araq arar aras arat arau arav araw arax aray araz arba arbb +arbc arbd arbe arbf arbg arbh arbi arbj arbk arbl arbm arbn arbo arbp arbq +arbr arbs arbt arbu arbv arbw arbx arby arbz arca arcb arcc arcd arce arcf +arcg arch arci arcj arck arcl arcm arcn arco arcp arcq arcr arcs arct arcu +arcv arcw arcx arcy arcz arda ardb ardc ardd arde ardf ardg ardh ardi ardj +ardk ardl ardm ardn ardo ardp ardq ardr ards ardt ardu ardv ardw ardx ardy +ardz area areb arec ared aree aref areg areh arei arej arek arel arem aren +areo arep areq arer ares aret areu arev arew arex arey arez arfa arfb arfc +arfd arfe arff arfg arfh arfi arfj arfk arfl arfm arfn arfo arfp arfq arfr +arfs arft arfu arfv arfw arfx arfy arfz arga argb argc argd arge argf argg +argh argi argj argk argl argm argn argo argp argq argr args argt argu argv +argw argx argy argz arha arhb arhc arhd arhe arhf arhg arhh arhi arhj arhk +arhl arhm arhn arho arhp arhq arhr arhs arht arhu arhv arhw arhx arhy arhz +aria arib aric arid arie arif arig arih arii arij arik aril arim arin ario +arip ariq arir aris arit ariu ariv ariw arix ariy ariz arja arjb arjc arjd +arje arjf arjg arjh arji arjj arjk arjl arjm arjn arjo arjp arjq arjr arjs +arjt arju arjv arjw arjx arjy arjz arka arkb arkc arkd arke arkf arkg arkh +arki arkj arkk arkl arkm arkn arko arkp arkq arkr arks arkt arku arkv arkw +arkx arky arkz arla arlb arlc arld arle arlf arlg arlh arli arlj arlk arll +arlm arln arlo arlp arlq arlr arls arlt arlu arlv arlw arlx arly arlz arma +armb armc armd arme armf armg armh armi armj armk arml armm armn armo armp +armq armr arms armt armu armv armw armx army armz arna arnb arnc arnd arne +arnf arng arnh arni arnj arnk arnl arnm arnn arno arnp arnq arnr arns arnt +arnu arnv arnw arnx arny arnz aroa arob aroc arod aroe arof arog aroh aroi +aroj arok arol arom aron aroo arop aroq aror aros arot arou arov arow arox +aroy aroz arpa arpb arpc arpd arpe arpf arpg arph arpi arpj arpk arpl arpm +arpn arpo arpp arpq arpr arps arpt arpu arpv arpw arpx arpy arpz arqa arqb +arqc arqd arqe arqf arqg arqh arqi arqj arqk arql arqm arqn arqo arqp arqq +arqr arqs arqt arqu arqv arqw arqx arqy arqz arra arrb arrc arrd arre arrf +arrg arrh arri arrj arrk arrl arrm arrn arro arrp arrq arrr arrs arrt arru +arrv arrw arrx arry arrz arsa arsb arsc arsd arse arsf arsg arsh arsi arsj +arsk arsl arsm arsn arso arsp arsq arsr arss arst arsu arsv arsw arsx arsy +arsz arta artb artc artd arte artf artg arth arti artj artk artl artm artn +arto artp artq artr arts artt artu artv artw artx arty artz arua arub aruc +arud arue aruf arug aruh arui aruj aruk arul arum arun aruo arup aruq arur +arus arut aruu aruv aruw arux aruy aruz arva arvb arvc arvd arve arvf arvg +arvh arvi arvj arvk arvl arvm arvn arvo arvp arvq arvr arvs arvt arvu arvv +arvw arvx arvy arvz arwa arwb arwc arwd arwe arwf arwg arwh arwi arwj arwk +arwl arwm arwn arwo arwp arwq arwr arws arwt arwu arwv arww arwx arwy arwz +arxa arxb arxc arxd arxe arxf arxg arxh arxi arxj arxk arxl arxm arxn arxo +arxp arxq arxr arxs arxt arxu arxv arxw arxx arxy arxz arya aryb aryc aryd +arye aryf aryg aryh aryi aryj aryk aryl arym aryn aryo aryp aryq aryr arys +aryt aryu aryv aryw aryx aryy aryz arza arzb arzc arzd arze arzf arzg arzh +arzi arzj arzk arzl arzm arzn arzo arzp arzq arzr arzs arzt arzu arzv arzw +arzx arzy arzz asaa asab asac asad asae asaf asag asah asai asaj asak asal +asam asan asao asap asaq asar asas asat asau asav asaw asax asay asaz asba +asbb asbc asbd asbe asbf asbg asbh asbi asbj asbk asbl asbm asbn asbo asbp +asbq asbr asbs asbt asbu asbv asbw asbx asby asbz asca ascb ascc ascd asce +ascf ascg asch asci ascj asck ascl ascm ascn asco ascp ascq ascr ascs asct +ascu ascv ascw ascx ascy ascz asda asdb asdc asdd asde asdf asdg asdh asdi +asdj asdk asdl asdm asdn asdo asdp asdq asdr asds asdt asdu asdv asdw asdx +asdy asdz asea aseb asec ased asee asef aseg aseh asei asej asek asel asem +asen aseo asep aseq aser ases aset aseu asev asew asex asey asez asfa asfb +asfc asfd asfe asff asfg asfh asfi asfj asfk asfl asfm asfn asfo asfp asfq +asfr asfs asft asfu asfv asfw asfx asfy asfz asga asgb asgc asgd asge asgf +asgg asgh asgi asgj asgk asgl asgm asgn asgo asgp asgq asgr asgs asgt asgu +asgv asgw asgx asgy asgz asha ashb ashc ashd ashe ashf ashg ashh ashi ashj +ashk ashl ashm ashn asho ashp ashq ashr ashs asht ashu ashv ashw ashx ashy +ashz asia asib asic asid asie asif asig asih asii asij asik asil asim asin +asio asip asiq asir asis asit asiu asiv asiw asix asiy asiz asja asjb asjc +asjd asje asjf asjg asjh asji asjj asjk asjl asjm asjn asjo asjp asjq asjr +asjs asjt asju asjv asjw asjx asjy asjz aska askb askc askd aske askf askg +askh aski askj askk askl askm askn asko askp askq askr asks askt asku askv +askw askx asky askz asla aslb aslc asld asle aslf aslg aslh asli aslj aslk +asll aslm asln aslo aslp aslq aslr asls aslt aslu aslv aslw aslx asly aslz +asma asmb asmc asmd asme asmf asmg asmh asmi asmj asmk asml asmm asmn asmo +asmp asmq asmr asms asmt asmu asmv asmw asmx asmy asmz asna asnb asnc asnd +asne asnf asng asnh asni asnj asnk asnl asnm asnn asno asnp asnq asnr asns +asnt asnu asnv asnw asnx asny asnz asoa asob asoc asod asoe asof asog asoh +asoi asoj asok asol asom ason asoo asop asoq asor asos asot asou asov asow +asox asoy asoz aspa aspb aspc aspd aspe aspf aspg asph aspi aspj aspk aspl +aspm aspn aspo aspp aspq aspr asps aspt aspu aspv aspw aspx aspy aspz asqa +asqb asqc asqd asqe asqf asqg asqh asqi asqj asqk asql asqm asqn asqo asqp +asqq asqr asqs asqt asqu asqv asqw asqx asqy asqz asra asrb asrc asrd asre +asrf asrg asrh asri asrj asrk asrl asrm asrn asro asrp asrq asrr asrs asrt +asru asrv asrw asrx asry asrz assa assb assc assd asse assf assg assh assi +assj assk assl assm assn asso assp assq assr asss asst assu assv assw assx +assy assz asta astb astc astd aste astf astg asth asti astj astk astl astm +astn asto astp astq astr asts astt astu astv astw astx asty astz asua asub +asuc asud asue asuf asug asuh asui asuj asuk asul asum asun asuo asup asuq +asur asus asut asuu asuv asuw asux asuy asuz asva asvb asvc asvd asve asvf +asvg asvh asvi asvj asvk asvl asvm asvn asvo asvp asvq asvr asvs asvt asvu +asvv asvw asvx asvy asvz aswa aswb aswc aswd aswe aswf aswg aswh aswi aswj +aswk aswl aswm aswn aswo aswp aswq aswr asws aswt aswu aswv asww aswx aswy +aswz asxa asxb asxc asxd asxe asxf asxg asxh asxi asxj asxk asxl asxm asxn +asxo asxp asxq asxr asxs asxt asxu asxv asxw asxx asxy asxz asya asyb asyc +asyd asye asyf asyg asyh asyi asyj asyk asyl asym asyn asyo asyp asyq asyr +asys asyt asyu asyv asyw asyx asyy asyz asza aszb aszc aszd asze aszf aszg +aszh aszi aszj aszk aszl aszm aszn aszo aszp aszq aszr aszs aszt aszu aszv +aszw aszx aszy aszz ataa atab atac atad atae ataf atag atah atai ataj atak +atal atam atan atao atap ataq atar atas atat atau atav ataw atax atay ataz +atba atbb atbc atbd atbe atbf atbg atbh atbi atbj atbk atbl atbm atbn atbo +atbp atbq atbr atbs atbt atbu atbv atbw atbx atby atbz atca atcb atcc atcd +atce atcf atcg atch atci atcj atck atcl atcm atcn atco atcp atcq atcr atcs +atct atcu atcv atcw atcx atcy atcz atda atdb atdc atdd atde atdf atdg atdh +atdi atdj atdk atdl atdm atdn atdo atdp atdq atdr atds atdt atdu atdv atdw +atdx atdy atdz atea ateb atec ated atee atef ateg ateh atei atej atek atel +atem aten ateo atep ateq ater ates atet ateu atev atew atex atey atez atfa +atfb atfc atfd atfe atff atfg atfh atfi atfj atfk atfl atfm atfn atfo atfp +atfq atfr atfs atft atfu atfv atfw atfx atfy atfz atga atgb atgc atgd atge +atgf atgg atgh atgi atgj atgk atgl atgm atgn atgo atgp atgq atgr atgs atgt +atgu atgv atgw atgx atgy atgz atha athb athc athd athe athf athg athh athi +athj athk athl athm athn atho athp athq athr aths atht athu athv athw athx +athy athz atia atib atic atid atie atif atig atih atii atij atik atil atim +atin atio atip atiq atir atis atit atiu ativ atiw atix atiy atiz atja atjb +atjc atjd atje atjf atjg atjh atji atjj atjk atjl atjm atjn atjo atjp atjq +atjr atjs atjt atju atjv atjw atjx atjy atjz atka atkb atkc atkd atke atkf +atkg atkh atki atkj atkk atkl atkm atkn atko atkp atkq atkr atks atkt atku +atkv atkw atkx atky atkz atla atlb atlc atld atle atlf atlg atlh atli atlj +atlk atll atlm atln atlo atlp atlq atlr atls atlt atlu atlv atlw atlx atly +atlz atma atmb atmc atmd atme atmf atmg atmh atmi atmj atmk atml atmm atmn +atmo atmp atmq atmr atms atmt atmu atmv atmw atmx atmy atmz atna atnb atnc +atnd atne atnf atng atnh atni atnj atnk atnl atnm atnn atno atnp atnq atnr +atns atnt atnu atnv atnw atnx atny atnz atoa atob atoc atod atoe atof atog +atoh atoi atoj atok atol atom aton atoo atop atoq ator atos atot atou atov +atow atox atoy atoz atpa atpb atpc atpd atpe atpf atpg atph atpi atpj atpk +atpl atpm atpn atpo atpp atpq atpr atps atpt atpu atpv atpw atpx atpy atpz +atqa atqb atqc atqd atqe atqf atqg atqh atqi atqj atqk atql atqm atqn atqo +atqp atqq atqr atqs atqt atqu atqv atqw atqx atqy atqz atra atrb atrc atrd +atre atrf atrg atrh atri atrj atrk atrl atrm atrn atro atrp atrq atrr atrs +atrt atru atrv atrw atrx atry atrz atsa atsb atsc atsd atse atsf atsg atsh +atsi atsj atsk atsl atsm atsn atso atsp atsq atsr atss atst atsu atsv atsw +atsx atsy atsz atta attb attc attd atte attf attg atth atti attj attk attl +attm attn atto attp attq attr atts attt attu attv attw attx atty attz atua +atub atuc atud atue atuf atug atuh atui atuj atuk atul atum atun atuo atup +atuq atur atus atut atuu atuv atuw atux atuy atuz atva atvb atvc atvd atve +atvf atvg atvh atvi atvj atvk atvl atvm atvn atvo atvp atvq atvr atvs atvt +atvu atvv atvw atvx atvy atvz atwa atwb atwc atwd atwe atwf atwg atwh atwi +atwj atwk atwl atwm atwn atwo atwp atwq atwr atws atwt atwu atwv atww atwx +atwy atwz atxa atxb atxc atxd atxe atxf atxg atxh atxi atxj atxk atxl atxm +atxn atxo atxp atxq atxr atxs atxt atxu atxv atxw atxx atxy atxz atya atyb +atyc atyd atye atyf atyg atyh atyi atyj atyk atyl atym atyn atyo atyp atyq +atyr atys atyt atyu atyv atyw atyx atyy atyz atza atzb atzc atzd atze atzf +atzg atzh atzi atzj atzk atzl atzm atzn atzo atzp atzq atzr atzs atzt atzu +atzv atzw atzx atzy atzz auaa auab auac auad auae auaf auag auah auai auaj +auak aual auam auan auao auap auaq auar auas auat auau auav auaw auax auay +auaz auba aubb aubc aubd aube aubf aubg aubh aubi aubj aubk aubl aubm aubn +aubo aubp aubq aubr aubs aubt aubu aubv aubw aubx auby aubz auca aucb aucc +aucd auce aucf aucg auch auci aucj auck aucl aucm aucn auco aucp aucq aucr +aucs auct aucu aucv aucw aucx aucy aucz auda audb audc audd aude audf audg +audh audi audj audk audl audm audn audo audp audq audr auds audt audu audv +audw audx audy audz auea aueb auec aued auee auef aueg aueh auei auej auek +auel auem auen aueo auep aueq auer aues auet aueu auev auew auex auey auez +aufa aufb aufc aufd aufe auff aufg aufh aufi aufj aufk aufl aufm aufn aufo +aufp aufq aufr aufs auft aufu aufv aufw aufx aufy aufz auga augb augc augd +auge augf augg augh augi augj augk augl augm augn augo augp augq augr augs +augt augu augv augw augx augy augz auha auhb auhc auhd auhe auhf auhg auhh +auhi auhj auhk auhl auhm auhn auho auhp auhq auhr auhs auht auhu auhv auhw +auhx auhy auhz auia auib auic auid auie auif auig auih auii auij auik auil +auim auin auio auip auiq auir auis auit auiu auiv auiw auix auiy auiz auja +aujb aujc aujd auje aujf aujg aujh auji aujj aujk aujl aujm aujn aujo aujp +aujq aujr aujs aujt auju aujv aujw aujx aujy aujz auka aukb aukc aukd auke +aukf aukg aukh auki aukj aukk aukl aukm aukn auko aukp aukq aukr auks aukt +auku aukv aukw aukx auky aukz aula aulb aulc auld aule aulf aulg aulh auli +aulj aulk aull aulm auln aulo aulp aulq aulr auls ault aulu aulv aulw aulx +auly aulz auma aumb aumc aumd aume aumf aumg aumh aumi aumj aumk auml aumm +aumn aumo aump aumq aumr aums aumt aumu aumv aumw aumx aumy aumz auna aunb +aunc aund aune aunf aung aunh auni aunj aunk aunl aunm aunn auno aunp aunq +aunr auns aunt aunu aunv aunw aunx auny aunz auoa auob auoc auod auoe auof +auog auoh auoi auoj auok auol auom auon auoo auop auoq auor auos auot auou +auov auow auox auoy auoz aupa aupb aupc aupd aupe aupf aupg auph aupi aupj +aupk aupl aupm aupn aupo aupp aupq aupr aups aupt aupu aupv aupw aupx aupy +aupz auqa auqb auqc auqd auqe auqf auqg auqh auqi auqj auqk auql auqm auqn +auqo auqp auqq auqr auqs auqt auqu auqv auqw auqx auqy auqz aura aurb aurc +aurd aure aurf aurg aurh auri aurj aurk aurl aurm aurn auro aurp aurq aurr +aurs aurt auru aurv aurw aurx aury aurz ausa ausb ausc ausd ause ausf ausg +aush ausi ausj ausk ausl ausm ausn auso ausp ausq ausr auss aust ausu ausv +ausw ausx ausy ausz auta autb autc autd aute autf autg auth auti autj autk +autl autm autn auto autp autq autr auts autt autu autv autw autx auty autz +auua auub auuc auud auue auuf auug auuh auui auuj auuk auul auum auun auuo +auup auuq auur auus auut auuu auuv auuw auux auuy auuz auva auvb auvc auvd +auve auvf auvg auvh auvi auvj auvk auvl auvm auvn auvo auvp auvq auvr auvs +auvt auvu auvv auvw auvx auvy auvz auwa auwb auwc auwd auwe auwf auwg auwh +auwi auwj auwk auwl auwm auwn auwo auwp auwq auwr auws auwt auwu auwv auww +auwx auwy auwz auxa auxb auxc auxd auxe auxf auxg auxh auxi auxj auxk auxl +auxm auxn auxo auxp auxq auxr auxs auxt auxu auxv auxw auxx auxy auxz auya +auyb auyc auyd auye auyf auyg auyh auyi auyj auyk auyl auym auyn auyo auyp +auyq auyr auys auyt auyu auyv auyw auyx auyy auyz auza auzb auzc auzd auze +auzf auzg auzh auzi auzj auzk auzl auzm auzn auzo auzp auzq auzr auzs auzt +auzu auzv auzw auzx auzy auzz avaa avab avac avad avae avaf avag avah avai +avaj avak aval avam avan avao avap avaq avar avas avat avau avav avaw avax +avay avaz avba avbb avbc avbd avbe avbf avbg avbh avbi avbj avbk avbl avbm +avbn avbo avbp avbq avbr avbs avbt avbu avbv avbw avbx avby avbz avca avcb +avcc avcd avce avcf avcg avch avci avcj avck avcl avcm avcn avco avcp avcq +avcr avcs avct avcu avcv avcw avcx avcy avcz avda avdb avdc avdd avde avdf +avdg avdh avdi avdj avdk avdl avdm avdn avdo avdp avdq avdr avds avdt avdu +avdv avdw avdx avdy avdz avea aveb avec aved avee avef aveg aveh avei avej +avek avel avem aven aveo avep aveq aver aves avet aveu avev avew avex avey +avez avfa avfb avfc avfd avfe avff avfg avfh avfi avfj avfk avfl avfm avfn +avfo avfp avfq avfr avfs avft avfu avfv avfw avfx avfy avfz avga avgb avgc +avgd avge avgf avgg avgh avgi avgj avgk avgl avgm avgn avgo avgp avgq avgr +avgs avgt avgu avgv avgw avgx avgy avgz avha avhb avhc avhd avhe avhf avhg +avhh avhi avhj avhk avhl avhm avhn avho avhp avhq avhr avhs avht avhu avhv +avhw avhx avhy avhz avia avib avic avid avie avif avig avih avii avij avik +avil avim avin avio avip aviq avir avis avit aviu aviv aviw avix aviy aviz +avja avjb avjc avjd avje avjf avjg avjh avji avjj avjk avjl avjm avjn avjo +avjp avjq avjr avjs avjt avju avjv avjw avjx avjy avjz avka avkb avkc avkd +avke avkf avkg avkh avki avkj avkk avkl avkm avkn avko avkp avkq avkr avks +avkt avku avkv avkw avkx avky avkz avla avlb avlc avld avle avlf avlg avlh +avli avlj avlk avll avlm avln avlo avlp avlq avlr avls avlt avlu avlv avlw +avlx avly avlz avma avmb avmc avmd avme avmf avmg avmh avmi avmj avmk avml +avmm avmn avmo avmp avmq avmr avms avmt avmu avmv avmw avmx avmy avmz avna +avnb avnc avnd avne avnf avng avnh avni avnj avnk avnl avnm avnn avno avnp +avnq avnr avns avnt avnu avnv avnw avnx avny avnz avoa avob avoc avod avoe +avof avog avoh avoi avoj avok avol avom avon avoo avop avoq avor avos avot +avou avov avow avox avoy avoz avpa avpb avpc avpd avpe avpf avpg avph avpi +avpj avpk avpl avpm avpn avpo avpp avpq avpr avps avpt avpu avpv avpw avpx +avpy avpz avqa avqb avqc avqd avqe avqf avqg avqh avqi avqj avqk avql avqm +avqn avqo avqp avqq avqr avqs avqt avqu avqv avqw avqx avqy avqz avra avrb +avrc avrd avre avrf avrg avrh avri avrj avrk avrl avrm avrn avro avrp avrq +avrr avrs avrt avru avrv avrw avrx avry avrz avsa avsb avsc avsd avse avsf +avsg avsh avsi avsj avsk avsl avsm avsn avso avsp avsq avsr avss avst avsu +avsv avsw avsx avsy avsz avta avtb avtc avtd avte avtf avtg avth avti avtj +avtk avtl avtm avtn avto avtp avtq avtr avts avtt avtu avtv avtw avtx avty +avtz avua avub avuc avud avue avuf avug avuh avui avuj avuk avul avum avun +avuo avup avuq avur avus avut avuu avuv avuw avux avuy avuz avva avvb avvc +avvd avve avvf avvg avvh avvi avvj avvk avvl avvm avvn avvo avvp avvq avvr +avvs avvt avvu avvv avvw avvx avvy avvz avwa avwb avwc avwd avwe avwf avwg +avwh avwi avwj avwk avwl avwm avwn avwo avwp avwq avwr avws avwt avwu avwv +avww avwx avwy avwz avxa avxb avxc avxd avxe avxf avxg avxh avxi avxj avxk +avxl avxm avxn avxo avxp avxq avxr avxs avxt avxu avxv avxw avxx avxy avxz +avya avyb avyc avyd avye avyf avyg avyh avyi avyj avyk avyl avym avyn avyo +avyp avyq avyr avys avyt avyu avyv avyw avyx avyy avyz avza avzb avzc avzd +avze avzf avzg avzh avzi avzj avzk avzl avzm avzn avzo avzp avzq avzr avzs +avzt avzu avzv avzw avzx avzy avzz awaa awab awac awad awae awaf awag awah +awai awaj awak awal awam awan awao awap awaq awar awas awat awau awav awaw +awax away awaz awba awbb awbc awbd awbe awbf awbg awbh awbi awbj awbk awbl +awbm awbn awbo awbp awbq awbr awbs awbt awbu awbv awbw awbx awby awbz awca +awcb awcc awcd awce awcf awcg awch awci awcj awck awcl awcm awcn awco awcp +awcq awcr awcs awct awcu awcv awcw awcx awcy awcz awda awdb awdc awdd awde +awdf awdg awdh awdi awdj awdk awdl awdm awdn awdo awdp awdq awdr awds awdt +awdu awdv awdw awdx awdy awdz awea aweb awec awed awee awef aweg aweh awei +awej awek awel awem awen aweo awep aweq awer awes awet aweu awev awew awex +awey awez awfa awfb awfc awfd awfe awff awfg awfh awfi awfj awfk awfl awfm +awfn awfo awfp awfq awfr awfs awft awfu awfv awfw awfx awfy awfz awga awgb +awgc awgd awge awgf awgg awgh awgi awgj awgk awgl awgm awgn awgo awgp awgq +awgr awgs awgt awgu awgv awgw awgx awgy awgz awha awhb awhc awhd awhe awhf +awhg awhh awhi awhj awhk awhl awhm awhn awho awhp awhq awhr awhs awht awhu +awhv awhw awhx awhy awhz awia awib awic awid awie awif awig awih awii awij +awik awil awim awin awio awip awiq awir awis awit awiu awiv awiw awix awiy +awiz awja awjb awjc awjd awje awjf awjg awjh awji awjj awjk awjl awjm awjn +awjo awjp awjq awjr awjs awjt awju awjv awjw awjx awjy awjz awka awkb awkc +awkd awke awkf awkg awkh awki awkj awkk awkl awkm awkn awko awkp awkq awkr +awks awkt awku awkv awkw awkx awky awkz awla awlb awlc awld awle awlf awlg +awlh awli awlj awlk awll awlm awln awlo awlp awlq awlr awls awlt awlu awlv +awlw awlx awly awlz awma awmb awmc awmd awme awmf awmg awmh awmi awmj awmk +awml awmm awmn awmo awmp awmq awmr awms awmt awmu awmv awmw awmx awmy awmz +awna awnb awnc awnd awne awnf awng awnh awni awnj awnk awnl awnm awnn awno +awnp awnq awnr awns awnt awnu awnv awnw awnx awny awnz awoa awob awoc awod +awoe awof awog awoh awoi awoj awok awol awom awon awoo awop awoq awor awos +awot awou awov awow awox awoy awoz awpa awpb awpc awpd awpe awpf awpg awph +awpi awpj awpk awpl awpm awpn awpo awpp awpq awpr awps awpt awpu awpv awpw +awpx awpy awpz awqa awqb awqc awqd awqe awqf awqg awqh awqi awqj awqk awql +awqm awqn awqo awqp awqq awqr awqs awqt awqu awqv awqw awqx awqy awqz awra +awrb awrc awrd awre awrf awrg awrh awri awrj awrk awrl awrm awrn awro awrp +awrq awrr awrs awrt awru awrv awrw awrx awry awrz awsa awsb awsc awsd awse +awsf awsg awsh awsi awsj awsk awsl awsm awsn awso awsp awsq awsr awss awst +awsu awsv awsw awsx awsy awsz awta awtb awtc awtd awte awtf awtg awth awti +awtj awtk awtl awtm awtn awto awtp awtq awtr awts awtt awtu awtv awtw awtx +awty awtz awua awub awuc awud awue awuf awug awuh awui awuj awuk awul awum +awun awuo awup awuq awur awus awut awuu awuv awuw awux awuy awuz awva awvb +awvc awvd awve awvf awvg awvh awvi awvj awvk awvl awvm awvn awvo awvp awvq +awvr awvs awvt awvu awvv awvw awvx awvy awvz awwa awwb awwc awwd awwe awwf +awwg awwh awwi awwj awwk awwl awwm awwn awwo awwp awwq awwr awws awwt awwu +awwv awww awwx awwy awwz awxa awxb awxc awxd awxe awxf awxg awxh awxi awxj +awxk awxl awxm awxn awxo awxp awxq awxr awxs awxt awxu awxv awxw awxx awxy +awxz awya awyb awyc awyd awye awyf awyg awyh awyi awyj awyk awyl awym awyn +awyo awyp awyq awyr awys awyt awyu awyv awyw awyx awyy awyz awza awzb awzc +awzd awze awzf awzg awzh awzi awzj awzk awzl awzm awzn awzo awzp awzq awzr +awzs awzt awzu awzv awzw awzx awzy awzz axaa axab axac axad axae axaf axag +axah axai axaj axak axal axam axan axao axap axaq axar axas axat axau axav +axaw axax axay axaz axba axbb axbc axbd axbe axbf axbg axbh axbi axbj axbk +axbl axbm axbn axbo axbp axbq axbr axbs axbt axbu axbv axbw axbx axby axbz +axca axcb axcc axcd axce axcf axcg axch axci axcj axck axcl axcm axcn axco +axcp axcq axcr axcs axct axcu axcv axcw axcx axcy axcz axda axdb axdc axdd +axde axdf axdg axdh axdi axdj axdk axdl axdm axdn axdo axdp axdq axdr axds +axdt axdu axdv axdw axdx axdy axdz axea axeb axec axed axee axef axeg axeh +axei axej axek axel axem axen axeo axep axeq axer axes axet axeu axev axew +axex axey axez axfa axfb axfc axfd axfe axff axfg axfh axfi axfj axfk axfl +axfm axfn axfo axfp axfq axfr axfs axft axfu axfv axfw axfx axfy axfz axga +axgb axgc axgd axge axgf axgg axgh axgi axgj axgk axgl axgm axgn axgo axgp +axgq axgr axgs axgt axgu axgv axgw axgx axgy axgz axha axhb axhc axhd axhe +axhf axhg axhh axhi axhj axhk axhl axhm axhn axho axhp axhq axhr axhs axht +axhu axhv axhw axhx axhy axhz axia axib axic axid axie axif axig axih axii +axij axik axil axim axin axio axip axiq axir axis axit axiu axiv axiw axix +axiy axiz axja axjb axjc axjd axje axjf axjg axjh axji axjj axjk axjl axjm +axjn axjo axjp axjq axjr axjs axjt axju axjv axjw axjx axjy axjz axka axkb +axkc axkd axke axkf axkg axkh axki axkj axkk axkl axkm axkn axko axkp axkq +axkr axks axkt axku axkv axkw axkx axky axkz axla axlb axlc axld axle axlf +axlg axlh axli axlj axlk axll axlm axln axlo axlp axlq axlr axls axlt axlu +axlv axlw axlx axly axlz axma axmb axmc axmd axme axmf axmg axmh axmi axmj +axmk axml axmm axmn axmo axmp axmq axmr axms axmt axmu axmv axmw axmx axmy +axmz axna axnb axnc axnd axne axnf axng axnh axni axnj axnk axnl axnm axnn +axno axnp axnq axnr axns axnt axnu axnv axnw axnx axny axnz axoa axob axoc +axod axoe axof axog axoh axoi axoj axok axol axom axon axoo axop axoq axor +axos axot axou axov axow axox axoy axoz axpa axpb axpc axpd axpe axpf axpg +axph axpi axpj axpk axpl axpm axpn axpo axpp axpq axpr axps axpt axpu axpv +axpw axpx axpy axpz axqa axqb axqc axqd axqe axqf axqg axqh axqi axqj axqk +axql axqm axqn axqo axqp axqq axqr axqs axqt axqu axqv axqw axqx axqy axqz +axra axrb axrc axrd axre axrf axrg axrh axri axrj axrk axrl axrm axrn axro +axrp axrq axrr axrs axrt axru axrv axrw axrx axry axrz axsa axsb axsc axsd +axse axsf axsg axsh axsi axsj axsk axsl axsm axsn axso axsp axsq axsr axss +axst axsu axsv axsw axsx axsy axsz axta axtb axtc axtd axte axtf axtg axth +axti axtj axtk axtl axtm axtn axto axtp axtq axtr axts axtt axtu axtv axtw +axtx axty axtz axua axub axuc axud axue axuf axug axuh axui axuj axuk axul +axum axun axuo axup axuq axur axus axut axuu axuv axuw axux axuy axuz axva +axvb axvc axvd axve axvf axvg axvh axvi axvj axvk axvl axvm axvn axvo axvp +axvq axvr axvs axvt axvu axvv axvw axvx axvy axvz axwa axwb axwc axwd axwe +axwf axwg axwh axwi axwj axwk axwl axwm axwn axwo axwp axwq axwr axws axwt +axwu axwv axww axwx axwy axwz axxa axxb axxc axxd axxe axxf axxg axxh axxi +axxj axxk axxl axxm axxn axxo axxp axxq axxr axxs axxt axxu axxv axxw axxx +axxy axxz axya axyb axyc axyd axye axyf axyg axyh axyi axyj axyk axyl axym +axyn axyo axyp axyq axyr axys axyt axyu axyv axyw axyx axyy axyz axza axzb +axzc axzd axze axzf axzg axzh axzi axzj axzk axzl axzm axzn axzo axzp axzq +axzr axzs axzt axzu axzv axzw axzx axzy axzz ayaa ayab ayac ayad ayae ayaf +ayag ayah ayai ayaj ayak ayal ayam ayan ayao ayap ayaq ayar ayas ayat ayau +ayav ayaw ayax ayay ayaz ayba aybb aybc aybd aybe aybf aybg aybh aybi aybj +aybk aybl aybm aybn aybo aybp aybq aybr aybs aybt aybu aybv aybw aybx ayby +aybz ayca aycb aycc aycd ayce aycf aycg aych ayci aycj ayck aycl aycm aycn +ayco aycp aycq aycr aycs ayct aycu aycv aycw aycx aycy aycz ayda aydb aydc +aydd ayde aydf aydg aydh aydi aydj aydk aydl aydm aydn aydo aydp aydq aydr +ayds aydt aydu aydv aydw aydx aydy aydz ayea ayeb ayec ayed ayee ayef ayeg +ayeh ayei ayej ayek ayel ayem ayen ayeo ayep ayeq ayer ayes ayet ayeu ayev +ayew ayex ayey ayez ayfa ayfb ayfc ayfd ayfe ayff ayfg ayfh ayfi ayfj ayfk +ayfl ayfm ayfn ayfo ayfp ayfq ayfr ayfs ayft ayfu ayfv ayfw ayfx ayfy ayfz +ayga aygb aygc aygd ayge aygf aygg aygh aygi aygj aygk aygl aygm aygn aygo +aygp aygq aygr aygs aygt aygu aygv aygw aygx aygy aygz ayha ayhb ayhc ayhd +ayhe ayhf ayhg ayhh ayhi ayhj ayhk ayhl ayhm ayhn ayho ayhp ayhq ayhr ayhs +ayht ayhu ayhv ayhw ayhx ayhy ayhz ayia ayib ayic ayid ayie ayif ayig ayih +ayii ayij ayik ayil ayim ayin ayio ayip ayiq ayir ayis ayit ayiu ayiv ayiw +ayix ayiy ayiz ayja ayjb ayjc ayjd ayje ayjf ayjg ayjh ayji ayjj ayjk ayjl +ayjm ayjn ayjo ayjp ayjq ayjr ayjs ayjt ayju ayjv ayjw ayjx ayjy ayjz ayka +aykb aykc aykd ayke aykf aykg aykh ayki aykj aykk aykl aykm aykn ayko aykp +aykq aykr ayks aykt ayku aykv aykw aykx ayky aykz ayla aylb aylc ayld ayle +aylf aylg aylh ayli aylj aylk ayll aylm ayln aylo aylp aylq aylr ayls aylt +aylu aylv aylw aylx ayly aylz ayma aymb aymc aymd ayme aymf aymg aymh aymi +aymj aymk ayml aymm aymn aymo aymp aymq aymr ayms aymt aymu aymv aymw aymx +aymy aymz ayna aynb aync aynd ayne aynf ayng aynh ayni aynj aynk aynl aynm +aynn ayno aynp aynq aynr ayns aynt aynu aynv aynw aynx ayny aynz ayoa ayob +ayoc ayod ayoe ayof ayog ayoh ayoi ayoj ayok ayol ayom ayon ayoo ayop ayoq +ayor ayos ayot ayou ayov ayow ayox ayoy ayoz aypa aypb aypc aypd aype aypf +aypg ayph aypi aypj aypk aypl aypm aypn aypo aypp aypq aypr ayps aypt aypu +aypv aypw aypx aypy aypz ayqa ayqb ayqc ayqd ayqe ayqf ayqg ayqh ayqi ayqj +ayqk ayql ayqm ayqn ayqo ayqp ayqq ayqr ayqs ayqt ayqu ayqv ayqw ayqx ayqy +ayqz ayra ayrb ayrc ayrd ayre ayrf ayrg ayrh ayri ayrj ayrk ayrl ayrm ayrn +ayro ayrp ayrq ayrr ayrs ayrt ayru ayrv ayrw ayrx ayry ayrz aysa aysb aysc +aysd ayse aysf aysg aysh aysi aysj aysk aysl aysm aysn ayso aysp aysq aysr +ayss ayst aysu aysv aysw aysx aysy aysz ayta aytb aytc aytd ayte aytf aytg +ayth ayti aytj aytk aytl aytm aytn ayto aytp aytq aytr ayts aytt aytu aytv +aytw aytx ayty aytz ayua ayub ayuc ayud ayue ayuf ayug ayuh ayui ayuj ayuk +ayul ayum ayun ayuo ayup ayuq ayur ayus ayut ayuu ayuv ayuw ayux ayuy ayuz +ayva ayvb ayvc ayvd ayve ayvf ayvg ayvh ayvi ayvj ayvk ayvl ayvm ayvn ayvo +ayvp ayvq ayvr ayvs ayvt ayvu ayvv ayvw ayvx ayvy ayvz aywa aywb aywc aywd +aywe aywf aywg aywh aywi aywj aywk aywl aywm aywn aywo aywp aywq aywr ayws +aywt aywu aywv ayww aywx aywy aywz ayxa ayxb ayxc ayxd ayxe ayxf ayxg ayxh +ayxi ayxj ayxk ayxl ayxm ayxn ayxo ayxp ayxq ayxr ayxs ayxt ayxu ayxv ayxw +ayxx ayxy ayxz ayya ayyb ayyc ayyd ayye ayyf ayyg ayyh ayyi ayyj ayyk ayyl +ayym ayyn ayyo ayyp ayyq ayyr ayys ayyt ayyu ayyv ayyw ayyx ayyy ayyz ayza +ayzb ayzc ayzd ayze ayzf ayzg ayzh ayzi ayzj ayzk ayzl ayzm ayzn ayzo ayzp +ayzq ayzr ayzs ayzt ayzu ayzv ayzw ayzx ayzy ayzz azaa azab azac azad azae +azaf azag azah azai azaj azak azal azam azan azao azap azaq azar azas azat +azau azav azaw azax azay azaz azba azbb azbc azbd azbe azbf azbg azbh azbi +azbj azbk azbl azbm azbn azbo azbp azbq azbr azbs azbt azbu azbv azbw azbx +azby azbz azca azcb azcc azcd azce azcf azcg azch azci azcj azck azcl azcm +azcn azco azcp azcq azcr azcs azct azcu azcv azcw azcx azcy azcz azda azdb +azdc azdd azde azdf azdg azdh azdi azdj azdk azdl azdm azdn azdo azdp azdq +azdr azds azdt azdu azdv azdw azdx azdy azdz azea azeb azec azed azee azef +azeg azeh azei azej azek azel azem azen azeo azep azeq azer azes azet azeu +azev azew azex azey azez azfa azfb azfc azfd azfe azff azfg azfh azfi azfj +azfk azfl azfm azfn azfo azfp azfq azfr azfs azft azfu azfv azfw azfx azfy +azfz azga azgb azgc azgd azge azgf azgg azgh azgi azgj azgk azgl azgm azgn +azgo azgp azgq azgr azgs azgt azgu azgv azgw azgx azgy azgz azha azhb azhc +azhd azhe azhf azhg azhh azhi azhj azhk azhl azhm azhn azho azhp azhq azhr +azhs azht azhu azhv azhw azhx azhy azhz azia azib azic azid azie azif azig +azih azii azij azik azil azim azin azio azip aziq azir azis azit aziu aziv +aziw azix aziy aziz azja azjb azjc azjd azje azjf azjg azjh azji azjj azjk +azjl azjm azjn azjo azjp azjq azjr azjs azjt azju azjv azjw azjx azjy azjz +azka azkb azkc azkd azke azkf azkg azkh azki azkj azkk azkl azkm azkn azko +azkp azkq azkr azks azkt azku azkv azkw azkx azky azkz azla azlb azlc azld +azle azlf azlg azlh azli azlj azlk azll azlm azln azlo azlp azlq azlr azls +azlt azlu azlv azlw azlx azly azlz azma azmb azmc azmd azme azmf azmg azmh +azmi azmj azmk azml azmm azmn azmo azmp azmq azmr azms azmt azmu azmv azmw +azmx azmy azmz azna aznb aznc aznd azne aznf azng aznh azni aznj aznk aznl +aznm aznn azno aznp aznq aznr azns aznt aznu aznv aznw aznx azny aznz azoa +azob azoc azod azoe azof azog azoh azoi azoj azok azol azom azon azoo azop +azoq azor azos azot azou azov azow azox azoy azoz azpa azpb azpc azpd azpe +azpf azpg azph azpi azpj azpk azpl azpm azpn azpo azpp azpq azpr azps azpt +azpu azpv azpw azpx azpy azpz azqa azqb azqc azqd azqe azqf azqg azqh azqi +azqj azqk azql azqm azqn azqo azqp azqq azqr azqs azqt azqu azqv azqw azqx +azqy azqz azra azrb azrc azrd azre azrf azrg azrh azri azrj azrk azrl azrm +azrn azro azrp azrq azrr azrs azrt azru azrv azrw azrx azry azrz azsa azsb +azsc azsd azse azsf azsg azsh azsi azsj azsk azsl azsm azsn azso azsp azsq +azsr azss azst azsu azsv azsw azsx azsy azsz azta aztb aztc aztd azte aztf +aztg azth azti aztj aztk aztl aztm aztn azto aztp aztq aztr azts aztt aztu +aztv aztw aztx azty aztz azua azub azuc azud azue azuf azug azuh azui azuj +azuk azul azum azun azuo azup azuq azur azus azut azuu azuv azuw azux azuy +azuz azva azvb azvc azvd azve azvf azvg azvh azvi azvj azvk azvl azvm azvn +azvo azvp azvq azvr azvs azvt azvu azvv azvw azvx azvy azvz azwa azwb azwc +azwd azwe azwf azwg azwh azwi azwj azwk azwl azwm azwn azwo azwp azwq azwr +azws azwt azwu azwv azww azwx azwy azwz azxa azxb azxc azxd azxe azxf azxg +azxh azxi azxj azxk azxl azxm azxn azxo azxp azxq azxr azxs azxt azxu azxv +azxw azxx azxy azxz azya azyb azyc azyd azye azyf azyg azyh azyi azyj azyk +azyl azym azyn azyo azyp azyq azyr azys azyt azyu azyv azyw azyx azyy azyz +azza azzb azzc azzd azze azzf azzg azzh azzi azzj azzk azzl azzm azzn azzo +azzp azzq azzr azzs azzt azzu azzv azzw azzx azzy azzz baaa baab baac baad +baae baaf baag baah baai baaj baak baal baam baan baao baap baaq baar baas +baat baau baav baaw baax baay baaz baba babb babc babd babe babf babg babh +babi babj babk babl babm babn babo babp babq babr babs babt babu babv babw +babx baby babz baca bacb bacc bacd bace bacf bacg bach baci bacj back bacl +bacm bacn baco bacp bacq bacr bacs bact bacu bacv bacw bacx bacy bacz bada +badb badc badd bade badf badg badh badi badj badk badl badm badn bado badp +badq badr bads badt badu badv badw badx bady badz baea baeb baec baed baee +baef baeg baeh baei baej baek bael baem baen baeo baep baeq baer baes baet +baeu baev baew baex baey baez bafa bafb bafc bafd bafe baff bafg bafh bafi +bafj bafk bafl bafm bafn bafo bafp bafq bafr bafs baft bafu bafv bafw bafx +bafy bafz baga bagb bagc bagd bage bagf bagg bagh bagi bagj bagk bagl bagm +bagn bago bagp bagq bagr bags bagt bagu bagv bagw bagx bagy bagz baha bahb +bahc bahd bahe bahf bahg bahh bahi bahj bahk bahl bahm bahn baho bahp bahq +bahr bahs baht bahu bahv bahw bahx bahy bahz baia baib baic baid baie baif +baig baih baii baij baik bail baim bain baio baip baiq bair bais bait baiu +baiv baiw baix baiy baiz baja bajb bajc bajd baje bajf bajg bajh baji bajj +bajk bajl bajm bajn bajo bajp bajq bajr bajs bajt baju bajv bajw bajx bajy +bajz baka bakb bakc bakd bake bakf bakg bakh baki bakj bakk bakl bakm bakn +bako bakp bakq bakr baks bakt baku bakv bakw bakx baky bakz bala balb balc +bald bale balf balg balh bali balj balk ball balm baln balo balp balq balr +bals balt balu balv balw balx baly balz bama bamb bamc bamd bame bamf bamg +bamh bami bamj bamk baml bamm bamn bamo bamp bamq bamr bams bamt bamu bamv +bamw bamx bamy bamz bana banb banc band bane banf bang banh bani banj bank +banl banm bann bano banp banq banr bans bant banu banv banw banx bany banz +baoa baob baoc baod baoe baof baog baoh baoi baoj baok baol baom baon baoo +baop baoq baor baos baot baou baov baow baox baoy baoz bapa bapb bapc bapd +bape bapf bapg baph bapi bapj bapk bapl bapm bapn bapo bapp bapq bapr baps +bapt bapu bapv bapw bapx bapy bapz baqa baqb baqc baqd baqe baqf baqg baqh +baqi baqj baqk baql baqm baqn baqo baqp baqq baqr baqs baqt baqu baqv baqw +baqx baqy baqz bara barb barc bard bare barf barg barh bari barj bark barl +barm barn baro barp barq barr bars bart baru barv barw barx bary barz basa +basb basc basd base basf basg bash basi basj bask basl basm basn baso basp +basq basr bass bast basu basv basw basx basy basz bata batb batc batd bate +batf batg bath bati batj batk batl batm batn bato batp batq batr bats batt +batu batv batw batx baty batz baua baub bauc baud baue bauf baug bauh baui +bauj bauk baul baum baun bauo baup bauq baur baus baut bauu bauv bauw baux +bauy bauz bava bavb bavc bavd bave bavf bavg bavh bavi bavj bavk bavl bavm +bavn bavo bavp bavq bavr bavs bavt bavu bavv bavw bavx bavy bavz bawa bawb +bawc bawd bawe bawf bawg bawh bawi bawj bawk bawl bawm bawn bawo bawp bawq +bawr baws bawt bawu bawv baww bawx bawy bawz baxa baxb baxc baxd baxe baxf +baxg baxh baxi baxj baxk baxl baxm baxn baxo baxp baxq baxr baxs baxt baxu +baxv baxw baxx baxy baxz baya bayb bayc bayd baye bayf bayg bayh bayi bayj +bayk bayl baym bayn bayo bayp bayq bayr bays bayt bayu bayv bayw bayx bayy +bayz baza bazb bazc bazd baze bazf bazg bazh bazi bazj bazk bazl bazm bazn +bazo bazp bazq bazr bazs bazt bazu bazv bazw bazx bazy bazz bbaa bbab bbac +bbad bbae bbaf bbag bbah bbai bbaj bbak bbal bbam bban bbao bbap bbaq bbar +bbas bbat bbau bbav bbaw bbax bbay bbaz bbba bbbb diff --git a/camlp4/test/fixtures/if.ml b/camlp4/test/fixtures/if.ml new file mode 100644 index 00000000..3f9b452c --- /dev/null +++ b/camlp4/test/fixtures/if.ml @@ -0,0 +1,8 @@ +let x = if x then a else b in x + +let x = if StringSet.mem "*" sections then a else b in x + +let x = +if StringSet.mem "*" sections then fun _ -> true else + fun x -> StringSet.mem x sections +in x diff --git a/camlp4/test/fixtures/label.ml b/camlp4/test/fixtures/label.ml new file mode 100644 index 00000000..a60f367a --- /dev/null +++ b/camlp4/test/fixtures/label.ml @@ -0,0 +1 @@ +value f ~a:_ ?b:_ = (); diff --git a/camlp4/test/fixtures/lambda_free.ml b/camlp4/test/fixtures/lambda_free.ml new file mode 100644 index 00000000..4d6f1351 --- /dev/null +++ b/camlp4/test/fixtures/lambda_free.ml @@ -0,0 +1,68 @@ +open Format; + +module S = Set.Make String; + +type term = + [ Lambda of string and term + | Atom of string + | App of term and term + | Opt of term and option term and term + ]; + +value free_vars = + let rec fv t env free = + match t with + [ Lambda x t -> fv t (S.add x env) free + | Atom x -> if S.mem x env then free else S.add x free + | App t1 t2 -> fv t1 env (fv t2 env free) + | Opt _ _ _ -> assert False ] + in fun t -> fv t S.empty S.empty; + +value print_set f s = do { + fprintf f "@[<2>{ "; + S.iter (fprintf f "%s@ ") s; + fprintf f "}@]"; +}; + +value t1 = Lambda "x" (App (Lambda "y" (App (Atom "y") (Atom "x"))) (Lambda "x" (Atom "x"))); +value t2 = Lambda "x" (App (Lambda "y" (App (Atom "y") (Atom "x"))) (Lambda "z" (Atom "z"))); +value t3 = Lambda "x" (App (Lambda "y" (App (Atom "y") (Atom "x"))) (Lambda "x" (Atom "z"))); +value t4 = Lambda "a" (App (Lambda "y" (App (Atom "y") (Atom "x"))) (Lambda "x" (Atom "z"))); + +printf "t1: %a@." print_set (free_vars t1); +printf "t2: %a@." print_set (free_vars t2); +printf "t3: %a@." print_set (free_vars t3); +printf "t4: %a@." print_set (free_vars t4); + +class fold ['accu] init = + object (o : 'self_type) + value accu : 'accu = init; + method accu = accu; + method term t = + match t with + [ Lambda x t -> (o#string x)#term t + | Atom x -> o#string x + | App t1 t2 -> (o#term t1)#term t2 + | Opt t1 ot t2 -> ((o#term t1)#option (fun o -> o#term) ot)#term t2 ]; + method string : string -> 'self_type = fun _ -> o; + method option : ! 'a. ('self_type -> 'a -> 'self_type) -> option 'a -> 'self_type = + fun f opt -> + match opt with + [ None -> o + | Some x -> f o x ]; + end; + +class fold_atoms ['accu] f init = + object (o : 'self_type) + inherit fold ['accu] init as super; + method term t = + match t with + [ Atom x -> {< accu = f x accu >} + | _ -> super#term t ]; + end; + +value t5 = Opt (Atom "a") (Some (Atom "b")) (Atom "c"); + +value atoms = ((new fold_atoms S.add S.empty)#term t5)#accu; + +printf "atoms: %a@." print_set atoms; diff --git a/camlp4/test/fixtures/loc-bug.ml b/camlp4/test/fixtures/loc-bug.ml new file mode 100644 index 00000000..2901e6f8 --- /dev/null +++ b/camlp4/test/fixtures/loc-bug.ml @@ -0,0 +1,3 @@ +#default_quotation "expr";; +Lwt.return + << 3 + >> diff --git a/camlp4/test/fixtures/macrotest.ml b/camlp4/test/fixtures/macrotest.ml new file mode 100644 index 00000000..023a5b42 --- /dev/null +++ b/camlp4/test/fixtures/macrotest.ml @@ -0,0 +1,70 @@ +DEFINE A = 42; +DEFINE B = 51; + +IFDEF A THEN + value a_should_be_present = B + 2; + print_int (a_should_be_present + 1); +ENDIF; + +print_int (a_should_be_present + 2); + +IFNDEF C THEN + print_int (a_should_be_present + 3); +ENDIF; + +IFNDEF C THEN + print_int (a_should_be_present + 4); +ELSE + print_int (c_should_not_be_present + 1); +ENDIF; + +IFDEF C THEN + print_int (c_should_not_be_present + 2); +ELSIF + print_int (A * a_should_be_present + 5); +ENDIF; + +IFDEF DNE THEN + print_int (c_should_not_be_present + 2); +ELSIF + print_int (A * a_should_be_present + 5); +ENDIF; + +IFDEF OPT THEN + print_int (c_should_not_be_present + 2); +ELSIF + print_int (A * a_should_be_present + 5); +ENDIF; + +value e = + IFDEF DNE THEN + print_int (c_should_not_be_present + 2) + ELSE + print_int (A * a_should_be_present + 5) + ENDIF; + +value f = + fun _ -> + IFDEF DNE THEN + print_int (c_should_not_be_present + 2) + ELSE + print_int (A * a_should_be_present + 5) + ENDIF; + +IFDEF A THEN + DEFINE Z = "ok"; +ELSE + DEFINE Z = "ko"; +ENDIF; + +Z; + +IFDEF DNE THEN + DEFINE Z = "ko2"; +ELSE + DEFINE Z = "ok2"; +ENDIF; + +Z; + +pouet; diff --git a/camlp4/test/fixtures/macrotest.mli b/camlp4/test/fixtures/macrotest.mli new file mode 100644 index 00000000..4912fd34 --- /dev/null +++ b/camlp4/test/fixtures/macrotest.mli @@ -0,0 +1,25 @@ +DEFINE A; +DEFINE B; + +IFDEF A THEN + value a_should_be_present : int; +ENDIF; + +IFNDEF C THEN + value b_should_be_present : int; +ENDIF; + +IFNDEF C THEN + value c_should_be_present : int; +ELSE + value a_should_NOT_be_present : int; +END; + +IFDEF C THEN + value b_should_NOT_be_present : int; +ELSE + value d_should_be_present : int; + value e_should_be_present : int; +ENDIF; + +value f_should_be_present : int; diff --git a/camlp4/test/fixtures/macrotest2.ml b/camlp4/test/fixtures/macrotest2.ml new file mode 100644 index 00000000..cb2d4cff --- /dev/null +++ b/camlp4/test/fixtures/macrotest2.ml @@ -0,0 +1,6 @@ +IFNDEF UNDEFINED_VARIABLE THEN + DEFINE SQUARE (x) = x * x ;; + DEFINE DOUBLE_SQUARE (x) = (SQUARE x) * 2 ;; +END;; + +Printf.printf "%d\n" (DOUBLE_SQUARE(42)) ;; diff --git a/camlp4/test/fixtures/macrotest3.ml b/camlp4/test/fixtures/macrotest3.ml new file mode 100644 index 00000000..ef618d28 --- /dev/null +++ b/camlp4/test/fixtures/macrotest3.ml @@ -0,0 +1,11 @@ +IFNDEF UNDEFINED_VARIABLE THEN + DEFINE UNDEFINED_VARIABLE + + IFDEF UNDEFINED_VARIABLE THEN + DEFINE SQUARE (x) = x * x ;; + DEFINE DOUBLE_SQUARE (x) = (SQUARE x) * 2 ;; + END +END;; + +Printf.printf "%d\n" (DOUBLE_SQUARE(42)) ;; + diff --git a/camlp4/test/fixtures/make_extend.ml b/camlp4/test/fixtures/make_extend.ml new file mode 100644 index 00000000..f2d625c2 --- /dev/null +++ b/camlp4/test/fixtures/make_extend.ml @@ -0,0 +1 @@ +<:expr< EXTEND G expr: [[ "foo" -> <:expr< foo >> ]]; END >>; diff --git a/camlp4/test/fixtures/match.ml b/camlp4/test/fixtures/match.ml new file mode 100644 index 00000000..9fb52cb7 --- /dev/null +++ b/camlp4/test/fixtures/match.ml @@ -0,0 +1,9 @@ +let x = + match y with + | A z -> z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z + | B l -> + (match l with + | [] -> () + | x::xs -> p x; self xs) + | C -> () +in x diff --git a/camlp4/test/fixtures/match_parser.ml b/camlp4/test/fixtures/match_parser.ml new file mode 100644 index 00000000..e053ee88 --- /dev/null +++ b/camlp4/test/fixtures/match_parser.ml @@ -0,0 +1,10 @@ +open Camlp4.PreCast; + +let _loc = Loc.ghost in +let e = <:expr< parser [: `"a" :] -> t >> in +let a = + match e with + [ <:expr< parser [: `$str:x$ :] -> t >> -> x + | _ -> assert False ] +in Format.printf "a: %S@." a; + diff --git a/camlp4/test/fixtures/meta_multi_term.ml b/camlp4/test/fixtures/meta_multi_term.ml new file mode 100644 index 00000000..35e96b2a --- /dev/null +++ b/camlp4/test/fixtures/meta_multi_term.ml @@ -0,0 +1,16 @@ +open Camlp4.PreCast; +value _loc = Loc.ghost; + +module Term = struct + type patt = + [ PApp of patt and patt + | PAny + | PVar of string + | POlb of string and expr ] + and expr = + [ EApp of expr and expr + | EVar of string + | ELam of patt and expr ]; +end; + +module MetaTerm = MetaGenerator Term; diff --git a/camlp4/test/fixtures/metalib.ml b/camlp4/test/fixtures/metalib.ml new file mode 100644 index 00000000..22dff11c --- /dev/null +++ b/camlp4/test/fixtures/metalib.ml @@ -0,0 +1,5 @@ +#load "camlp4of.cma";; +open Camlp4.PreCast;; +module M = Ast.Meta.Make(Ast.Meta.MetaGhostLoc);; +let ghost = Loc.ghost;; +M.Expr.meta_ctyp ghost <:ctyp@ghost< int >>;; diff --git a/camlp4/test/fixtures/method_private_virtual.ml b/camlp4/test/fixtures/method_private_virtual.ml new file mode 100644 index 00000000..6c0b94a6 --- /dev/null +++ b/camlp4/test/fixtures/method_private_virtual.ml @@ -0,0 +1,9 @@ +class virtual c1 = object method virtual private f : unit end;; +class virtual c2 = object method private virtual f : unit end;; + +<:str_item< class virtual c1 = object method virtual private f : unit; end >>;; +<:str_item< class virtual c2 = object method private virtual f : unit; end >>;; +<:str_item< class virtual c2 = object method $private:p$ virtual f : unit; end >>;; +<:str_item< class virtual c2 = object method virtual $private:p$ f : unit; end >>;; +<:str_item< class $virtual:v$ c2 [$t1$] = + object ($pat:self$) method virtual $private:p$ $lid:f$ : $t2$; end >>;; diff --git a/camlp4/test/fixtures/mod.ml b/camlp4/test/fixtures/mod.ml new file mode 100644 index 00000000..ca2b3e03 --- /dev/null +++ b/camlp4/test/fixtures/mod.ml @@ -0,0 +1,15 @@ +module type S = sig type t end +module F (A : S) = struct + type t2 = A.t + module A = A +end + +module A = struct type t = int end + +module type S3 = sig + module M : S +end + +module type S2 = S with type t = F(A).t2 + +module type S4 = S3 with module M = F(A).A diff --git a/camlp4/test/fixtures/mod2.ml b/camlp4/test/fixtures/mod2.ml new file mode 100644 index 00000000..c0a1667d --- /dev/null +++ b/camlp4/test/fixtures/mod2.ml @@ -0,0 +1,8 @@ +module type S = sig type t = 'a; end; +module F (A : S) = struct + type t2 = A.t; +end; + +module A = struct type t = int; end; + +module type S2 = S with type t = (F A).t2; diff --git a/camlp4/test/fixtures/operators.ml b/camlp4/test/fixtures/operators.ml new file mode 100644 index 00000000..467c37c3 --- /dev/null +++ b/camlp4/test/fixtures/operators.ml @@ -0,0 +1,7 @@ +let _ : int = 42 +let (+) = M.(+) +let (+) = M.(+) in 42 +let (+) : int -> int -> int = (+) +let (+) : int -> int -> int = (+) in 42 +let None = None +let None : int option = None diff --git a/camlp4/test/fixtures/operators.mli b/camlp4/test/fixtures/operators.mli new file mode 100644 index 00000000..af445306 --- /dev/null +++ b/camlp4/test/fixtures/operators.mli @@ -0,0 +1 @@ +val (+) : int -> int -> int diff --git a/camlp4/test/fixtures/original_syntax.ml b/camlp4/test/fixtures/original_syntax.ml new file mode 100644 index 00000000..bf08d561 --- /dev/null +++ b/camlp4/test/fixtures/original_syntax.ml @@ -0,0 +1,17 @@ +fun x when x <> 0 -> x / 42 +;; +object val virtual mutable x : int val mutable virtual y : int end +;; +- !r +;; +! -r +;; +-32 +;; +- - 32 +;; +!(r.b) +;; +(!r).b = !r.b +;; +let l : (unit -> int) list = [(fun _ -> 42); (fun _ -> 42)] diff --git a/camlp4/test/fixtures/outside-scope.ml b/camlp4/test/fixtures/outside-scope.ml new file mode 100644 index 00000000..6b8b80b8 --- /dev/null +++ b/camlp4/test/fixtures/outside-scope.ml @@ -0,0 +1,21 @@ +type t 'a = [ Nil | Cons of 'a and t 'a ]; + +module A : sig + value app_hd : t 'a -> ('a -> 'a) -> option 'a; +end = struct + value app_hd x f = + match x with + [ Nil -> None + | Cons x _ -> Some (f x) ]; +end; +open A; + +module M = struct + external mk_nil : unit -> t 'a = "%identity"; + value nil = mk_nil (); + (* value is_nil x = x = nil; *) +end; + +(* M.app_hd succ (M.Cons 1 M.Nil); *) +(* M.hd (M.Cons 1 M.Nil); *) +app_hd (M.nil : t 'a) (fun (x : int) -> (x : 'a)); diff --git a/camlp4/test/fixtures/parser.ml b/camlp4/test/fixtures/parser.ml new file mode 100644 index 00000000..7e41f35b --- /dev/null +++ b/camlp4/test/fixtures/parser.ml @@ -0,0 +1,61 @@ +open Camlp4.PreCast; +type t = [ A of t and t | B of string ]; +value lex = Lexer.mk (); + + (* value list0 symb = + let rec loop al = + parser + [ [: a = symb; s :] -> loop [a :: al] s + | [: :] -> al ] + in + parser [: a = loop [] :] -> List.rev a + ; + value list0sep symb sep = + let rec kont al = + parser + [ [: v = sep; a = symb; s :] -> kont [a :: al] s + | [: :] -> al ] + in + parser + [ [: a = symb; s :] -> List.rev (kont [a] s) + | [: :] -> [] ] + ; + value list1 symb = + let rec loop al = + parser + [ [: a = symb; s :] -> loop [a :: al] s + | [: :] -> al ] + in + parser [: a = symb; s :] -> List.rev (loop [a] s) + ; + value list1sep symb sep = + let rec kont al = + parser + [ [: v = sep; a = symb; s :] -> kont [a :: al] s + | [: :] -> al ] + in + parser [: a = symb; s :] -> List.rev (kont [a] s) + ; *) + +value list1 = + let rec self stream acc = + match stream with parser + [ [: `(EOI, _) :] -> acc + | [: `(LIDENT x, _); xs :] -> self xs (A acc (B x)) + | [: `(BLANKS _ | NEWLINE, _); xs :] -> self xs acc ] + in + parser [: `(LIDENT x, _); xs :] -> self xs (B x); +value rec length x acc = + match x with + [ A x y -> length x (length y acc) + | B _ -> succ acc ]; +(* value length _ _ = -1; *) +open Format; +try + let f = Sys.argv.(1) in + let () = printf "parsing...@." in + let a = list1 (lex (Loc.mk f) (Stream.of_channel (open_in f))) in + let () = printf "counting...@." in + let n = length a 0 in + printf "%d@." n +with e -> eprintf "error: %a@." Camlp4.ErrorHandler.print e; diff --git a/camlp4/test/fixtures/pp_let_in.ml b/camlp4/test/fixtures/pp_let_in.ml new file mode 100644 index 00000000..c6162499 --- /dev/null +++ b/camlp4/test/fixtures/pp_let_in.ml @@ -0,0 +1,10 @@ +let i = "toto" in do { (let i = 42 in print_int i); print_string i }; +let i = "toto" in do { print_string i; let i = 42 in print_int i; print_int i }; +let i = "toto" in do { + (let i = 42 in print_int i); + let i = i ^ i; + let i = i ^ i; + print_string i; + print_string i; + let i = i ^ i; + print_string i }; diff --git a/camlp4/test/fixtures/pp_let_in2.ml b/camlp4/test/fixtures/pp_let_in2.ml new file mode 100644 index 00000000..7e9b3496 --- /dev/null +++ b/camlp4/test/fixtures/pp_let_in2.ml @@ -0,0 +1 @@ +let i = "toto" in ((let i = 42 in print_int i); print_string i) diff --git a/camlp4/test/fixtures/pp_xml.ml b/camlp4/test/fixtures/pp_xml.ml new file mode 100644 index 00000000..986998c4 --- /dev/null +++ b/camlp4/test/fixtures/pp_xml.ml @@ -0,0 +1,31 @@ + +type xml = Elt of string * xml list | Pcdata of string + +let pp = Format.fprintf + +let rec print_elt f = + function + | Elt (tag, contents) -> + pp f "@[@[<%s>@,%a@]@,@]" + tag print_list_elts contents tag + | Pcdata s -> + Format.pp_print_string f s + +and print_list_elts f = + let rec loop = + function + | [] -> () + | x::xs -> (pp f "@,"; print_elt f x; loop xs) in + function + | [] -> () + | [x] -> print_elt f x + | x::xs -> (print_elt f x; loop xs) + +let tree = + Elt ("div", [ + Elt ("p", [Pcdata "a short text"]); + Elt ("p", [Pcdata "a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong text"]) + ]) + +let () = Format.printf "%a@." print_elt tree + diff --git a/camlp4/test/fixtures/pprecordtyp.ml b/camlp4/test/fixtures/pprecordtyp.ml new file mode 100644 index 00000000..1b140af0 --- /dev/null +++ b/camlp4/test/fixtures/pprecordtyp.ml @@ -0,0 +1,26 @@ +open Camlp4.PreCast + +let _loc = Loc.mk "?" + +let base base fields ty = + let fields = List.fold_right (fun field acc -> + let c = <:ctyp< $lid:field$ : $uid:field$.record >> in + <:ctyp< $c$ ; $acc$ >>) fields <:ctyp< >> + in + <:module_binding< $uid:base$ : + sig type record = { + key : $ty$; + $fields$ + } end = struct + type record = { + key : $ty$; + $fields$ + } end + >> + +module CleanAst = Camlp4.Struct.CleanAst.Make(Ast) +let _ = + let b = base "b" ["f1"; "f2"] <:ctyp< int >> in + Camlp4.PreCast.Printers.OCaml.print_implem + ((new CleanAst.clean_ast)#str_item + <:str_item< module rec $b$ >>) diff --git a/camlp4/test/fixtures/pr4314.ml b/camlp4/test/fixtures/pr4314.ml new file mode 100644 index 00000000..9e6b23bc --- /dev/null +++ b/camlp4/test/fixtures/pr4314.ml @@ -0,0 +1 @@ +(int_of_string "1" : unit); diff --git a/camlp4/test/fixtures/pr4314gram1.ml b/camlp4/test/fixtures/pr4314gram1.ml new file mode 100644 index 00000000..a83b073a --- /dev/null +++ b/camlp4/test/fixtures/pr4314gram1.ml @@ -0,0 +1,36 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram ; + +value exp = G.Entry.mk "exp" ; +value prog = G.Entry.mk "prog" ; + +EXTEND G +exp: +[ "apply" + [ e1 = SELF; e2 = SELF -> + let p = Loc.dump in + let () = + Format.eprintf "e1: %a,@.e2: %a,@.e1-e2: %a,@._loc: %a@." + p e1 p e2 p (Loc.merge e1 e2) p _loc + in + _loc + ] +| "simple" + [ _ = LIDENT -> _loc ] +]; +prog: [[ e = exp; `EOI -> e ]]; +END ; + +(* and the following function: *) + +value parse_string entry s = +try + G.parse_string entry (Loc.mk "") s +with [ Loc.Exc_located loc exn -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + failwith "Syntax Error" +end ] ; + +parse_string prog "f x"; diff --git a/camlp4/test/fixtures/pr4314gram2.ml b/camlp4/test/fixtures/pr4314gram2.ml new file mode 100644 index 00000000..38a5222e --- /dev/null +++ b/camlp4/test/fixtures/pr4314gram2.ml @@ -0,0 +1,36 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram ; + +value exp = G.Entry.mk "exp" ; +value prog = G.Entry.mk "prog" ; + +EXTEND G +exp: +[ "apply" + [ e1 = exp LEVEL "simple"; e2 = SELF -> + let p = Loc.dump in + let () = + Format.eprintf "e1: %a,@.e2: %a,@.e1-e2: %a,@._loc: %a@." + p e1 p e2 p (Loc.merge e1 e2) p _loc + in + _loc + ] +| "simple" + [ _ = LIDENT -> _loc ] +]; +prog: [[ e = exp; `EOI -> e ]]; +END ; + +(* and the following function: *) + +value parse_string entry s = +try + G.parse_string entry (Loc.mk "") s +with [ Loc.Exc_located loc exn -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + failwith "Syntax Error" +end ] ; + +parse_string prog "f x"; diff --git a/camlp4/test/fixtures/pr4314gram3.ml b/camlp4/test/fixtures/pr4314gram3.ml new file mode 100644 index 00000000..3298bcbf --- /dev/null +++ b/camlp4/test/fixtures/pr4314gram3.ml @@ -0,0 +1,36 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram ; + +value exp = G.Entry.mk "exp" ; +value prog = G.Entry.mk "prog" ; + +EXTEND G +exp: +[ "apply" + [ e1 = SELF; e2 = exp LEVEL "simple" -> + let p = Loc.dump in + let () = + Format.eprintf "e1: %a,@.e2: %a,@.e1-e2: %a,@._loc: %a@." + p e1 p e2 p (Loc.merge e1 e2) p _loc + in + _loc + ] +| "simple" + [ _ = LIDENT -> _loc ] +]; +prog: [[ e = exp; `EOI -> e ]]; +END ; + +(* and the following function: *) + +value parse_string entry s = +try + G.parse_string entry (Loc.mk "") s +with [ Loc.Exc_located loc exn -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + failwith "Syntax Error" +end ] ; + +parse_string prog "f x"; diff --git a/camlp4/test/fixtures/pr4314gram4.ml b/camlp4/test/fixtures/pr4314gram4.ml new file mode 100644 index 00000000..1c6712e2 --- /dev/null +++ b/camlp4/test/fixtures/pr4314gram4.ml @@ -0,0 +1,36 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram ; + +value exp = G.Entry.mk "exp" ; +value prog = G.Entry.mk "prog" ; + +EXTEND G +exp: +[ "apply" + [ e1 = SELF; e2 = exp LEVEL "simple"; e3 = exp LEVEL "simple" -> + let p = Loc.dump in + let () = + Format.eprintf "e1: %a,@.e2: %a,@.e3: %a,@._loc: %a@." + p e1 p e2 p e3 p _loc + in + _loc + ] +| "simple" + [ _ = LIDENT -> _loc ] +]; +prog: [[ e = exp; `EOI -> e ]]; +END ; + +(* and the following function: *) + +value parse_string entry s = +try + G.parse_string entry (Loc.mk "") s +with [ Loc.Exc_located loc exn -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + failwith "Syntax Error" +end ] ; + +parse_string prog "f x y"; diff --git a/camlp4/test/fixtures/pr4314gram5.ml b/camlp4/test/fixtures/pr4314gram5.ml new file mode 100644 index 00000000..bd2fb11c --- /dev/null +++ b/camlp4/test/fixtures/pr4314gram5.ml @@ -0,0 +1,38 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram ; + +value exp = G.Entry.mk "exp" ; +value prog = G.Entry.mk "prog" ; + +EXTEND G +exp: +[ "apply" +[ e1 = SELF; e2 = exp LEVEL "simple"; e3 = SELF -> + let p = Loc.dump in + let () = + Format.eprintf "e1: %a,@.e2: %a,@.e3: %a,@._loc: %a@." + p e1 p e2 p e3 p _loc + in + _loc + ] +| "simple" +[ x = LIDENT; y = LIDENT -> + let () = Format.eprintf "reduce expr simple (%S, %S) at %a@." x y Loc.dump _loc in _loc ] +]; +prog: [[ e = exp; `EOI -> e ]]; +END ; + +(* and the following function: *) + +value parse_string entry s = +try + print_endline s; + G.parse_string entry (Loc.mk "") s +with [ Loc.Exc_located loc exn -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + failwith "Syntax Error" +end ] ; + +parse_string prog "f1 f2 x1 x2 y1 y2"; diff --git a/camlp4/test/fixtures/pr4329.ml b/camlp4/test/fixtures/pr4329.ml new file mode 100644 index 00000000..72f2b787 --- /dev/null +++ b/camlp4/test/fixtures/pr4329.ml @@ -0,0 +1,50 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram; + +value ab_eoi = G.Entry.mk "ab_eoi" ; +value a_or_ab = G.Entry.mk "a_or_ab" ; +value a_or_ab_eoi = G.Entry.mk "a_or_ab_eoi" ; +value c_a_or_ab_eoi = G.Entry.mk "c_a_or_ab_eoi" ; + +EXTEND G +ab_eoi: [[ "a"; "b"; `EOI -> () ]]; +a_or_ab: [[ "a" -> () | "a"; "b" -> () ]]; +a_or_ab_eoi: [[ a_or_ab; `EOI -> () ]]; +c_a_or_ab_eoi: [[ "c"; a_or_ab; `EOI -> () ]]; +END ; + +value parse_string entry s = +try + G.parse_string entry (Loc.mk "") s +with [ Loc.Exc_located loc exn -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + (* failwith "Syntax Error" *) +end ] ; + +(* Consider the following syntax errors: *) +parse_string ab_eoi "a c" ; +(* File "", line 1, characters 2-3 +Stream.Error("illegal begin of ab_eoi") +Exception: Failure "Syntax Error". +--> "Illegal begin": at least the first symbol was correct +--> nevertheless, the reported position is correct +--> The message used to be: "b" then EOI expected after "a" in [ab_eoi] *) + +parse_string a_or_ab_eoi "a c" ; +(* File "", line 1, characters 0-1 +Stream.Error("illegal begin of a_or_ab_eoi") +Exception: Failure "Syntax Error". +--> "Illegal begin": at least the first non-terminal was correct +--> the reported position is weird +--> I think the message used to be either: "b" expected after "a" in +[a_or_ab] +or: EOI expected after [a_or_ab] in [a_or_ab_eoi] *) + +parse_string c_a_or_ab_eoi "c a c" ; +(* File "", line 1, characters 2-3 +Stream.Error("[a_or_ab] expected after \"c\" (in [c_a_or_ab_eoi])") +Exception: Failure "Syntax Error". +--> "[a_or_ab] expected": this is very confusing: there is a valid a_or_ab +there, namely "a" *) diff --git a/camlp4/test/fixtures/pr4330.ml b/camlp4/test/fixtures/pr4330.ml new file mode 100644 index 00000000..19593584 --- /dev/null +++ b/camlp4/test/fixtures/pr4330.ml @@ -0,0 +1,57 @@ +open Camlp4.PreCast ; +module G = Camlp4.PreCast.Gram ; + +value a = G.Entry.mk "a" ; +value a_eoi = G.Entry.mk "a_eoi" ; + +EXTEND G +a: [[ "one" -> 1 | x = a; "plus"; y = a -> x+y ]]; +a_eoi: [[ x = a; `EOI -> x ]]; +END ; + +(* and the following function: *) + +value parse_string entry s o = +try + Printf.eprintf "Parsing %S\n%!" s; + assert (o = Some (G.parse_string entry (Loc.mk "") s)) +with [ Loc.Exc_located loc exn when o <> None -> +begin + print_endline (Loc.to_string loc); + print_endline (Printexc.to_string exn); + assert (o = None) +end +| exn when o = None -> Printf.eprintf "Fail as expected\n%!" +| exn -> begin + Printf.eprintf "Unexpected exception: \n%!"; + print_endline (Printexc.to_string exn); + assert (o = None) +end ] ; + +(* The following is correct: *) + +parse_string a_eoi "one plus one" (Some 2); + +(* While all of the following inputs should be rejected because they are not *) +(* legal according to the grammar: *) + +parse_string a_eoi "one plus" None; +(* - : int = 1 *) +parse_string a_eoi "one plus plus" None; +(* - : int = 1 *) +parse_string a_eoi "one plus one plus" None; +(* - : int = 2 *) +parse_string a_eoi "one plus one plus plus" None; +(* - : int = 2 *) + +(* Curiously, you may only repeat the operator twice. If you specify it three +times, gramlib complains. *) + +parse_string a_eoi "one plus plus plus" None ; +(* File "", line 1, characters 9-13 *) +(* Stream.Error("EOI expected after [a] (in [a_eoi])") *) +(* Exception: Failure "Syntax Error". *) +parse_string a_eoi "one plus one plus plus plus" None ; +(* File "", line 1, characters 18-22 *) +(* Stream.Error("EOI expected after [a] (in [a_eoi])") *) +(* Exception: Failure "Syntax Error". *) diff --git a/camlp4/test/fixtures/pr4357.ml b/camlp4/test/fixtures/pr4357.ml new file mode 100644 index 00000000..2d84004a --- /dev/null +++ b/camlp4/test/fixtures/pr4357.ml @@ -0,0 +1,16 @@ +open Camlp4.PreCast + +let sample_expr _loc _loc_name s = + Printf.eprintf "file=%s line=%d offset=%d bol=%d\n%!" + (Loc.file_name _loc) + (Loc.start_line _loc) + (Loc.start_off _loc) + (Loc.start_bol _loc); + <:expr< $lid:s$ >> +;; + +Quotation.add + "sample" + Syntax.Quotation.DynAst.expr_tag + sample_expr +;; diff --git a/camlp4/test/fixtures/pr4357sample.ml b/camlp4/test/fixtures/pr4357sample.ml new file mode 100644 index 00000000..789bcb8d --- /dev/null +++ b/camlp4/test/fixtures/pr4357sample.ml @@ -0,0 +1,3 @@ +let u = "Hello";; +let s = <:sample>;; +print_string s diff --git a/camlp4/test/fixtures/pr4357sample2.ml b/camlp4/test/fixtures/pr4357sample2.ml new file mode 100644 index 00000000..f6fe8d02 --- /dev/null +++ b/camlp4/test/fixtures/pr4357sample2.ml @@ -0,0 +1,5 @@ +#default_quotation "sample";; +let u = "Hello";; +let s = <>;; +let s = <:sample>;; +print_string s diff --git a/camlp4/test/fixtures/pr4452.ml b/camlp4/test/fixtures/pr4452.ml new file mode 100644 index 00000000..bed7db7b --- /dev/null +++ b/camlp4/test/fixtures/pr4452.ml @@ -0,0 +1,24 @@ +open Camlp4.PreCast + +let _loc = Loc.mk "?" + +let base base fields ty = + let fields = List.fold_right (fun field acc -> + let c = <:ctyp< $lid:field$ : $uid:field$.record >> in + <:ctyp< $c$ ; $acc$ >>) fields <:ctyp< >> + in + <:module_binding< $uid:base$ : + sig type record = { + key : $ty$; + $fields$ + } end = struct + type record = { + key : $ty$; + $fields$ + } end + >> + +let _ = + let b = base "b" ["f1"; "f2"] <:ctyp< int >> in + Camlp4.PreCast.Printers.OCaml.print_implem + <:str_item< module rec $b$ >> diff --git a/camlp4/test/fixtures/private_row.ml b/camlp4/test/fixtures/private_row.ml new file mode 100644 index 00000000..53ada775 --- /dev/null +++ b/camlp4/test/fixtures/private_row.ml @@ -0,0 +1,27 @@ + + +module type Ops = sig + type expr + val eval : expr -> int + end + ;; + + +module Plus = struct + type 'a expr0 = [`Num of int | `Plus of 'a * 'a ] + module F(X : Ops with type expr = private ([> 'a expr0] as 'a)) = + struct + type expr = X.expr expr0 + let eval : expr -> int = function + `Num n -> n + |`Plus(e1,e2) -> X.eval e1 + X.eval e2 + end + module rec L : (Ops with type expr = L.expr expr0) = F(L) + end + ;; + + +open Printf +;; + +let _ = Printf.printf "%d\n%!" (Plus.L.eval (`Plus ((`Num 5),(`Num 2))));; diff --git a/camlp4/test/fixtures/rec.ml b/camlp4/test/fixtures/rec.ml new file mode 100644 index 00000000..1c74b24d --- /dev/null +++ b/camlp4/test/fixtures/rec.ml @@ -0,0 +1,2 @@ +(* rec.ml *) +value rec x = 42; diff --git a/camlp4/test/fixtures/seq.ml b/camlp4/test/fixtures/seq.ml new file mode 100644 index 00000000..dd563d4c --- /dev/null +++ b/camlp4/test/fixtures/seq.ml @@ -0,0 +1,1003 @@ +module M = struct + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; +end; diff --git a/camlp4/test/fixtures/seq2.ml b/camlp4/test/fixtures/seq2.ml new file mode 100644 index 00000000..d47c2540 --- /dev/null +++ b/camlp4/test/fixtures/seq2.ml @@ -0,0 +1,3003 @@ +module M = struct + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; + foo bar; +end; diff --git a/camlp4/test/fixtures/simplify.ml b/camlp4/test/fixtures/simplify.ml new file mode 100644 index 00000000..d910641c --- /dev/null +++ b/camlp4/test/fixtures/simplify.ml @@ -0,0 +1,11 @@ +open Camlp4.PreCast + +let simplify = + object + inherit Ast.map as super + method expr e = + match super#expr e with + | <:expr< $x$ + 0 >> | <:expr< 0 + $x$ >> -> x + | x -> x + end +in AstFilters.register_str_item_filter simplify#str_item diff --git a/camlp4/test/fixtures/simplify_r.ml b/camlp4/test/fixtures/simplify_r.ml new file mode 100644 index 00000000..fa60135f --- /dev/null +++ b/camlp4/test/fixtures/simplify_r.ml @@ -0,0 +1,11 @@ +open Camlp4.PreCast; + +let simplify = + object + inherit Ast.map as super; + method expr e = + match super#expr e with + [ <:expr< $x$ + 0 >> | <:expr< 0 + $x$ >> -> x + | x -> x ]; + end +in AstFilters.register_str_item_filter simplify#str_item; diff --git a/camlp4/test/fixtures/stream-parser-bug.ml b/camlp4/test/fixtures/stream-parser-bug.ml new file mode 100644 index 00000000..6c17793c --- /dev/null +++ b/camlp4/test/fixtures/stream-parser-bug.ml @@ -0,0 +1,6 @@ +let foo = parser + | [< '42; ps >] -> + let ps = ps + 42 in + type_phrases ps + | [< >] -> [< >] + diff --git a/camlp4/test/fixtures/string.ml b/camlp4/test/fixtures/string.ml new file mode 100644 index 00000000..5b0e6466 --- /dev/null +++ b/camlp4/test/fixtures/string.ml @@ -0,0 +1 @@ +"abc"; diff --git a/camlp4/test/fixtures/superfluous.ml b/camlp4/test/fixtures/superfluous.ml new file mode 100644 index 00000000..79b086b9 --- /dev/null +++ b/camlp4/test/fixtures/superfluous.ml @@ -0,0 +1,12 @@ +open Camlp4.PreCast;; +open Syntax;; + +let _loc = Loc.ghost;; +let st = <:str_item< >>;; +let e = <:expr< 1 >> +let bi = <:binding< x = 0 >>;; + +(* none of these holds due to superfluous StSem and StNil *) +assert (Ast.StSem (_loc, st, st) = <:str_item< $st$ $st$ >>);; +assert (Ast.StExp (_loc, e) = <:str_item< $exp:e$ >>);; +assert (Ast.StVal (_loc, bi) = <:str_item< let $bi$ >>);; diff --git a/camlp4/test/fixtures/transform-examples.ml b/camlp4/test/fixtures/transform-examples.ml new file mode 100644 index 00000000..0aea9c4d --- /dev/null +++ b/camlp4/test/fixtures/transform-examples.ml @@ -0,0 +1,3 @@ +<:expr< $x$ + $y$ - $z$ >> -> <:expr< plus_minus $x$ $y$ $z$ >> + +<< List.rev (List.rev $l$) >> -> l diff --git a/camlp4/test/fixtures/try.ml b/camlp4/test/fixtures/try.ml new file mode 100644 index 00000000..90c01a3e --- /dev/null +++ b/camlp4/test/fixtures/try.ml @@ -0,0 +1,6 @@ +try + let f = Sys.getenv "CAMLP4_DEBUG_FILE" + in + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar +with Not_found -> stderr + diff --git a/camlp4/test/fixtures/tuple_as_retval.ml b/camlp4/test/fixtures/tuple_as_retval.ml new file mode 100644 index 00000000..1dd68e6a --- /dev/null +++ b/camlp4/test/fixtures/tuple_as_retval.ml @@ -0,0 +1,3 @@ +EXTEND Gram + abc: [ [ (x,y) = foo -> x+y ] ]; +END; diff --git a/camlp4/test/fixtures/type.ml b/camlp4/test/fixtures/type.ml new file mode 100644 index 00000000..f17cc50b --- /dev/null +++ b/camlp4/test/fixtures/type.ml @@ -0,0 +1,3 @@ +type t = [ A of int | B of t ]; +type t2 = [ A of int | B of t ]; +type t3 = [ A of int | B of t ]; diff --git a/camlp4/test/fixtures/type_decl.ml b/camlp4/test/fixtures/type_decl.ml new file mode 100644 index 00000000..8610ba29 --- /dev/null +++ b/camlp4/test/fixtures/type_decl.ml @@ -0,0 +1,22 @@ +module M = struct + type t = A of int * int * int * int * int * int * int * int * int * int + | B | B | B | B | B | B | B | B + and t2 = + | B | B | B | B | B | B | B | B + and t3 = + | B | B | B of a * a * a * a * a * a * a * a * a * a * a | B | B | B | B | B + and t4 = + | B | B | B | B | B | B | B | B + and t5 = + | B | B | B | B | B | B | B | B + and t6 = + | B | B | B | A of int * int * int * int * int * int * int * int * int * int * int * int * int * int * int * int * int * int * int | B | B | B | B | B + and t7 = + | B | B | B | B | B | B | B | B + and t8 = + | B | B | B | B | B | B | B | B + and t9 = + | B | B | B | B | B | B | B | B + and t10 = + | A of (a * a) +end diff --git a/camlp4/test/fixtures/unit.ml b/camlp4/test/fixtures/unit.ml new file mode 100644 index 00000000..52241dfa --- /dev/null +++ b/camlp4/test/fixtures/unit.ml @@ -0,0 +1,4 @@ +type t1 = ();; +type t2 = unit;; +let x : t1 = ();; +let y : t2 = ();; diff --git a/camlp4/test/fixtures/use.ml b/camlp4/test/fixtures/use.ml new file mode 100644 index 00000000..36e2f695 --- /dev/null +++ b/camlp4/test/fixtures/use.ml @@ -0,0 +1,4 @@ +(* use.ml *) +#use "test/fixtures/rec.ml"; +(* value use *) +value use = 3; diff --git a/camlp4/test/fixtures/where.o.ml b/camlp4/test/fixtures/where.o.ml new file mode 100644 index 00000000..8295d4a2 --- /dev/null +++ b/camlp4/test/fixtures/where.o.ml @@ -0,0 +1 @@ +let where = 42 diff --git a/camlp4/test/fixtures/where.r.ml b/camlp4/test/fixtures/where.r.ml new file mode 100644 index 00000000..e48c3085 --- /dev/null +++ b/camlp4/test/fixtures/where.r.ml @@ -0,0 +1 @@ +x where x = 42; diff --git a/camlp4/unmaintained/Makefile b/camlp4/unmaintained/Makefile new file mode 100644 index 00000000..b6db0753 --- /dev/null +++ b/camlp4/unmaintained/Makefile @@ -0,0 +1,20 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# The unmaintained directory +# + +include ../config/Makefile.cnf + +DIRS=format lefteval ocamllex olabl scheme sml + +include ../config/Makefile.base diff --git a/camlp4/unmaintained/compile/.cvsignore b/camlp4/unmaintained/compile/.cvsignore new file mode 100644 index 00000000..47817cce --- /dev/null +++ b/camlp4/unmaintained/compile/.cvsignore @@ -0,0 +1,4 @@ +*.fast +*.fast.opt +o_fast.ml +pa_o_fast.ml diff --git a/camlp4/unmaintained/compile/.depend b/camlp4/unmaintained/compile/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/compile/Makefile b/camlp4/unmaintained/compile/Makefile new file mode 100644 index 00000000..bd4078f2 --- /dev/null +++ b/camlp4/unmaintained/compile/Makefile @@ -0,0 +1,37 @@ + + +include ../config/Makefile.cnf + +INCLUDES=-I ../camlp4 -I ../lib +SRC=../etc/pa_o.ml ../etc/pa_op.ml # FIXME and why not pa_$D.ml? +D=o +COMP_OPT=-strict_parsing -e "Grammar.Entry.obj Pcaml.interf" -e "Grammar.Entry.obj Pcaml.implem" -e "Grammar.Entry.obj Pcaml.top_phrase" -e "Grammar.Entry.obj Pcaml.use_file" +CLEANFILES=pa_*_fast.ml *_fast.ml + +# FIXME +EXECUTABLES=#camlp4$D.fast + +include ../config/Makefile.base + +WARNINGS=Ay + +camlp4$D.fast: pa_$D_fast.cmo + rm -f camlp4$D.fast + cd ../camlp4; $(MAKE) CAMLP4=../compile/camlp4$D.fast CAMLP4M="../compile/pa_$D_fast.cmo ../meta/pr_dump.cmo" + +camlp4$D.fast.opt: pa_$D_fast.cmx + rm -f camlp4$D.fast.opt + cd ../camlp4; $(MAKE) ../compile/camlp4$D.fast.opt CAMLP4OPT=../compile/camlp4$D.fast.opt CAMLP4M="../compile/pa_$D_fast.cmx ../meta/pr_dump.cmx" + +pa_$D_fast.ml: comp_head.ml $D_fast.ml comp_trail.ml + cat $(SRC) | sed -e "s/Plexer.make_lexer *()/P.lexer_pos/" -e "/EXTEND/,/END/d" -e "/Grammar.Entry.of_parser/d" -e "/Grammar.Entry.gcreate/d" | cat comp_head.ml - $D_fast.ml comp_trail.ml > pa_$D_fast.ml + +$D_fast.ml: compile.cmo $(SRC) + echo '(* camlp4r *)' >$D_fast.ml + OTOP=$(OTOP) EXE=$(EXE) ./compile.sh $(COMP_OPT) $(SRC) >> $D_fast.ml + +install-local: + if test -f camlp4$D.fast.opt; then cp camlp4$D.fast.opt $(BINDIR)/camlp4$D.opt$(EXE); fi + for TARG in pa_$D_fast.cmi pa_$D_fast.cmo pa_$D_fast.cmx ; do if test -f $$TARG; then cp $$TARG "$(LIBDIR)/camlp4/."; fi; done + +include .depend diff --git a/camlp4/unmaintained/compile/comp_head.ml b/camlp4/unmaintained/compile/comp_head.ml new file mode 100644 index 00000000..cd623436 --- /dev/null +++ b/camlp4/unmaintained/compile/comp_head.ml @@ -0,0 +1,70 @@ +(* camlp4r q_MLast.cmo pa_extend.cmo *) + + +module P = + struct + value gloc bp strm = Grammar.loc_of_token_interval bp (Stream.count strm); + value list0 symb = + let rec loop al = + parser + [ [: a = symb; s :] -> loop [a :: al] s + | [: :] -> al ] + in + parser [: a = loop [] :] -> List.rev a + ; + value list0sep symb sep = + let rec kont al = + parser + [ [: v = sep; a = symb; s :] -> kont [a :: al] s + | [: :] -> al ] + in + parser + [ [: a = symb; s :] -> List.rev (kont [a] s) + | [: :] -> [] ] + ; + value list1 symb = + let rec loop al = + parser + [ [: a = symb; s :] -> loop [a :: al] s + | [: :] -> al ] + in + parser [: a = symb; s :] -> List.rev (loop [a] s) + ; + value list1sep symb sep = + let rec kont al = + parser + [ [: v = sep; a = symb; s :] -> kont [a :: al] s + | [: :] -> al ] + in + parser [: a = symb; s :] -> List.rev (kont [a] s) + ; + value option f = + parser + [ [: x = f :] -> Some x + | [: :] -> None ] + ; + value token (p_con, p_prm) = + if p_prm = "" then parser [: `(con, prm) when con = p_con :] -> prm + else parser [: `(con, prm) when con = p_con && prm = p_prm :] -> prm + ; + value orzero f f0 = + parser bp + [ [: x = f :] -> x + | [: x = f0 :] ep -> +(* +let (loc1, loc2) = Grammar.loc_of_token_interval bp ep in +let _ = do { Printf.eprintf "recovered or_zero at loc (%d, %d)\n" loc1 loc2; flush stderr } in +*) + x ] + ; + value error entry prev_symb symb = + symb ^ " expected" ^ + (if prev_symb = "" then "" else " after " ^ prev_symb) ^ + " (in [" ^ entry ^ "])" + ; + value lexer = Plexer.gmake(); + end +; + +(****************************************) + diff --git a/camlp4/unmaintained/compile/comp_trail.ml b/camlp4/unmaintained/compile/comp_trail.ml new file mode 100644 index 00000000..75f40abb --- /dev/null +++ b/camlp4/unmaintained/compile/comp_trail.ml @@ -0,0 +1,33 @@ +(* camlp4r pa_extend.cmo *) +(****************************************) + +value interf_p = + Grammar.Entry.of_parser Pcaml.gram "interf" interf_0 +; + +value implem_p = + Grammar.Entry.of_parser Pcaml.gram "implem" implem_0 +; + +value top_phrase_p = + Grammar.Entry.of_parser Pcaml.gram "top_phrase" top_phrase_0 +; + +value use_file_p = + Grammar.Entry.of_parser Pcaml.gram "use_file" use_file_0 +; + +EXTEND + interf: + [ [ x = interf_p -> x ] ] + ; + implem: + [ [ x = implem_p -> x ] ] + ; + top_phrase: + [ [ x = top_phrase_p -> x ] ] + ; + use_file: + [ [ x = use_file_p -> x ] ] + ; +END; diff --git a/camlp4/unmaintained/compile/compile.ml b/camlp4/unmaintained/compile/compile.ml new file mode 100644 index 00000000..b5e6ba5a --- /dev/null +++ b/camlp4/unmaintained/compile/compile.ml @@ -0,0 +1,574 @@ +(* camlp4r *) + + +open Gramext; + +value strict_parsing = ref False; +value keywords = ref []; + +value _loc = Loc.ghost; + +(* Watch the segmentation faults here! the compiled file must have been + loaded in camlp4 with the option pa_extend.cmo -meta_action. *) +value magic_act (act : Obj.t) : MLast.expr = Obj.magic act; + +(* Names of symbols for error messages; code borrowed to grammar.ml *) + +value rec name_of_symbol entry = + fun + [ Snterm e -> "[" ^ e.ename ^ "]" + | Snterml e l -> "[" ^ e.ename ^ " level " ^ l ^ "]" + | Sself | Snext -> "[" ^ entry.ename ^ "]" + | Stoken tok -> entry.egram.glexer.Token.tok_text tok + | _ -> "???" ] +; + +value rec name_of_symbol_failed entry = + fun + [ Slist0 s -> name_of_symbol_failed entry s + | Slist0sep s _ -> name_of_symbol_failed entry s + | Slist1 s -> name_of_symbol_failed entry s + | Slist1sep s _ -> name_of_symbol_failed entry s + | Sopt s -> name_of_symbol_failed entry s + | Stree t -> name_of_tree_failed entry t + | s -> name_of_symbol entry s ] +and name_of_tree_failed entry = + fun + [ Node {node = s; brother = bro; son = son} -> + let txt = name_of_symbol_failed entry s in + let txt = + match (s, son) with + [ (Sopt _, Node _) -> txt ^ " or " ^ name_of_tree_failed entry son + | _ -> txt ] + in + let txt = + match bro with + [ DeadEnd | LocAct _ _ -> txt + | _ -> txt ^ " or " ^ name_of_tree_failed entry bro ] + in + txt + | DeadEnd | LocAct _ _ -> "???" ] +; + +value tree_failed entry prev_symb tree = + let (s2, s3) = + let txt = name_of_tree_failed entry tree in + match prev_symb with + [ Slist0 s -> + let txt1 = name_of_symbol_failed entry s in + ("", txt1 ^ " or " ^ txt) + | Slist1 s -> + let txt1 = name_of_symbol_failed entry s in + ("", txt1 ^ " or " ^ txt) + | Slist0sep s sep -> + let txt1 = name_of_symbol_failed entry s in + ("", txt1 ^ " or " ^ txt) + | Slist1sep s sep -> + let txt1 = name_of_symbol_failed entry s in + ("", txt1 ^ " or " ^ txt) + | Sopt _ | Stree _ -> ("", txt) + | _ -> (name_of_symbol entry prev_symb, txt) ] + in + <:expr< + P.error $str:entry.ename$ $`str:s2$ $`str:s3$ + >> +; + +(* Compilation *) + +value rec find_act = + fun + [ DeadEnd -> failwith "find_act" + | LocAct act _ -> (magic_act act, 0) + | Node {son = son; brother = bro} -> + let (act, n) = try find_act son with [ Failure _ -> find_act bro ] in + (act, n + 1) ] +; + +value level_number e l = + match e.edesc with + [ Dlevels elevs -> + loop 0 elevs where rec loop n = + fun + [ [lev :: levs] -> if lev.lname = Some l then n else loop (n + 1) levs + | [] -> failwith ("level " ^ l ^ " not found in entry " ^ e.ename) ] + | Dparser _ -> 0 ] +; + +value nth_patt_of_act (e, n) = + let patt_list = + loop e where rec loop = + fun + [ <:expr< fun (_loc : Locaction.t) -> $_$ >> -> + [] + | <:expr< fun ($p$ : $_$) -> $e$ >> -> [p :: loop e] + | <:expr< fun $p$ -> $e$ >> -> [p :: loop e] + | _ -> failwith "nth_patt_of_act" ] + in + List.nth patt_list n +; + +value rec last_patt_of_act = + fun + [ <:expr< fun ($p$ : $_$) (_loc : Locaction.t) -> + $_$ >> -> p + | <:expr< fun $_$ -> $e$ >> -> last_patt_of_act e + | _ -> failwith "last_patt_of_act" ] +; + +#load "pr_r.cmo"; +value rec final_action = + fun + [ + <:expr< fun (_loc : Loc.t) -> ($e$ : $_$) >> -> e + | <:expr< fun $_$ -> $e$ >> -> final_action e + | ast -> do { + print_endline "final_action failed"; + Pcaml.print_implem.val [(MLast.StExp _loc ast, _loc)]; + failwith "final_action"; + } ] +; + +value parse_standard_symbol e rkont fkont ending_act = + <:expr< + match try Some ($e$ __strm) with [ Stream.Failure -> None ] with + [ Some $nth_patt_of_act ending_act$ -> $rkont$ + | _ -> $fkont$ ] + >> +; + +value parse_symbol_no_failure e rkont fkont ending_act = + <:expr< + let $nth_patt_of_act ending_act$ = + try $e$ __strm with [ Stream.Failure -> raise (Stream.Error "") ] + in + $rkont$ + >> +; + +value rec contain_loc = + fun + [ <:expr< $lid:s$ >> -> (s = "loc") || (s = "_loc") + | <:expr< $uid:_$ >> -> False + | <:expr< $str:_$ >> -> False + | <:expr< ($list:el$) >> -> List.exists contain_loc el + | <:expr< $e1$ $e2$ >> -> contain_loc e1 || contain_loc e2 + | _ -> True ] +; + +value gen_let_loc _loc e = + if contain_loc e then <:expr< let _loc = P.gloc bp __strm in $e$ >> else e +; + +value phony_entry = Grammar.Entry.obj Pcaml.implem; + +value rec parse_tree entry nlevn alevn (tree, fst_symb) act_kont kont = + match tree with + [ DeadEnd -> kont + | LocAct act _ -> + let act = magic_act act in + act_kont False act + | Node {node = Sself; son = LocAct act _; brother = bro} -> + let act = magic_act act in + let n = entry.ename ^ "_" ^ string_of_int alevn in + let e = + if strict_parsing.val || alevn = 0 || fst_symb then <:expr< $lid:n$ >> + else <:expr< P.orzero $lid:n$ $lid:entry.ename ^ "_0"$ >> + in + let p2 = + match bro with + [ DeadEnd -> kont + | _ -> parse_tree entry nlevn alevn (bro, fst_symb) act_kont kont ] + in + let p1 = act_kont True act in + parse_standard_symbol e p1 p2 (act, 0) + | Node {node = s; son = LocAct act _; brother = bro} -> + let act = magic_act act in + let p2 = parse_tree entry nlevn alevn (bro, fst_symb) act_kont kont in + let p1 = act_kont False act in + parse_symbol entry nlevn s p1 p2 (act, 0) + | Node {node = s; son = son; brother = bro} -> + let p2 = parse_tree entry nlevn alevn (bro, fst_symb) act_kont kont in + let p1 = + let err = + let txt = tree_failed entry s son in + <:expr< raise (Stream.Error $txt$) >> + in + match son with + [ Node {brother = DeadEnd} -> + parse_tree entry nlevn alevn (son, False) act_kont err + | _ -> + let p1 = + parse_tree entry nlevn alevn (son, True) act_kont + <:expr< raise Stream.Failure >> + in + <:expr< try $p1$ with [ Stream.Failure -> $err$ ] >> ] + in + parse_symbol entry nlevn s p1 p2 (find_act son) ] +and parse_symbol entry nlevn s rkont fkont ending_act = + match s with + [ Slist0 s -> + let e = <:expr< P.list0 $symbol_parser entry nlevn s$ >> in + parse_symbol_no_failure e rkont fkont ending_act + | Slist1 s -> + let e = <:expr< P.list1 $symbol_parser entry nlevn s$ >> in + parse_standard_symbol e rkont fkont ending_act + | Slist0sep s sep -> + let e = + <:expr< + P.list0sep $symbol_parser entry nlevn s$ + $symbol_parser entry nlevn sep$ >> + in + parse_symbol_no_failure e rkont fkont ending_act + | Slist1sep s sep -> + let e = + <:expr< + P.list1sep $symbol_parser entry nlevn s$ + $symbol_parser entry nlevn sep$ >> + in + parse_standard_symbol e rkont fkont ending_act + | Sopt s -> + let e = <:expr< P.option $symbol_parser entry nlevn s$ >> in + parse_symbol_no_failure e rkont fkont ending_act + | Stree tree -> + let kont = <:expr< raise Stream.Failure >> in + let act_kont _ act = gen_let_loc _loc (final_action act) in + let e = parse_tree phony_entry 0 0 (tree, True) act_kont kont in + parse_standard_symbol <:expr< fun __strm -> $e$ >> rkont fkont ending_act + | Snterm e -> + let n = + match e.edesc with + [ Dparser _ -> e.ename + | Dlevels _ -> e.ename ^ "_0" ] + in + parse_standard_symbol <:expr< $lid:n$ >> rkont fkont ending_act + | Snterml e l -> + let n = e.ename ^ "_" ^ string_of_int (level_number e l) in + parse_standard_symbol <:expr< $lid:n$ >> rkont fkont ending_act + | Sself -> + let n = entry.ename ^ "_0" in + parse_standard_symbol <:expr< $lid:n$ >> rkont fkont ending_act + | Snext -> + let n = entry.ename ^ "_" ^ string_of_int nlevn in + parse_standard_symbol <:expr< $lid:n$ >> rkont fkont ending_act + | Stoken tok -> + let _ = + do { + if fst tok = "" && not (List.mem (snd tok) keywords.val) then + keywords.val := [snd tok :: keywords.val] + else () + } + in + let p = + let patt = nth_patt_of_act ending_act in + let p_con = fst tok in + let p_prm = snd tok in + if snd tok = "" then + if fst tok = "ANY" then <:patt< (_, $patt$) >> + else <:patt< ($`str:p_con$, $patt$) >> + else + match patt with + [ <:patt< _ >> -> <:patt< ($`str:p_con$, $`str:p_prm$) >> + | _ -> <:patt< ($`str:p_con$, ($`str:p_prm$ as $patt$)) >> ] + in + <:expr< + match Stream.peek __strm with + [ Some $p$ -> do { Stream.junk __strm; $rkont$ } + | _ -> $fkont$ ] + >> + | _ -> + parse_standard_symbol <:expr< not_impl >> rkont fkont ending_act ] +and symbol_parser entry nlevn = + fun + [ Snterm e -> + let n = e.ename ^ "_0" in + <:expr< $lid:n$ >> + | Snterml e l -> + let n = e.ename ^ "_" ^ string_of_int (level_number e l) in + <:expr< $lid:n$ >> + | Snext -> + let n = entry.ename ^ "_" ^ string_of_int nlevn in + if strict_parsing.val then <:expr< $lid:n$ >> + else + let n0 = entry.ename ^ "_0" in + <:expr< P.orzero $lid:n$ $lid:n0$ >> + | Stoken tok -> + let _ = + do { + if fst tok = "" && not (List.mem (snd tok) keywords.val) then + keywords.val := [snd tok :: keywords.val] + else () + } + in + <:expr< P.token ($`str:fst tok$, $`str:snd tok$) >> + | Stree tree -> + let kont = <:expr< raise Stream.Failure >> in + let act_kont _ act = final_action act in + <:expr< + fun __strm -> + $parse_tree phony_entry 0 0 (tree, True) act_kont kont$ + >> + | _ -> + <:expr< aaa >> ] +; + +value rec start_parser_of_levels entry clevn levs = + let n = entry.ename ^ "_" ^ string_of_int clevn in + let next = entry.ename ^ "_" ^ string_of_int (clevn + 1) in + let p = <:patt< $lid:n$ >> in + match levs with + [ [] -> [Some (p, <:expr< fun __strm -> raise Stream.Failure >>)] + | [lev :: levs] -> + let pel = start_parser_of_levels entry (succ clevn) levs in + match lev.lprefix with + [ DeadEnd -> + let ncont = + if not strict_parsing.val && clevn = 0 then + entry.ename ^ "_gen_cont" + else entry.ename ^ "_" ^ string_of_int clevn ^ "_cont" + in + let curr = + <:expr< let a = $lid:next$ __strm in $lid:ncont$ bp a __strm >> + in + let curr = <:expr< let bp = Stream.count __strm in $curr$ >> in + let e = <:expr< fun __strm -> $curr$ >> in + let pel = if levs = [] then [] else pel in + [Some (p, e) :: pel] + | tree -> + let alevn = clevn in + let (kont, pel) = + match levs with + [ [] -> (<:expr< raise Stream.Failure >>, []) + | _ -> + let e = + match (lev.assoc, lev.lsuffix) with + [ (NonA, _) | (_, DeadEnd) -> <:expr< $lid:next$ __strm >> + | _ -> + let ncont = + entry.ename ^ "_" ^ string_of_int clevn ^ "_cont" + in + <:expr< + let a = $lid:next$ __strm in + $lid:ncont$ bp a __strm + >> ] + in + (e, pel) ] + in + let act_kont end_with_self act = + if lev.lsuffix = DeadEnd then gen_let_loc _loc (final_action act) + else + let ncont = entry.ename ^ "_" ^ string_of_int clevn ^ "_cont" in + gen_let_loc _loc + <:expr< $lid:ncont$ bp $final_action act$ __strm >> + in + let curr = + parse_tree entry (succ clevn) alevn (tree, True) act_kont kont + in + let curr = <:expr< let bp = Stream.count __strm in $curr$ >> in + let e = <:expr< fun __strm -> $curr$ >> in + [Some (p, e) :: pel] ] ] +; + +value rec continue_parser_of_levels entry clevn levs = + let n = entry.ename ^ "_" ^ string_of_int clevn ^ "_cont" in + let p = <:patt< $lid:n$ >> in + match levs with + [ [] -> [None] + | [lev :: levs] -> + let pel = continue_parser_of_levels entry (succ clevn) levs in + match lev.lsuffix with + [ DeadEnd -> + [None :: pel] + | tree -> + let alevn = + match lev.assoc with + [ LeftA | NonA -> succ clevn + | RightA -> clevn ] + in + let (kont, pel) = + match levs with + [ [] -> (<:expr< a__ >>, []) + | _ -> (<:expr< a__ >>, pel) ] + in + let act_kont end_with_self act = + let p = last_patt_of_act act in + match lev.assoc with + [ RightA | NonA -> + <:expr< + let $p$ = a__ in + $gen_let_loc _loc (final_action act)$ + >> + | LeftA -> + let ncont = + entry.ename ^ "_" ^ string_of_int clevn ^ "_cont" + in + gen_let_loc _loc + <:expr< + let $p$ = a__ in + $lid:ncont$ bp $final_action act$ __strm + >> ] + in + let curr = + parse_tree entry (succ clevn) alevn (tree, True) act_kont kont + in + let e = <:expr< fun bp a__ __strm -> $curr$ >> in + [Some (p, e) :: pel] ] ] +; + +value continue_parser_of_levels_again entry levs = + let n = entry.ename ^ "_gen_cont" in + let e = + loop <:expr< a__ >> 0 levs where rec loop var levn = + fun + [ [] -> <:expr< if x == a__ then x else $lid:n$ bp x __strm >> + | [lev :: levs] -> + match lev.lsuffix with + [ DeadEnd -> loop var (levn + 1) levs + | _ -> + let n = entry.ename ^ "_" ^ string_of_int levn ^ "_cont" in + let rest = loop <:expr< x >> (levn + 1) levs in + <:expr< let x = $lid:n$ bp $var$ __strm in $rest$ >> ] ] + in + (<:patt< $lid:n$ >>, <:expr< fun bp a__ __strm -> $e$ >>) +; + +value empty_entry ename = + let p = <:patt< $lid:ename$ >> in + let e = + <:expr< + fun __strm -> + raise (Stream.Error $str:"entry [" ^ ename ^ "] is empty"$) >> + in + [Some (p, e)] +; + +value start_parser_of_entry entry = + match entry.edesc with + [ Dlevels [] -> empty_entry entry.ename + | Dlevels elev -> start_parser_of_levels entry 0 elev + | Dparser p -> [] ] +; + +value continue_parser_of_entry entry = + match entry.edesc with + [ Dlevels elev -> continue_parser_of_levels entry 0 elev + | Dparser p -> [] ] +; + +value continue_parser_of_entry_again entry = + if strict_parsing.val then [] + else + match entry.edesc with + [ Dlevels ([_; _ :: _] as levs) -> + [continue_parser_of_levels_again entry levs] + | _ -> [] ] +; + +value rec list_alternate l1 l2 = + match (l1, l2) with + [ ([x1 :: l1], [x2 :: l2]) -> [x1; x2 :: list_alternate l1 l2] + | ([], l2) -> l2 + | (l1, []) -> l1 ] +; + +value compile_entry entry = + let pel1 = start_parser_of_entry entry in + let pel2 = continue_parser_of_entry entry in + let pel = list_alternate pel1 pel2 in + List.fold_right + (fun pe list -> + match pe with + [ Some pe -> [pe :: list] + | None -> list ]) + pel (continue_parser_of_entry_again entry) +; + +(* get all entries connected together *) + +value rec scan_tree list = + fun + [ Node {node = n; son = son; brother = bro} -> + let list = scan_symbol list n in + let list = scan_tree list son in + let list = scan_tree list bro in + list + | LocAct _ _ | DeadEnd -> list ] +and scan_symbol list = + fun + [ Snterm e -> scan_entry list e + | Snterml e l -> scan_entry list e + | Slist0 s -> scan_symbol list s + | Slist0sep s sep -> scan_symbol (scan_symbol list s) sep + | Slist1 s -> scan_symbol list s + | Slist1sep s sep -> scan_symbol (scan_symbol list s) sep + | Sopt s -> scan_symbol list s + | Stree t -> scan_tree list t + | Smeta _ _ _ | Sself | Snext | Stoken _ -> list ] +and scan_level list lev = + let list = scan_tree list lev.lsuffix in + let list = scan_tree list lev.lprefix in + list +and scan_levels list levs = List.fold_left scan_level list levs +and scan_entry list entry = + if List.memq entry list then list + else + match entry.edesc with + [ Dlevels levs -> scan_levels [entry :: list] levs + | Dparser _ -> list ] +; + +value all_entries_in_graph list entry = + List.rev (scan_entry list entry) +; + +(* main *) + +value entries = ref []; + +value rec list_mem_right_assoc x = + fun + [ [] -> False + | [(a, b) :: l] -> x = b || list_mem_right_assoc x l ] +; + +value rec expr_list = + fun + [ [] -> <:expr< [] >> + | [x :: l] -> <:expr< [$`str:x$ :: $expr_list l$] >> ] +; + +value compile () = + let _ = do { keywords.val := []; } in + let list = List.fold_left all_entries_in_graph [] entries.val in + let list = + List.filter (fun e -> List.memq e list) entries.val @ + List.filter (fun e -> not (List.memq e entries.val)) list + in + let list = + let set = ref [] in + List.fold_right + (fun entry list -> + if List.mem entry.ename set.val then + list + else do { set.val := [entry.ename :: set.val]; [entry :: list] }) + list [] + in + let pell = List.map compile_entry list in + let pel = List.flatten pell in + let si1 = <:str_item< value rec $list:pel$ >> in + let si2 = + let list = List.sort compare keywords.val in + <:str_item< + List.iter (fun kw -> P.lexer.Token.tok_using ("", kw)) + $expr_list list$ + >> + in + let loc = Loc.ghost in + ([(si1, loc); (si2, loc)], False) +; + +Pcaml.parse_implem.val := fun _ _ -> compile (); + +Pcaml.add_option "-strict_parsing" (Arg.Set strict_parsing) + "Don't generate error recovering by trying continuations or first levels" +; diff --git a/camlp4/unmaintained/compile/compile.sh b/camlp4/unmaintained/compile/compile.sh new file mode 100755 index 00000000..a2f4f773 --- /dev/null +++ b/camlp4/unmaintained/compile/compile.sh @@ -0,0 +1,27 @@ +#!/bin/sh -e + +ARGS= +FILES= +ENTRIES= +while test "" != "$1"; do + case $1 in + -e) + shift; + if test "$ENTRIES" != ""; then ENTRIES="$ENTRIES; "; fi + ENTRIES="$ENTRIES$1";; + *.ml*) FILES="$FILES $1";; + *) ARGS="$ARGS $1";; + esac + shift +done + +cat $FILES | sed -e 's/Pcaml.parse_i.*$//' > tmp.ml +echo "Compile.entries.val := [$ENTRIES];" >> tmp.ml +> tmp.mli +set -x +$OTOP/boot/ocamlrun$EXE $OTOP/boot/ocamlc -I $OTOP/boot -c tmp.mli +$OTOP/boot/ocamlrun$EXE ../boot/camlp4boot$EXE -meta_action tmp.ml -o tmp.ppo +$OTOP/boot/ocamlrun$EXE $OTOP/boot/ocamlc -I $OTOP/boot -I ../lib -I ../camlp4 -c -impl tmp.ppo +rm tmp.ppo +> tmp.null +$OTOP/boot/ocamlrun$EXE ../camlp4/camlp4$EXE ./compile.cmo ./tmp.cmo ../etc/pr_r.cmo ../etc/pr_rp.cmo $ARGS -sep "\n\n" -impl tmp.null && rm tmp.* diff --git a/camlp4/unmaintained/etc/.cvsignore b/camlp4/unmaintained/etc/.cvsignore new file mode 100644 index 00000000..50d8a8ea --- /dev/null +++ b/camlp4/unmaintained/etc/.cvsignore @@ -0,0 +1,7 @@ +*.cm[oia] +camlp4o +camlp4sch +camlp4o.opt +version.sh +mkcamlp4.sh +mkcamlp4.mpw diff --git a/camlp4/unmaintained/etc/.depend b/camlp4/unmaintained/etc/.depend new file mode 100644 index 00000000..863adc1c --- /dev/null +++ b/camlp4/unmaintained/etc/.depend @@ -0,0 +1,6 @@ +parserify.cmo: parserify.cmi +parserify.cmx: parserify.cmi +pr_op_main.cmo: parserify.cmi +pr_op_main.cmx: parserify.cmx +pr_rp_main.cmo: parserify.cmi +pr_rp_main.cmx: parserify.cmx diff --git a/camlp4/unmaintained/etc/Makefile b/camlp4/unmaintained/etc/Makefile new file mode 100644 index 00000000..196dd2b7 --- /dev/null +++ b/camlp4/unmaintained/etc/Makefile @@ -0,0 +1,62 @@ + + +include ../config/Makefile.cnf + +INCLUDES=-I ../camlp4 -I ../lib -I ../meta -I $(OTOP)/lex -I $(OTOP)/parsing +OBJS=q_phony.cmo pa_o.cmo pa_op.cmo pa_oop.cmo pa_ru.cmo pa_extfun.cmo pa_fstream.cmo pa_ifdef.cmo pr_r.cmo pr_rp.cmo pr_o.cmo pr_op.cmo pr_extend.cmo pr_extfun.cmo pr_null.cmo pr_depend.cmo genTraversal.cmo fi_exc_tracer.cmo +INTF=pa_o.cmi +CAMLP4OM=pa_o.cmo pa_op.cmo ../meta/pr_dump.cmo +CAMLP4OMX=$(CAMLP4OM:.cmo=.cmx) +EXECUTABLES=camlp4o + +include ../config/Makefile.base + +all-local: mkcamlp4.sh + +pr_rp.cmo: parserify.cmo pr_rp_main.cmo + $(OCAMLC) parserify.cmo pr_rp_main.cmo -a -o $@ + +pr_op.cmo: parserify.cmo pr_op_main.cmo + $(OCAMLC) parserify.cmo pr_op_main.cmo -a -o $@ + +pr_rp.cmx: parserify.cmx pr_rp_main.cmx + $(OCAMLOPT) parserify.cmx pr_rp_main.cmx -a -o pr_rp.cmxa + mv pr_rp.cmxa pr_rp.cmx + mv pr_rp.$(A) pr_rp.$(O) + +pr_op.cmx: parserify.cmx pr_op_main.cmx + $(OCAMLOPT) parserify.cmx pr_op_main.cmx -a -o pr_op.cmxa + mv pr_op.cmxa pr_op.cmx + mv pr_op.$(A) pr_op.$(O) + +camlp4o$(EXE): ../camlp4/camlp4$(EXE) $(CAMLP4OM) + rm -f camlp4o$(EXE) + cd ../camlp4; $(MAKE) CAMLP4=../etc/camlp4o$(EXE) CAMLP4M="-I ../etc $(CAMLP4OM)" + +camlp4o.opt: $(CAMLP4OMX) + rm -f camlp4o.opt + cd ../camlp4; $(MAKE) ../etc/camlp4o.opt CAMLP4OPT=../etc/camlp4o.opt CAMLP4M="-I ../etc $(CAMLP4OMX)" + +mkcamlp4.sh: mkcamlp4.sh.tpl version.sh + sed -e "s!LIBDIR!$(LIBDIR)!g" -e "/define VERSION/r version.sh" \ + mkcamlp4.sh.tpl > mkcamlp4.sh + +version.sh : $(OTOP)/VERSION + echo "VERSION=\"`head -1 ../VERSION`\"" >version.sh + +install-local: + -$(MKDIR) "$(LIBDIR)/camlp4" "$(BINDIR)" + cp $(OBJS) "$(LIBDIR)/camlp4/." + cp $(INTF) "$(LIBDIR)/camlp4/." + cp camlp4o$(EXE) "$(BINDIR)/." + if test -f camlp4o.opt; then \ + cp camlp4o.opt "$(BINDIR)/camlp4o.opt$(EXE)"; \ + cp $(OBJSX) "$(LIBDIR)/camlp4/."; \ + for file in $(OBJSX); do \ + cp "`echo $$file | sed -e 's/\.cmx$$/.$(O)/'`" "$(LIBDIR)/camlp4/."; \ + done ; \ + fi + cp mkcamlp4.sh "$(BINDIR)/mkcamlp4" + chmod a+x "$(BINDIR)/mkcamlp4" + +include .depend diff --git a/camlp4/unmaintained/etc/pa_fstream.ml b/camlp4/unmaintained/etc/pa_fstream.ml new file mode 100644 index 00000000..e5027b58 --- /dev/null +++ b/camlp4/unmaintained/etc/pa_fstream.ml @@ -0,0 +1,163 @@ +(* camlp4r pa_extend.cmo q_MLast.cmo *) + + +open Pcaml; + +type spat_comp = + [ SpTrm of Loc.t and MLast.patt and option MLast.expr + | SpNtr of Loc.t and MLast.patt and MLast.expr + | SpStr of Loc.t and MLast.patt ] +; +type sexp_comp = + [ SeTrm of Loc.t and MLast.expr + | SeNtr of Loc.t and MLast.expr ] +; + +(* parsers *) + +value strm_n = "__strm"; +value next_fun _loc = <:expr< Fstream.next >>; + +value rec pattern_eq_expression p e = + match (p, e) with + [ (<:patt< $lid:a$ >>, <:expr< $lid:b$ >>) -> a = b + | (<:patt< $uid:a$ >>, <:expr< $uid:b$ >>) -> a = b + | (<:patt< $p1$ $p2$ >>, <:expr< $e1$ $e2$ >>) -> + pattern_eq_expression p1 e1 && pattern_eq_expression p2 e2 + | (<:patt< ($list:pl$) >>, <:expr< ($list:el$) >>) -> + loop pl el where rec loop pl el = + match (pl, el) with + [ ([p :: pl], [e :: el]) -> + pattern_eq_expression p e && loop pl el + | ([], []) -> True + | _ -> False ] + | _ -> False ] +; + +value stream_pattern_component skont = + fun + [ SpTrm _loc p wo -> + let p = <:patt< Some ($p$, $lid:strm_n$) >> in + if wo = None && pattern_eq_expression p skont then + <:expr< $next_fun _loc$ $lid:strm_n$ >> + else + <:expr< match $next_fun _loc$ $lid:strm_n$ with + [ $p$ $when:wo$ -> $skont$ + | _ -> None ] >> + | SpNtr _loc p e -> + let p = <:patt< Some ($p$, $lid:strm_n$) >> in + if pattern_eq_expression p skont then <:expr< $e$ $lid:strm_n$ >> + else + <:expr< match $e$ $lid:strm_n$ with + [ $p$ -> $skont$ + | _ -> None ] >> + | SpStr _loc p -> + <:expr< let $p$ = $lid:strm_n$ in $skont$ >> ] +; + +value rec stream_pattern _loc epo e = + fun + [ [] -> + let e = + match epo with + [ Some ep -> <:expr< let $ep$ = Fstream.count $lid:strm_n$ in $e$ >> + | None -> e ] + in + <:expr< Some ($e$, $lid:strm_n$) >> + | [spc :: spcl] -> + let skont = stream_pattern _loc epo e spcl in + stream_pattern_component skont spc ] +; + +value rec parser_cases _loc = + fun + [ [] -> <:expr< None >> + | [(spcl, epo, e) :: spel] -> + match parser_cases _loc spel with + [ <:expr< None >> -> stream_pattern _loc epo e spcl + | pc -> + <:expr< match $stream_pattern _loc epo e spcl$ with + [ Some _ as x -> x + | None -> $pc$ ] >> ] ] +; + +value cparser_match _loc me bpo pc = + let pc = parser_cases _loc pc in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $pc$ >> + | None -> pc ] + in + <:expr< let ($lid:strm_n$ : Stream.t _) = $me$ in $e$ >> +; + +value cparser _loc bpo pc = + let e = parser_cases _loc pc in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Fstream.count $lid:strm_n$ in $e$ >> + | None -> e ] + in + let p = <:patt< ($lid:strm_n$ : Fstream.t _) >> in <:expr< fun $p$ -> $e$ >> +; + +(* streams *) + +value slazy _loc x = <:expr< fun () -> $x$ >>; + +value rec cstream _loc = + fun + [ [] -> <:expr< Fstream.nil >> + | [SeTrm _loc e :: sel] -> + let e2 = cstream _loc sel in + let x = <:expr< Fstream.cons $e$ $e2$ >> in + <:expr< Fstream.flazy $slazy _loc x$ >> + | [SeNtr _loc e] -> + e + | [SeNtr _loc e :: sel] -> + let e2 = cstream _loc sel in + let x = <:expr< Fstream.app $e$ $e2$ >> in + <:expr< Fstream.flazy $slazy _loc x$ >> ] +; + +EXTEND + GLOBAL: expr; + expr: LEVEL "top" + [ [ "fparser"; po = OPT ipatt; "["; pcl = LIST0 parser_case SEP "|"; "]" -> + <:expr< $cparser _loc po pcl$ >> + | "fparser"; po = OPT ipatt; pc = parser_case -> + <:expr< $cparser _loc po [pc]$ >> + | "match"; e = SELF; "with"; "parser"; po = OPT ipatt; "["; + pcl = LIST0 parser_case SEP "|"; "]" -> + <:expr< $cparser_match _loc e po pcl$ >> + | "match"; e = SELF; "with"; "parser"; po = OPT ipatt; + pc = parser_case -> + <:expr< $cparser_match _loc e po [pc]$ >> ] ] + ; + parser_case: + [ [ "[:"; sp = stream_patt; ":]"; po = OPT ipatt; "->"; e = expr -> + (sp, po, e) ] ] + ; + stream_patt: + [ [ spc = stream_patt_comp -> [spc] + | spc = stream_patt_comp; ";"; sp = LIST1 stream_patt_comp SEP ";" -> + [spc :: sp] + | -> [] ] ] + ; + stream_patt_comp: + [ [ "`"; p = patt; eo = OPT [ "when"; e = expr -> e ] -> SpTrm _loc p eo + | p = patt; "="; e = expr -> SpNtr _loc p e + | p = patt -> SpStr _loc p ] ] + ; + ipatt: + [ [ i = LIDENT -> <:patt< $lid:i$ >> ] ] + ; + expr: LEVEL "simple" + [ [ "fstream"; "[:"; se = LIST0 stream_expr_comp SEP ";"; ":]" -> + <:expr< $cstream _loc se$ >> ] ] + ; + stream_expr_comp: + [ [ "`"; e = expr -> SeTrm _loc e + | e = expr -> SeNtr _loc e ] ] + ; +END; diff --git a/camlp4/unmaintained/etc/pa_ifdef.ml b/camlp4/unmaintained/etc/pa_ifdef.ml new file mode 100644 index 00000000..06652630 --- /dev/null +++ b/camlp4/unmaintained/etc/pa_ifdef.ml @@ -0,0 +1,91 @@ +(* camlp4r pa_extend.cmo q_MLast.cmo *) + + +(* This module is deprecated since version 3.07; use pa_macro.ml instead *) + +value _ = + prerr_endline "Warning: pa_ifdef is deprecated since OCaml 3.07. Use pa_macro instead." +; + +type item_or_def 'a = + [ SdStr of 'a | SdDef of string | SdUnd of string | SdNop ] +; + +value list_remove x l = + List.fold_right (fun e l -> if e = x then l else [e :: l]) l [] +; + +value defined = ref ["OCAML_308"; "OCAML_307"; "OCAML_305"; "CAMLP4_300"; "NEWSEQ"]; +value define x = defined.val := [x :: defined.val]; +value undef x = defined.val := list_remove x defined.val; + +EXTEND + GLOBAL: Pcaml.expr Pcaml.str_item Pcaml.sig_item; + Pcaml.expr: LEVEL "top" + [ [ "ifdef"; c = UIDENT; "then"; e1 = Pcaml.expr; "else"; + e2 = Pcaml.expr -> + if List.mem c defined.val then e1 else e2 + | "ifndef"; c = UIDENT; "then"; e1 = Pcaml.expr; "else"; + e2 = Pcaml.expr -> + if List.mem c defined.val then e2 else e1 ] ] + ; + Pcaml.str_item: FIRST + [ [ x = def_undef_str -> + match x with + [ SdStr si -> si + | SdDef x -> do { define x; <:str_item< declare end >> } + | SdUnd x -> do { undef x; <:str_item< declare end >> } + | SdNop -> <:str_item< declare end >> ] ] ] + ; + def_undef_str: + [ [ "ifdef"; c = UIDENT; "then"; e1 = str_item_def_undef; + "else"; e2 = str_item_def_undef -> + if List.mem c defined.val then e1 else e2 + | "ifdef"; c = UIDENT; "then"; e1 = str_item_def_undef -> + if List.mem c defined.val then e1 else SdNop + | "ifndef"; c = UIDENT; "then"; e1 = str_item_def_undef; + "else"; e2 = str_item_def_undef -> + if List.mem c defined.val then e2 else e1 + | "ifndef"; c = UIDENT; "then"; e1 = str_item_def_undef -> + if List.mem c defined.val then SdNop else e1 + | "define"; c = UIDENT -> SdDef c + | "undef"; c = UIDENT -> SdUnd c ] ] + ; + str_item_def_undef: + [ [ d = def_undef_str -> d + | si = Pcaml.str_item -> SdStr si ] ] + ; + Pcaml.sig_item: FIRST + [ [ x = def_undef_sig -> + match x with + [ SdStr si -> si + | SdDef x -> do { define x; <:sig_item< declare end >> } + | SdUnd x -> do { undef x; <:sig_item< declare end >> } + | SdNop -> <:sig_item< declare end >> ] ] ] + ; + def_undef_sig: + [ [ "ifdef"; c = UIDENT; "then"; e1 = sig_item_def_undef; + "else"; e2 = sig_item_def_undef -> + if List.mem c defined.val then e1 else e2 + | "ifdef"; c = UIDENT; "then"; e1 = sig_item_def_undef -> + if List.mem c defined.val then e1 else SdNop + | "ifndef"; c = UIDENT; "then"; e1 = sig_item_def_undef; + "else"; e2 = sig_item_def_undef -> + if List.mem c defined.val then e2 else e1 + | "ifndef"; c = UIDENT; "then"; e1 = sig_item_def_undef -> + if List.mem c defined.val then SdNop else e1 + | "define"; c = UIDENT -> SdDef c + | "undef"; c = UIDENT -> SdUnd c ] ] + ; + sig_item_def_undef: + [ [ d = def_undef_sig -> d + | si = Pcaml.sig_item -> SdStr si ] ] + ; +END; + +Pcaml.add_option "-D" (Arg.String define) + " Define for ifdef instruction." +; +Pcaml.add_option "-U" (Arg.String undef) + " Undefine for ifdef instruction." +; diff --git a/camlp4/unmaintained/etc/pa_oop.ml b/camlp4/unmaintained/etc/pa_oop.ml new file mode 100644 index 00000000..bb5684ba --- /dev/null +++ b/camlp4/unmaintained/etc/pa_oop.ml @@ -0,0 +1,155 @@ +(* camlp4r pa_extend.cmo q_MLast.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; + +type spat_comp = + [ SpTrm of Loc.t and MLast.patt and option MLast.expr + | SpNtr of Loc.t and MLast.patt and MLast.expr + | SpStr of Loc.t and MLast.patt ] +; +type sexp_comp = + [ SeTrm of Loc.t and MLast.expr | SeNtr of Loc.t and MLast.expr ] +; + +value strm_n = "__strm"; +value peek_fun _loc = <:expr< Stream.peek >>; +value junk_fun _loc = <:expr< Stream.junk >>; + +(* Parsers. *) + +value stream_pattern_component skont = + fun + [ SpTrm _loc p wo -> + (<:expr< $peek_fun _loc$ $lid:strm_n$ >>, p, wo, + <:expr< do { $junk_fun _loc$ $lid:strm_n$; $skont$ } >>) + | SpNtr _loc p e -> + (<:expr< try Some ($e$ $lid:strm_n$) with + [ Stream.Failure -> None ] >>, + p, None, skont) + | SpStr _loc p -> + (<:expr< Some $lid:strm_n$ >>, p, None, skont) ] +; + +value rec stream_pattern _loc epo e ekont = + fun + [ [] -> + match epo with + [ Some ep -> <:expr< let $ep$ = Stream.count $lid:strm_n$ in $e$ >> + | _ -> e ] + | [(spc, err) :: spcl] -> + let skont = + let ekont err = + let str = + match err with + [ Some estr -> estr + | _ -> <:expr< "" >> ] + in + <:expr< raise (Stream.Error $str$) >> + in + stream_pattern _loc epo e ekont spcl + in + let (tst, p, wo, e) = stream_pattern_component skont spc in + let ckont = ekont err in + <:expr< match $tst$ with + [ Some $p$ $when:wo$ -> $e$ | _ -> $ckont$ ] >> ] +; + +value rec parser_cases _loc = + fun + [ [] -> <:expr< raise Stream.Failure >> + | [(spcl, epo, e) :: spel] -> + stream_pattern _loc epo e (fun _ -> parser_cases _loc spel) spcl ] +; + +value cparser _loc bpo pc = + let e = parser_cases _loc pc in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $e$ >> + | None -> e ] + in + let p = <:patt< ($lid:strm_n$ : Stream.t _) >> in + <:expr< fun $p$ -> $e$ >> +; + +value cparser_match _loc me bpo pc = + let pc = parser_cases _loc pc in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $pc$ >> + | None -> pc ] + in + <:expr< let $lid:strm_n$ = $me$ in $e$ >> +; + +(* streams *) + +value slazy _loc e = <:expr< fun _ -> $e$ >>; + +value rec cstream gloc = + fun + [ [] -> let _loc = gloc in <:expr< Stream.sempty >> + | [SeTrm _loc e :: secl] -> + <:expr< Stream.lcons $slazy _loc e$ $cstream gloc secl$ >> + | [SeNtr _loc e :: secl] -> + <:expr< Stream.lapp $slazy _loc e$ $cstream gloc secl$ >> ] +; + +(* Syntax extensions in Ocaml grammar *) + + +EXTEND + GLOBAL: expr; + expr: LEVEL "expr1" + [ [ "parser"; po = OPT ipatt; OPT "|"; pcl = LIST1 parser_case SEP "|" -> + <:expr< $cparser _loc po pcl$ >> + | "match"; e = expr; "with"; "parser"; po = OPT ipatt; OPT "|"; + pcl = LIST1 parser_case SEP "|" -> + <:expr< $cparser_match _loc e po pcl$ >> ] ] + ; + parser_case: + [ [ "[<"; sp = stream_patt; ">]"; po = OPT ipatt; "->"; e = expr -> + (sp, po, e) ] ] + ; + stream_patt: + [ [ spc = stream_patt_comp -> [(spc, None)] + | spc = stream_patt_comp; ";"; sp = LIST1 stream_patt_comp_err SEP ";" -> + [(spc, None) :: sp] + | (* empty *) -> [] ] ] + ; + stream_patt_comp_err: + [ [ spc = stream_patt_comp; + eo = OPT [ "??"; e = expr LEVEL "expr1" -> e ] -> + (spc, eo) ] ] + ; + stream_patt_comp: + [ [ "'"; p = patt; eo = OPT [ "when"; e = (expr LEVEL "expr1") -> e ] -> + SpTrm _loc p eo + | p = patt; "="; e = (expr LEVEL "expr1") -> SpNtr _loc p e + | p = patt -> SpStr _loc p ] ] + ; + ipatt: + [ [ i = LIDENT -> <:patt< $lid:i$ >> ] ] + ; + + expr: LEVEL "simple" + [ [ "[<"; se = LIST0 stream_expr_comp SEP ";"; ">]" -> + <:expr< $cstream _loc se$ >> ] ] + ; + stream_expr_comp: + [ [ "'"; e = expr LEVEL "expr1" -> SeTrm _loc e + | e = expr LEVEL "expr1" -> SeNtr _loc e ] ] + ; +END; diff --git a/camlp4/unmaintained/etc/pa_ru.ml b/camlp4/unmaintained/etc/pa_ru.ml new file mode 100644 index 00000000..1761c5e4 --- /dev/null +++ b/camlp4/unmaintained/etc/pa_ru.ml @@ -0,0 +1,46 @@ +(* camlp4r pa_extend.cmo q_MLast.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; + +value o2b = + fun + [ Some _ -> True + | None -> False ] +; + +EXTEND + GLOBAL: expr; + expr: LEVEL "top" + [ [ "do"; "{"; seq = sequence; "}" -> + match seq with + [ [e] -> e + | _ -> <:expr< do { $list:seq$ } >> ] ] ] + ; + sequence: + [ [ "let"; o = OPT "rec"; l = LIST1 let_binding SEP "and"; [ "in" | ";" ]; + el = SELF -> + let e = + match el with + [ [e] -> e + | _ -> <:expr< do { $list:el$ } >> ] + in + [ <:expr< let $opt:o2b o$ $list:l$ in $e$ >> ] + | e = expr; ";"; el = SELF -> + let e = let _loc = MLast.loc_of_expr e in <:expr< ($e$ : unit) >> in + [e :: el] + | e = expr; ";" -> [e] + | e = expr -> [e] ] ] + ; +END; diff --git a/camlp4/unmaintained/etc/parserify.ml b/camlp4/unmaintained/etc/parserify.ml new file mode 100644 index 00000000..f0a3be8b --- /dev/null +++ b/camlp4/unmaintained/etc/parserify.ml @@ -0,0 +1,305 @@ +(* camlp4r q_MLast.cmo *) + + +(* FIXME FIXME *) +value _loc = Loc.mk "FIXME parserify.ml"; + +type spc = + [ SPCterm of (MLast.patt * option MLast.expr) + | SPCnterm of MLast.patt and MLast.expr + | SPCsterm of MLast.patt ] +; + +exception NotImpl; + +value rec subst v = + MLast.Map.Expr.expr (fun [ <:expr@_loc< __strm >> -> <:expr< $lid:v$ >> + | e -> e ]) +(* FIXME FIXME *) + (* match e with + [ <:expr< $lid:x$ >> -> if x = "__strm" then <:expr< $lid:v$ >> else e + | <:expr< $uid:_$ >> -> e + | <:expr< $int:_$ >> -> e + | <:expr< $chr:_$ >> -> e + | <:expr< $str:_$ >> -> e + | <:expr@_loc< $e1$ . $lab$ >> -> <:expr< $subst v e1$ . $lab$ >> + | <:expr@_loc< $x$ $y$ >> -> <:expr< $subst v x$ $subst v y$ >> + | <:expr@_loc< let $lid:s1$ = $e1$ in $e2$ >> -> + if s1 = v then <:expr< let $lid:s1$ = $subst v e1$ in $e2$ >> + else <:expr< let $lid:s1$ = $subst v e1$ in $subst v e2$ >> + | <:expr@_loc< let _ = $e1$ in $e2$ >> -> + <:expr< let _ = $subst v e1$ in $subst v e2$ >> + | <:expr@_loc< ($list:el$) >> -> <:expr< ($list:List.map (subst v) el$) >> + | _ -> raise NotImpl ] *) +; + +value rec is_free v = + fun + [ <:expr< $lid:x$ >> -> x <> v + | <:expr< $uid:_$ >> -> True + | <:expr< $int:_$ >> -> True + | <:expr< $chr:_$ >> -> True + | <:expr< $str:_$ >> -> True + | <:expr< $e$ . $_$ >> -> is_free v e + | <:expr< $x$ $y$ >> -> is_free v x && is_free v y + | <:expr< let $lid:s1$ = $e1$ in $e2$ >> -> + is_free v e1 && (s1 = v || is_free v e2) + | <:expr< let _ = $e1$ in $e2$ >> -> is_free v e1 && is_free v e2 + | <:expr< ($list:el$) >> -> List.for_all (is_free v) el + | _ -> raise NotImpl ] +; + +value gensym = + let cnt = ref 0 in + fun () -> + do { incr cnt; "pr_rp_symb_" ^ string_of_int cnt.val } +; + +value free_var_in_expr c e = + let rec loop_alpha v = + let x = String.make 1 v in + if is_free x e then Some x + else if v = 'z' then None + else loop_alpha (Char.chr (Char.code v + 1)) + in + let rec loop_count cnt = + let x = String.make 1 c ^ string_of_int cnt in + if is_free x e then x else loop_count (succ cnt) + in + try + match loop_alpha c with + [ Some v -> v + | None -> loop_count 1 ] + with + [ NotImpl -> gensym () ] +; + +value parserify _loc = + fun + [ <:expr< $e$ __strm >> -> e + | e -> <:expr< fun __strm -> $e$ >> ] +; + +value is_raise_failure = + fun + [ <:expr< raise Stream.Failure >> -> True + | _ -> False ] +; + +value is_raise_error = + fun + [ <:expr< raise (Stream.Error $_$) >> -> True + | _ -> False ] +; + +value semantic _loc e = + try + if is_free "__strm" e then e + else + let v = free_var_in_expr 's' e in + <:expr< let $lid:v$ = __strm in $subst v e$ >> + with + [ NotImpl -> e ] +; + +value rewrite_parser = + rewrite True where rec rewrite top ge = + match ge with + [ <:expr@_loc< let $p$ = try $e$ with [ Stream.Failure -> raise $exc$ ] in + $sp_kont$ >> -> + let f = parserify _loc e in + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some $p$ -> $rewrite False sp_kont$ + | _ -> raise $exc$ ] + >> + | <:expr@_loc< let $p$ = Stream.count __strm in $f$ >> -> + try + if is_free "__strm" f then ge + else + let v = free_var_in_expr 's' f in + <:expr< + let $lid:v$ = __strm in + let $p$ = Stream.count __strm in $subst v f$ + >> + with + [ NotImpl -> ge ] + | <:expr@_loc< let $p$ = __strm in $e$ >> -> + <:expr< let $p$ = __strm in $rewrite False e$ >> + | <:expr@_loc< let $p$ = $f$ __strm in $sp_kont$ >> when top -> + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some $p$ -> $rewrite False sp_kont$ + | _ -> raise Stream.Failure ] + >> + | <:expr@_loc< let $p$ = $e$ in $sp_kont$ >> -> + if match e with + [ <:expr< match try Some $_$ with [ Stream.Failure -> None ] with + [ $list:_$ ] >> + | <:expr< match Stream.peek __strm with [ $list:_$ ] >> + | <:expr< try $_$ with [ Stream.Failure -> $_$ ] >> + | <:expr< let $_$ = Stream.count __strm in $_$ >> -> True + | _ -> False ] + then + let f = rewrite True <:expr< fun __strm -> $e$ >> in + let exc = + if top then <:expr< Stream.Failure >> + else <:expr< Stream.Error "" >> + in + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some $p$ -> $rewrite False sp_kont$ + | _ -> raise $exc$ ] + >> + else semantic _loc ge + | <:expr@_loc< match try Some $e$ with [ Stream.Failure -> None ] with + [ Some $p$ -> $sp_kont$ + | _ -> $p_kont$ ] >> -> + let f = parserify _loc e in + if not top && is_raise_failure p_kont then semantic _loc ge + else + let (p, f, sp_kont, p_kont) = + if top || is_raise_error p_kont then + (p, f, rewrite False sp_kont, rewrite top p_kont) + else + let f = + <:expr< + fun __strm -> + match + try Some ($f$ __strm) with [ Stream.Failure -> None ] + with + [ Some $p$ -> $rewrite False sp_kont$ + | _ -> $rewrite top p_kont$ ] + >> + in + (<:patt< a >>, f, <:expr< a >>, + <:expr< raise (Stream.Error "") >>) + in + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some $p$ -> $sp_kont$ + | _ -> $p_kont$ ] + >> + | <:expr< match Stream.peek __strm with [ $list:pel$ ] >> -> + let rec iter pel = + match pel with + [ [(<:patt< Some $p$ >>, eo, + <:expr< do { Stream.junk __strm; $sp_kont$ } >>); + (<:patt< _ >>, None, p_kont) :: _] -> + <:expr< + match Stream.peek __strm with + [ Some $p$ $when:eo$ -> + do { Stream.junk __strm; $rewrite False sp_kont$ } + | _ -> $rewrite top p_kont$ ] + >> + | [(<:patt< Some $p$ >>, eo, + <:expr< do { Stream.junk __strm; $sp_kont$ } >>) :: pel] -> + let p_kont = iter pel in + <:expr< + match Stream.peek __strm with + [ Some $p$ $when:eo$ -> + do { Stream.junk __strm; $rewrite False sp_kont$ } + | _ -> $p_kont$ ] + >> + | _ -> + <:expr< match Stream.peek __strm with [ $list:pel$ ] >> ] + in + iter pel + | <:expr@_loc< try Some $e$ with [ Stream.Failure -> $p_kont$ ] >> -> + let f = parserify _loc e in + let e = + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some a -> Some a + | _ -> $p_kont$ ] + >> + in + rewrite top e + | <:expr@_loc< try $e$ with [ Stream.Failure -> $p_kont$ ] >> -> + let f = parserify _loc e in + let e = + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some a -> a + | _ -> $rewrite top p_kont$ ] + >> + in + rewrite top e + | <:expr< $f$ __strm >> -> + if top then + <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some a -> a + | _ -> raise Stream.Failure ] + >> + else + let v = free_var_in_expr 's' f in + <:expr< let $lid:v$ = __strm in $subst v f$ $lid:v$ >> + | e -> let loc = MLast.loc_of_expr e in semantic loc e ] +; + +value spc_of_parser = + let rec parser_cases e = + match e with + [ <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some $p$ -> $sp_kont$ + | _ -> $p_kont$ ] + >> -> + let spc = (SPCnterm p f, None) in + let (sp, epo, e) = kont sp_kont in + [([spc :: sp], epo, e) :: parser_cases p_kont] + | <:expr< + match Stream.peek __strm with + [ Some $p$ $when:wo$ -> do { Stream.junk __strm; $sp_kont$ } + | _ -> $p_kont$ ] + >> -> + let spc = (SPCterm (p, wo), None) in + let (sp, epo, e) = kont sp_kont in + [([spc :: sp], epo, e) :: parser_cases p_kont] + | <:expr< let $p$ = __strm in $sp_kont$ >> -> + let spc = (SPCsterm p, None) in + let (sp, epo, e) = kont sp_kont in + [([spc :: sp], epo, e)] + | <:expr< let $p$ = Stream.count __strm in $e$ >> -> [([], Some p, e)] + | <:expr< raise Stream.Failure >> -> [] + | _ -> [([], None, e)] ] + and kont e = + match e with + [ <:expr< + match try Some ($f$ __strm) with [ Stream.Failure -> None ] with + [ Some $p$ -> $sp_kont$ + | _ -> raise (Stream.Error $err$) ] + >> -> + let err = + match err with + [ <:expr< "" >> -> None + | _ -> Some err ] + in + let spc = (SPCnterm p f, err) in + let (sp, epo, e) = kont sp_kont in + ([spc :: sp], epo, e) + | <:expr< + match Stream.peek __strm with + [ Some $p$ $when:wo$ -> do { Stream.junk __strm; $sp_kont$ } + | _ -> raise (Stream.Error $err$) ] + >> -> + let err = + match err with + [ <:expr< "" >> -> None + | _ -> Some err ] + in + let spc = (SPCterm (p, wo), err) in + let (sp, epo, e) = kont sp_kont in + ([spc :: sp], epo, e) + | <:expr< let $p$ = __strm in $sp_kont$ >> -> + let spc = (SPCsterm p, None) in + let (sp, epo, e) = kont sp_kont in + ([spc :: sp], epo, e) + | <:expr< let $p$ = Stream.count __strm in $e$ >> -> ([], Some p, e) + | _ -> ([], None, e) ] + in + parser_cases +; + +value parser_of_expr e = spc_of_parser (rewrite_parser e); diff --git a/camlp4/unmaintained/etc/parserify.mli b/camlp4/unmaintained/etc/parserify.mli new file mode 100644 index 00000000..c1affdba --- /dev/null +++ b/camlp4/unmaintained/etc/parserify.mli @@ -0,0 +1,12 @@ +(* camlp4r *) + + +type spc = + [ SPCterm of (MLast.patt * option MLast.expr) + | SPCnterm of MLast.patt and MLast.expr + | SPCsterm of MLast.patt ] +; + +value parser_of_expr : + MLast.expr -> + list (list (spc * option MLast.expr) * option MLast.patt * MLast.expr); diff --git a/camlp4/unmaintained/etc/pr_depend.ml b/camlp4/unmaintained/etc/pr_depend.ml new file mode 100644 index 00000000..53224daa --- /dev/null +++ b/camlp4/unmaintained/etc/pr_depend.ml @@ -0,0 +1,321 @@ +(* camlp4r *) + + +open MLast; + +value not_impl name x = + Format.eprintf "pr_depend: not impl: %s; %a@." name ObjTools.print (Obj.repr x) +; + +module StrSet = + Set.Make (struct type t = string; value compare = compare; end) +; + +value fset = ref StrSet.empty; +value addmodule s = fset.val := StrSet.add s fset.val; + +value list = List.iter; + +value option f = + fun + [ Some x -> f x + | None -> () ] +; + +value longident = + fun + [ [s; _ :: _] -> addmodule s + | _ -> () ] +; + +value rec ctyp = + fun + [ TyAcc _ t _ -> ctyp_module t + | TyAli _ t1 t2 -> do { ctyp t1; ctyp t2; } + | TyApp _ t1 t2 -> do { ctyp t1; ctyp t2; } + | TyAny _ -> () + | TyArr _ t1 t2 -> do { ctyp t1; ctyp t2; } + | TyCls _ li -> longident li + | TyLab _ _ t -> ctyp t + | TyLid _ _ -> () + | TyMan _ t1 t2 -> do { ctyp t1; ctyp t2; } + | TyOlb _ _ t -> ctyp t + | TyQuo _ _ -> () + | TyRec _ ldl -> list label_decl ldl + | TySum _ cdl -> list constr_decl cdl + | TyPrv _ t -> ctyp t + | TyTup _ tl -> list ctyp tl + | TyVrn _ sbtll _ -> list variant sbtll + | x -> not_impl "ctyp" x ] +and constr_decl (_, _, tl) = list ctyp tl +and label_decl (_, _, _, t) = ctyp t +and variant = + fun + [ RfTag _ _ tl -> list ctyp tl + | RfInh t -> ctyp t ] +and ctyp_module = + fun + [ TyAcc _ t _ -> ctyp_module t + | TyApp _ t1 t2 -> do { ctyp t1; ctyp t2; } + | TyUid _ m -> addmodule m + | x -> not_impl "ctyp_module" x ] +; + +value rec patt = + fun + [ PaAcc _ p _ -> patt_module p + | PaAli _ p1 p2 -> do { patt p1; patt p2; } + | PaAny _ -> () + | PaApp _ p1 p2 -> do { patt p1; patt p2; } + | PaArr _ pl -> list patt pl + | PaChr _ _ -> () + | PaInt _ _ -> () + | PaLab _ _ po -> option patt po + | PaLid _ _ -> () + | PaOlb _ _ peoo -> + option (fun (p, eo) -> do { patt p; option expr eo }) peoo + | PaOrp _ p1 p2 -> do { patt p1; patt p2; } + | PaRec _ lpl -> list label_patt lpl + | PaRng _ p1 p2 -> do { patt p1; patt p2; } + | PaStr _ _ -> () + | PaTup _ pl -> list patt pl + | PaTyc _ p t -> do { patt p; ctyp t; } + | PaUid _ _ -> () + | PaVrn _ _ -> () + | x -> not_impl "patt" x ] +and patt_module = + fun + [ PaUid _ m -> addmodule m + | PaAcc _ p _ -> patt_module p + | x -> not_impl "patt_module" x ] +and label_patt (p1, p2) = do { patt p1; patt p2; } +and expr = + fun + [ ExAcc _ e1 e2 -> do { expr_module e1; expr e2; } + | ExApp _ e1 e2 -> do { expr e1; expr e2; } + | ExAre _ e1 e2 -> do { expr e1; expr e2; } + | ExArr _ el -> list expr el + | ExAsf _ -> () + | ExAsr _ e -> do { expr e; } + | ExAss _ e1 e2 -> do { expr e1; expr e2; } + | ExChr _ _ -> () + | ExCoe _ e t1 t2 -> do { expr e; option ctyp t1; ctyp t2 } + | ExFor _ _ e1 e2 _ el -> do { expr e1; expr e2; list expr el; } + | ExFun _ pwel -> list match_case pwel + | ExIfe _ e1 e2 e3 -> do { expr e1; expr e2; expr e3; } + | ExInt _ _ -> () + | ExInt32 _ _ -> () + | ExInt64 _ _ -> () + | ExNativeInt _ _ -> () + | ExFlo _ _ -> () + | ExLab _ _ eo -> option expr eo + | ExLaz _ e -> expr e + | ExLet _ _ pel e -> do { list let_binding pel; expr e; } + | ExLid _ _ -> () + | ExLmd _ _ me e -> do { module_expr me; expr e; } + | ExMat _ e pwel -> do { expr e; list match_case pwel; } + | ExNew _ li -> longident li + | ExOlb _ _ eo -> option expr eo + | ExRec _ lel w -> do { list label_expr lel; option expr w; } + | ExSeq _ el -> list expr el + | ExSnd _ e _ -> expr e + | ExSte _ e1 e2 -> do { expr e1; expr e2; } + | ExStr _ _ -> () + | ExTry _ e pwel -> do { expr e; list match_case pwel; } + | ExTup _ el -> list expr el + | ExTyc _ e t -> do { expr e; ctyp t; } + | ExUid _ _ -> () + | ExVrn _ _ -> () + | ExWhi _ e el -> do { expr e; list expr el; } + | x -> not_impl "expr" x ] +and expr_module = + fun + [ ExUid _ m -> addmodule m + | e -> expr e ] +and let_binding (p, e) = do { patt p; expr e } +and label_expr (p, e) = do { patt p; expr e } +and match_case (p, w, e) = do { patt p; option expr w; expr e; } +and module_type = + fun + [ MtAcc _ (MtUid _ m) _ -> addmodule m + | MtFun _ _ mt1 mt2 -> do { module_type mt1; module_type mt2; } + | MtSig _ sil -> list sig_item sil + | MtUid _ _ -> () + | MtWit _ mt wc -> do { module_type mt; list with_constr wc; } + | x -> not_impl "module_type" x ] +and with_constr = + fun + [ WcTyp _ _ _ t -> ctyp t + | x -> not_impl "with_constr" x ] +and sig_item = + fun + [ SgDcl _ sil -> list sig_item sil + | SgExc _ _ tl -> list ctyp tl + | SgExt _ _ t _ -> ctyp t + | SgMod _ _ mt -> module_type mt + | SgRecMod _ mts -> list (fun (_, mt) -> module_type mt) mts + | SgMty _ _ mt -> module_type mt + | SgOpn _ [s :: _] -> addmodule s + | SgTyp _ tdl -> list type_decl tdl + | SgVal _ _ t -> ctyp t + | x -> not_impl "sig_item" x ] +and module_expr = + fun + [ MeAcc _ (MeUid _ m) _ -> addmodule m + | MeApp _ me1 me2 -> do { module_expr me1; module_expr me2; } + | MeFun _ _ mt me -> do { module_type mt; module_expr me; } + | MeStr _ sil -> list str_item sil + | MeTyc _ me mt -> do { module_expr me; module_type mt; } + | MeUid _ _ -> () + | x -> not_impl "module_expr" x ] +and str_item = + fun + [ StCls _ cil -> list (fun ci -> class_expr ci.ciExp) cil + | StDcl _ sil -> list str_item sil + | StDir _ _ _ -> () + | StExc _ _ tl _ -> list ctyp tl + | StExp _ e -> expr e + | StExt _ _ t _ -> ctyp t + | StMod _ _ me -> module_expr me + | StRecMod _ nmtmes -> list (fun (_, mt, me) -> do { module_expr me; module_type mt; }) nmtmes + | StMty _ _ mt -> module_type mt + | StOpn _ [s :: _] -> addmodule s + | StTyp _ tdl -> list type_decl tdl + | StVal _ _ pel -> list let_binding pel + | x -> not_impl "str_item" x ] +and type_decl (_, _, t, _) = ctyp t +and class_expr = + fun + [ CeApp _ ce e -> do { class_expr ce; expr e; } + | CeCon _ li tl -> do { longident li; list ctyp tl; } + | CeFun _ p ce -> do { patt p; class_expr ce; } + | CeLet _ _ pel ce -> do { list let_binding pel; class_expr ce; } + | CeStr _ po csil -> do { option patt po; list class_str_item csil; } + | x -> not_impl "class_expr" x ] +and class_str_item = + fun + [ CrInh _ ce _ -> class_expr ce + | CrIni _ e -> expr e + | CrMth _ _ _ e None -> expr e + | CrMth _ _ _ e (Some t) -> do { expr e; ctyp t } + | CrVal _ _ _ e -> expr e + | CrVir _ _ _ t -> ctyp t + | x -> not_impl "class_str_item" x ] +; + +(* Print dependencies *) + +value load_path = ref [""]; + +value find_in_path path name = + if not (Filename.is_implicit name) then + if Sys.file_exists name then name else raise Not_found + else + let rec try_dir = + fun + [ [] -> raise Not_found + | [dir :: rem] -> + let fullname = Filename.concat dir name in + if Sys.file_exists fullname then fullname else try_dir rem ] + in + try_dir path +; + +value find_depend modname (byt_deps, opt_deps) = + let name = String.uncapitalize modname in + try + let filename = find_in_path load_path.val (name ^ ".mli") in + let basename = Filename.chop_suffix filename ".mli" in + let byt_dep = basename ^ ".cmi" in + let opt_dep = + if Sys.file_exists (basename ^ ".ml") then basename ^ ".cmx" + else basename ^ ".cmi" + in + ([byt_dep :: byt_deps], [opt_dep :: opt_deps]) + with + [ Not_found -> + try + let filename = find_in_path load_path.val (name ^ ".ml") in + let basename = Filename.chop_suffix filename ".ml" in + ([basename ^ ".cmo" :: byt_deps], [basename ^ ".cmx" :: opt_deps]) + with + [ Not_found -> (byt_deps, opt_deps) ] ] +; + +value (depends_on, escaped_eol) = + match Sys.os_type with + [ "Unix" | "Win32" | "Cygwin" -> (": ", "\\\n ") + | "MacOS" -> ("\196 ", "\182\n ") + | _ -> assert False ] +; + +value print_depend target_file deps = + match deps with + [ [] -> () + | _ -> + do { + print_string target_file; + print_string depends_on; + let rec print_items pos = + fun + [ [] -> print_string "\n" + | [dep :: rem] -> + if pos + String.length dep <= 77 then do { + print_string dep; + print_string " "; + print_items (pos + String.length dep + 1) rem + } + else do { + print_string escaped_eol; + print_string dep; + print_string " "; + print_items (String.length dep + 5) rem + } ] + in + print_items (String.length target_file + 2) deps + } ] +; + +(* Main *) + +value depend_sig ast = + do { + fset.val := StrSet.empty; + List.iter (fun (si, _) -> sig_item si) ast; + let basename = Filename.chop_suffix Pcaml.input_file.val ".mli" in + let (byt_deps, _) = StrSet.fold find_depend fset.val ([], []) in + print_depend (basename ^ ".cmi") byt_deps; + } +; + +value depend_str ast = + do { + fset.val := StrSet.empty; + List.iter (fun (si, _) -> str_item si) ast; + let basename = + if Filename.check_suffix Pcaml.input_file.val ".ml" then + Filename.chop_suffix Pcaml.input_file.val ".ml" + else + try + let len = String.rindex Pcaml.input_file.val '.' in + String.sub Pcaml.input_file.val 0 len + with + [ Failure _ | Not_found -> Pcaml.input_file.val ] + in + let init_deps = + if Sys.file_exists (basename ^ ".mli") then + let cmi_name = basename ^ ".cmi" in ([cmi_name], [cmi_name]) + else ([], []) + in + let (byt_deps, opt_deps) = StrSet.fold find_depend fset.val init_deps in + print_depend (basename ^ ".cmo") byt_deps; + print_depend (basename ^ ".cmx") opt_deps; + } +; + +Pcaml.print_interf.val := depend_sig; +Pcaml.print_implem.val := depend_str; + +Pcaml.add_option "-I" + (Arg.String (fun dir -> load_path.val := load_path.val @ [dir])) + " Add to the list of include directories."; diff --git a/camlp4/unmaintained/etc/pr_extend.ml b/camlp4/unmaintained/etc/pr_extend.ml new file mode 100644 index 00000000..5f8b6933 --- /dev/null +++ b/camlp4/unmaintained/etc/pr_extend.ml @@ -0,0 +1,518 @@ +(* camlp4r q_MLast.cmo ./pa_extfun.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; +open Spretty; + +value no_slist = ref False; + +value expr e dg k = pr_expr.pr_fun "top" e dg k; +value patt e dg k = pr_patt.pr_fun "top" e dg k; + +(* Utilities *) + +value rec list elem el k = + match el with + [ [] -> k + | [x] -> [: `elem x k :] + | [x :: l] -> [: `elem x [: :]; list elem l k :] ] +; + +value rec listws elem sep el k = + match el with + [ [] -> k + | [x] -> [: `elem x k :] + | [x :: l] -> [: `elem x [: `sep :]; listws elem sep l k :] ] +; + +value rec listwbws elem b sep el dg k = + match el with + [ [] -> [: b; k :] + | [x] -> [: `elem b x dg k :] + | [x :: l] -> + let sdg = + match sep with + [ S _ x -> x + | _ -> "" ] + in + [: `elem b x sdg [: :]; listwbws elem [: `sep :] sep l dg k :] ] +; + +(* Extracting *) + +value rec get_globals = + fun + [ [(<:patt< _ >>, <:expr< ($e$ : $uid:gmod1$.Entry.e '$_$) >>) :: pel] -> + let (gmod, gl) = get_globals pel in + if gmod = "" || gmod = gmod1 then (gmod1, [e :: gl]) + else raise Not_found + | [] -> ("", []) + | _ -> raise Not_found ] +; + +value rec get_locals = + fun + [ [(<:patt< $_$ >>, + <:expr< (grammar_entry_create $_$ : $_$) >>) :: pel] -> + get_locals pel + | [] -> () + | _ -> raise Not_found ] +; + +value unposition = + fun + [ <:expr< None >> -> None + | <:expr< Some Gramext.First >> -> Some Gramext.First + | <:expr< Some Gramext.Last >> -> Some Gramext.Last + | <:expr< Some (Gramext.Before $str:s$) >> -> Some (Gramext.Before s) + | <:expr< Some (Gramext.After $str:s$) >> -> Some (Gramext.After s) + | <:expr< Some (Gramext.Level $str:s$) >> -> Some (Gramext.Level s) + | _ -> raise Not_found ] +; + +value unlabel = + fun + [ <:expr< None >> -> None + | <:expr< Some $str:s$ >> -> Some s + | _ -> raise Not_found ] +; + +value unassoc = + fun + [ <:expr< None >> -> None + | <:expr< Some Gramext.NonA >> -> Some Gramext.NonA + | <:expr< Some Gramext.LeftA >> -> Some Gramext.LeftA + | <:expr< Some Gramext.RightA >> -> Some Gramext.RightA + | _ -> raise Not_found ] +; + +value rec unaction = + fun + [ <:expr< fun ($lid:locp$ : Loc.t) -> ($a$ : $_$) >> + when locp = Stdpp.loc_name.val -> + let ao = + match a with + [ <:expr< () >> -> None + | _ -> Some a ] + in + ([], ao) + | <:expr< fun ($p$ : $_$) -> $e$ >> -> + let (pl, a) = unaction e in ([p :: pl], a) + | <:expr@_loc< fun _ -> $e$ >> -> + let (pl, a) = unaction e in ([ <:patt< _ >> :: pl ], a) + | _ -> raise Not_found ] +; + +value untoken = + fun + [ <:expr< ($str:x$, $str:y$) >> -> (x, y) + | _ -> raise Not_found ] +; + +type symbol = + [ Snterm of MLast.expr + | Snterml of MLast.expr and string + | Slist0 of symbol + | Slist0sep of symbol and symbol + | Slist1 of symbol + | Slist1sep of symbol and symbol + | Sopt of symbol + | Sself + | Snext + | Stoken of Token.pattern + | Srules of list (list (option MLast.patt * symbol) * option MLast.expr) ] +; + +value rec unsymbol = + fun + [ <:expr< Gramext.Snterm ($uid:_$.Entry.obj ($e$ : $_$)) >> -> Snterm e + | <:expr< Gramext.Snterml ($uid:_$.Entry.obj ($e$ : $_$)) $str:s$ >> -> + Snterml e s + | <:expr< Gramext.Snterml ($uid:_$.Entry.obj ($e$ : $_$), $str:s$) >> -> + Snterml e s + | <:expr< Gramext.Slist0 $e$ >> -> Slist0 (unsymbol e) + | <:expr< Gramext.Slist0sep $e1$ $e2$ >> -> + Slist0sep (unsymbol e1) (unsymbol e2) + | <:expr< Gramext.Slist0sep ($e1$, $e2$) >> -> + Slist0sep (unsymbol e1) (unsymbol e2) + | <:expr< Gramext.Slist1 $e$ >> -> Slist1 (unsymbol e) + | <:expr< Gramext.Slist1sep $e1$ $e2$ >> -> + Slist1sep (unsymbol e1) (unsymbol e2) + | <:expr< Gramext.Slist1sep ($e1$, $e2$) >> -> + Slist1sep (unsymbol e1) (unsymbol e2) + | <:expr< Gramext.Sopt $e$ >> -> Sopt (unsymbol e) + | <:expr< Gramext.Sself >> -> Sself + | <:expr< Gramext.Snext >> -> Snext + | <:expr< Gramext.Stoken $e$ >> -> Stoken (untoken e) + | <:expr< Gramext.srules $e$ >> -> Srules (unrule_list [] e) + | _ -> raise Not_found ] +and unpsymbol_list pl e = + match (pl, e) with + [ ([], <:expr< [] >>) -> [] + | ([p :: pl], <:expr< [$e$ :: $el$] >>) -> + let op = + match p with + [ <:patt< _ >> -> None + | _ -> Some p ] + in + [(op, unsymbol e) :: unpsymbol_list pl el] + | _ -> raise Not_found ] +and unrule = + fun + [ <:expr@_loc< ($e1$, Gramext.action $e2$) >> -> + let (pl, a) = + match unaction e2 with + [ ([], None) -> ([], Some <:expr< () >>) + | x -> x ] + in + let sl = unpsymbol_list (List.rev pl) e1 in + (sl, a) + | _ -> raise Not_found ] +and unrule_list rl = + fun + [ <:expr< [$e$ :: $el$] >> -> unrule_list [unrule e :: rl] el + | <:expr< [] >> -> rl + | _ -> raise Not_found ] +; + +value unlevel = + fun + [ <:expr< ($e1$, $e2$, $e3$) >> -> + (unlabel e1, unassoc e2, unrule_list [] e3) + | _ -> raise Not_found ] +; + +value rec unlevel_list = + fun + [ <:expr< [$e$ :: $el$] >> -> [unlevel e :: unlevel_list el] + | <:expr< [] >> -> [] + | _ -> raise Not_found ] +; + +value unentry = + fun + [ <:expr< (Grammar.Entry.obj ($e$ : Grammar.Entry.e '$_$), $pos$, $ll$) >> -> + (e, unposition pos, unlevel_list ll) + | _ -> raise Not_found ] +; + +value rec unentry_list = + fun + [ <:expr< [$e$ :: $el$] >> -> [unentry e :: unentry_list el] + | <:expr< [] >> -> [] + | _ -> raise Not_found ] +; + +value unextend_body e = + let ((_, globals), e) = + match e with + [ <:expr< let $list:pel$ in $e1$ >> -> + try (get_globals pel, e1) with + [ Not_found -> (("", []), e) ] + | _ -> (("", []), e) ] + in + let e = + match e with + [ <:expr< + let grammar_entry_create s = + Grammar.Entry.create (Grammar.of_entry $_$) s + in + $e$ >> -> + let e = + match e with + [ <:expr< let $list:pel$ in $e1$ >> -> + try let _ = get_locals pel in e1 with + [ Not_found -> e ] + | _ -> e ] + in + e + | _ -> e ] + in + let el = unentry_list e in + (globals, el) +; + +value ungextend_body e = + let e = + match e with + [ <:expr< + let grammar_entry_create = Gram.Entry.create in + let $list:ll$ in $e$ + >> -> + let _ = get_locals ll in e + | _ -> e ] + in + match e with + [ <:expr< do { $list:el$ } >> -> + List.map + (fun + [ <:expr< $uid:_$.extend ($e$ : $uid:_$.Entry.e '$_$) $pos$ $ll$ >> -> + (e, unposition pos, unlevel_list ll) + | _ -> raise Not_found ]) + el + | _ -> raise Not_found ] +; + +(* Printing *) + +value ident s k = HVbox [: `S LR s; k :]; +value string s k = HVbox [: `S LR ("\"" ^ s ^ "\""); k :]; + +value position = + fun + [ None -> [: :] + | Some Gramext.First -> [: `S LR "FIRST" :] + | Some Gramext.Last -> [: `S LR "LAST" :] + | Some (Gramext.Before s) -> [: `S LR "BEFORE"; `string s [: :] :] + | Some (Gramext.After s) -> [: `S LR "AFTER"; `string s [: :] :] + | Some (Gramext.Level s) -> [: `S LR "LEVEL"; `string s [: :] :] ] +; + +value action expr a dg k = + expr a dg k +; + +value token (con, prm) k = + if con = "" then string prm k + else if prm = "" then HVbox [: `S LR con; k :] + else HVbox [: `S LR con; `string prm k :] +; + +value simplify_rules rl = + try + List.map + (fun + [ ([(Some <:patt< $lid:x$ >>, s)], Some <:expr< $lid:y$ >>) -> + if x = y then ([(None, s)], None) else raise Exit + | ([], _) as r -> r + | _ -> raise Exit ]) + rl + with + [ Exit -> rl ] +; + +value rec symbol s k = + match s with + [ Snterm e -> expr e "" k + | Snterml e s -> HVbox [: `expr e "" [: :]; `S LR "LEVEL"; `string s k :] + | Slist0 s -> HVbox [: `S LR "LIST0"; `symbol s k :] + | Slist0sep s sep -> + HVbox + [: `S LR "LIST0"; `symbol s [: :]; `S LR "SEP"; + `symbol sep k :] + | Slist1 s -> HVbox [: `S LR "LIST1"; `symbol s k :] + | Slist1sep s sep -> + HVbox + [: `S LR "LIST1"; `symbol s [: :]; `S LR "SEP"; + `symbol sep k :] + | Sopt s -> HVbox [: `S LR "OPT"; `symbol s k :] + | Sself -> HVbox [: `S LR "SELF"; k :] + | Snext -> HVbox [: `S LR "NEXT"; k :] + | Stoken tok -> token tok k + | Srules + [([(Some <:patt< a >>, Snterm <:expr< a_list >>)], Some <:expr< a >>); + ([(Some <:patt< a >>, + ((Slist0 _ | Slist1 _ | Slist0sep _ _ | Slist1sep _ _) as s))], + Some <:expr< Qast.List a >>)] + when not no_slist.val + -> + match s with + [ Slist0 s -> HVbox [: `S LR "SLIST0"; `simple_symbol s k :] + | Slist1 s -> HVbox [: `S LR "SLIST1"; `simple_symbol s k :] + | Slist0sep s sep -> + HVbox + [: `S LR "SLIST0"; `simple_symbol s [: :]; `S LR "SEP"; + `symbol sep k :] + | Slist1sep s sep -> + HVbox + [: `S LR "SLIST1"; `simple_symbol s [: :]; `S LR "SEP"; + `simple_symbol sep k :] + | _ -> assert False ] + | Srules + [([(Some <:patt< a >>, Snterm <:expr< a_opt >>)], Some <:expr< a >>); + ([(Some <:patt< a >>, Sopt s)], Some <:expr< Qast.Option a >>)] + when not no_slist.val + -> + let s = + match s with + [ Srules + [([(Some <:patt< x >>, Stoken ("", str))], + Some <:expr< Qast.Str x >>)] -> + Stoken ("", str) + | s -> s ] + in + HVbox [: `S LR "SOPT"; `simple_symbol s k :] + | Srules rl -> + let rl = simplify_rules rl in + HVbox [: `HVbox [: :]; rule_list rl k :] ] +and simple_symbol s k = + match s with + [ Snterml _ _ -> HVbox [: `S LO "("; `symbol s [: `S RO ")"; k :] :] + | s -> symbol s k ] +and psymbol (p, s) k = + match p with + [ None -> symbol s k + | Some p -> HVbox [: `patt p "" [: `S LR "=" :]; `symbol s k :] ] +and psymbol_list sl k = + listws psymbol (S RO ";") sl k +and rule b (sl, a) dg k = + match a with + [ None -> HVbox [: b; `HOVbox [: psymbol_list sl k :] :] + | Some a -> + HVbox + [: b; + `HOVbox + [: `HOVbox + [: `HVbox [: :]; + psymbol_list sl [: `S LR "->" :] :]; + `action expr a dg k :] :] ] +and rule_list ll k = + listwbws rule [: `S LR "[" :] (S LR "|") ll "" + [: `S LR "]"; k :] +; + +value label = + fun + [ Some s -> [: `S LR ("\"" ^ s ^ "\"") :] + | None -> [: :] ] +; + +value intloc loc = ((Loc.start_off loc), (Loc.stop_off loc)); + +value intloc2 (bp, ep) = (bp.Lexing.pos_cnum, ep.Lexing.pos_cnum); + + +value assoc = + fun + [ Some Gramext.NonA -> [: `S LR "NONA" :] + | Some Gramext.LeftA -> [: `S LR "LEFTA" :] + | Some Gramext.RightA -> [: `S LR "RIGHTA" :] + | None -> [: :] ] +; + +value level b (lab, ass, rl) _ k = + let s = + if rl = [] then [: `S LR "[ ]"; k :] + else [: `Vbox [: `HVbox [: :]; rule_list rl k :] :] + in + match (lab, ass) with + [ (None, None) -> HVbox [: b; s :] + | _ -> + Vbox + [: `HVbox [: b; label lab; assoc ass :]; + `HVbox [: `HVbox [: :]; s :] :] ] +; + +value level_list ll k = + Vbox + [: `HVbox [: :]; + listwbws level [: `S LR "[" :] (S LR "|") ll "" + [: `S LR "]"; k :] :] +; + +value entry (e, pos, ll) k = + BEbox + [: `LocInfo (intloc(MLast.loc_of_expr e)) + (HVbox [: `expr e "" [: `S RO ":" :]; position pos :]); + `level_list ll [: :]; + `HVbox [: `S RO ";"; k :] :] +; + +value entry_list el k = + Vbox [: `HVbox [: :]; list entry el k :] +; + +value extend_body (globals, e) k = + let s = entry_list e k in + match globals with + [ [] -> s + | sl -> + HVbox + [: `HVbox [: :]; + `HOVbox + [: `S LR "GLOBAL"; `S RO ":"; + list (fun e k -> HVbox [: `expr e "" k :]) sl + [: `S RO ";" :] :]; + `s :] ] +; + +value extend e _ k = + match e with + [ <:expr< Grammar.extend $e$ >> -> + try + let ex = unextend_body e in + BEbox + [: `S LR "EXTEND"; `extend_body ex [: :]; + `HVbox [: `S LR "END"; k :] :] + with + [ Not_found -> + HVbox + [: `S LR "Grammar.extend"; + `HOVbox + [: `S LO "("; + `expr e "" [: `HVbox [: `S RO ")"; k :] :] :] :] ] + | _ -> expr e "" k ] +; + +value get_gextend = + fun + [ <:expr< let $list:gl$ in $e$ >> -> + try + let (gmod, gl) = get_globals gl in + let el = ungextend_body e in + Some (gmod, gl, el) + with + [ Not_found -> None ] + | _ -> None ] +; + +value gextend e _ k = + match get_gextend e with + [ Some (gmod, gl, el) -> + BEbox + [: `HVbox [: `S LR "GEXTEND"; `S LR gmod :]; + `extend_body (gl, el) [: :]; + `HVbox [: `S LR "END"; k :] :] + | None -> expr e "" k ] +; + +value is_gextend e = get_gextend e <> None; + +(* Printer extensions *) + +let lev = + try find_pr_level "expr1" pr_expr.pr_levels with + [ Failure _ -> find_pr_level "top" pr_expr.pr_levels ] +in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< let $list:_$ in $_$ >> as e when is_gextend e -> + fun _ next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "apply" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Grammar.extend $_$ >> as e -> + fun _ next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "simple" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Grammar.extend $_$ >> as e -> + fun _ _ _ k -> [: `extend e "" k :] + | <:expr< let $list:_$ in $_$ >> as e when is_gextend e -> + fun _ _ _ k -> [: `gextend e "" k :] ]; + +Pcaml.add_option "-no_slist" (Arg.Set no_slist) + "Don't reconstruct SLIST and SOPT"; diff --git a/camlp4/unmaintained/etc/pr_extfun.ml b/camlp4/unmaintained/etc/pr_extfun.ml new file mode 100644 index 00000000..4479bb40 --- /dev/null +++ b/camlp4/unmaintained/etc/pr_extfun.ml @@ -0,0 +1,92 @@ +(* camlp4r q_MLast.cmo ./pa_extfun.cmo *) + + +open Pcaml; +open Spretty; + +value _loc = Loc.mk "FIXME pr_extfun.ml"; + +value expr e dg k = pr_expr.pr_fun "top" e dg k; +value patt e dg k = pr_patt.pr_fun "top" e dg k; + +value rec un_extfun rpel = + fun + [ <:expr< [ ($_$, $_$, fun [ $list:pel$ ]) :: $el$ ] >> -> + let (p, wo, e) = + match pel with + [ [(p, wo, <:expr< Some $e$ >>); + (<:patt< _ >>, None, <:expr< None >>)] -> + (p, wo, e) + | [(p, wo, <:expr< Some $e$ >>)] -> (p, wo, e) + | _ -> raise Not_found ] + in + let rpel = + match rpel with + [ [(p1, wo1, e1) :: pel] -> + if wo1 = wo && e1 = e then + let p = + match (p1, p) with + [ (<:patt< ($x1$ as $x2$) >>, <:patt< ($y1$ as $y2$) >>) -> + if x2 = y2 then <:patt< ($x1$ | $y1$ as $x2$) >> + else <:patt< $p1$ | $p$ >> + | _ -> <:patt< $p1$ | $p$ >> ] + in + [(p, wo, e) :: pel] + else [(p, wo, e) :: rpel] + | [] -> [(p, wo, e)] ] + in + un_extfun rpel el + | <:expr< [] >> -> List.rev rpel + | _ -> raise Not_found ] +; + +value rec listwbws elem b sep el k = + match el with + [ [] -> [: b; k :] + | [x] -> [: `elem b x k :] + | [x :: l] -> [: `elem b x [: :]; listwbws elem [: `sep :] sep l k :] ] +; + +value rec match_assoc_list pwel k = + match pwel with + [ [pwe] -> match_assoc [: `S LR "[" :] pwe [: `S LR "]"; k :] + | pel -> + Vbox + [: `HVbox [: :]; + listwbws match_assoc [: `S LR "[" :] (S LR "|") pel + [: `S LR "]"; k :] :] ] +and match_assoc b (p, w, e) k = + let s = + let (p, k) = + match p with + [ <:patt< ($p$ as $p2$) >> -> (p, [: `S LR "as"; `patt p2 "" [: :] :]) + | _ -> (p, [: :]) ] + in + match w with + [ Some e1 -> + [: `HVbox + [: `HVbox [: :]; `patt p "" k; + `HVbox [: `S LR "when"; `expr e1 "" [: `S LR "->" :] :] :] :] + | _ -> [: `patt p "" [: k; `S LR "->" :] :] ] + in + HVbox [: b; `HVbox [: `HVbox s; `expr e "" k :] :] +; + +let lev = find_pr_level "top" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Extfun.extend $e$ $list$ >> as ge -> + fun _ next dg k -> + try + let pel = un_extfun [] list in + [: `HVbox [: :]; + `BEbox [: `S LR "extfun"; `expr e "" [: :]; `S LR "with" :]; + `match_assoc_list pel k :] + with + [ Not_found -> [: `next ge dg k :] ] ]; + +let lev = find_pr_level "apply" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Extfun.extend $_$ $_$ >> as ge -> + fun _ next dg k -> [: `next ge dg k :] ]; diff --git a/camlp4/unmaintained/etc/pr_null.ml b/camlp4/unmaintained/etc/pr_null.ml new file mode 100644 index 00000000..22f3cb74 --- /dev/null +++ b/camlp4/unmaintained/etc/pr_null.ml @@ -0,0 +1,16 @@ +(* camlp4r *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +Pcaml.print_interf.val := fun _ -> (); +Pcaml.print_implem.val := fun _ -> (); diff --git a/camlp4/unmaintained/etc/pr_op.ml b/camlp4/unmaintained/etc/pr_op.ml new file mode 100644 index 00000000..9b2aebcf --- /dev/null +++ b/camlp4/unmaintained/etc/pr_op.ml @@ -0,0 +1,210 @@ +(* camlp4r q_MLast.cmo ./pa_extfun.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; +open Spretty; + +value expr e dg k = pr_expr.pr_fun "top" e dg k; +value patt e dg k = pr_patt.pr_fun "top" e dg k; + +value spatt p dg k = + match p with + [ <:patt< $lid:s$ >> -> + if String.length s >= 2 && s.[1] == ''' then + HVbox [: `S LR (" " ^ s); k :] + else patt p dg k + | _ -> patt p dg k ] +; + +(* Streams *) + +value stream e _ k = + let rec get = + fun + [ <:expr< Stream.iapp $x$ $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.icons $x$ $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.ising $x$ >> -> [(True, x)] + | <:expr< Stream.lapp (fun _ -> $x$) $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.lcons (fun _ -> $x$) $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.lsing (fun _ -> $x$) >> -> [(True, x)] + | <:expr< Stream.sempty >> -> [] + | <:expr< Stream.slazy (fun _ -> $x$) >> -> [(False, x)] + | <:expr< Stream.slazy $x$ >> -> [(False, <:expr< $x$ () >>)] + | e -> [(False, e)] ] + in + let elem e dg k = + match e with + [ (True, e) -> [: `HOVbox [: `S LO "'"; `expr e dg k :] :] + | (False, e) -> [: `expr e dg k :] ] + in + let rec glop e k = + match e with + [ [] -> k + | [e] -> [: elem e "" k :] + | [e :: el] -> [: elem e ";" [: `S RO ";" :]; glop el k :] ] + in + HOVbox [: `S LR "[<"; glop (get e) [: `S LR ">]"; k :] :] +; + +(* Parsers *) + +value parser_cases b spel dg k = + let rec parser_cases b spel dg k = + match spel with + [ [] -> [: `HVbox [: b; k :] :] + | [(sp, epo, e)] -> [: `parser_case b sp epo e dg k :] + | [(sp, epo, e) :: spel] -> + [: `parser_case b sp epo e "|" [: :]; + parser_cases [: `S LR "|" :] spel dg k :] ] + and parser_case b sp epo e dg k = + let epo = + match epo with + [ Some p -> [: `patt p "" [: `S LR "->" :] :] + | _ -> [: `S LR "->" :] ] + in + HVbox + [: b; + `HOVbox + [: `HOVbox + [: `S LR "[<"; + stream_patt [: :] sp [: `S LR ">]"; epo :] :]; + `expr e dg k :] :] + and stream_patt b sp k = + match sp with + [ [] -> [: `HVbox [: b; k :] :] + | [(spc, None)] -> [: `stream_patt_comp b spc "" k :] + | [(spc, Some e)] -> + [: `HVbox + [: `stream_patt_comp b spc "" [: :]; + `HVbox [: `S LR "??"; `expr e "" k :] :] :] + | [(spc, None) :: spcl] -> + [: `stream_patt_comp b spc ";" [: `S RO ";" :]; + stream_patt [: :] spcl k :] + | [(spc, Some e) :: spcl] -> + [: `HVbox + [: `stream_patt_comp b spc "" [: :]; + `HVbox [: `S LR "??"; `expr e ";" [: `S RO ";" :] :] :]; + stream_patt [: :] spcl k :] ] + and stream_patt_comp b spc dg k = + match spc with + [ SPCterm (p, w) -> + HVbox [: b; `S LO "'"; `spatt p "" (when_opt w k) :] + | SPCnterm p e -> + HVbox [: b; `HVbox [: `patt p "" [: `S LR "=" :]; `expr e dg k :] :] + | SPCsterm p -> HVbox [: b; `patt p "" k :] ] + and when_opt wo k = + match wo with + [ Some e -> [: `S LR "when"; `expr e "" k :] + | _ -> k ] + in + parser_cases b spel dg k +; + +value parser_body e dg k = + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + match Parserify.parser_of_expr e with + [ [] -> + let spe = ([], None, <:expr< raise Stream.Failure >>) in + HVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: :] [spe] dg k :] + | spel -> + BEVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: :] spel dg k :] ] +; + +value pmatch e dg k = + let (me, e) = + match e with + [ <:expr< let (__strm : Stream.t _) = $me$ in $e$ >> -> (me, e) + | _ -> failwith "Pr_op.pmatch" ] + in + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + let spel = Parser_of_expr.parser_of_expr e in + Vbox + [: `HVbox [: :]; + `HVbox + [: `S LR "match"; `expr me "" [: `S LR "with" :]; `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + `BEbox [: `HVbox [: :]; parser_cases [: :] spel dg k :] :] +; + +(* Printer extensions *) + +pr_expr_fun_args.val := + extfun pr_expr_fun_args.val with + [ <:expr< fun __strm -> $_$ >> as ge -> ([], ge) + | <:expr< fun [(__strm : $_$) -> $_$] >> as ge -> ([], ge) ]; + +let lev = find_pr_level "expr1" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< let (__strm : Stream.t _) = $_$ in $_$ >> as e -> + fun curr next dg k -> + if not (List.mem dg ["|"; ";"]) then [: `pmatch e dg k :] + else [: `S LO "("; `pmatch e "" [: `S RO ")"; k :] :] + | <:expr< fun __strm -> $x$ >> -> + fun curr next dg k -> + if not (List.mem dg ["|"; ";"]) then [: `parser_body x dg k :] + else [: `S LO "("; `parser_body x "" [: `S RO ")"; k :] :] + | <:expr< fun [ (__strm : $_$) -> $x$ ] >> -> + fun curr next dg k -> + if not (List.mem dg ["|"; ";"]) then [: `parser_body x dg k :] + else [: `S LO "("; `parser_body x "" [: `S RO ")"; k :] :] ]; + +let lev = find_pr_level "apply" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun curr next dg k -> [: `next e "" k :] ]; + +let lev = find_pr_level "dot" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.sempty >> as e -> + fun curr next dg k -> [: `next e "" k :] ]; + +let lev = find_pr_level "simple" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun curr next dg k -> + [: `stream e "" k :] ]; diff --git a/camlp4/unmaintained/etc/pr_op_main.ml b/camlp4/unmaintained/etc/pr_op_main.ml new file mode 100644 index 00000000..3ea53ba4 --- /dev/null +++ b/camlp4/unmaintained/etc/pr_op_main.ml @@ -0,0 +1,214 @@ +(* camlp4r q_MLast.cmo ./pa_extfun.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; +open Spretty; + +value _loc = Loc.mk "FIXME pr_op_main.ml"; + +value expr e dg k = pr_expr.pr_fun "top" e dg k; +value patt e dg k = pr_patt.pr_fun "top" e dg k; + +value spatt p dg k = + match p with + [ <:patt< $lid:s$ >> -> + if String.length s >= 2 && s.[1] == ''' then + HVbox [: `S LR (" " ^ s); k :] + else patt p dg k + | _ -> patt p dg k ] +; + +(* Streams *) + +value stream e _ k = + let rec get = + fun + [ <:expr< Stream.iapp $x$ $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.icons $x$ $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.ising $x$ >> -> [(True, x)] + | <:expr< Stream.lapp (fun _ -> $x$) $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.lcons (fun _ -> $x$) $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.lsing (fun _ -> $x$) >> -> [(True, x)] + | <:expr< Stream.sempty >> -> [] + | <:expr< Stream.slazy (fun _ -> $x$) >> -> [(False, x)] + | <:expr< Stream.slazy $x$ >> -> [(False, <:expr< $x$ () >>)] + | e -> [(False, e)] ] + in + let elem e dg k = + match e with + [ (True, e) -> [: `HOVbox [: `S LO "'"; `expr e dg k :] :] + | (False, e) -> [: `expr e dg k :] ] + in + let rec glop e k = + match e with + [ [] -> k + | [e] -> [: elem e "" k :] + | [e :: el] -> [: elem e ";" [: `S RO ";" :]; glop el k :] ] + in + HOVbox [: `S LR "[<"; glop (get e) [: `S LR ">]"; k :] :] +; + +(* Parsers *) + +open Parserify; + +value parser_cases b spel dg k = + let rec parser_cases b spel dg k = + match spel with + [ [] -> [: `HVbox [: b; k :] :] + | [(sp, epo, e)] -> [: `parser_case b sp epo e dg k :] + | [(sp, epo, e) :: spel] -> + [: `parser_case b sp epo e "|" [: :]; + parser_cases [: `S LR "|" :] spel dg k :] ] + and parser_case b sp epo e dg k = + let epo = + match epo with + [ Some p -> [: `patt p "" [: `S LR "->" :] :] + | _ -> [: `S LR "->" :] ] + in + HVbox + [: b; + `HOVbox + [: `HOVbox + [: `S LR "[<"; + stream_patt [: :] sp [: `S LR ">]"; epo :] :]; + `expr e dg k :] :] + and stream_patt b sp k = + match sp with + [ [] -> [: `HVbox [: b; k :] :] + | [(spc, None)] -> [: `stream_patt_comp b spc "" k :] + | [(spc, Some e)] -> + [: `HVbox + [: `stream_patt_comp b spc "" [: :]; + `HVbox [: `S LR "??"; `expr e "" k :] :] :] + | [(spc, None) :: spcl] -> + [: `stream_patt_comp b spc ";" [: `S RO ";" :]; + stream_patt [: :] spcl k :] + | [(spc, Some e) :: spcl] -> + [: `HVbox + [: `stream_patt_comp b spc "" [: :]; + `HVbox [: `S LR "??"; `expr e ";" [: `S RO ";" :] :] :]; + stream_patt [: :] spcl k :] ] + and stream_patt_comp b spc dg k = + match spc with + [ SPCterm (p, w) -> + HVbox [: b; `S LO "'"; `spatt p "" (when_opt w k) :] + | SPCnterm p e -> + HVbox [: b; `HVbox [: `patt p "" [: `S LR "=" :]; `expr e dg k :] :] + | SPCsterm p -> HVbox [: b; `patt p "" k :] ] + and when_opt wo k = + match wo with + [ Some e -> [: `S LR "when"; `expr e "" k :] + | _ -> k ] + in + parser_cases b spel dg k +; + +value parser_body e dg k = + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + match parser_of_expr e with + [ [] -> + let spe = ([], None, <:expr< raise Stream.Failure >>) in + HVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: :] [spe] dg k :] + | spel -> + BEVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: :] spel dg k :] ] +; + +value pmatch e dg k = + let (me, e) = + match e with + [ <:expr< let (__strm : Stream.t _) = $me$ in $e$ >> -> (me, e) + | _ -> failwith "Pr_op.pmatch" ] + in + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + let spel = parser_of_expr e in + Vbox + [: `HVbox [: :]; + `HVbox + [: `S LR "match"; `expr me "" [: `S LR "with" :]; `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + `BEbox [: `HVbox [: :]; parser_cases [: :] spel dg k :] :] +; + +(* Printer extensions *) + +pr_expr_fun_args.val := + extfun pr_expr_fun_args.val with + [ <:expr< fun __strm -> $_$ >> as ge -> ([], ge) + | <:expr< fun [(__strm : $_$) -> $_$] >> as ge -> ([], ge) ]; + +let lev = find_pr_level "expr1" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< let (__strm : Stream.t _) = $_$ in $_$ >> as e -> + fun _ _ dg k -> + if not (List.mem dg ["|"; ";"]) then [: `pmatch e dg k :] + else [: `S LO "("; `pmatch e "" [: `S RO ")"; k :] :] + | <:expr< fun __strm -> $x$ >> -> + fun _ _ dg k -> + if not (List.mem dg ["|"; ";"]) then [: `parser_body x dg k :] + else [: `S LO "("; `parser_body x "" [: `S RO ")"; k :] :] + | <:expr< fun [ (__strm : $_$) -> $x$ ] >> -> + fun _ _ dg k -> + if not (List.mem dg ["|"; ";"]) then [: `parser_body x dg k :] + else [: `S LO "("; `parser_body x "" [: `S RO ")"; k :] :] ]; + +let lev = find_pr_level "apply" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun _ next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "dot" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.sempty >> as e -> + fun _ next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "simple" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun _ _ _ k -> + [: `stream e "" k :] ]; diff --git a/camlp4/unmaintained/etc/pr_rp.ml b/camlp4/unmaintained/etc/pr_rp.ml new file mode 100644 index 00000000..0604b463 --- /dev/null +++ b/camlp4/unmaintained/etc/pr_rp.ml @@ -0,0 +1,207 @@ +(* camlp4r q_MLast.cmo ./pa_extfun.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; +open Spretty; + +value _loc = (Token.nowhere, Token.nowhere); + +value expr e dg k = pr_expr.pr_fun "top" e dg k; +value patt e dg k = pr_patt.pr_fun "top" e dg k; + +(* Streams *) + +value stream e dg k = + let rec get = + fun + [ <:expr< Stream.iapp $x$ $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.icons $x$ $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.ising $x$ >> -> [(True, x)] + | <:expr< Stream.lapp (fun _ -> $x$) $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.lcons (fun _ -> $x$) $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.lsing (fun _ -> $x$) >> -> [(True, x)] + | <:expr< Stream.sempty >> -> [] + | <:expr< Stream.slazy (fun _ -> $x$) >> -> [(False, x)] + | <:expr< Stream.slazy $x$ >> -> [(False, <:expr< $x$ () >>)] + | e -> [(False, e)] ] + in + let elem e k = + match e with + [ (True, e) -> [: `HOVbox [: `S LO "`"; `expr e "" k :] :] + | (False, e) -> [: `expr e "" k :] ] + in + let rec glop e k = + match e with + [ [] -> k + | [e] -> [: elem e k :] + | [e :: el] -> [: elem e [: `S RO ";" :]; glop el k :] ] + in + HOVbox [: `S LR "[:"; glop (get e) [: `S LR ":]"; k :] :] +; + +(* Parsers *) + +value parser_cases b spel k = + let rec parser_cases b spel k = + match spel with + [ [] -> [: `HVbox [: b; k :] :] + | [(sp, epo, e)] -> [: `parser_case b sp epo e k :] + | [(sp, epo, e) :: spel] -> + [: `parser_case b sp epo e [: :]; + parser_cases [: `S LR "|" :] spel k :] ] + and parser_case b sp epo e k = + let epo = + match epo with + [ Some p -> [: `patt p "" [: `S LR "->" :] :] + | _ -> [: `S LR "->" :] ] + in + HVbox + [: b; + `HOVbox + [: `HOVbox + [: `S LR "[:"; + stream_patt [: :] sp [: `S LR ":]"; epo :] :]; + `expr e "" k :] :] + and stream_patt b sp k = + match sp with + [ [] -> [: `HVbox [: b; k :] :] + | [(spc, None)] -> [: `stream_patt_comp b spc k :] + | [(spc, Some e)] -> + [: `HVbox + [: `stream_patt_comp b spc [: :]; + `HVbox [: `S LR "?"; `expr e "" k :] :] :] + | [(spc, None) :: spcl] -> + [: `stream_patt_comp b spc [: `S RO ";" :]; + stream_patt [: :] spcl k :] + | [(spc, Some e) :: spcl] -> + [: `HVbox + [: `stream_patt_comp b spc [: :]; + `HVbox [: `S LR "?"; `expr e "" [: `S RO ";" :] :] :]; + stream_patt [: :] spcl k :] ] + and stream_patt_comp b spc k = + match spc with + [ SPCterm (p, w) -> + HVbox [: b; `S LO "`"; `patt p "" [: :]; `HVbox [: when_opt w k :] :] + | SPCnterm p e -> + HVbox [: b; `HVbox [: `patt p "" [: `S LR "=" :]; `expr e "" k :] :] + | SPCsterm p -> HVbox [: b; `patt p "" k :] ] + and when_opt wo k = + match wo with + [ Some e -> [: `S LR "when"; `expr e "" k :] + | _ -> k ] + in + parser_cases b spel k +; + +value parser_body e dg k = + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + match Parserify.parser_of_expr e with + [ [] -> + HVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + `HVbox [: `S LR "[]"; k :] :] + | [spe] -> + HVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: :] [spe] k :] + | spel -> + Vbox + [: `HVbox [: :]; + `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: `S LR "[" :] spel [: `S LR "]"; k :] :] ] +; + +value pmatch e dg k = + let (me, e) = + match e with + [ <:expr< let (__strm : Stream.t _) = $me$ in $e$ >> -> (me, e) + | <:expr< match $_$ __strm with [ $list:_$ ] >> -> (<:expr< __strm >>, e) + | _ -> failwith "Pr_rp.pmatch" ] + in + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + let spel = Parserify.parser_of_expr e in + Vbox + [: `HVbox [: :]; + `HVbox + [: `S LR "match"; `expr me "" [: `S LR "with" :]; `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: `S LR "[" :] spel [: `S LR "]"; k :] :] +; + +(* Printer extensions *) + +pr_expr_fun_args.val := + extfun pr_expr_fun_args.val with + [ <:expr< fun __strm -> $_$ >> as ge -> ([], ge) + | <:expr< fun [(__strm : $_$) -> $_$] >> as ge -> ([], ge) ]; + +let lev = find_pr_level "top" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< let (__strm : Stream.t _) = $_$ in $_$ >> as e -> + fun curr next _ k -> [: `pmatch e "" k :] + | <:expr< match $_$ __strm with [ $list:_$ ] >> as e -> + fun curr next _ k -> [: `pmatch e "" k :] + | <:expr< fun __strm -> $x$ >> -> + fun curr next _ k -> [: `parser_body x "" k :] + | <:expr< fun (__strm : $_$) -> $x$ >> -> + fun curr next _ k -> [: `parser_body x "" k :] ]; + +let lev = find_pr_level "apply" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun curr next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "dot" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.sempty >> as e -> + fun curr next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "simple" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun curr next _ k -> [: `stream e "" k :] ]; diff --git a/camlp4/unmaintained/etc/pr_rp_main.ml b/camlp4/unmaintained/etc/pr_rp_main.ml new file mode 100644 index 00000000..534d4073 --- /dev/null +++ b/camlp4/unmaintained/etc/pr_rp_main.ml @@ -0,0 +1,206 @@ +(* camlp4r q_MLast.cmo ./pa_extfun.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1998 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; +open Spretty; + +value _loc = Loc.mk "FIXME pr_rp_main.ml"; + +value expr e dg k = pr_expr.pr_fun "top" e dg k; +value patt e dg k = pr_patt.pr_fun "top" e dg k; + +(* Streams *) + +value stream e _ k = + let rec get = + fun + [ <:expr< Stream.iapp $x$ $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.icons $x$ $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.ising $x$ >> -> [(True, x)] + | <:expr< Stream.lapp (fun _ -> $x$) $y$ >> -> [(False, x) :: get y] + | <:expr< Stream.lcons (fun _ -> $x$) $y$ >> -> [(True, x) :: get y] + | <:expr< Stream.lsing (fun _ -> $x$) >> -> [(True, x)] + | <:expr< Stream.sempty >> -> [] + | <:expr< Stream.slazy (fun _ -> $x$) >> -> [(False, x)] + | <:expr< Stream.slazy $x$ >> -> [(False, <:expr< $x$ () >>)] + | e -> [(False, e)] ] + in + let elem e k = + match e with + [ (True, e) -> [: `HOVbox [: `S LO "`"; `expr e "" k :] :] + | (False, e) -> [: `expr e "" k :] ] + in + let rec glop e k = + match e with + [ [] -> k + | [e] -> [: elem e k :] + | [e :: el] -> [: elem e [: `S RO ";" :]; glop el k :] ] + in + HOVbox [: `S LR "[:"; glop (get e) [: `S LR ":]"; k :] :] +; + +(* Parsers *) + +open Parserify; + +value parser_cases b spel k = + let rec parser_cases b spel k = + match spel with + [ [] -> [: `HVbox [: b; k :] :] + | [(sp, epo, e)] -> [: `parser_case b sp epo e k :] + | [(sp, epo, e) :: spel] -> + [: `parser_case b sp epo e [: :]; + parser_cases [: `S LR "|" :] spel k :] ] + and parser_case b sp epo e k = + let epo = + match epo with + [ Some p -> [: `patt p "" [: `S LR "->" :] :] + | _ -> [: `S LR "->" :] ] + in + HVbox + [: b; + `HOVbox + [: `HOVbox + [: `S LR "[:"; + stream_patt [: :] sp [: `S LR ":]"; epo :] :]; + `expr e "" k :] :] + and stream_patt b sp k = + match sp with + [ [] -> [: `HVbox [: b; k :] :] + | [(spc, None)] -> [: `stream_patt_comp b spc k :] + | [(spc, Some e)] -> + [: `HVbox + [: `stream_patt_comp b spc [: :]; + `HVbox [: `S LR "?"; `expr e "" k :] :] :] + | [(spc, None) :: spcl] -> + [: `stream_patt_comp b spc [: `S RO ";" :]; + stream_patt [: :] spcl k :] + | [(spc, Some e) :: spcl] -> + [: `HVbox + [: `stream_patt_comp b spc [: :]; + `HVbox [: `S LR "?"; `expr e "" [: `S RO ";" :] :] :]; + stream_patt [: :] spcl k :] ] + and stream_patt_comp b spc k = + match spc with + [ SPCterm (p, w) -> + HVbox [: b; `S LO "`"; `patt p "" [: :]; `HVbox [: when_opt w k :] :] + | SPCnterm p e -> + HVbox [: b; `HVbox [: `patt p "" [: `S LR "=" :]; `expr e "" k :] :] + | SPCsterm p -> HVbox [: b; `patt p "" k :] ] + and when_opt wo k = + match wo with + [ Some e -> [: `S LR "when"; `expr e "" k :] + | _ -> k ] + in + parser_cases b spel k +; + +value parser_body e _ k = + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + match parser_of_expr e with + [ [] -> + HVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + `HVbox [: `S LR "[]"; k :] :] + | [spe] -> + HVbox + [: `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: :] [spe] k :] + | spel -> + Vbox + [: `HVbox [: :]; + `HVbox + [: `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: `S LR "[" :] spel [: `S LR "]"; k :] :] ] +; + +value pmatch e _ k = + let (me, e) = + match e with + [ <:expr< let (__strm : Stream.t _) = $me$ in $e$ >> -> (me, e) + | _ -> failwith "Pr_rp.pmatch" ] + in + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + let spel = parser_of_expr e in + Vbox + [: `HVbox [: :]; + `HVbox + [: `S LR "match"; `expr me "" [: `S LR "with" :]; `S LR "parser"; + match bp with + [ Some p -> [: `patt p "" [: :] :] + | _ -> [: :] ] :]; + parser_cases [: `S LR "[" :] spel [: `S LR "]"; k :] :] +; + +(* Printer extensions *) + +pr_expr_fun_args.val := + extfun pr_expr_fun_args.val with + [ <:expr< fun __strm -> $_$ >> as ge -> ([], ge) + | <:expr< fun [(__strm : $_$) -> $_$] >> as ge -> ([], ge) ]; + +let lev = find_pr_level "top" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< let (__strm : Stream.t _) = $_$ in $_$ >> as e -> + fun _ _ _ k -> [: `pmatch e "" k :] + | <:expr< fun __strm -> $x$ >> -> + fun _ _ _ k -> [: `parser_body x "" k :] + | <:expr< fun (__strm : $_$) -> $x$ >> -> + fun _ _ _ k -> [: `parser_body x "" k :] ]; + +let lev = find_pr_level "apply" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun _ next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "dot" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.sempty >> as e -> + fun _ next _ k -> [: `next e "" k :] ]; + +let lev = find_pr_level "simple" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> | + <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> | + <:expr< Stream.lcons (fun _ -> $_$) $_$ >> | + <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> | + <:expr< Stream.slazy $_$ >> as e -> + fun _ _ _ k -> [: `stream e "" k :] ]; diff --git a/camlp4/unmaintained/etc/q_phony.ml b/camlp4/unmaintained/etc/q_phony.ml new file mode 100644 index 00000000..e4908081 --- /dev/null +++ b/camlp4/unmaintained/etc/q_phony.ml @@ -0,0 +1,38 @@ +(* camlp4r pa_extend.cmo q_MLast.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2001 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +open Pcaml; + +value t = ref ""; + +Quotation.add "" + (Quotation.ExAst + (fun c s -> + let _loc = c.Quotation.loc in + let t = + if t.val = "" then "<<" ^ s ^ ">>" + else "<:" ^ t.val ^ "<" ^ s ^ ">>" + in + <:expr< $uid:t$ >>, + fun c s -> + let _loc = c.Quotation.loc in + let t = + if t.val = "" then "<<" ^ s ^ ">>" + else "<:" ^ t.val ^ "<" ^ s ^ ">>" + in + <:patt< $uid:t$ >>)) +; + +Quotation.default.val := ""; +Quotation.translate.val := fun s -> do { t.val := s; "" }; diff --git a/camlp4/unmaintained/extfold/README b/camlp4/unmaintained/extfold/README new file mode 100644 index 00000000..2a09ff09 --- /dev/null +++ b/camlp4/unmaintained/extfold/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + Nicolas Pouillard diff --git a/camlp4/unmaintained/extfold/pa_extfold.ml b/camlp4/unmaintained/extfold/pa_extfold.ml new file mode 100644 index 00000000..aa8e922b --- /dev/null +++ b/camlp4/unmaintained/extfold/pa_extfold.ml @@ -0,0 +1,42 @@ +(* camlp4r pa_extend.cmo q_MLast.cmo *) + + +open Pcaml; +open Pa_extend; + +value sfold _loc n foldfun f e s = + let styp = STquo _loc (new_type_var ()) in + let e = <:expr< Extfold.$lid:foldfun$ $f$ $e$ >> in + let t = STapp _loc (STapp _loc (STtyp <:ctyp< Extfold.t _ >>) s.styp) styp in + {used = s.used; text = TXmeta _loc n [s.text] e t; styp = styp} +; + +value sfoldsep _loc n foldfun f e s sep = + let styp = STquo _loc (new_type_var ()) in + let e = <:expr< Extfold.$lid:foldfun$ $f$ $e$ >> in + let t = + STapp _loc (STapp _loc (STtyp <:ctyp< Extfold.tsep _ >>) s.styp) styp + in + {used = s.used @ sep.used; text = TXmeta _loc n [s.text; sep.text] e t; + styp = styp} +; + +EXTEND + GLOBAL: symbol; + symbol: LEVEL "top" + [ [ UIDENT "FOLD0"; f = simple_expr; e = simple_expr; s = SELF -> + sfold _loc "FOLD0" "sfold0" f e s + | UIDENT "FOLD1"; f = simple_expr; e = simple_expr; s = SELF -> + sfold _loc "FOLD1" "sfold1" f e s + | UIDENT "FOLD0"; f = simple_expr; e = simple_expr; s = SELF; + UIDENT "SEP"; sep = symbol -> + sfoldsep _loc "FOLD0 SEP" "sfold0sep" f e s sep + | UIDENT "FOLD1"; f = simple_expr; e = simple_expr; s = SELF; + UIDENT "SEP"; sep = symbol -> + sfoldsep _loc "FOLD1 SEP" "sfold1sep" f e s sep ] ] + ; + simple_expr: + [ [ i = LIDENT -> <:expr< $lid:i$ >> + | "("; e = expr; ")" -> e ] ] + ; +END; diff --git a/camlp4/unmaintained/format/.depend b/camlp4/unmaintained/format/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/format/Makefile b/camlp4/unmaintained/format/Makefile new file mode 100644 index 00000000..c3887209 --- /dev/null +++ b/camlp4/unmaintained/format/Makefile @@ -0,0 +1,61 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# Makefile for pa_format +# M.Mauny +# + +include ../../config/Makefile.cnf + +OCAMLTOP=../../.. +CAMLP4=../../camlp4/camlp4$(EXE) + +OCAMLC=$(OCAMLTOP)/ocamlc$(EXE) +OCAMLOPT=$(OCAMLTOP)/ocamlopt$(EXE) + +P4INCLUDES= -nolib -I ../../lib -I ../../meta -I ../../etc +OCAMLINCLUDES= -nostdlib -I $(OCAMLTOP)/stdlib -I ../../lib -I ../../camlp4 +OCAMLCFLAGS=-warn-error A $(OCAMLINCLUDES) + +SRC=pa_format.ml +OBJS=$(SRC:.ml=.cmo) +OBJSX=$(SRC:.ml=.cmx) + +all: $(OBJS) + +opt: $(OBJSX) + +depend: + cp .depend .depend.bak + > .depend + for file in $(SRC); do \ + $(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $$file` pr_depend.cmo $$i | \ + sed -e 's| \.\./\.\./\.\.| $$(OCAMLTOP)|g' >> .depend; \ + done + +clean: + rm -f *.cm* *.$(O) *.bak .*.bak + + +.SUFFIXES: .cmx .cmo .cmi .ml .mli + +.mli.cmi: + $(OCAMLC) $(OCAMLCFLAGS) -c $< + + +.ml.cmo: + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +include .depend diff --git a/camlp4/unmaintained/format/README b/camlp4/unmaintained/format/README new file mode 100644 index 00000000..809d42f2 --- /dev/null +++ b/camlp4/unmaintained/format/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + diff --git a/camlp4/unmaintained/format/pa_format.ml b/camlp4/unmaintained/format/pa_format.ml new file mode 100644 index 00000000..640a7503 --- /dev/null +++ b/camlp4/unmaintained/format/pa_format.ml @@ -0,0 +1,52 @@ +(* pa_r.cmo pa_extend.cmo q_MLast.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + +open Pcaml; + +EXTEND + GLOBAL: expr; + expr: LEVEL "top" + [ [ n = box_type; d = SELF; "begin"; + el = LIST0 [ e = box_expr; ";" -> e ]; "end" -> + let el = [<:expr< Format.$lid:"open_" ^ n$ $d$ >> :: el] in + let el = el @ [<:expr< Format.close_box () >>] in + <:expr< do { $list:el$ } >> + | "hbox"; "begin"; el = LIST0 [ e = box_expr; ";" -> e ]; "end" -> + let el = [<:expr< Format.open_hbox () >> :: el] in + let el = el @ [<:expr< Format.close_box () >>] in + <:expr< do { $list:el$ } >> + | "nobox"; "begin"; el = LIST0 [ e = box_expr; ";" -> e ]; "end" -> + match el with + [ [e] -> e + | _ -> <:expr< do { $list:el$ } >> ] ] ] + ; + box_type: + [ [ n = "hovbox" -> n + | n = "hvbox" -> n + | n = "vbox" -> n + | n = "box" -> n ] ] + ; + box_expr: + [ [ s = STRING -> <:expr< Format.print_string $str:s$ >> + | UIDENT "STRING"; e = expr -> <:expr< Format.print_string $e$ >> + | UIDENT "INT"; e = expr -> <:expr< Format.print_int $e$ >> + | "/-" -> <:expr< Format.print_space () >> + | "//" -> <:expr< Format.print_cut () >> + | "!/" -> <:expr< Format.force_newline () >> + | "?/" -> <:expr< Format.print_if_newline () >> + | e = expr -> e ] ] + ; +END; diff --git a/camlp4/unmaintained/lefteval/.depend b/camlp4/unmaintained/lefteval/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/lefteval/Makefile b/camlp4/unmaintained/lefteval/Makefile new file mode 100644 index 00000000..7e5cdd02 --- /dev/null +++ b/camlp4/unmaintained/lefteval/Makefile @@ -0,0 +1,61 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# Makefile for pa_lefteval +# M.Mauny +# + +include ../../config/Makefile.cnf + +OCAMLTOP=../../.. +CAMLP4=../../camlp4/camlp4$(EXE) + +OCAMLC=$(OCAMLTOP)/ocamlc$(EXE) +OCAMLOPT=$(OCAMLTOP)/ocamlopt$(EXE) + +P4INCLUDES= -nolib -I ../../meta -I ../../etc +OCAMLINCLUDES= -nostdlib -I $(OCAMLTOP)/stdlib -I ../../camlp4 +OCAMLCFLAGS=-warn-error A $(OCAMLINCLUDES) + +SRC=pa_lefteval.ml +OBJS=$(SRC:.ml=.cmo) +OBJSX=$(SRC:.ml=.cmx) + +all: $(OBJS) + +opt: $(OBJSX) + +depend: + cp .depend .depend.bak + > .depend + for file in $(SRC); do \ + $(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $$file` pr_depend.cmo $$i | \ + sed -e 's| \.\./\.\./\.\.| $$(OCAMLTOP)|g' >> .depend; \ + done + +clean: + rm -f *.cm* *.$(O) *.bak .*.bak + + +.SUFFIXES: .cmx .cmo .cmi .ml .mli + +.mli.cmi: + $(OCAMLC) $(OCAMLCFLAGS) -c $< + + +.ml.cmo: + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +include .depend diff --git a/camlp4/unmaintained/lefteval/README b/camlp4/unmaintained/lefteval/README new file mode 100644 index 00000000..809d42f2 --- /dev/null +++ b/camlp4/unmaintained/lefteval/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + diff --git a/camlp4/unmaintained/lefteval/pa_lefteval.ml b/camlp4/unmaintained/lefteval/pa_lefteval.ml new file mode 100644 index 00000000..56ad2979 --- /dev/null +++ b/camlp4/unmaintained/lefteval/pa_lefteval.ml @@ -0,0 +1,241 @@ +(* pa_r.cmo q_MLast.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + +value not_impl name x = + let desc = + if Obj.is_block (Obj.repr x) then + "tag = " ^ string_of_int (Obj.tag (Obj.repr x)) + else "int_val = " ^ string_of_int (Obj.magic x) + in + failwith ("pa_lefteval: not impl: " ^ name ^ "; " ^ desc ^ ">") +; + +value rec expr_fa al = + fun + [ <:expr< $f$ $a$ >> -> expr_fa [a :: al] f + | f -> (f, al) ] +; + +(* generating let..in before functions calls which evaluates + several (more than one) of their arguments *) + +value no_side_effects_ht = + let ht = Hashtbl.create 73 in + do { + List.iter (fun s -> Hashtbl.add ht s True) + ["<"; "="; "@"; "^"; "+"; "-"; "ref"]; + ht + } +; + +value no_side_effects = + fun + [ <:expr< $uid:_$ >> -> True + | <:expr< $uid:_$ . $uid:_$ >> -> True + | <:expr< $lid:s$ >> -> + try Hashtbl.find no_side_effects_ht s with [ Not_found -> False ] + | _ -> False ] +; + +value rec may_side_effect = + fun + [ <:expr< $lid:_$ >> | <:expr< $uid:_$ >> | <:expr< $str:_$ >> | + <:expr< $chr:_$ >> | <:expr< $int:_$ >> | <:expr< $flo:_$ >> | + <:expr< $_$ . $_$ >> | <:expr< fun [ $list:_$ ] >> -> + False + | <:expr< ($list:el$) >> -> List.exists may_side_effect el + | <:expr< $_$ $_$ >> as e -> + let (f, el) = expr_fa [] e in + not (no_side_effects f) || List.exists may_side_effect el + | _ -> True ] +; + +value rec may_be_side_effect_victim = + fun + [ <:expr< $lid:_$ . $_$ >> -> True + | <:expr< $uid:_$ . $e$ >> -> may_be_side_effect_victim e + | _ -> False ] +; + +value rec may_depend_on_order el = + loop False False el where rec loop + side_effect_found side_effect_victim_found = + fun + [ [e :: el] -> + if may_side_effect e then + if side_effect_found || side_effect_victim_found then True + else loop True True el + else if may_be_side_effect_victim e then + if side_effect_found then True else loop False True el + else loop side_effect_found side_effect_victim_found el + | [] -> False ] +; + +value gen_let_in loc expr el = + let (pel, el) = + loop 0 (List.rev el) where rec loop n = + fun + [ [e :: el] -> + if may_side_effect e || may_be_side_effect_victim e then + if n = 0 then + let (pel, el) = loop 1 el in + (pel, [expr e :: el]) + else + let id = "xxx" ^ string_of_int n in + let (pel, el) = loop (n + 1) el in + ([(<:patt< $lid:id$ >>, expr e) :: pel], + [<:expr< $lid:id$ >> :: el]) + else + let (pel, el) = loop n el in + (pel, [expr e :: el]) + | [] -> ([], []) ] + in + match List.rev el with + [ [e :: el] -> (pel, e, el) + | _ -> assert False ] +; + +value left_eval_apply loc expr e1 e2 = + let (f, el) = expr_fa [] <:expr< $e1$ $e2$ >> in + if not (may_depend_on_order [f :: el]) then <:expr< $expr e1$ $expr e2$ >> + else + let (pel, e, el) = gen_let_in loc expr [f :: el] in + let e = List.fold_left (fun e e1 -> <:expr< $e$ $e1$ >>) e el in + List.fold_left (fun e (p1, e1) -> <:expr< let $p1$ = $e1$ in $e$ >>) e pel +; + +value left_eval_tuple loc expr el = + if not (may_depend_on_order el) then <:expr< ($list:List.map expr el$) >> + else + let (pel, e, el) = gen_let_in loc expr el in + List.fold_left (fun e (p1, e1) -> <:expr< let $p1$ = $e1$ in $e$ >>) + <:expr< ($list:[e :: el]$) >> pel +; + +value left_eval_record loc expr lel = + let el = List.map snd lel in + if not (may_depend_on_order el) then + let lel = List.map (fun (p, e) -> (p, expr e)) lel in + <:expr< { $list:lel$ } >> + else + let (pel, e, el) = gen_let_in loc expr el in + let e = + let lel = List.combine (List.map fst lel) [e :: el] in + <:expr< { $list:lel$ } >> + in + List.fold_left (fun e (p1, e1) -> <:expr< let $p1$ = $e1$ in $e$ >>) e pel +; + +value left_eval_assign loc expr e1 e2 = <:expr< $e1$ := $expr e2$ >>; + +(* scanning the input tree, calling "left_eval_*" functions if necessary *) + +value map_option f = + fun + [ Some x -> Some (f x) + | None -> None ] +; + +value class_infos f ci = + {MLast.ciLoc = ci.MLast.ciLoc; MLast.ciVir = ci.MLast.ciVir; + MLast.ciPrm = ci.MLast.ciPrm; MLast.ciNam = ci.MLast.ciNam; + MLast.ciExp = f ci.MLast.ciExp} +; + +value rec expr x = + let loc = MLast.loc_of_expr x in + match x with + [ <:expr< fun [ $list:pwel$ ] >> -> + <:expr< fun [ $list:List.map match_assoc pwel$ ] >> + | <:expr< match $e$ with [ $list:pwel$ ] >> -> + <:expr< match $expr e$ with [ $list:List.map match_assoc pwel$ ] >> + | <:expr< try $e$ with [ $list:pwel$ ] >> -> + <:expr< try $expr e$ with [ $list:List.map match_assoc pwel$ ] >> + | <:expr< let $opt:rf$ $list:pel$ in $e$ >> -> + <:expr< let $opt:rf$ $list:List.map let_binding pel$ in $expr e$ >> + | <:expr< let module $s$ = $me$ in $e$ >> -> + <:expr< let module $s$ = $module_expr me$ in $expr e$ >> + | <:expr< if $e1$ then $e2$ else $e3$ >> -> + <:expr< if $expr e1$ then $expr e2$ else $expr e3$ >> + | <:expr< while $e$ do { $list:el$ } >> -> + <:expr< while $expr e$ do { $list:List.map expr el$ } >> + | <:expr< do { $list:el$ } >> -> <:expr< do { $list:List.map expr el$ } >> + | <:expr< $e$ # $s$ >> -> <:expr< $expr e$ # $s$ >> + | <:expr< ($e$ : $t$) >> -> <:expr< ($expr e$ : $t$) >> + | <:expr< $e1$ || $e2$ >> -> <:expr< $expr e1$ || $expr e2$ >> + | <:expr< $e1$ && $e2$ >> -> <:expr< $expr e1$ && $expr e2$ >> + | <:expr< $e1$ $e2$ >> -> left_eval_apply loc expr e1 e2 + | <:expr< ($list:el$) >> -> left_eval_tuple loc expr el + | <:expr< { $list:lel$ } >> -> left_eval_record loc expr lel + | <:expr< $e1$ := $e2$ >> -> left_eval_assign loc expr e1 e2 + | <:expr< $_$ . $_$ >> | <:expr< $uid:_$ >> | <:expr< $lid:_$ >> | + <:expr< $str:_$ >> | <:expr< $chr:_$ >> | <:expr< $int:_$ >> | + <:expr< $flo:_$ >> | <:expr< new $list:_$ >> -> + x + | x -> not_impl "expr" x ] +and let_binding (p, e) = (p, expr e) +and match_assoc (p, eo, e) = (p, map_option expr eo, expr e) +and module_expr x = + let loc = MLast.loc_of_module_expr x in + match x with + [ <:module_expr< functor ($s$ : $mt$) -> $me$ >> -> + <:module_expr< functor ($s$ : $mt$) -> $module_expr me$ >> + | <:module_expr< ($me$ : $mt$) >> -> + <:module_expr< ($module_expr me$ : $mt$) >> + | <:module_expr< struct $list:sil$ end >> -> + <:module_expr< struct $list:List.map str_item sil$ end >> + | <:module_expr< $_$ . $_$ >> | <:module_expr< $_$ $_$ >> | + <:module_expr< $uid:_$ >> -> + x ] +and str_item x = + let loc = MLast.loc_of_str_item x in + match x with + [ <:str_item< module $s$ = $me$ >> -> + <:str_item< module $s$ = $module_expr me$ >> + | <:str_item< value $opt:rf$ $list:pel$ >> -> + <:str_item< value $opt:rf$ $list:List.map let_binding pel$ >> + | <:str_item< declare $list:sil$ end >> -> + <:str_item< declare $list:List.map str_item sil$ end >> + | <:str_item< class $list:ce$ >> -> + <:str_item< class $list:List.map (class_infos class_expr) ce$ >> + | <:str_item< $exp:e$ >> -> <:str_item< $exp:expr e$ >> + | <:str_item< open $_$ >> | <:str_item< type $list:_$ >> | + <:str_item< exception $_$ of $list:_$ = $_$ >> | + <:str_item< module type $_$ = $_$ >> | <:str_item< # $_$ $opt:_$ >> -> + x + | x -> not_impl "str_item" x ] +and class_expr x = + let loc = MLast.loc_of_class_expr x in + match x with + [ <:class_expr< object $opt:p$ $list:csil$ end >> -> + <:class_expr< object $opt:p$ $list:List.map class_str_item csil$ end >> + | x -> not_impl "class_expr" x ] +and class_str_item x = + let loc = MLast.loc_of_class_str_item x in + match x with + [ <:class_str_item< value $opt:mf$ $s$ = $e$ >> -> + <:class_str_item< value $opt:mf$ $s$ = $expr e$ >> + | <:class_str_item< method $s$ = $e$ >> -> + <:class_str_item< method $s$ = $expr e$ >> + | x -> not_impl "class_str_item" x ] +; + +value parse_implem = Pcaml.parse_implem.val; +value parse_implem_with_left_eval strm = + let (r, b) = parse_implem strm in + (List.map (fun (si, loc) -> (str_item si, loc)) r, b) +; +Pcaml.parse_implem.val := parse_implem_with_left_eval; diff --git a/camlp4/unmaintained/lib/.cvsignore b/camlp4/unmaintained/lib/.cvsignore new file mode 100644 index 00000000..c77a681d --- /dev/null +++ b/camlp4/unmaintained/lib/.cvsignore @@ -0,0 +1,3 @@ +*.cm[oiax] +*.cmxa +*.lib diff --git a/camlp4/unmaintained/lib/.depend b/camlp4/unmaintained/lib/.depend new file mode 100644 index 00000000..a7793969 --- /dev/null +++ b/camlp4/unmaintained/lib/.depend @@ -0,0 +1,14 @@ +debug.cmo: debug.cmi +debug.cmx: debug.cmi +extfun.cmo: extfun.cmi +extfun.cmx: extfun.cmi +fstream.cmo: fstream.cmi +fstream.cmx: fstream.cmi +grammar.cmo: token.cmi plexer.cmi loc.cmi +grammar.cmx: token.cmx plexer.cmi loc.cmx +loc.cmo: loc.cmi +loc.cmx: loc.cmi +token.cmo: loc.cmi token.cmi +token.cmx: loc.cmx token.cmi +plexer.cmi: token.cmi loc.cmi +token.cmi: loc.cmi diff --git a/camlp4/unmaintained/lib/Makefile b/camlp4/unmaintained/lib/Makefile new file mode 100644 index 00000000..3d5be9b4 --- /dev/null +++ b/camlp4/unmaintained/lib/Makefile @@ -0,0 +1,52 @@ + + +include ../config/Makefile.cnf + +INCLUDES=-I $(OTOP)/parsing -I $(OTOP)/utils +LIBRARIES=gramlib.cma +OBJS=$(OTOP)/utils/misc.cmo $(OTOP)/parsing/linenum.cmo \ + $(OTOP)/utils/warnings.cmo $(OTOP)/parsing/location.cmo \ + $(OTOP)/utils/config.cmo debug.cmo loc.cmo \ + token.cmo lexer_token.cmo lexer_error.cmo \ + plexer.cmo grammar.cmo extfun.cmo \ + fstream.cmo +CLEANFILES=plexer.ml + +include ../config/Makefile.base + +debug.cmo: debug.cmi +debug.cmo: debug.ml + $(OCAMLC) -pp '$(CAMLP4BOOT)' -rectypes $(OCAMLCFLAGS) $< -c -o $@ + +plexer.cmo: plexer.ml plexer.cmi + $(OCAMLC) $(OCAMLCFLAGS) $< -c -o $@ + +plexer.cmx: plexer.ml plexer.cmi + $(OCAMLOPT) $(OCAMLCFLAGS) $< -c -o $@ + +$(LIBRARIES): $(OBJS) + $(OCAMLC) -linkall $(OBJS) -a -o $(LIBRARIES) + +$(LIBRARIESX): $(OBJSX) + $(OCAMLOPT) -linkall $(OBJSX) -a -o $(LIBRARIESX) + +$(LIBRARIESP): $(OBJSP) + $(OCAMLOPT) -linkall $(OBJSP) -a -o $(LIBRARIESP) + +install-local: + -$(MKDIR) "$(LIBDIR)/camlp4" + cp $(LIBRARIES) *.mli "$(LIBDIR)/camlp4/." + cp *.cmi "$(LIBDIR)/camlp4/." + test -f $(LIBRARIESX) && $(MAKE) installopt LIBDIR="$(LIBDIR)" || true + +installopt: + for f in $(LIBRARIESX) $(LIBRARIESP) *.cmx ; do \ + test -f $$f && cp $$f "$(LIBDIR)/camlp4/." || true ; \ + done + # Special treatment for this one: some versions of make don't like $(A) in $(TARGET:.cma=.$(A)) + target="`echo $(LIBRARIES) | sed -e 's/\.cma$$/.$(A)/'`" ; \ + if test -f $$target ; then \ + cp $$target "$(LIBDIR)/camlp4/." && ( cd "$(LIBDIR)/camlp4/." && $(RANLIB) $$target ) \ + fi + +include .depend diff --git a/camlp4/unmaintained/lib/extfun.ml b/camlp4/unmaintained/lib/extfun.ml new file mode 100644 index 00000000..4f4cbbd9 --- /dev/null +++ b/camlp4/unmaintained/lib/extfun.ml @@ -0,0 +1,107 @@ +(* camlp4r *) + +(* Copyright 2001 INRIA *) + +(* Extensible Functions *) + +type t 'a 'b = list (matching 'a 'b) +and matching 'a 'b = { patt : patt; has_when : bool; expr : expr 'a 'b } +and patt = + [ Eapp of list patt + | Eacc of list patt + | Econ of string + | Estr of string + | Eint of string + | Etup of list patt + | Evar of unit ] +and expr 'a 'b = 'a -> option 'b +; + +exception Failure; + +value empty = []; + +(*** Apply ***) + +value rec apply_matchings a = + fun + [ [m :: ml] -> + match m.expr a with + [ None -> apply_matchings a ml + | x -> x ] + | [] -> None ] +; + +value apply ef a = + match apply_matchings a ef with + [ Some x -> x + | None -> raise Failure ] +; + +(*** Trace ***) + +value rec list_iter_sep f s = + fun + [ [] -> () + | [x] -> f x + | [x :: l] -> do { f x; s (); list_iter_sep f s l } ] +; + +value rec print_patt = + fun + [ Eapp pl -> list_iter_sep print_patt2 (fun () -> print_string " ") pl + | p -> print_patt2 p ] +and print_patt2 = + fun + [ Eacc pl -> list_iter_sep print_patt1 (fun () -> print_string ".") pl + | p -> print_patt1 p ] +and print_patt1 = + fun + [ Econ s -> print_string s + | Estr s -> do { print_string "\""; print_string s; print_string "\"" } + | Eint s -> print_string s + | Evar () -> print_string "_" + | Etup pl -> + do { + print_string "("; + list_iter_sep print_patt (fun () -> print_string ", ") pl; + print_string ")" + } + | Eapp _ | Eacc _ as p -> + do { print_string "("; print_patt p; print_string ")" } ] +; + +value print ef = + List.iter + (fun m -> + do { + print_patt m.patt; + if m.has_when then print_string " when ..." else (); + print_newline () + }) + ef +; + +(*** Extension ***) + +value insert_matching matchings (patt, has_when, expr) = + let m1 = {patt = patt; has_when = has_when; expr = expr} in + let rec loop = + fun + [ [m :: ml] as gml -> + if m1.has_when && not m.has_when then [m1 :: gml] else + if not m1.has_when && m.has_when then [m :: loop ml] else + (* either both or none have a when clause *) + if compare m1.patt m.patt = 0 then + if not m1.has_when then [m1 :: ml] else [m1 :: gml] + else [m :: loop ml] + | [] -> [m1] ] + in + loop matchings +; + +(* available extension function *) + +value extend ef matchings_def = + List.fold_left insert_matching ef matchings_def +; diff --git a/camlp4/unmaintained/lib/extfun.mli b/camlp4/unmaintained/lib/extfun.mli new file mode 100644 index 00000000..6d71fc11 --- /dev/null +++ b/camlp4/unmaintained/lib/extfun.mli @@ -0,0 +1,35 @@ +(* camlp4r *) + + +(** Extensible functions. + + This module implements pattern matching extensible functions. + To extend, use syntax [pa_extfun.cmo]: + + [extfun e with [ pattern_matching ]] *) + +type t 'a 'b = 'x; + (** The type of the extensible functions of type ['a -> 'b] *) +value empty : t 'a 'b; + (** Empty extensible function *) +value apply : t 'a 'b -> 'a -> 'b; + (** Apply an extensible function *) +exception Failure; + (** Match failure while applying an extensible function *) +value print : t 'a 'b -> unit; + (** Print patterns in the order they are recorded *) + +(**/**) + +type patt = + [ Eapp of list patt + | Eacc of list patt + | Econ of string + | Estr of string + | Eint of string + | Etup of list patt + | Evar of unit ] +and expr 'a 'b = 'a -> option 'b +; + +value extend : t 'a 'b -> list (patt * bool * expr 'a 'b) -> t 'a 'b; diff --git a/camlp4/unmaintained/lib/fstream.ml b/camlp4/unmaintained/lib/fstream.ml new file mode 100644 index 00000000..8c3171a8 --- /dev/null +++ b/camlp4/unmaintained/lib/fstream.ml @@ -0,0 +1,77 @@ +(* camlp4r *) + +(* Copyright 2001 INRIA *) + +type t 'a = { count : int; data : Lazy.t (data 'a) } +and data 'a = + [ Nil + | Cons of 'a and t 'a + | App of t 'a and t 'a ] +; + +value from f = + loop 0 where rec loop i = + {count = 0; + data = + lazy + (match f i with + [ Some x -> Cons x (loop (i + 1)) + | None -> Nil ])} +; + +value rec next s = + let count = s.count + 1 in + match Lazy.force s.data with + [ Nil -> None + | Cons a s -> Some (a, {count = count; data = s.data}) + | App s1 s2 -> + match next s1 with + [ Some (a, s1) -> Some (a, {count = count; data = lazy (App s1 s2)}) + | None -> + match next s2 with + [ Some (a, s2) -> Some (a, {count = count; data = s2.data}) + | None -> None ] ] ] +; + +value empty s = + match next s with + [ Some _ -> None + | None -> Some ((), s) ] +; + +value nil = {count = 0; data = lazy Nil}; +value cons a s = Cons a s; +value app s1 s2 = App s1 s2; +value flazy f = {count = 0; data = Lazy.lazy_from_fun f}; + +value of_list l = + List.fold_right (fun x s -> flazy (fun () -> cons x s)) l nil +; + +value of_string s = + from (fun c -> if c < String.length s then Some s.[c] else None) +; + +value of_channel ic = + from (fun _ -> try Some (input_char ic) with [ End_of_file -> None ]) +; + +value iter f = + do_rec where rec do_rec strm = + match next strm with + [ Some (a, strm) -> + let _ = f a in + do_rec strm + | None -> () ] +; + +value count s = s.count; + +value count_unfrozen s = + loop 0 s where rec loop cnt s = + if Lazy.lazy_is_val s.data then + match Lazy.force s.data with + [ Cons _ s -> loop (cnt + 1) s + | _ -> cnt ] + else cnt +; diff --git a/camlp4/unmaintained/lib/fstream.mli b/camlp4/unmaintained/lib/fstream.mli new file mode 100644 index 00000000..723389ac --- /dev/null +++ b/camlp4/unmaintained/lib/fstream.mli @@ -0,0 +1,60 @@ +(* camlp4r *) + + +(* Module [Fstream]: functional streams *) + +(* This module implement functional streams. + To be used with syntax [pa_fstream.cmo]. The syntax is: +- stream: [fstream [: ... :]] +- parser: [parser [ [: ... :] -> ... | ... ]] + + Functional parsers are of type: [Fstream.t 'a -> option ('a * Fstream.t 'a)] + + They have limited backtrack, i.e if a rule fails, the next rule is tested + with the initial stream; limited because when in case of a rule with two + consecutive symbols [a] and [b], if [b] fails, the rule fails: there is + no try with the next rule of [a]. +*) + +type t 'a = 'x; + (* The type of 'a functional streams *) +value from : (int -> option 'a) -> t 'a; + (* [Fstream.from f] returns a stream built from the function [f]. + To create a new stream element, the function [f] is called with + the current stream count. The user function [f] must return either + [Some ] for a value or [None] to specify the end of the + stream. *) + +value of_list : list 'a -> t 'a; + (* Return the stream holding the elements of the list in the same + order. *) +value of_string : string -> t char; + (* Return the stream of the characters of the string parameter. *) +value of_channel : in_channel -> t char; + (* Return the stream of the characters read from the input channel. *) + +value iter : ('a -> unit) -> t 'a -> unit; + (* [Fstream.iter f s] scans the whole stream s, applying function [f] + in turn to each stream element encountered. *) + +value next : t 'a -> option ('a * t 'a); + (* Return [Some (a, s)] where [a] is the first element of the stream + and [s] the remaining stream, or [None] if the stream is empty. *) +value empty : t 'a -> option (unit * t 'a); + (* Return [Some ((), s)] if the stream is empty where [s] is itself, + else [None] *) +value count : t 'a -> int; + (* Return the current count of the stream elements, i.e. the number + of the stream elements discarded. *) +value count_unfrozen : t 'a -> int; + (* Return the number of unfrozen elements in the beginning of the + stream; useful to determine the position of a parsing error (longuest + path). *) + +(*--*) + +value nil : t 'a; +type data 'a = 'x; +value cons : 'a -> t 'a -> data 'a; +value app : t 'a -> t 'a -> data 'a; +value flazy : (unit -> data 'a) -> t 'a; diff --git a/camlp4/unmaintained/ocamllex/Makefile b/camlp4/unmaintained/ocamllex/Makefile new file mode 100644 index 00000000..b232023e --- /dev/null +++ b/camlp4/unmaintained/ocamllex/Makefile @@ -0,0 +1,59 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# Makefile for pa_ocamllex +# M.Mauny +# + +include ../../config/Makefile.cnf + +OCAMLTOP=../../.. + +CAMLP4=../../camlp4/camlp4$(EXE) + +OCAMLC=$(OCAMLTOP)/ocamlc$(EXE) +OCAMLOPT=$(OCAMLTOP)/ocamlopt$(EXE) + +P4INCLUDES= -nolib -I ../../etc -I ../../meta +OCAMLINCLUDES= -nostdlib -I $(OCAMLTOP)/stdlib -I ../../camlp4 -I ../../lib -I $(OCAMLTOP)/lex +OCAMLCFLAGS=-warn-error A $(OCAMLINCLUDES) + +SRC=pa_ocamllex.ml +OBJS=pa_ocamllex.cmo +OBJSX=$(OBJS:.cmo=.cmx) + +all: $(OBJS) pa_ocamllex.cma + +opt: $(OBJSX) pa_ocamllex.cmxa + +pa_ocamllex.cma: pa_ocamllex.cmo + $(OCAMLC) $(OCAMLCFLAGS) cset.cmo syntax.cmo table.cmo lexgen.cmo compact.cmo pa_ocamllex.cmo -a -o pa_ocamllex.cma + +pa_ocamllex.cmxa: pa_ocamllex.cmo + $(OCAMLOPT) $(OCAMLCFLAGS) cset.cmx syntax.cmx table.cmx lexgen.cmx compact.cmx pa_ocamllex.cmx -a -o pa_ocamllex.cmxa + +clean: + rm -f *.cm* *.$(O) *.$(A) *.bak .*.bak + +depend: + +.SUFFIXES: .cmx .cmo .cmi .ml .mli + +.mli.cmi: + $(OCAMLC) $(OCAMLCFLAGS) -c $< + + +.ml.cmo: + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< diff --git a/camlp4/unmaintained/ocamllex/README b/camlp4/unmaintained/ocamllex/README new file mode 100644 index 00000000..809d42f2 --- /dev/null +++ b/camlp4/unmaintained/ocamllex/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + diff --git a/camlp4/unmaintained/ocamllex/pa_ocamllex.ml b/camlp4/unmaintained/ocamllex/pa_ocamllex.ml new file mode 100644 index 00000000..e1d4a8ef --- /dev/null +++ b/camlp4/unmaintained/ocamllex/pa_ocamllex.ml @@ -0,0 +1,356 @@ +(* pa_o.cmo q_MLast.cmo pa_extend.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Alain Frisch, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + +open Syntax +open Lexgen +open Compact + +(* Adapted from output.ml *) +(**************************) + +(* Output the DFA tables and its entry points *) + +(* To output an array of short ints, encoded as a string *) + +let output_byte buf b = + Buffer.add_char buf '\\'; + Buffer.add_char buf (Char.chr(48 + b / 100)); + Buffer.add_char buf (Char.chr(48 + (b / 10) mod 10)); + Buffer.add_char buf (Char.chr(48 + b mod 10)) + +let loc = (Lexing.dummy_pos,Lexing.dummy_pos) + +let output_array v = + let b = Buffer.create (Array.length v * 3) in + for i = 0 to Array.length v - 1 do + output_byte b (v.(i) land 0xFF); + output_byte b ((v.(i) asr 8) land 0xFF); + if i land 7 = 7 then Buffer.add_string b "\\\n " + done; + let s = Buffer.contents b in + <:expr< $str:s$ >> + +let output_byte_array v = + let b = Buffer.create (Array.length v * 2) in + for i = 0 to Array.length v - 1 do + output_byte b (v.(i) land 0xFF); + if i land 15 = 15 then Buffer.add_string b "\\\n " + done; + let s = Buffer.contents b in + <:expr< $str:s$ >> + + + +(* Output the tables *) + +let output_tables tbl = + <:str_item< value lex_tables = { + Lexing.lex_base = $output_array tbl.tbl_base$; + Lexing.lex_backtrk = $output_array tbl.tbl_backtrk$; + Lexing.lex_default = $output_array tbl.tbl_default$; + Lexing.lex_trans = $output_array tbl.tbl_trans$; + Lexing.lex_check = $output_array tbl.tbl_check$; + Lexing.lex_base_code = $output_array tbl.tbl_base_code$; + Lexing.lex_backtrk_code = $output_array tbl.tbl_backtrk_code$; + Lexing.lex_default_code = $output_array tbl.tbl_default_code$; + Lexing.lex_trans_code = $output_array tbl.tbl_trans_code$; + Lexing.lex_check_code = $output_array tbl.tbl_check_code$; + Lexing.lex_code = $output_byte_array tbl.tbl_code$ + } >> + +(* Output the entries *) + +let rec make_alias n = function + | [] -> [] + | h::t -> + (h, "__ocaml_lex_arg_" ^ (string_of_int n)) :: (make_alias (succ n) t) + +let abstraction = + List.fold_right (fun (p,a) e -> <:expr< fun ($p$ as $lid:a$) -> $e$ >>) + + +let application = + List.fold_left (fun f (_,a) -> <:expr< $f$ $lid:a$ >>) + +let int i = <:expr< $int:string_of_int i$ >> + +let output_memory_actions acts = + let aux = function + | Copy (tgt, src) -> + <:expr< lexbuf.Lexing.lex_mem.($int tgt$) := + lexbuf.Lexing.lex_mem.($int src$) >> + | Set tgt -> + <:expr< lexbuf.Lexing.lex_mem.($int tgt$) := + lexbuf.Lexing.lex_curr_pos >> + in + <:expr< do { $list:List.map aux acts$ } >> + +let output_base_mem = function + | Mem i -> <:expr< lexbuf.Lexing.lex_mem.($int i$) >> + | Start -> <:expr< lexbuf.Lexing.lex_start_pos >> + | End -> <:expr< lexbuf.Lexing.lex_curr_pos >> + +let output_tag_access = function + | Sum (a,0) -> output_base_mem a + | Sum (a,i) -> <:expr< $output_base_mem a$ + $int i$ >> + +let rec output_env e = function + | [] -> e + | (x, Ident_string (o,nstart,nend)) :: rem -> + <:expr< + let $lid:x$ = + Lexing.$lid:if o then "sub_lexeme_opt" else "sub_lexeme"$ + lexbuf $output_tag_access nstart$ $output_tag_access nend$ + in $output_env e rem$ + >> + | (x, Ident_char (o,nstart)) :: rem -> + <:expr< + let $lid:x$ = + Lexing.$lid: if o then "sub_lexeme_char_opt" else "sub_lexeme_char"$ + lexbuf $output_tag_access nstart$ + in $output_env e rem$ + >> + +let output_entry e = + let init_num, init_moves = e.auto_initial_state in + let args = make_alias 0 (e.auto_args @ [ <:patt< lexbuf >> ]) in + let f = "__ocaml_lex_rec_" ^ e.auto_name ^ "_rec" in + let call_f = application <:expr< $lid:f$ >> args in + let body_wrapper = + <:expr< + do { + lexbuf.Lexing.lex_mem := Array.create $int e.auto_mem_size$ (-1) ; + $output_memory_actions init_moves$; + $call_f$ $int init_num$ + } >> in + let cases = + List.map + (fun (num, env, (loc,e)) -> + <:patt< $int:string_of_int num$ >>, + None, + output_env <:expr< $e$ >> env + (* Note: the <:expr<...>> above is there to set the location *) + ) e.auto_actions @ + [ <:patt< __ocaml_lex_n >>, + None, + <:expr< do + { lexbuf.Lexing.refill_buff lexbuf; $call_f$ __ocaml_lex_n }>> ] + in + let engine = + if e.auto_mem_size = 0 + then <:expr< Lexing.engine >> + else <:expr< Lexing.new_engine >> in + let body = + <:expr< fun state -> + match $engine$ lex_tables state lexbuf with [ $list:cases$ ] >> in + [ + <:patt< $lid:e.auto_name$ >>, (abstraction args body_wrapper); + <:patt< $lid:f$ >>, (abstraction args body) + ] + +(* Main output function *) + +exception Table_overflow + +let output_lexdef tables entry_points = + Printf.eprintf + "pa_ocamllex: lexer found; %d states, %d transitions, table size %d bytes\n" + (Array.length tables.tbl_base) + (Array.length tables.tbl_trans) + (2 * (Array.length tables.tbl_base + Array.length tables.tbl_backtrk + + Array.length tables.tbl_default + Array.length tables.tbl_trans + + Array.length tables.tbl_check)); + let size_groups = + (2 * (Array.length tables.tbl_base_code + + Array.length tables.tbl_backtrk_code + + Array.length tables.tbl_default_code + + Array.length tables.tbl_trans_code + + Array.length tables.tbl_check_code) + + Array.length tables.tbl_code) in + if size_groups > 0 then + Printf.eprintf "pa_ocamllex: %d additional bytes used for bindings\n" + size_groups ; + flush stderr; + if Array.length tables.tbl_trans > 0x8000 then raise Table_overflow; + + let entries = List.map output_entry entry_points in + [output_tables tables; <:str_item< value rec $list:List.flatten entries$ >> ] + + +(* Adapted from parser.mly and main.ml *) +(***************************************) + +(* Auxiliaries for the parser. *) + +let char s = Char.code (Token.eval_char s) + +let named_regexps = + (Hashtbl.create 13 : (string, regular_expression) Hashtbl.t) + +let regexp_for_string s = + let rec re_string n = + if n >= String.length s then Epsilon + else if succ n = String.length s then + Characters (Cset.singleton (Char.code s.[n])) + else + Sequence + (Characters(Cset.singleton (Char.code s.[n])), + re_string (succ n)) + in re_string 0 + +let char_class c1 c2 = Cset.interval c1 c2 + +let all_chars = Cset.all_chars + +let rec remove_as = function + | Bind (e,_) -> remove_as e + | Epsilon|Eof|Characters _ as e -> e + | Sequence (e1, e2) -> Sequence (remove_as e1, remove_as e2) + | Alternative (e1, e2) -> Alternative (remove_as e1, remove_as e2) + | Repetition e -> Repetition (remove_as e) + +let () = + Hashtbl.add named_regexps "eof" (Characters Cset.eof) + +(* The parser *) + +let let_regexp = Grammar.Entry.create Pcaml.gram "pa_ocamllex let" +let header = Grammar.Entry.create Pcaml.gram "pa_ocamllex header" +let lexer_def = Grammar.Entry.create Pcaml.gram "pa_ocaml lexerdef" + +EXTEND + GLOBAL: Pcaml.str_item let_regexp header lexer_def; + + let_regexp: [ + [ x = LIDENT; "="; r = regexp -> + if Hashtbl.mem named_regexps x then + Printf.eprintf + "pa_ocamllex (warning): multiple definition of named regexp '%s'\n" + x; + Hashtbl.add named_regexps x r; + ] + ]; + + lexer_def: [ + [ def = LIST0 definition SEP "and" -> + (try + let (entries, transitions) = make_dfa def in + let tables = compact_tables transitions in + let output = output_lexdef tables entries in + <:str_item< declare $list: output$ end >> + with + |Table_overflow -> + failwith "Transition table overflow in lexer, automaton is too big" + | Lexgen.Memory_overflow -> + failwith "Position memory overflow in lexer, too many as variables") + ] + ]; + + + Pcaml.str_item: [ + [ "pa_ocamllex"; LIDENT "rule"; d = lexer_def -> d + | "pa_ocamllex"; "let"; let_regexp -> + <:str_item< declare $list: []$ end >> + ] + ]; + + definition: [ + [ x=LIDENT; pl = LIST0 Pcaml.patt LEVEL "simple"; "="; + short=[ LIDENT "parse" -> false | LIDENT "shortest" -> true ]; + OPT "|"; l = LIST0 [ r=regexp; a=action -> (r,a) ] SEP "|" -> + { name=x ; shortest=short ; args=pl ; clauses = l } ] + ]; + + action: [ + [ "{"; e = OPT Pcaml.expr; "}" -> + let e = match e with + | Some e -> e + | None -> <:expr< () >> + in + (loc,e) + ] + ]; + + header: [ + [ "{"; e = LIST0 [ si = Pcaml.str_item; OPT ";;" -> si ]; "}" -> + [<:str_item< declare $list:e$ end>>, loc] ] + | [ -> [] ] + ]; + + regexp: [ + [ r = regexp; "as"; i = LIDENT -> Bind (r,i) ] + | [ r1 = regexp; "|"; r2 = regexp -> Alternative(r1,r2) ] + | [ r1 = regexp; r2 = regexp -> Sequence(r1,r2) ] + | [ r = regexp; "*" -> Repetition r + | r = regexp; "+" -> Sequence(Repetition (remove_as r), r) + | r = regexp; "?" -> Alternative(Epsilon, r) + | "("; r = regexp; ")" -> r + | "_" -> Characters all_chars + | c = CHAR -> Characters (Cset.singleton (char c)) + | s = STRING -> regexp_for_string (Token.eval_string loc s) + | "["; cc = ch_class; "]" -> Characters cc + | x = LIDENT -> + try Hashtbl.find named_regexps x + with Not_found -> + failwith + ("pa_ocamllex (error): reference to unbound regexp name `"^x^"'") + ] + ]; + + ch_class: [ + [ "^"; cc = ch_class -> Cset.complement cc] + | [ c1 = CHAR; "-"; c2 = CHAR -> Cset.interval (char c1) (char c2) + | c = CHAR -> Cset.singleton (char c) + | cc1 = ch_class; cc2 = ch_class -> Cset.union cc1 cc2 + ] + ]; +END + +(* We have to be careful about "rule"; in standalone mode, + it is used as a keyword (otherwise, there is a conflict + with named regexp); in normal mode, it is used as LIDENT + (we do not want to reserve such an useful identifier). + + Plexer does not like identifiers used as keyword _and_ + as LIDENT ... +*) + +let standalone = + let already = ref false in + fun () -> + if not (!already) then + begin + already := true; + Printf.eprintf "pa_ocamllex: stand-alone mode\n"; + + DELETE_RULE Pcaml.str_item: "pa_ocamllex"; LIDENT "rule";lexer_def END; + DELETE_RULE Pcaml.str_item: "pa_ocamllex"; "let"; let_regexp END; + let ocamllex = Grammar.Entry.create Pcaml.gram "pa_ocamllex" in + EXTEND GLOBAL: ocamllex let_regexp header lexer_def; + ocamllex: [ + [ h = header; + l = [LIST0 ["let"; let_regexp]; "rule"; d = lexer_def -> (d,loc)]; + t = header; EOI -> h @ (l :: t) ,false + ] + ]; + END; + Pcaml.parse_implem := Grammar.Entry.parse ocamllex + end + +let () = + Pcaml.add_option "-ocamllex" (Arg.Unit standalone) + "Activate (standalone) ocamllex emulation mode." + diff --git a/camlp4/unmaintained/ocpp/.cvsignore b/camlp4/unmaintained/ocpp/.cvsignore new file mode 100644 index 00000000..baef26c6 --- /dev/null +++ b/camlp4/unmaintained/ocpp/.cvsignore @@ -0,0 +1,3 @@ +*.cm[oia] +ocpp +crc.ml diff --git a/camlp4/unmaintained/ocpp/.depend b/camlp4/unmaintained/ocpp/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/ocpp/Makefile b/camlp4/unmaintained/ocpp/Makefile new file mode 100644 index 00000000..b92fa3c5 --- /dev/null +++ b/camlp4/unmaintained/ocpp/Makefile @@ -0,0 +1,24 @@ + + +include ../config/Makefile.cnf + +EXECUTABLES=ocpp +OBJS=ocpp.cmo +INCLUDES=-I ../camlp4 -I ../lib -I ../odyl -I $(OTOP)/otherlibs/dynlink +OCPPM=../lib/debug.cmo ../lib/loc.cmo ../lib/stdpp.cmo ../camlp4/quotation.cmo + +include ../config/Makefile.base + +ocpp$(EXE): $(OBJS) + $(OCAMLC) $(LINKFLAGS) $(OCPPM) ../odyl/odyl.cma $(OBJS) ../odyl/odyl.cmo -linkall -o $@ + +ocpp.opt: $(OBJSX) + $(OCAMLOPT) $(LINKFLAGS) $(OCPPM:.cmo=.cmx) ../odyl/odyl.cmxa $(OBJSX) ../odyl/odyl.cmx -linkall -o $@ + +install-local: + -$(MKDIR) "$(LIBDIR)/camlp4" "$(BINDIR)" + cp $(OBJS) "$(LIBDIR)/camlp4/." + cp ocpp$(EXE) "$(BINDIR)/." + if test -f ocpp.opt ; then \ + cp ocpp.opt "$(LIBDIR)/camlp4/." ; \ + fi diff --git a/camlp4/unmaintained/ocpp/ocpp.ml b/camlp4/unmaintained/ocpp/ocpp.ml new file mode 100644 index 00000000..eb2ccdf5 --- /dev/null +++ b/camlp4/unmaintained/ocpp/ocpp.ml @@ -0,0 +1,129 @@ +(* camlp4r *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + + +value buff = ref (String.create 80); +value store len x = + do { + if len >= String.length buff.val then + buff.val := buff.val ^ String.create (String.length buff.val) + else (); + buff.val.[len] := x; + succ len + } +; +value get_buff len = String.sub buff.val 0 len; + +value rec copy_strip_locate cs = + match cs with parser + [ [: `'$' :] -> maybe_locate cs + | [: `c :] -> do { print_char c; copy_strip_locate cs } + | [: :] -> () ] +and maybe_locate cs = + match cs with parser + [ [: `'1'..'9' :] -> locate cs + | [: :] -> do { print_char '$'; copy_strip_locate cs } ] +and locate cs = + match cs with parser + [ [: `'0'..'9' :] -> locate cs + | [: `':' :] -> inside_locate cs + | [: :] -> raise (Stream.Error "colon char expected") ] +and inside_locate cs = + match cs with parser + [ [: `'$' :] -> copy_strip_locate cs + | [: `'\\'; `c :] -> do { print_char c; inside_locate cs } + | [: `c :] -> do { print_char c; inside_locate cs } + | [: :] -> raise (Stream.Error "end of file in locate directive") ] +; + +value file = ref ""; + +value quot name loc str = + let loc = Loc.move `stop (String.length str) loc in + let exp = + try + match Quotation.find name with + [ Quotation.ExStr f -> f + | _ -> raise Not_found ] + with + [ Not_found -> Stdpp.raise_with_loc loc Not_found ] + in + let new_str = + try exp True { Quotation.loc = Loc.mk file.val ; loc_name_opt = None } str with + [ Loc.Exc_located loc exc -> Stdpp.raise_with_loc loc exc + | exc -> Stdpp.raise_with_loc loc exc ] + in + let cs = Stream.of_string new_str in copy_strip_locate cs +; + +value rec ident len = + parser + [ [: `('A'..'Z' | 'a'..'z' | '0'..'9' | '_' | ''' as c); s :] -> + ident (store len c) s + | [: :] -> get_buff len ] +; + +value loc_of_ep ep = + Loc.set_all `start 1 0 ep (Loc.mk file.val); + +value rec copy cs = + match cs with parser + [ [: `'<' :] -> maybe_quot cs + | [: `'"' :] -> do { print_char '"'; inside_string cs } + | [: `c :] -> do { print_char c; copy cs } + | [: :] -> () ] +and maybe_quot cs = + match cs with parser + [ [: `'<' :] ep -> inside_quot "" (loc_of_ep ep) 0 cs + | [: `':'; i = ident 0; `'<' ?? "less char expected" :] ep -> + inside_quot i (loc_of_ep ep) 0 cs + | [: :] -> do { print_char '<'; copy cs } ] +and inside_quot name loc len cs = + match cs with parser + [ [: `'>' :] -> maybe_end_quot name loc len cs + | [: `c :] -> inside_quot name loc (store len c) cs + | [: :] -> raise (Stream.Error "end of file in quotation") ] +and maybe_end_quot name loc len cs = + match cs with parser + [ [: `'>' :] -> do { quot name loc (get_buff len); copy cs } + | [: :] -> inside_quot name loc (store len '>') cs ] +and inside_string cs = + match cs with parser + [ [: `'"' :] -> do { print_char '"'; copy cs } + | [: `c :] -> do { print_char c; inside_string cs } + | [: :] -> raise (Stream.Error "end of file in string") ] +; + +value copy_quot cs = do { copy cs; flush stdout; }; + +Arg.parse [] (fun x -> file.val := x) "ocpp "; + +value main () = + try + if file.val <> "" then + copy_quot (Stream.of_channel (open_in_bin file.val)) + else () + with exc -> + do { + Format.printf "@."; + raise + (match exc with + [ Loc.Exc_located loc exc -> + do { Format.eprintf "%a@." Loc.print loc; exc } + | exc -> exc ]) + } +; + +Odyl_main.name.val := "ocpp"; +Odyl_main.go.val := main; diff --git a/camlp4/unmaintained/odyl/.cvsignore b/camlp4/unmaintained/odyl/.cvsignore new file mode 100644 index 00000000..8ae0ebb0 --- /dev/null +++ b/camlp4/unmaintained/odyl/.cvsignore @@ -0,0 +1,4 @@ +*.cm[oia] +odyl +*.lib +odyl_config.ml diff --git a/camlp4/unmaintained/odyl/.depend b/camlp4/unmaintained/odyl/.depend new file mode 100644 index 00000000..a2629440 --- /dev/null +++ b/camlp4/unmaintained/odyl/.depend @@ -0,0 +1,4 @@ +odyl.cmo: odyl_main.cmi odyl_config.cmo +odyl.cmx: odyl_main.cmx odyl_config.cmx +odyl_main.cmo: odyl_config.cmo odyl_main.cmi +odyl_main.cmx: odyl_config.cmx odyl_main.cmi diff --git a/camlp4/unmaintained/odyl/Makefile b/camlp4/unmaintained/odyl/Makefile new file mode 100644 index 00000000..f4f5d870 --- /dev/null +++ b/camlp4/unmaintained/odyl/Makefile @@ -0,0 +1,61 @@ + + +include ../config/Makefile.cnf + +EXECUTABLES=odyl +INCLUDES=-I $(OTOP)/otherlibs/dynlink +OBJS=odyl_config.cmo odyl_main.cmo +OBJSX=odyl.cmx odyl.cmxa +CLEANFILES=odyl_config.ml + +include ../config/Makefile.base + +odyl$(EXE): odyl.cma odyl.cmo + $(OCAMLC) odyl.cma odyl.cmo -o $@ + +odyl.opt: odyl.cmxa odyl.cmx + $(OCAMLOPT) odyl.cmxa odyl.cmx -o $@ + +odyl.cma: $(OBJS) + $(OCAMLC) $(LINKFLAGS) dynlink.cma $(OBJS) -a -o $@ + +odyl.cmxa: $(OBJSX) + $(OCAMLOPT) $(LINKFLAGS) $(OBJSX) -a -o $@ + +odyl.p.cmxa: $(OBJSP) + $(OCAMLOPT) $(LINKFLAGS) $(OBJSP) -a -o $@ + +odyl_main.cmx: odyl_main.ml + $(CAMLP4BOOT) -nolib -DOPT -o odyl_main.ppo odyl_main.ml + $(OCAMLOPT) -c -impl odyl_main.ppo + rm -f odyl_main.ppo + +odyl_main.p.cmx: odyl_main.ml + $(CAMLP4BOOT) -nolib -DOPT -o odyl_main.ppo odyl_main.ml + $(OCAMLOPT) -p -c -o $@ -impl odyl_main.ppo + rm -f odyl_main.ppo + +odyl_config.ml: + (echo '(* camlp4r *)'; \ + echo 'value standard_library ='; \ + echo ' try Sys.getenv "CAMLP4LIB" with [ Not_found -> '; \ + echo ' try Sys.getenv "OCAMLLIB" ^ "/camlp4" with [ Not_found -> '; \ + echo ' try Sys.getenv "CAMLLIB" ^ "/camlp4" with [ Not_found -> '; \ + echo ' "$(LIBDIR)/camlp4"]]];') \ + | sed -e 's|\\|/|g' > odyl_config.ml + +install-local: + -$(MKDIR) "$(LIBDIR)/camlp4" "$(BINDIR)" + cp odyl.cmo odyl.cma odyl_main.cmi $(LIBDIR)/camlp4/. + for f in odyl.$(A) odyl.p.$(A) ; do \ + if test -f $$f ; then \ + cp $$f "$(LIBDIR)/camlp4/." && ( cd "$(LIBDIR)/camlp4/." && $(RANLIB) $$f ) ; \ + fi ; \ + done + for f in odyl.cmx odyl.o odyl.p.cmx odyl.p.o odyl.cmxa odyl.p.cmxa ; do \ + if test -f $$f ; then \ + cp $$f "$(LIBDIR)/camlp4/." ; \ + fi ; \ + done + +include .depend diff --git a/camlp4/unmaintained/odyl/odyl.ml b/camlp4/unmaintained/odyl/odyl.ml new file mode 100644 index 00000000..23b7136c --- /dev/null +++ b/camlp4/unmaintained/odyl/odyl.ml @@ -0,0 +1,57 @@ +(* camlp4r *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2001 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +value apply_load () = + let i = ref 1 in + let stop = ref False in + while not stop.val && i.val < Array.length Sys.argv do { + let s = Sys.argv.(i.val) in + if s = "-I" && i.val + 1 < Array.length Sys.argv then do { + Odyl_main.directory Sys.argv.(i.val + 1); + i.val := i.val + 2 + } + else if s = "-nolib" then do { Odyl_main.nolib.val := True; incr i } + else if s = "-where" then do { + print_string Odyl_config.standard_library; + print_newline (); + flush stdout; + exit 0 + } + else if s = "-version" then do { + print_string Sys.ocaml_version; + print_newline (); + flush stdout; + exit 0 + } + else if s = "--" then do { incr i; stop.val := True; () } + else if String.length s > 0 && s.[0] == '-' then stop.val := True + else if Filename.check_suffix s ".cmo" || Filename.check_suffix s ".cma" + then do { Odyl_main.loadfile s; incr i } + else stop.val := True + } +; + +value main () = + try do { apply_load () ; Odyl_main.go.val () } with + [ Odyl_main.Error fname str -> + do { + flush stdout; + Printf.eprintf "Error while loading \"%s\": " fname; + Printf.eprintf "%s.\n" str; + flush stderr; + exit 2 + } ] +; + +Printexc.catch main (); diff --git a/camlp4/unmaintained/odyl/odyl_main.mli b/camlp4/unmaintained/odyl/odyl_main.mli new file mode 100644 index 00000000..122c9335 --- /dev/null +++ b/camlp4/unmaintained/odyl/odyl_main.mli @@ -0,0 +1,13 @@ +(* camlp4r *) + + +exception Error of string and string; + +value nolib : ref bool; +value initialized : ref bool; +value path : ref (list string); +value loadfile : string -> unit; +value directory : string -> unit; + +value go : ref (unit -> unit); +value name : ref string; diff --git a/camlp4/unmaintained/olabl/.depend b/camlp4/unmaintained/olabl/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/olabl/Makefile b/camlp4/unmaintained/olabl/Makefile new file mode 100644 index 00000000..f928d458 --- /dev/null +++ b/camlp4/unmaintained/olabl/Makefile @@ -0,0 +1,61 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# Makefile for pa_lefteval +# M.Mauny +# + +include ../../config/Makefile.cnf + +OCAMLTOP=../../.. +CAMLP4=../../camlp4/camlp4$(EXE) + +OCAMLC=$(OCAMLTOP)/ocamlc$(EXE) +OCAMLOPT=$(OCAMLTOP)/ocamlopt$(EXE) + +P4INCLUDES= -nolib -I ../../meta -I ../../lib -I ../../etc +OCAMLINCLUDES= -nostdlib -I $(OCAMLTOP)/stdlib -I ../../lib -I ../../camlp4 +OCAMLCFLAGS=-warn-error A $(OCAMLINCLUDES) + +SRC=pa_olabl.ml +OBJS=$(SRC:.ml=.cmo) +OBJSX=$(SRC:.ml=.cmx) + +all: $(OBJS) + +opt: $(OBJSX) + +depend: + cp .depend .depend.bak + > .depend + for file in $(SRC); do \ + $(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $$file` pr_depend.cmo $$i | \ + sed -e 's| \.\./\.\./\.\.| $$(OCAMLTOP)|g' >> .depend; \ + done + +clean: + rm -f *.cm* *.$(O) *.bak .*.bak + + +.SUFFIXES: .cmx .cmo .cmi .ml .mli + +.mli.cmi: + $(OCAMLC) $(OCAMLCFLAGS) -c $< + + +.ml.cmo: + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +include .depend diff --git a/camlp4/unmaintained/olabl/README b/camlp4/unmaintained/olabl/README new file mode 100644 index 00000000..809d42f2 --- /dev/null +++ b/camlp4/unmaintained/olabl/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + diff --git a/camlp4/unmaintained/olabl/pa_olabl.ml b/camlp4/unmaintained/olabl/pa_olabl.ml new file mode 100644 index 00000000..285902a1 --- /dev/null +++ b/camlp4/unmaintained/olabl/pa_olabl.ml @@ -0,0 +1,2022 @@ +(* pa_r.cmo pa_rp.cmo pa_extend.cmo q_MLast.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + + +module Plexer = + struct + open Stdpp; + open Token; + value buff = ref (String.create 80); + value store len x = + do { + if len >= String.length buff.val then + buff.val := buff.val ^ String.create (String.length buff.val) + else (); + buff.val.[len] := x; + succ len + } + ; + value mstore len s = + add_rec len 0 where rec add_rec len i = + if i == String.length s then len + else add_rec (store len s.[i]) (succ i) + ; + value get_buff len = String.sub buff.val 0 len; + value rec ident len = + parser + [ [: `('A'..'Z' | 'a'..'z' | '\192'..'\214' | '\216'..'\246' | + '\248'..'\255' | '0'..'9' | '_' | ''' as + c) + ; + s :] -> + ident (store len c) s + | [: :] -> len ] + and ident2 len = + parser + [ [: `('!' | '?' | '~' | '=' | '@' | '^' | '&' | '+' | '-' | '*' | '/' | + '%' | '.' | ':' | '<' | '>' | '|' as + c) + ; + s :] -> + ident2 (store len c) s + | [: :] -> len ] + and ident3 len = + parser + [ [: `('0'..'9' | 'A'..'Z' | 'a'..'z' | '\192'..'\214' | + '\216'..'\246' | '\248'..'\255' | '_' | '!' | '%' | '&' | '*' | + '+' | '-' | '.' | '/' | ':' | '<' | '=' | '>' | '?' | '@' | '^' | + '|' | '~' | ''' | '$' as + c) + ; + s :] -> + ident3 (store len c) s + | [: :] -> len ] + and ident4 len = + parser + [ [: `('!' | '?' | '~' | '=' | '@' | '^' | '&' | '+' | '-' | '*' | '/' | + '%' | '.' | '<' | '>' | '|' as + c) + ; + s :] -> + ident4 (store len c) s + | [: :] -> len ] + and base_number len = + parser + [ [: `'o' | 'O'; s :] -> octal_digits (store len 'o') s + | [: `'x' | 'X'; s :] -> hexa_digits (store len 'x') s + | [: `'b' | 'B'; s :] -> binary_digits (store len 'b') s + | [: a = number len :] -> a ] + and octal_digits len = + parser + [ [: `('0'..'7' as d); s :] -> octal_digits (store len d) s + | [: :] -> ("INT", get_buff len) ] + and hexa_digits len = + parser + [ [: `('0'..'9' | 'a'..'f' | 'A'..'F' as d); s :] -> + hexa_digits (store len d) s + | [: :] -> ("INT", get_buff len) ] + and binary_digits len = + parser + [ [: `('0'..'1' as d); s :] -> binary_digits (store len d) s + | [: :] -> ("INT", get_buff len) ] + and number len = + parser + [ [: `('0'..'9' as c); s :] -> number (store len c) s + | [: `'.'; s :] -> decimal_part (store len '.') s + | [: `'e' | 'E'; s :] -> exponent_part (store len 'E') s + | [: :] -> ("INT", get_buff len) ] + and decimal_part len = + parser + [ [: `('0'..'9' as c); s :] -> decimal_part (store len c) s + | [: `'e' | 'E'; s :] -> exponent_part (store len 'E') s + | [: :] -> ("FLOAT", get_buff len) ] + and exponent_part len = + parser + [ [: `('+' | '-' as c); s :] -> end_exponent_part (store len c) s + | [: a = end_exponent_part len :] -> a ] + and end_exponent_part len = + parser + [ [: `('0'..'9' as c); s :] -> end_exponent_part (store len c) s + | [: :] -> ("FLOAT", get_buff len) ] + ; + value valch x = Char.code x - Char.code '0'; + value rec backslash s i = + if i = String.length s then raise Not_found + else + match s.[i] with + [ 'n' -> ('\n', i + 1) + | 'r' -> ('\r', i + 1) + | 't' -> ('\t', i + 1) + | 'b' -> ('\b', i + 1) + | '\\' -> ('\\', i + 1) + | '0'..'9' as c -> backslash1 (valch c) s (i + 1) + | _ -> raise Not_found ] + and backslash1 cod s i = + if i = String.length s then (Char.chr cod, i) + else + match s.[i] with + [ '0'..'9' as c -> backslash2 (10 * cod + valch c) s (i + 1) + | _ -> (Char.chr cod, i) ] + and backslash2 cod s i = + if i = String.length s then (Char.chr cod, i) + else + match s.[i] with + [ '0'..'9' as c -> (Char.chr (10 * cod + valch c), i + 1) + | _ -> (Char.chr cod, i) ] + ; + value rec skip_indent s i = + if i = String.length s then i + else + match s.[i] with + [ ' ' | '\t' -> skip_indent s (i + 1) + | _ -> i ] + ; + value skip_opt_linefeed s i = + if i = String.length s then i else if s.[i] = '\010' then i + 1 else i + ; + value char_of_char_token s = + if String.length s = 1 then s.[0] + else if String.length s = 0 then failwith "invalid char token" + else if s.[0] = '\\' then + if String.length s = 2 && s.[1] = ''' then ''' + else + try + let (c, i) = backslash s 1 in + if i = String.length s then c else raise Not_found + with + [ Not_found -> failwith "invalid char token" ] + else failwith "invalid char token" + ; + value string_of_string_token s = + loop 0 0 where rec loop len i = + if i = String.length s then get_buff len + else + let (len, i) = + if s.[i] = '\\' then + let i = i + 1 in + if i = String.length s then failwith "invalid string token" + else if s.[i] = '"' then (store len '"', i + 1) + else + match s.[i] with + [ '\010' -> (len, skip_indent s (i + 1)) + | '\013' -> (len, skip_indent s (skip_opt_linefeed s (i + 1))) + | c -> + try + let (c, i) = backslash s i in + (store len c, i) + with + [ Not_found -> (store (store len '\\') c, i + 1) ] ] + else (store len s.[i], i + 1) + in + loop len i + ; + value rec skip_spaces = + parser + [ [: `' ' | '\n' | '\r' | '\t' | '\026' | '\012'; s :] -> skip_spaces s + | [: :] -> () ] + ; + value error_on_unknown_keywords = ref False; + value next_token_fun find_id_kwd find_spe_kwd fname lnum bolpos = + let make_pos p = + {Lexing.pos_fname = fname.val; Lexing.pos_lnum = lnum.val; + Lexing.pos_bol = bolpos.val; Lexing.pos_cnum = p} in + let mkloc (bp, ep) = (make_pos bp, make_pos ep) in + + let err loc msg = raise_with_loc loc (Token.Error msg) in + let keyword_or_error (bp,ep) s = + try ("", find_spe_kwd s) with + [ Not_found -> + if error_on_unknown_keywords.val then + err (mkloc (bp, ep)) ("illegal token: " ^ s) + else ("", s) ] + in + let rec next_token = + parser bp + [ [: `('A'..'Z' | 'À'..'Ö' | 'Ø'..'Þ' as c); s :] -> + let id = get_buff (ident (store 0 c) s) in + try ("", find_id_kwd id) with [ Not_found -> ("UIDENT", id) ] + | [: `('a'..'z' | 'ß'..'ö' | 'ø'..'ÿ' | '_' as c); s :] -> + let id = get_buff (ident (store 0 c) s) in + let is_label = + match Stream.peek s with + [ Some ':' -> + match Stream.npeek 2 s with + [ [_; ':' | '=' | '>'] -> False + | _ -> True ] + | _ -> False ] + in + if is_label then do { Stream.junk s; ("LABEL", id) } + else try ("", find_id_kwd id) with [ Not_found -> ("LIDENT", id) ] + | [: `('1'..'9' as c); s :] -> number (store 0 c) s + | [: `'0'; s :] -> base_number (store 0 '0') s + | [: `'''; s :] ep -> + match Stream.npeek 2 s with + [ [_; '''] | ['\\'; _] -> ("CHAR", char bp 0 s) + | _ -> keyword_or_error (bp, ep) "'" ] + | [: `'"'; s :] -> ("STRING", string bp 0 s) + | [: `'$'; s :] -> locate_or_antiquot bp 0 s + | [: `('!' | '~' | '=' | '@' | '^' | '&' | '+' | '-' | '*' | '/' | + '%' as + c) + ; + s :] -> + let id = get_buff (ident2 (store 0 c) s) in + keyword_or_error (bp, Stream.count s) id + | [: `('?' as c); s :] -> + let id = get_buff (ident4 (store 0 c) s) in + keyword_or_error (bp, Stream.count s) id + | [: `'<'; s :] -> less bp s + | [: `(':' as c1); + (is_label, len) = + parser + [ [: `(']' | ':' | '=' | '>' as c2) :] -> + (False, store (store 0 c1) c2) + | [: `('a'..'z' | 'ß'..'ö' | 'ø'..'ÿ' | '_' as c); s :] -> + (True, ident (store 0 c) s) + | [: :] -> (False, store 0 c1) ] :] ep -> + let id = get_buff len in + if is_label then ("ELABEL", id) else keyword_or_error (bp, ep) id + | [: `('>' | '|' as c1); + len = + parser + [ [: `(']' | '}' as c2) :] -> store (store 0 c1) c2 + | [: a = ident2 (store 0 c1) :] -> a ] :] ep -> + let id = get_buff len in + keyword_or_error (bp, ep) id + | [: `('[' | '{' as c1); s :] -> + let len = + match Stream.npeek 2 s with + [ ['<'; '<' | ':'] -> store 0 c1 + | _ -> + match s with parser + [ [: `('|' | '<' | ':' as c2) :] -> store (store 0 c1) c2 + | [: :] -> store 0 c1 ] ] + in + let ep = Stream.count s in + let id = get_buff len in + keyword_or_error (bp, ep) id + | [: `'.'; id = parser [ [: `'.' :] -> ".." | [: :] -> "." ] :] ep -> + keyword_or_error (bp, ep) id + | [: `';'; id = parser [ [: `';' :] -> ";;" | [: :] -> ";" ] :] ep -> + keyword_or_error (bp, ep) id + | [: `'\\'; s :] -> ("LIDENT", get_buff (ident3 0 s)) + | [: `c :] ep -> keyword_or_error (bp, ep) (String.make 1 c) ] + and less bp = + parser + [ [: `'<'; s :] -> ("QUOTATION", ":" ^ get_buff (quotation bp 0 s)) + | [: `':'; i = parser [: len = ident 0 :] -> get_buff len; + `'<' ? "character '<' expected"; s :] -> + ("QUOTATION", i ^ ":" ^ get_buff (quotation bp 0 s)) + | [: s :] ep -> + let id = get_buff (ident2 (store 0 '<') s) in + keyword_or_error (bp, ep) id ] + and string bp len = + parser + [ [: `'"' :] -> get_buff len + | [: `'\\'; `c; s :] -> string bp (store (store len '\\') c) s + | [: `c; s :] -> string bp (store len c) s + | [: :] ep -> err (mkloc (bp, ep)) "string not terminated" ] + and char bp len = + parser + [ [: `'''; s :] -> + if len = 0 then char bp (store len ''') s else get_buff len + | [: `'\\'; `c; s :] -> char bp (store (store len '\\') c) s + | [: `c; s :] -> char bp (store len c) s + | [: :] ep -> err (mkloc(bp,ep)) "char not terminated" ] + and locate_or_antiquot bp len = + parser + [ [: `'$' :] -> ("ANTIQUOT", ":" ^ get_buff len) + | [: `('a'..'z' | 'A'..'Z' as c); s :] -> antiquot bp (store len c) s + | [: `('0'..'9' as c); s :] -> maybe_locate bp (store len c) s + | [: `':'; s :] -> + let k = get_buff len in + ("ANTIQUOT", k ^ ":" ^ locate_or_antiquot_rest bp 0 s) + | [: `'\\'; `c; s :] -> + ("ANTIQUOT", ":" ^ locate_or_antiquot_rest bp (store len c) s) + | [: `c; s :] -> + ("ANTIQUOT", ":" ^ locate_or_antiquot_rest bp (store len c) s) + | [: :] ep -> err (mkloc(bp,ep)) "antiquotation not terminated" ] + and maybe_locate bp len = + parser + [ [: `'$' :] -> ("ANTIQUOT", ":" ^ get_buff len) + | [: `('0'..'9' as c); s :] -> maybe_locate bp (store len c) s + | [: `':'; s :] -> + ("LOCATE", get_buff len ^ ":" ^ locate_or_antiquot_rest bp 0 s) + | [: `'\\'; `c; s :] -> + ("ANTIQUOT", ":" ^ locate_or_antiquot_rest bp (store len c) s) + | [: `c; s :] -> + ("ANTIQUOT", ":" ^ locate_or_antiquot_rest bp (store len c) s) + | [: :] ep -> err (mkloc(bp,ep)) "antiquotation not terminated" ] + and antiquot bp len = + parser + [ [: `'$' :] -> ("ANTIQUOT", ":" ^ get_buff len) + | [: `('a'..'z' | 'A'..'Z' | '0'..'9' as c); s :] -> + antiquot bp (store len c) s + | [: `':'; s :] -> + let k = get_buff len in + ("ANTIQUOT", k ^ ":" ^ locate_or_antiquot_rest bp 0 s) + | [: `'\\'; `c; s :] -> + ("ANTIQUOT", ":" ^ locate_or_antiquot_rest bp (store len c) s) + | [: `c; s :] -> + ("ANTIQUOT", ":" ^ locate_or_antiquot_rest bp (store len c) s) + | [: :] ep -> err (mkloc(bp,ep)) "antiquotation not terminated" ] + and locate_or_antiquot_rest bp len = + parser + [ [: `'$' :] -> get_buff len + | [: `'\\'; `c; s :] -> locate_or_antiquot_rest bp (store len c) s + | [: `c; s :] -> locate_or_antiquot_rest bp (store len c) s + | [: :] ep -> err (mkloc(bp,ep)) "antiquotation not terminated" ] + and quotation bp len = + parser + [ [: `'>'; s :] -> maybe_end_quotation bp len s + | [: `'<'; s :] -> + quotation bp (maybe_nested_quotation bp (store len '<') __strm) s + | [: `'\\'; + len = + parser + [ [: `('>' | '<' | '\\' as c) :] -> store len c + | [: :] -> store len '\\' ]; + s :] -> + quotation bp len s + | [: `c; s :] -> quotation bp (store len c) s + | [: :] ep -> err (mkloc(bp,ep)) "quotation not terminated" ] + and maybe_nested_quotation bp len = + parser + [ [: `'<'; s :] -> mstore (quotation bp (store len '<') s) ">>" + | [: `':'; len = ident (store len ':'); + a = + parser + [ [: `'<'; s :] -> mstore (quotation bp (store len '<') s) ">>" + | [: :] -> len ] :] -> + a + | [: :] -> len ] + and maybe_end_quotation bp len = + parser + [ [: `'>' :] -> len + | [: a = quotation bp (store len '>') :] -> a ] + in + let rec next_token_loc = + parser bp + [ [: `' ' | '\n' | '\r' | '\t' | '\026' | '\012'; s :] -> + next_token_loc s + | [: `'('; s :] -> maybe_comment bp s + | [: `'#'; _ = spaces_tabs; a = linenum bp :] -> a + | [: tok = next_token :] ep -> (tok, mkloc(bp, ep)) + | [: _ = Stream.empty :] -> (("EOI", ""), mkloc(bp, succ bp)) ] + and maybe_comment bp = + parser + [ [: `'*'; s :] -> do { comment bp s; next_token_loc s } + | [: :] ep -> + let tok = keyword_or_error (bp, ep) "(" in + (tok, mkloc(bp, ep)) ] + and comment bp = + parser + [ [: `'('; s :] -> maybe_nested_comment bp s + | [: `'*'; s :] -> maybe_end_comment bp s + | [: `c; s :] -> comment bp s + | [: :] ep -> err (mkloc(bp,ep)) "comment not terminated" ] + and maybe_nested_comment bp = + parser + [ [: `'*'; s :] -> do { comment bp s; comment bp s } + | [: a = comment bp :] -> a ] + and maybe_end_comment bp = + parser [ [: `')' :] -> () | [: a = comment bp :] -> a ] + and linenum bp = + parser + [ [: `'0'..'9'; _ = digits; _ = spaces_tabs; `'"'; _ = any_to_nl; + s :] -> + next_token_loc s + | [: :] -> (keyword_or_error (bp, bp + 1) "#", mkloc(bp, bp + 1)) ] + and spaces_tabs = + parser [ [: `' ' | '\t'; s :] -> spaces_tabs s | [: :] -> () ] + and digits = parser [ [: `'0'..'9'; s :] -> digits s | [: :] -> () ] + and any_to_nl = + parser + [ [: `'\r' | '\n' :] -> () + | [: `_; s :] -> any_to_nl s + | [: :] -> () ] + in + fun cstrm -> + try next_token_loc cstrm with + [ Stream.Error str -> + err (mkloc(Stream.count cstrm, Stream.count cstrm + 1)) str ] + ; + value locerr () = invalid_arg "Lexer: location function"; + value loct_create () = ref (Array.create 1024 None); + value loct_func loct i = + match + if i < 0 || i >= Array.length loct.val then None + else Array.unsafe_get loct.val i + with + [ Some loc -> loc + | _ -> locerr () ] + ; + value loct_add loct i loc = + do { + if i >= Array.length loct.val then do { + let new_tmax = Array.length loct.val * 2 in + let new_loct = Array.create new_tmax None in + Array.blit loct.val 0 new_loct 0 (Array.length loct.val); + loct.val := new_loct + } + else (); + loct.val.(i) := Some loc + } + ; + value func kwd_table = + let bolpos = ref 0 in + let lnum = ref 0 in + let fname = ref "" in + let find = Hashtbl.find kwd_table in + let lex cstrm = + let next_token_loc = next_token_fun find find fname lnum bolpos in + let loct = loct_create () in + let ts = + Stream.from + (fun i -> + let (tok, loc) = next_token_loc cstrm in + do { loct_add loct i loc; Some tok }) + in + let locf = loct_func loct in + (ts, locf) + in + lex + ; + value rec check_keyword_stream = + parser [: _ = check; _ = Stream.empty :] -> True + and check = + parser + [ [: `'A'..'Z' | 'a'..'z' | 'À'..'Ö' | 'Ø'..'ö' | 'ø'..'ÿ'; s :] -> + check_ident s + | [: `'!' | '?' | '~' | '=' | '@' | '^' | '&' | '+' | '-' | '*' | '/' | + '%' | '.' + ; + s :] -> + check_ident2 s + | [: `'<'; s :] -> + match Stream.npeek 1 s with + [ [':' | '<'] -> () + | _ -> check_ident2 s ] + | [: `':'; + _ = + parser + [ [: `']' | ':' | '=' | '>' :] -> () + | [: :] -> () ] :] ep -> + () + | [: `'>' | '|'; + _ = + parser + [ [: `']' | '}' :] -> () + | [: a = check_ident2 :] -> a ] :] -> + () + | [: `'[' | '{'; s :] -> + match Stream.npeek 2 s with + [ ['<'; '<' | ':'] -> () + | _ -> + match s with parser + [ [: :] -> + match Stream.peek __strm with + [ Some ('|' | '<' | ':') -> Stream.junk __strm + | _ -> () ] ] ] + | [: `';'; _ = parser [ [: `';' :] -> () | [: :] -> () ] :] -> () + | [: `_ :] -> () ] + and check_ident = + parser + [ [: `'A'..'Z' | 'a'..'z' | 'À'..'Ö' | 'Ø'..'ö' | 'ø'..'ÿ' | '0'..'9' | + '_' | ''' + ; + s :] -> + check_ident s + | [: :] -> () ] + and check_ident2 = + parser + [ [: `'!' | '?' | '~' | '=' | '@' | '^' | '&' | '+' | '-' | '*' | '/' | + '%' | '.' | ':' | '<' | '>' | '|' + ; + s :] -> + check_ident2 s + | [: :] -> () ] + ; + value check_keyword s = + try check_keyword_stream (Stream.of_string s) with _ -> False + ; + value using_token kwd_table (p_con, p_prm) = + match p_con with + [ "" -> + try + let _ = Hashtbl.find kwd_table p_prm in + () + with + [ Not_found -> + if check_keyword p_prm then Hashtbl.add kwd_table p_prm p_prm + else + raise + (Token.Error + ("the token \"" ^ p_prm ^ + "\" does not respect Plexer rules")) ] + | "LIDENT" | "UIDENT" | "INT" | "FLOAT" | "CHAR" | "STRING" | + "QUOTATION" | "ANTIQUOT" | "LOCATE" | "LABEL" | "ELABEL" | "EOI" -> + () + | _ -> + raise + (Token.Error + ("the constructor \"" ^ p_con ^ + "\" is not recognized by Llexer")) ] + ; + value removing_token kwd_table (p_con, p_prm) = + if p_con = "" then Hashtbl.remove kwd_table p_prm else () + ; + value text = + fun + [ ("", t) -> "'" ^ t ^ "'" + | ("LIDENT", "") -> "lowercase identifier" + | ("LIDENT", t) -> "'" ^ t ^ "'" + | ("UIDENT", "") -> "uppercase identifier" + | ("UIDENT", t) -> "'" ^ t ^ "'" + | ("INT", "") -> "integer" + | ("INT", s) -> "'" ^ s ^ "'" + | ("FLOAT", "") -> "float" + | ("STRING", "") -> "string" + | ("CHAR", "") -> "char" + | ("QUOTATION", "") -> "quotation" + | ("ANTIQUOT", k) -> "antiquot \"" ^ k ^ "\"" + | ("LOCATE", "") -> "locate" + | ("LABEL", "") -> "label" + | ("ELABEL", "") -> "elabel" + | ("EOI", "") -> "end of input" + | (con, "") -> con + | (con, prm) -> con ^ " \"" ^ prm ^ "\"" ] + ; + value eq_before_colon p e = + loop 0 where rec loop i = + if i == String.length e then + failwith "Internal error in Plexer: incorrect ANTIQUOT" + else if i == String.length p then e.[i] == ':' + else if p.[i] == e.[i] then loop (i + 1) + else False + ; + value after_colon e = + try + let i = String.index e ':' in + String.sub e (i + 1) (String.length e - i - 1) + with + [ Not_found -> "" ] + ; + value gmake () = + let kwd_table = Hashtbl.create 301 in + {tok_func = func kwd_table; tok_using = using_token kwd_table; + tok_removing = removing_token kwd_table; + tok_match = Token.default_match; tok_text = text; tok_comm = None} + ; + end +; + +open Stdpp; +open Pcaml; + +Pcaml.no_constructors_arity.val := True; + +do { + Grammar.Unsafe.gram_reinit gram (Plexer.gmake ()); + Grammar.Unsafe.clear_entry interf; + Grammar.Unsafe.clear_entry implem; + Grammar.Unsafe.clear_entry top_phrase; + Grammar.Unsafe.clear_entry use_file; + Grammar.Unsafe.clear_entry module_type; + Grammar.Unsafe.clear_entry module_expr; + Grammar.Unsafe.clear_entry sig_item; + Grammar.Unsafe.clear_entry str_item; + Grammar.Unsafe.clear_entry expr; + Grammar.Unsafe.clear_entry patt; + Grammar.Unsafe.clear_entry ctyp; + Grammar.Unsafe.clear_entry let_binding; + Grammar.Unsafe.clear_entry class_type; + Grammar.Unsafe.clear_entry class_expr; + Grammar.Unsafe.clear_entry class_sig_item; + Grammar.Unsafe.clear_entry class_str_item +}; + +Pcaml.parse_interf.val := Grammar.Entry.parse interf; +Pcaml.parse_implem.val := Grammar.Entry.parse implem; + +value o2b = + fun + [ Some _ -> True + | None -> False ] +; + +value mkumin loc f arg = + match arg with + [ <:expr< $int:n$ >> when int_of_string n > 0 -> + let n = "-" ^ n in + <:expr< $int:n$ >> + | <:expr< $flo:n$ >> when float_of_string n > 0.0 -> + let n = "-" ^ n in + <:expr< $flo:n$ >> + | _ -> + let f = "~" ^ f in + <:expr< $lid:f$ $arg$ >> ] +; + +external loc_of_node : 'a -> Loc.t = "%field0"; + +value mklistexp loc last = + loop True where rec loop top = + fun + [ [] -> + match last with + [ Some e -> e + | None -> <:expr< [] >> ] + | [e1 :: el] -> + let loc = if top then loc else (fst (loc_of_node e1), snd loc) in + <:expr< [$e1$ :: $loop False el$] >> ] +; + +value mklistpat loc last = + loop True where rec loop top = + fun + [ [] -> + match last with + [ Some p -> p + | None -> <:patt< [] >> ] + | [p1 :: pl] -> + let loc = if top then loc else (fst (loc_of_node p1), snd loc) in + <:patt< [$p1$ :: $loop False pl$] >> ] +; + +value neg s = string_of_int (- int_of_string s); + +value is_operator = + let ht = Hashtbl.create 73 in + let ct = Hashtbl.create 73 in + do { + List.iter (fun x -> Hashtbl.add ht x True) + ["asr"; "land"; "lor"; "lsl"; "lsr"; "lxor"; "mod"; "or"]; + List.iter (fun x -> Hashtbl.add ct x True) + ['!'; '&'; '*'; '+'; '-'; '/'; ':'; '<'; '='; '>'; '@'; '^'; '|'; '~'; + '?'; '%'; '.']; + fun x -> + try Hashtbl.find ht x with + [ Not_found -> try Hashtbl.find ct x.[0] with _ -> False ] + } +; + +(* +value p_operator strm = + match Stream.peek strm with + [ Some (Token.Tterm "(") -> + match Stream.npeek 3 strm with + [ [_; Token.Tterm x; Token.Tterm ")"] when is_operator x -> + do { Stream.junk strm; Stream.junk strm; Stream.junk strm; x } + | _ -> raise Stream.Failure ] + | _ -> raise Stream.Failure ] +; + +value operator = Grammar.Entry.of_parser gram "operator" p_operator; +*) + +value operator = + Grammar.Entry.of_parser gram "operator" + (parser [: `("", x) when is_operator x :] -> x) +; + +value symbolchar = + let list = + ['!'; '$'; '%'; '&'; '*'; '+'; '-'; '.'; '/'; ':'; '<'; '='; '>'; '?'; + '@'; '^'; '|'; '~'] + in + let rec loop s i = + if i == String.length s then True + else if List.mem s.[i] list then loop s (i + 1) + else False + in + loop +; + +value prefixop = + let list = ['!'; '?'; '~'] in + let excl = ["!="] in + Grammar.Entry.of_parser gram "prefixop" + (parser + [: `("", x) + when + not (List.mem x excl) && String.length x >= 2 && + List.mem x.[0] list && symbolchar x 1 :] -> + x) +; + +value infixop0 = + let list = ['='; '<'; '>'; '|'; '&'; '$'] in + let excl = ["<-"; "||"; "&&"] in + Grammar.Entry.of_parser gram "infixop0" + (parser + [: `("", x) + when + not (List.mem x excl) && String.length x >= 2 && + List.mem x.[0] list && symbolchar x 1 :] -> + x) +; + +value infixop1 = + let list = ['@'; '^'] in + Grammar.Entry.of_parser gram "infixop1" + (parser + [: `("", x) + when + String.length x >= 2 && List.mem x.[0] list && + symbolchar x 1 :] -> + x) +; + +value infixop2 = + let list = ['+'; '-'] in + Grammar.Entry.of_parser gram "infixop2" + (parser + [: `("", x) + when + x <> "->" && String.length x >= 2 && List.mem x.[0] list && + symbolchar x 1 :] -> + x) +; + +value infixop3 = + let list = ['*'; '/'; '%'] in + Grammar.Entry.of_parser gram "infixop3" + (parser + [: `("", x) + when + String.length x >= 2 && List.mem x.[0] list && + symbolchar x 1 :] -> + x) +; + +value infixop4 = + Grammar.Entry.of_parser gram "infixop4" + (parser + [: `("", x) + when + String.length x >= 3 && x.[0] == '*' && x.[1] == '*' && + symbolchar x 2 :] -> + x) +; + +value test_constr_decl = + Grammar.Entry.of_parser gram "test_constr_decl" + (fun strm -> + match Stream.npeek 1 strm with + [ [("UIDENT", _)] -> + match Stream.npeek 2 strm with + [ [_; ("", ".")] -> raise Stream.Failure + | [_; ("", "(")] -> raise Stream.Failure + | [_ :: _] -> () + | _ -> raise Stream.Failure ] + | [("", "|")] -> () + | _ -> raise Stream.Failure ]) +; + +value stream_peek_nth n strm = + loop n (Stream.npeek n strm) where rec loop n = + fun + [ [] -> None + | [x] -> if n == 1 then Some x else None + | [_ :: l] -> loop (n - 1) l ] +; + +value test_label_eq = + let rec test lev strm = + match stream_peek_nth lev strm with + [ Some (("UIDENT", _) | ("LIDENT", _) | ("", ".")) -> test (lev + 1) strm + | Some ("", "=") -> () + | _ -> raise Stream.Failure ] + in + Grammar.Entry.of_parser gram "test_label_eq" (test 1) +; + +value constr_arity = ref [("Some", 1); ("Match_Failure", 1)]; + +value rec constr_expr_arity = + fun + [ <:expr< $uid:c$ >> -> + try List.assoc c constr_arity.val with [ Not_found -> 0 ] + | <:expr< $uid:_$.$e$ >> -> constr_expr_arity e + | _ -> 1 ] +; + +value rec constr_patt_arity = + fun + [ <:patt< $uid:c$ >> -> + try List.assoc c constr_arity.val with [ Not_found -> 0 ] + | <:patt< $uid:_$.$p$ >> -> constr_patt_arity p + | _ -> 1 ] +; + +value rec get_seq = + fun + [ <:expr< do { $list:el$ } >> -> el + | e -> [e] ] +; + +value choose_tvar tpl = + let rec find_alpha v = + let s = String.make 1 v in + if List.mem_assoc s tpl then + if v = 'z' then None else find_alpha (Char.chr (Char.code v + 1)) + else Some (String.make 1 v) + in + let rec make_n n = + let v = "a" ^ string_of_int n in + if List.mem_assoc v tpl then make_n (succ n) else v + in + match find_alpha 'a' with + [ Some x -> x + | None -> make_n 1 ] +; + +value rec patt_lid = + fun + [ <:patt< $lid:i$ $p$ >> -> Some (i, [p]) + | <:patt< $p1$ $p2$ >> -> + match patt_lid p1 with + [ Some (i, pl) -> Some (i, [p2 :: pl]) + | None -> None ] + | _ -> None ] +; + +value type_parameter = Grammar.Entry.create gram "type_parameter"; +value fun_def = Grammar.Entry.create gram "fun_def"; +value fun_binding = Grammar.Entry.create gram "fun_binding"; + +EXTEND + GLOBAL: interf implem top_phrase use_file sig_item str_item ctyp patt expr + module_type module_expr let_binding type_parameter fun_def fun_binding; + (* Main entry points *) + interf: + [ [ st = LIST0 [ s = sig_item; OPT ";;" -> (s, loc) ]; EOI -> + (st, False) ] ] + ; + implem: + [ [ st = LIST0 [ s = str_item; OPT ";;" -> (s, loc) ]; EOI -> + (st, False) ] ] + ; + top_phrase: + [ [ ph = phrase; ";;" -> Some ph + | EOI -> None ] ] + ; + use_file: + [ [ l = LIST0 [ ph = phrase; OPT ";;" -> ph ]; EOI -> (l, False) ] ] + ; + phrase: + [ [ sti = str_item -> sti + | "#"; n = LIDENT; dp = dir_param -> MLast.StDir loc n dp ] ] + ; + dir_param: + [ [ -> None + | e = expr -> Some e ] ] + ; + (* Module expressions *) + module_expr: + [ [ "functor"; "("; i = UIDENT; ":"; t = module_type; ")"; "->"; + me = SELF -> + <:module_expr< functor ( $i$ : $t$ ) -> $me$ >> + | "struct"; st = LIST0 [ s = str_item; OPT ";;" -> s ]; "end" -> + <:module_expr< struct $list:st$ end >> ] + | [ me1 = SELF; me2 = SELF -> <:module_expr< $me1$ $me2$ >> ] + | [ i = mod_expr_ident -> i + | "("; me = SELF; ":"; mt = module_type; ")" -> + <:module_expr< ( $me$ : $mt$ ) >> + | "("; me = SELF; ")" -> <:module_expr< $me$ >> ] ] + ; + mod_expr_ident: + [ LEFTA + [ m1 = SELF; "."; m2 = SELF -> <:module_expr< $m1$ . $m2$ >> ] + | [ m = UIDENT -> <:module_expr< $uid:m$ >> ] ] + ; + str_item: + [ "top" + [ "exception"; (_, c, tl) = constructor_declaration -> + <:str_item< exception $c$ of $list:tl$ >> + | "external"; i = LIDENT; ":"; t = ctyp; "="; pd = LIST1 STRING -> + <:str_item< external $i$ : $t$ = $list:pd$ >> + | "external"; i = LABEL; t = ctyp; "="; pd = LIST1 STRING -> + <:str_item< external $i$ : $t$ = $list:pd$ >> + | "external"; "("; i = operator; ")"; ":"; t = ctyp; "="; + pd = LIST1 STRING -> + <:str_item< external $i$ : $t$ = $list:pd$ >> + | "module"; i = UIDENT; mb = module_binding -> + <:str_item< module $i$ = $mb$ >> + | "module"; "type"; i = UIDENT; "="; mt = module_type -> + <:str_item< module type $i$ = $mt$ >> + | "open"; i = mod_ident -> <:str_item< open $i$ >> + | "type"; tdl = LIST1 type_declaration SEP "and" -> + <:str_item< type $list:tdl$ >> + | "let"; r = OPT "rec"; l = LIST1 let_binding SEP "and"; "in"; + x = expr -> + let e = <:expr< let $opt:o2b r$ $list:l$ in $x$ >> in + <:str_item< $exp:e$ >> + | "let"; r = OPT "rec"; l = LIST1 let_binding SEP "and" -> + match l with + [ [(<:patt< _ >>, e)] -> <:str_item< $exp:e$ >> + | _ -> <:str_item< value $opt:o2b r$ $list:l$ >> ] + | "let"; "module"; m = UIDENT; mb = module_binding; "in"; e = expr -> + <:str_item< let module $m$ = $mb$ in $e$ >> + | e = expr -> <:str_item< $exp:e$ >> ] ] + ; + module_binding: + [ RIGHTA + [ "("; m = UIDENT; ":"; mt = module_type; ")"; mb = SELF -> + <:module_expr< functor ( $m$ : $mt$ ) -> $mb$ >> + | ":"; mt = module_type; "="; me = module_expr -> + <:module_expr< ( $me$ : $mt$ ) >> + | "="; me = module_expr -> <:module_expr< $me$ >> ] ] + ; + (* Module types *) + module_type: + [ [ "functor"; "("; i = UIDENT; ":"; t = SELF; ")"; "->"; mt = SELF -> + <:module_type< functor ( $i$ : $t$ ) -> $mt$ >> ] + | [ mt = SELF; "with"; wcl = LIST1 with_constr SEP "and" -> + <:module_type< $mt$ with $list:wcl$ >> ] + | [ "sig"; sg = LIST0 [ s = sig_item; OPT ";;" -> s ]; "end" -> + <:module_type< sig $list:sg$ end >> + | i = mod_type_ident -> i + | "("; mt = SELF; ")" -> <:module_type< $mt$ >> ] ] + ; + mod_type_ident: + [ LEFTA + [ m1 = SELF; "."; m2 = SELF -> <:module_type< $m1$ . $m2$ >> + | m1 = SELF; "("; m2 = SELF; ")" -> <:module_type< $m1$ $m2$ >> ] + | [ m = UIDENT -> <:module_type< $uid:m$ >> + | m = LIDENT -> <:module_type< $lid:m$ >> ] ] + ; + sig_item: + [ "top" + [ "exception"; (_, c, tl) = constructor_declaration -> + <:sig_item< exception $c$ of $list:tl$ >> + | "external"; i = LIDENT; ":"; t = ctyp; "="; pd = LIST1 STRING -> + <:sig_item< external $i$ : $t$ = $list:pd$ >> + | "external"; i = LABEL; t = ctyp; "="; pd = LIST1 STRING -> + <:sig_item< external $i$ : $t$ = $list:pd$ >> + | "external"; "("; i = operator; ")"; ":"; t = ctyp; "="; + pd = LIST1 STRING -> + <:sig_item< external $i$ : $t$ = $list:pd$ >> + | "include"; mt = module_type -> <:sig_item< include $mt$ >> + | "module"; i = UIDENT; mt = module_declaration -> + <:sig_item< module $i$ : $mt$ >> + | "module"; "type"; i = UIDENT; "="; mt = module_type -> + <:sig_item< module type $i$ = $mt$ >> + | "open"; i = mod_ident -> <:sig_item< open $i$ >> + | "type"; tdl = LIST1 type_declaration SEP "and" -> + <:sig_item< type $list:tdl$ >> + | "val"; i = LIDENT; ":"; t = ctyp -> <:sig_item< value $i$ : $t$ >> + | "val"; i = LABEL; t = ctyp -> <:sig_item< value $i$ : $t$ >> + | "val"; "("; i = operator; ")"; ":"; t = ctyp -> + <:sig_item< value $i$ : $t$ >> ] ] + ; + module_declaration: + [ RIGHTA + [ ":"; mt = module_type -> <:module_type< $mt$ >> + | "("; i = UIDENT; ":"; t = module_type; ")"; mt = SELF -> + <:module_type< functor ( $i$ : $t$ ) -> $mt$ >> ] ] + ; + (* "with" constraints (additional type equations over signature + components) *) + with_constr: + [ [ "type"; tp = type_parameters; i = mod_ident; "="; t = ctyp -> + MLast.WcTyp loc i tp t + | "module"; i = mod_ident; "="; me = module_expr -> + MLast.WcMod loc i me ] ] + ; + (* Core expressions *) + expr: + [ "top" LEFTA + [ e1 = SELF; ";"; e2 = SELF -> + <:expr< do { $list:[e1 :: get_seq e2]$ } >> + | e1 = SELF; ";" -> e1 ] + | "expr1" + [ "let"; o = OPT "rec"; l = LIST1 let_binding SEP "and"; "in"; + x = expr LEVEL "top" -> + <:expr< let $opt:o2b o$ $list:l$ in $x$ >> + | "let"; "module"; m = UIDENT; mb = module_binding; "in"; + e = expr LEVEL "top" -> + <:expr< let module $m$ = $mb$ in $e$ >> + | "function"; OPT "|"; l = LIST1 match_case SEP "|" -> + <:expr< fun [ $list:l$ ] >> + | "fun"; p = patt LEVEL "simple"; e = fun_def -> + <:expr< fun [$p$ -> $e$] >> + | "match"; x = SELF; "with"; OPT "|"; l = LIST1 match_case SEP "|" -> + <:expr< match $x$ with [ $list:l$ ] >> + | "try"; x = SELF; "with"; OPT "|"; l = LIST1 match_case SEP "|" -> + <:expr< try $x$ with [ $list:l$ ] >> + | "if"; e1 = SELF; "then"; e2 = expr LEVEL "expr1"; + e3 = [ "else"; e = expr LEVEL "expr1" -> e | -> <:expr< () >> ] -> + <:expr< if $e1$ then $e2$ else $e3$ >> + | "for"; i = LIDENT; "="; e1 = SELF; df = direction_flag; e2 = SELF; + "do"; e = SELF; "done" -> + <:expr< for $i$ = $e1$ $to:df$ $e2$ do { $list:get_seq e$ } >> + | "while"; e1 = SELF; "do"; e2 = SELF; "done" -> + <:expr< while $e1$ do { $list:get_seq e2$ } >> ] + | [ e = SELF; ","; el = LIST1 NEXT SEP "," -> + <:expr< ( $list:[e :: el]$ ) >> ] + | ":=" NONA + [ e1 = SELF; ":="; e2 = expr LEVEL "expr1" -> + <:expr< $e1$.val := $e2$ >> + | e1 = SELF; "<-"; e2 = expr LEVEL "expr1" -> <:expr< $e1$ := $e2$ >> ] + | "||" RIGHTA + [ e1 = SELF; f = [ op = "or" -> op | op = "||" -> op ]; e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | "&&" RIGHTA + [ e1 = SELF; f = [ op = "&" -> op | op = "&&" -> op ]; e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | "<" LEFTA + [ e1 = SELF; + f = + [ op = "<" -> op + | op = ">" -> op + | op = "<=" -> op + | op = ">=" -> op + | op = "=" -> op + | op = "<>" -> op + | op = "==" -> op + | op = "!=" -> op + | op = infixop0 -> op ]; + e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | "^" RIGHTA + [ e1 = SELF; + f = [ op = "^" -> op | op = "@" -> op | op = infixop1 -> op ]; + e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | RIGHTA + [ e1 = SELF; "::"; e2 = SELF -> <:expr< [$e1$ :: $e2$] >> ] + | "+" LEFTA + [ e1 = SELF; + f = + [ op = "+" -> op + | op = "-" -> op + | op = "+." -> op + | op = "-." -> op + | op = infixop2 -> op ]; + e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | "*" LEFTA + [ e1 = SELF; + f = + [ op = "*" -> op + | op = "/" -> op + | op = "*." -> op + | op = "/." -> op + | op = "land" -> op + | op = "lor" -> op + | op = "lxor" -> op + | op = "mod" -> op + | op = infixop3 -> op ]; + e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | "**" RIGHTA + [ e1 = SELF; + f = + [ op = "**" -> op + | op = "asr" -> op + | op = "lsl" -> op + | op = "lsr" -> op + | op = infixop4 -> op ]; + e2 = SELF -> + <:expr< $lid:f$ $e1$ $e2$ >> ] + | "unary minus" NONA + [ f = [ op = "-" -> op | op = "-." -> op ]; e = SELF -> + <:expr< $mkumin loc f e$ >> ] + | "apply" LEFTA + [ e1 = SELF; e2 = SELF -> + match constr_expr_arity e1 with + [ 1 -> <:expr< $e1$ $e2$ >> + | _ -> + match e2 with + [ <:expr< ( $list:el$ ) >> -> + List.fold_left (fun e1 e2 -> <:expr< $e1$ $e2$ >>) e1 el + | _ -> <:expr< $e1$ $e2$ >> ] ] + | "assert"; e = expr LEVEL "simple" -> + match e with + [ <:expr< False >> -> MLast.ExAsf loc + | _ -> MLast.ExAsr loc e ] + | "lazy"; e = SELF -> + <:expr< lazy ($e$) >> ] + | "simple" LEFTA + [ e1 = SELF; "."; "("; e2 = SELF; ")" -> <:expr< $e1$ .( $e2$ ) >> + | e1 = SELF; "."; "["; e2 = SELF; "]" -> <:expr< $e1$ .[ $e2$ ] >> + | e1 = SELF; "."; e2 = SELF -> <:expr< $e1$ . $e2$ >> + | "!"; e = SELF -> <:expr< $e$ . val>> + | f = + [ op = "~-" -> op + | op = "~-." -> op + | op = "~" -> op + | op = prefixop -> op ]; + e = SELF -> + <:expr< $lid:f$ $e$ >> + | s = INT -> <:expr< $int:s$ >> + | s = FLOAT -> <:expr< $flo:s$ >> + | s = STRING -> <:expr< $str:s$ >> + | c = CHAR -> <:expr< $chr:c$ >> + | i = expr_ident -> i + | s = "false" -> <:expr< False >> + | s = "true" -> <:expr< True >> + | "["; "]" -> <:expr< [] >> + | "["; el = expr1_semi_list; "]" -> <:expr< $mklistexp loc None el$ >> + | "[|"; "|]" -> <:expr< [| |] >> + | "[|"; el = expr1_semi_list; "|]" -> <:expr< [| $list:el$ |] >> + | "{"; test_label_eq; lel = lbl_expr_list; "}" -> + <:expr< { $list:lel$ } >> + | "{"; e = expr LEVEL "simple"; "with"; lel = lbl_expr_list; "}" -> + <:expr< { ($e$) with $list:lel$ } >> + | "("; ")" -> <:expr< () >> + | "("; e = SELF; ":"; t = ctyp; ")" -> <:expr< ($e$ : $t$) >> + | "("; e = SELF; ")" -> <:expr< $e$ >> + | "("; "-"; ")" -> <:expr< $lid:"-"$ >> + | "("; "-."; ")" -> <:expr< $lid:"-."$ >> + | "("; op = operator; ")" -> <:expr< $lid:op$ >> + | "begin"; e = SELF; "end" -> <:expr< $e$ >> + | x = LOCATE -> + let x = + try + let i = String.index x ':' in + ({Lexing.pos_fname = ""; + Lexing.pos_lnum = 0; + Lexing.pos_bol = 0; + Lexing.pos_cnum = int_of_string (String.sub x 0 i)}, + String.sub x (i + 1) (String.length x - i - 1)) + with + [ Not_found | Failure _ -> (Token.nowhere, x) ] + in + Pcaml.handle_expr_locate loc x + | x = QUOTATION -> + let x = + try + let i = String.index x ':' in + (String.sub x 0 i, + String.sub x (i + 1) (String.length x - i - 1)) + with + [ Not_found -> ("", x) ] + in + Pcaml.handle_expr_quotation loc x ] ] + ; + let_binding: + [ [ p = patt; e = fun_binding -> + match patt_lid p with + [ Some (i, pl) -> + let e = + List.fold_left (fun e p -> <:expr< fun $p$ -> $e$ >>) e pl + in + (<:patt< $lid:i$ >>, e) + | None -> (p, e) ] ] ] + ; + fun_binding: + [ RIGHTA + [ p = patt LEVEL "simple"; e = SELF -> <:expr< fun $p$ -> $e$ >> + | "="; e = expr -> <:expr< $e$ >> + | ":"; t = ctyp; "="; e = expr -> <:expr< ($e$ : $t$) >> ] ] + ; + match_case: + [ [ x1 = patt; w = OPT [ "when"; e = expr -> e ]; "->"; x2 = expr -> + (x1, w, x2) ] ] + ; + lbl_expr_list: + [ [ le = lbl_expr; ";"; lel = SELF -> [le :: lel] + | le = lbl_expr; ";" -> [le] + | le = lbl_expr -> [le] ] ] + ; + lbl_expr: + [ [ i = patt_label_ident; "="; e = expr LEVEL "expr1" -> (i, e) ] ] + ; + expr1_semi_list: + [ [ e = expr LEVEL "expr1"; ";"; el = SELF -> [e :: el] + | e = expr LEVEL "expr1"; ";" -> [e] + | e = expr LEVEL "expr1" -> [e] ] ] + ; + fun_def: + [ RIGHTA + [ p = patt LEVEL "simple"; e = SELF -> <:expr< fun $p$ -> $e$ >> + | "->"; e = expr -> <:expr< $e$ >> ] ] + ; + expr_ident: + [ RIGHTA + [ i = LIDENT -> <:expr< $lid:i$ >> + | i = UIDENT -> <:expr< $uid:i$ >> + | m = UIDENT; "."; i = SELF -> + let rec loop m = + fun + [ <:expr< $x$ . $y$ >> -> loop <:expr< $m$ . $x$ >> y + | e -> <:expr< $m$ . $e$ >> ] + in + loop <:expr< $uid:m$ >> i + | m = UIDENT; "."; "("; i = operator; ")" -> + <:expr< $uid:m$ . $lid:i$ >> ] ] + ; + (* Patterns *) + patt: + [ LEFTA + [ p1 = SELF; "as"; i = LIDENT -> <:patt< ($p1$ as $lid:i$) >> ] + | LEFTA + [ p1 = SELF; "|"; p2 = SELF -> <:patt< $p1$ | $p2$ >> ] + | [ p = SELF; ","; pl = LIST1 NEXT SEP "," -> + <:patt< ( $list:[p :: pl]$) >> ] + | NONA + [ p1 = SELF; ".."; p2 = SELF -> <:patt< $p1$ .. $p2$ >> ] + | RIGHTA + [ p1 = SELF; "::"; p2 = SELF -> <:patt< [$p1$ :: $p2$] >> ] + | LEFTA + [ p1 = SELF; p2 = SELF -> + match constr_patt_arity p1 with + [ 1 -> <:patt< $p1$ $p2$ >> + | n -> + let p2 = + match p2 with + [ <:patt< _ >> when n > 1 -> + let pl = + loop n where rec loop n = + if n = 0 then [] else [<:patt< _ >> :: loop (n - 1)] + in + <:patt< ( $list:pl$ ) >> + | _ -> p2 ] + in + match p2 with + [ <:patt< ( $list:pl$ ) >> -> + List.fold_left (fun p1 p2 -> <:patt< $p1$ $p2$ >>) p1 pl + | _ -> <:patt< $p1$ $p2$ >> ] ] ] + | LEFTA + [ p1 = SELF; "."; p2 = SELF -> <:patt< $p1$ . $p2$ >> ] + | "simple" + [ s = LIDENT -> <:patt< $lid:s$ >> + | s = UIDENT -> <:patt< $uid:s$ >> + | s = INT -> <:patt< $int:s$ >> + | "-"; s = INT -> <:patt< $int:neg s$ >> + | s = STRING -> <:patt< $str:s$ >> + | s = CHAR -> <:patt< $chr:s$ >> + | s = "false" -> <:patt< False >> + | s = "true" -> <:patt< True >> + | "["; "]" -> <:patt< [] >> + | "["; pl = patt_semi_list; "]" -> <:patt< $mklistpat loc None pl$ >> + | "[|"; "|]" -> <:patt< [| |] >> + | "[|"; pl = patt_semi_list; "|]" -> <:patt< [| $list:pl$ |] >> + | "{"; lpl = lbl_patt_list; "}" -> <:patt< { $list:lpl$ } >> + | "("; ")" -> <:patt< () >> + | "("; p = SELF; ":"; t = ctyp; ")" -> <:patt< ($p$ : $t$) >> + | "("; p = SELF; ")" -> <:patt< $p$ >> + | "("; "-"; ")" -> <:patt< $lid:"-"$ >> + | "("; op = operator; ")" -> <:patt< $lid:op$ >> + | "_" -> <:patt< _ >> + | x = LOCATE -> + let x = + try + let i = String.index x ':' in + ({Lexing.pos_fname = ""; + Lexing.pos_lnum = 0; + Lexing.pos_bol = 0; + Lexing.pos_cnum = int_of_string (String.sub x 0 i)}, + String.sub x (i + 1) (String.length x - i - 1)) + with + [ Not_found | Failure _ -> (Token.nowhere, x) ] + in + Pcaml.handle_patt_locate loc x + | x = QUOTATION -> + let x = + try + let i = String.index x ':' in + (String.sub x 0 i, + String.sub x (i + 1) (String.length x - i - 1)) + with + [ Not_found -> ("", x) ] + in + Pcaml.handle_patt_quotation loc x ] ] + ; + patt_semi_list: + [ [ p = patt; ";"; pl = SELF -> [p :: pl] + | p = patt; ";" -> [p] + | p = patt -> [p] ] ] + ; + lbl_patt_list: + [ [ le = lbl_patt; ";"; lel = SELF -> [le :: lel] + | le = lbl_patt; ";" -> [le] + | le = lbl_patt -> [le] ] ] + ; + lbl_patt: + [ [ i = patt_label_ident; "="; p = patt -> (i, p) ] ] + ; + patt_label_ident: + [ RIGHTA + [ i = UIDENT -> <:patt< $uid:i$ >> + | i = LIDENT -> <:patt< $lid:i$ >> + | m = UIDENT; "."; i = SELF -> <:patt< $uid:m$ . $i$ >> ] ] + ; + (* Type declaration *) + type_declaration: + [ [ tpl = type_parameters; n = type_patt; "="; tk = type_kind; + cl = LIST0 constrain -> + (n, tpl, tk, cl) + | tpl = type_parameters; n = type_patt; cl = LIST0 constrain -> + (n, tpl, <:ctyp< '$choose_tvar tpl$ >>, cl) ] ] + ; + type_patt: + [ [ n = LIDENT -> (loc, n) ] ] + ; + constrain: + [ [ "constraint"; t1 = ctyp; "="; t2 = ctyp -> (t1, t2) ] ] + ; + type_kind: + [ [ test_constr_decl; OPT "|"; + cdl = LIST1 constructor_declaration SEP "|" -> + <:ctyp< [ $list:cdl$ ] >> + | t = ctyp -> <:ctyp< $t$ >> + | t = ctyp; "="; "{"; ldl = label_declarations; "}" -> + <:ctyp< $t$ == { $list:ldl$ } >> + | t = ctyp; "="; OPT "|"; cdl = LIST1 constructor_declaration SEP "|" -> + <:ctyp< $t$ == [ $list:cdl$ ] >> + | "{"; ldl = label_declarations; "}" -> <:ctyp< { $list:ldl$ } >> ] ] + ; + type_parameters: + [ [ -> (* empty *) [] + | tp = type_parameter -> [tp] + | "("; tpl = LIST1 type_parameter SEP ","; ")" -> tpl ] ] + ; + type_parameter: + [ [ "'"; i = ident -> (i, (False, False)) ] ] + ; + constructor_declaration: + [ [ ci = UIDENT; "of"; cal = LIST1 ctyp LEVEL "ctyp1" SEP "*" -> + (loc, ci, cal) + | ci = UIDENT -> (loc, ci, []) ] ] + ; + label_declarations: + [ [ ld = label_declaration; ";"; ldl = SELF -> [ld :: ldl] + | ld = label_declaration; ";" -> [ld] + | ld = label_declaration -> [ld] ] ] + ; + label_declaration: + [ [ i = LIDENT; ":"; t = ctyp -> (loc, i, False, t) + | i = LABEL; t = ctyp -> (loc, i, False, t) + | "mutable"; i = LIDENT; ":"; t = ctyp -> (loc, i, True, t) + | "mutable"; i = LABEL; t = ctyp -> (loc, i, True, t) ] ] + ; + (* Core types *) + ctyp: + [ [ t1 = SELF; "as"; "'"; i = ident -> <:ctyp< $t1$ as '$i$ >> ] + | "arrow" RIGHTA + [ t1 = SELF; "->"; t2 = SELF -> <:ctyp< $t1$ -> $t2$ >> ] + | [ t = SELF; "*"; tl = LIST1 ctyp LEVEL "ctyp1" SEP "*" -> + <:ctyp< ( $list:[t :: tl]$ ) >> ] + | "ctyp1" + [ t1 = SELF; t2 = SELF -> <:ctyp< $t2$ $t1$ >> ] + | "ctyp2" + [ t1 = SELF; "."; t2 = SELF -> <:ctyp< $t1$ . $t2$ >> + | t1 = SELF; "("; t2 = SELF; ")" -> <:ctyp< $t1$ $t2$ >> ] + | "simple" + [ "'"; i = ident -> <:ctyp< '$i$ >> + | "_" -> <:ctyp< _ >> + | i = LIDENT -> <:ctyp< $lid:i$ >> + | i = UIDENT -> <:ctyp< $uid:i$ >> + | "("; t = SELF; ","; tl = LIST1 ctyp SEP ","; ")"; + i = ctyp LEVEL "ctyp2" -> + List.fold_left (fun c a -> <:ctyp< $c$ $a$ >>) i [t :: tl] + | "("; t = SELF; ")" -> <:ctyp< $t$ >> ] ] + ; + (* Identifiers *) + ident: + [ [ i = LIDENT -> i + | i = UIDENT -> i ] ] + ; + mod_ident: + [ RIGHTA + [ i = UIDENT -> [i] + | i = LIDENT -> [i] + | m = UIDENT; "."; i = SELF -> [m :: i] ] ] + ; + (* Miscellaneous *) + direction_flag: + [ [ "to" -> True + | "downto" -> False ] ] + ; +END; + +(* Objects and Classes *) + +value rec class_type_of_ctyp loc t = + match t with + [ <:ctyp< $lid:i$ >> -> <:class_type< $list:[i]$ >> + | <:ctyp< $uid:m$.$t$ >> -> <:class_type< $list:[m :: type_id_list t]$ >> + | _ -> raise_with_loc loc (Stream.Error "lowercase identifier expected") ] +and type_id_list = + fun + [ <:ctyp< $uid:m$.$t$ >> -> [m :: type_id_list t] + | <:ctyp< $lid:i$ >> -> [i] + | t -> + raise_with_loc (loc_of_node t) + (Stream.Error "lowercase identifier expected") ] +; + +value class_fun_binding = Grammar.Entry.create gram "class_fun_binding"; + +EXTEND + GLOBAL: str_item sig_item expr ctyp class_sig_item class_str_item class_type + class_expr class_fun_binding; + str_item: + [ [ "class"; cd = LIST1 class_declaration SEP "and" -> + <:str_item< class $list:cd$ >> + | "class"; "type"; ctd = LIST1 class_type_declaration SEP "and" -> + <:str_item< class type $list:ctd$ >> ] ] + ; + sig_item: + [ [ "class"; cd = LIST1 class_description SEP "and" -> + <:sig_item< class $list:cd$ >> + | "class"; "type"; ctd = LIST1 class_type_declaration SEP "and" -> + <:sig_item< class type $list:ctd$ >> ] ] + ; + (* Class expressions *) + class_declaration: + [ [ vf = OPT "virtual"; ctp = class_type_parameters; i = LIDENT; + cfb = class_fun_binding -> + {MLast.ciLoc = loc; MLast.ciVir = o2b vf; MLast.ciPrm = ctp; + MLast.ciNam = i; MLast.ciExp = cfb} ] ] + ; + class_fun_binding: + [ [ "="; ce = class_expr -> ce + | ":"; ct = class_type; "="; ce = class_expr -> + <:class_expr< ($ce$ : $ct$) >> + | p = patt LEVEL "simple"; cfb = SELF -> + <:class_expr< fun $p$ -> $cfb$ >> ] ] + ; + class_type_parameters: + [ [ -> (loc, []) + | "["; tpl = LIST1 type_parameter SEP ","; "]" -> (loc, tpl) ] ] + ; + class_fun_def: + [ [ p = patt LEVEL "simple"; "->"; ce = class_expr -> + <:class_expr< fun $p$ -> $ce$ >> + | p = patt LEVEL "simple"; cfd = SELF -> + <:class_expr< fun $p$ -> $cfd$ >> ] ] + ; + class_expr: + [ "top" + [ "fun"; cfd = class_fun_def -> cfd + | "let"; rf = OPT "rec"; lb = LIST1 let_binding SEP "and"; "in"; + ce = SELF -> + <:class_expr< let $opt:o2b rf$ $list:lb$ in $ce$ >> ] + | "apply" NONA + [ ce = SELF; e = expr LEVEL "label" -> + <:class_expr< $ce$ $e$ >> ] + | "simple" + [ "["; ct = ctyp; ","; ctcl = LIST1 ctyp SEP ","; "]"; + ci = class_longident -> + <:class_expr< $list:ci$ [ $list:[ct :: ctcl]$ ] >> + | "["; ct = ctyp; "]"; ci = class_longident -> + <:class_expr< $list:ci$ [ $ct$ ] >> + | ci = class_longident -> <:class_expr< $list:ci$ >> + | "object"; cspo = OPT class_self_patt; cf = class_structure; "end" -> + <:class_expr< object $opt:cspo$ $list:cf$ end >> + | "("; ce = SELF; ":"; ct = class_type; ")" -> + <:class_expr< ($ce$ : $ct$) >> + | "("; ce = SELF; ")" -> ce ] ] + ; + class_structure: + [ [ cf = LIST0 class_str_item -> cf ] ] + ; + class_self_patt: + [ [ "("; p = patt; ")" -> p + | "("; p = patt; ":"; t = ctyp; ")" -> <:patt< ($p$ : $t$) >> ] ] + ; + class_str_item: + [ [ "inherit"; ce = class_expr; pb = OPT [ "as"; i = LIDENT -> i ] -> + <:class_str_item< inherit $ce$ $opt:pb$ >> + | "val"; (lab, mf, e) = cvalue -> + <:class_str_item< value $opt:mf$ $lab$ = $e$ >> + | "method"; "private"; "virtual"; l = label; ":"; t = ctyp -> + <:class_str_item< method virtual private $l$ : $t$ >> + | "method"; "virtual"; "private"; l = label; ":"; t = ctyp -> + <:class_str_item< method virtual private $l$ : $t$ >> + | "method"; "virtual"; l = label; ":"; t = ctyp -> + <:class_str_item< method virtual $l$ : $t$ >> + | "method"; "private"; l = label; fb = fun_binding -> + <:class_str_item< method private $l$ = $fb$ >> + | "method"; l = label; fb = fun_binding -> + <:class_str_item< method $l$ = $fb$ >> + | "constraint"; t1 = ctyp; "="; t2 = ctyp -> + <:class_str_item< type $t1$ = $t2$ >> + | "initializer"; se = expr -> <:class_str_item< initializer $se$ >> ] ] + ; + cvalue: + [ [ mf = OPT "mutable"; l = label; "="; e = expr -> (l, o2b mf, e) + | mf = OPT "mutable"; l = label; ":"; t = ctyp; "="; e = expr -> + (l, o2b mf, <:expr< ($e$ : $t$) >>) + | mf = OPT "mutable"; l = label; ":"; t1 = ctyp; ":>"; t2 = ctyp; "="; + e = expr -> + (l, o2b mf, <:expr< ($e$ : $t1$ :> $t2$) >>) + | mf = OPT "mutable"; l = label; ":>"; t = ctyp; "="; e = expr -> + (l, o2b mf, <:expr< ($e$ :> $t$) >>) ] ] + ; + label: + [ [ i = LIDENT -> i ] ] + ; + (* Class types *) + class_type: + [ [ t = ctyp LEVEL "ctyp1" -> class_type_of_ctyp loc t + | t = ctyp LEVEL "ctyp1"; "->"; ct = SELF -> + <:class_type< [ $t$ ] -> $ct$ >> + | t = ctyp LEVEL "ctyp1"; "*"; tl = LIST1 ctyp LEVEL "simple" SEP "*"; + "->"; ct = SELF -> + <:class_type< [ ($t$ * $list:tl$) ] -> $ct$ >> + | cs = class_signature -> cs ] ] + ; + class_signature: + [ [ "["; tl = LIST1 ctyp SEP ","; "]"; id = clty_longident -> + <:class_type< $list:id$ [ $list:tl$ ] >> + | id = clty_longident -> <:class_type< $list:id$ >> + | "object"; cst = OPT class_self_type; csf = LIST0 class_sig_item; + "end" -> + <:class_type< object $opt:cst$ $list:csf$ end >> ] ] + ; + class_self_type: + [ [ "("; t = ctyp; ")" -> t ] ] + ; + 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$ >> + | "method"; "private"; "virtual"; l = label; ":"; t = ctyp -> + <:class_sig_item< method virtual private $l$ : $t$ >> + | "method"; "virtual"; "private"; l = label; ":"; t = ctyp -> + <:class_sig_item< method virtual private $l$ : $t$ >> + | "method"; "virtual"; l = label; ":"; t = ctyp -> + <:class_sig_item< method virtual $l$ : $t$ >> + | "method"; "private"; l = label; ":"; t = ctyp -> + <:class_sig_item< method private $l$ : $t$ >> + | "method"; l = label; ":"; t = ctyp -> + <:class_sig_item< method $l$ : $t$ >> + | "constraint"; t1 = ctyp; "="; t2 = ctyp -> + <:class_sig_item< type $t1$ = $t2$ >> ] ] + ; + class_description: + [ [ vf = OPT "virtual"; ctp = class_type_parameters; n = LIDENT; ":"; + ct = class_type -> + {MLast.ciLoc = loc; MLast.ciVir = o2b vf; MLast.ciPrm = ctp; + MLast.ciNam = n; MLast.ciExp = ct} + | vf = OPT "virtual"; ctp = class_type_parameters; n = LABEL; + ct = class_type -> + {MLast.ciLoc = loc; MLast.ciVir = o2b vf; MLast.ciPrm = ctp; + MLast.ciNam = n; MLast.ciExp = ct} ] ] + ; + class_type_declaration: + [ [ vf = OPT "virtual"; ctp = class_type_parameters; n = LIDENT; "="; + cs = class_signature -> + {MLast.ciLoc = loc; MLast.ciVir = o2b vf; MLast.ciPrm = ctp; + MLast.ciNam = n; MLast.ciExp = cs} ] ] + ; + (* Expressions *) + expr: LEVEL "apply" + [ LEFTA + [ "new"; i = class_longident -> <:expr< new $list:i$ >> ] ] + ; + expr: LEVEL "simple" + [ [ e = SELF; "#"; lab = label -> <:expr< $e$ # $lab$ >> ] ] + ; + expr: LEVEL "simple" + [ [ "("; e = SELF; ":"; t1 = ctyp; ":>"; t2 = ctyp; ")" -> + <:expr< ($e$ : $t1$ :> $t2$) >> + | "("; e = SELF; ":>"; t = ctyp; ")" -> <:expr< ($e$ :> $t$) >> + | "{<"; ">}" -> <:expr< {< >} >> + | "{<"; fel = field_expr_list; ">}" -> <:expr< {< $list:fel$ >} >> ] ] + ; + field_expr_list: + [ [ l = label; "="; e = expr LEVEL "expr1"; ";"; fel = SELF -> + [(l, e) :: fel] + | l = label; "="; e = expr LEVEL "expr1"; ";" -> [(l, e)] + | l = label; "="; e = expr LEVEL "expr1" -> [(l, e)] ] ] + ; + (* Core types *) + ctyp: LEVEL "simple" + [ [ "#"; id = class_longident -> <:ctyp< # $list:id$ >> + | "<"; (ml, v) = meth_list; ">" -> <:ctyp< < $list:ml$ $opt:v$ > >> + | "<"; ">" -> <:ctyp< < > >> ] ] + ; + meth_list: + [ [ f = field; ";"; (ml, v) = SELF -> ([f :: ml], v) + | f = field; ";" -> ([f], False) + | f = field -> ([f], False) + | ".." -> ([], True) ] ] + ; + field: + [ [ lab = LIDENT; ":"; t = ctyp -> (lab, t) + | lab = LABEL; t = ctyp -> (lab, t) ] ] + ; + (* Identifiers *) + clty_longident: + [ [ m = UIDENT; "."; l = SELF -> [m :: l] + | i = LIDENT -> [i] ] ] + ; + class_longident: + [ [ m = UIDENT; "."; l = SELF -> [m :: l] + | i = LIDENT -> [i] ] ] + ; +END; + +(* Labels *) + +EXTEND + GLOBAL: ctyp expr patt fun_def fun_binding class_type class_fun_binding; + ctyp: AFTER "arrow" + [ NONA + [ i = LABEL; t = SELF -> <:ctyp< ~ $i$ : $t$ >> + | "?"; i = LABEL; t = SELF -> <:ctyp< ? $i$ : $t$ >> ] ] + ; + ctyp: LEVEL "simple" + [ [ "["; OPT "|"; rfl = LIST0 row_field SEP "|"; "]" -> + <:ctyp< [ = $list:rfl$ ] >> + | "["; ">"; OPT "|"; rfl = LIST1 row_field SEP "|"; "]" -> + <:ctyp< [ > $list:rfl$ ] >> + | "[<"; OPT "|"; rfl = LIST1 row_field SEP "|"; "]" -> + <:ctyp< [ < $list:rfl$ ] >> + | "[<"; OPT "|"; rfl = LIST1 row_field SEP "|"; ">"; + ntl = LIST1 name_tag; "]" -> + <:ctyp< [ < $list:rfl$ > $list:ntl$ ] >> ] ] + ; + row_field: + [ [ "`"; i = ident -> MLast.RfTag i False [] + | "`"; i = ident; "of"; ao = OPT "&"; l = LIST1 ctyp SEP "&" -> + MLast.RfTag i (o2b ao) l + | "`"; i = ident; "&"; l = LIST1 ctyp SEP "&" -> MLast.RfTag i True l + | "`"; i = ident; l = LIST1 ctyp SEP "&" -> MLast.RfTag i False l ] ] + ; + name_tag: + [ [ "`"; i = ident -> i ] ] + ; + expr: LEVEL "expr1" + [ [ "fun"; p = labeled_patt; e = fun_def -> <:expr< fun $p$ -> $e$ >> ] ] + ; + expr: AFTER "apply" + [ "label" + [ i = LABEL; e = SELF -> <:expr< ~ $i$ : $e$ >> + | i = ELABEL -> <:expr< ~ $i$ >> + | "?"; i = LABEL; e = SELF -> <:expr< ? $i$ : $e$ >> + | "?"; i = ELABEL -> <:expr< ? $i$ >> ] ] + ; + expr: LEVEL "simple" + [ [ "`"; s = ident -> <:expr< ` $s$ >> ] ] + ; + fun_def: + [ [ p = labeled_patt; e = SELF -> <:expr< fun $p$ -> $e$ >> ] ] + ; + fun_binding: + [ [ p = labeled_patt; e = SELF -> <:expr< fun $p$ -> $e$ >> ] ] + ; + patt: LEVEL "simple" + [ [ "`"; s = ident -> <:patt< ` $s$ >> ] ] + ; + labeled_patt: + [ [ i = LABEL; p = patt LEVEL "simple" -> <:patt< ~ $i$ : $p$ >> + | i = ELABEL -> <:patt< ~ $i$ >> + | "?"; i = LABEL; j = LIDENT -> <:patt< ? $i$ : ($lid:j$) >> + | "?"; "("; i = LABEL; j = LIDENT; ")" -> <:patt< ? $i$ : ($lid:j$) >> + | "?"; "("; i = LABEL; j = LIDENT; "="; e = expr; ")" -> + <:patt< ? $i$ : ( $lid:j$ = $e$ ) >> + | "?"; i = ELABEL -> <:patt< ? $i$ : ($lid:i$) >> + | "?"; "("; i = ELABEL; "="; e = expr; ")" -> + <:patt< ? $i$ : ( $lid:i$ = $e$ ) >> ] ] + ; + class_type: + [ [ i = LABEL; t = ctyp LEVEL "ctyp1"; "->"; ct = SELF -> + <:class_type< [ ~ $i$ : $t$ ] -> $ct$ >> + | "?"; i = LABEL; t = ctyp LEVEL "ctyp1"; "->"; ct = SELF -> + <:class_type< [ ? $i$ : $t$ ] -> $ct$ >> ] ] + ; + class_fun_binding: + [ [ p = labeled_patt; cfb = SELF -> <:class_expr< fun $p$ -> $cfb$ >> ] ] + ; + ident: + [ [ i = LIDENT -> i + | i = UIDENT -> i ] ] + ; +END; + +type spat_comp = + [ SpTrm of Loc.t and MLast.patt and option MLast.expr + | SpNtr of Loc.t and MLast.patt and MLast.expr + | SpStr of Loc.t and MLast.patt ] +; +type sexp_comp = + [ SeTrm of Loc.t and MLast.expr | SeNtr of Loc.t and MLast.expr ] +; + +value strm_n = "__strm"; +value peek_fun loc = <:expr< Stream.peek >>; +value junk_fun loc = <:expr< Stream.junk >>; + +(* Parsers. *) +(* In syntax generated, many cases are optimisations. *) + +value rec pattern_eq_expression p e = + match (p, e) with + [ (<:patt< $lid:a$ >>, <:expr< $lid:b$ >>) -> a = b + | (<:patt< $uid:a$ >>, <:expr< $uid:b$ >>) -> a = b + | (<:patt< $p1$ $p2$ >>, <:expr< $e1$ $e2$ >>) -> + pattern_eq_expression p1 e1 && pattern_eq_expression p2 e2 + | _ -> False ] +; + +value is_raise e = + match e with + [ <:expr< raise $_$ >> -> True + | _ -> False ] +; + +value is_raise_failure e = + match e with + [ <:expr< raise Stream.Failure >> -> True + | _ -> False ] +; + +value rec handle_failure e = + match e with + [ <:expr< try $te$ with [ Stream.Failure -> $e$] >> -> handle_failure e + | <:expr< match $me$ with [ $list:pel$ ] >> -> + handle_failure me && + List.for_all + (fun + [ (_, None, e) -> handle_failure e + | _ -> False ]) + pel + | <:expr< let $list:pel$ in $e$ >> -> + List.for_all (fun (p, e) -> handle_failure e) pel && handle_failure e + | <:expr< $lid:_$ >> | <:expr< $int:_$ >> | <:expr< $str:_$ >> | + <:expr< $chr:_$ >> | <:expr< fun [ $list:_$ ] >> | <:expr< $uid:_$ >> -> + True + | <:expr< raise $e$ >> -> + match e with + [ <:expr< Stream.Failure >> -> False + | _ -> True ] + | <:expr< $f$ $x$ >> -> + is_constr_apply f && handle_failure f && handle_failure x + | _ -> False ] +and is_constr_apply = + fun + [ <:expr< $uid:_$ >> -> True + | <:expr< $lid:_$ >> -> False + | <:expr< $x$ $_$ >> -> is_constr_apply x + | _ -> False ] +; + +value rec subst v e = + let loc = MLast.loc_of_expr e in + match e with + [ <:expr< $lid:x$ >> -> + let x = if x = v then strm_n else x in + <:expr< $lid:x$ >> + | <:expr< $uid:_$ >> -> e + | <:expr< $int:_$ >> -> e + | <:expr< $chr:_$ >> -> e + | <:expr< $str:_$ >> -> e + | <:expr< $_$ . $_$ >> -> e + | <:expr< let $opt:rf$ $list:pel$ in $e$ >> -> + <:expr< let $opt:rf$ $list:List.map (subst_pe v) pel$ in $subst v e$ >> + | <:expr< $e1$ $e2$ >> -> <:expr< $subst v e1$ $subst v e2$ >> + | <:expr< ( $list:el$ ) >> -> <:expr< ( $list:List.map (subst v) el$ ) >> + | _ -> raise Not_found ] +and subst_pe v (p, e) = + match p with + [ <:patt< $lid:v'$ >> -> if v = v' then (p, e) else (p, subst v e) + | _ -> raise Not_found ] +; + +value stream_pattern_component skont ckont = + fun + [ SpTrm loc p wo -> + <:expr< match $peek_fun loc$ $lid:strm_n$ with + [ Some $p$ $when:wo$ -> + do { $junk_fun loc$ $lid:strm_n$; $skont$ } + | _ -> $ckont$ ] >> + | SpNtr loc p e -> + let e = + match e with + [ <:expr< fun [ ($lid:v$ : Stream.t _) -> $e$ ] >> when v = strm_n -> + e + | _ -> <:expr< $e$ $lid:strm_n$ >> ] + in + if pattern_eq_expression p skont then + if is_raise_failure ckont then e + else if handle_failure e then e + else <:expr< try $e$ with [ Stream.Failure -> $ckont$ ] >> + else if is_raise_failure ckont then <:expr< let $p$ = $e$ in $skont$ >> + else if pattern_eq_expression <:patt< Some $p$ >> skont then + <:expr< try Some $e$ with [ Stream.Failure -> $ckont$ ] >> + else if is_raise ckont then + let tst = + if handle_failure e then e + else <:expr< try $e$ with [ Stream.Failure -> $ckont$ ] >> + in + <:expr< let $p$ = $tst$ in $skont$ >> + else + <:expr< match try Some $e$ with [ Stream.Failure -> None ] with + [ Some $p$ -> $skont$ + | _ -> $ckont$ ] >> + | SpStr loc p -> + try + match p with + [ <:patt< $lid:v$ >> -> subst v skont + | _ -> raise Not_found ] + with + [ Not_found -> <:expr< let $p$ = $lid:strm_n$ in $skont$ >> ] ] +; + +value rec stream_pattern loc epo e ekont = + fun + [ [] -> + match epo with + [ Some ep -> <:expr< let $ep$ = Stream.count $lid:strm_n$ in $e$ >> + | _ -> e ] + | [(spc, err) :: spcl] -> + let skont = + let ekont err = + let str = + match err with + [ Some estr -> estr + | _ -> <:expr< "" >> ] + in + <:expr< raise (Stream.Error $str$) >> + in + stream_pattern loc epo e ekont spcl + in + let ckont = ekont err in + stream_pattern_component skont ckont spc ] +; + +value stream_patterns_term loc ekont tspel = + let pel = + List.map + (fun (p, w, loc, spcl, epo, e) -> + let p = <:patt< Some $p$ >> in + let e = + let ekont err = + let str = + match err with + [ Some estr -> estr + | _ -> <:expr< "" >> ] + in + <:expr< raise (Stream.Error $str$) >> + in + let skont = stream_pattern loc epo e ekont spcl in + <:expr< do { $junk_fun loc$ $lid:strm_n$; $skont$ } >> + in + (p, w, e)) + tspel + in + let pel = pel @ [(<:patt< _ >>, None, ekont ())] in + <:expr< match $peek_fun loc$ $lid:strm_n$ with [ $list:pel$ ] >> +; + +value rec group_terms = + fun + [ [([(SpTrm loc p w, None) :: spcl], epo, e) :: spel] -> + let (tspel, spel) = group_terms spel in + ([(p, w, loc, spcl, epo, e) :: tspel], spel) + | spel -> ([], spel) ] +; + +value rec parser_cases loc = + fun + [ [] -> <:expr< raise Stream.Failure >> + | spel -> + match group_terms spel with + [ ([], [(spcl, epo, e) :: spel]) -> + stream_pattern loc epo e (fun _ -> parser_cases loc spel) spcl + | (tspel, spel) -> + stream_patterns_term loc (fun _ -> parser_cases loc spel) tspel ] ] +; + +value cparser loc bpo pc = + let e = parser_cases loc pc in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $e$ >> + | None -> e ] + in + let p = <:patt< ($lid:strm_n$ : Stream.t _) >> in + <:expr< fun $p$ -> $e$ >> +; + +value cparser_match loc me bpo pc = + let pc = parser_cases loc pc in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $pc$ >> + | None -> pc ] + in + <:expr< let $lid:strm_n$ = $me$ in $e$ >> +; + +(* streams *) + +value rec not_computing = + fun + [ <:expr< $lid:_$ >> | <:expr< $uid:_$ >> | <:expr< $int:_$ >> | + <:expr< $flo:_$ >> | <:expr< $chr:_$ >> | <:expr< $str:_$ >> -> + True + | <:expr< $x$ $y$ >> -> is_cons_apply_not_computing x && not_computing y + | _ -> False ] +and is_cons_apply_not_computing = + fun + [ <:expr< $uid:_$ >> -> True + | <:expr< $lid:_$ >> -> False + | <:expr< $x$ $y$ >> -> is_cons_apply_not_computing x && not_computing y + | _ -> False ] +; + +value slazy loc e = + match e with + [ <:expr< $f$ () >> -> + match f with + [ <:expr< $lid:_$ >> -> f + | _ -> <:expr< fun _ -> $e$ >> ] + | _ -> <:expr< fun _ -> $e$ >> ] +; + +value rec cstream gloc = + fun + [ [] -> + let loc = gloc in + <:expr< Stream.sempty >> + | [SeTrm loc e] -> + if not_computing e then <:expr< Stream.ising $e$ >> + else <:expr< Stream.lsing $slazy loc e$ >> + | [SeTrm loc e :: secl] -> + if not_computing e then <:expr< Stream.icons $e$ $cstream gloc secl$ >> + else <:expr< Stream.lcons $slazy loc e$ $cstream gloc secl$ >> + | [SeNtr loc e] -> + if not_computing e then e else <:expr< Stream.slazy $slazy loc e$ >> + | [SeNtr loc e :: secl] -> + if not_computing e then <:expr< Stream.iapp $e$ $cstream gloc secl$ >> + else <:expr< Stream.lapp $slazy loc e$ $cstream gloc secl$ >> ] +; + +(* Syntax extensions in Ocaml grammar *) + +EXTEND + GLOBAL: expr; + expr: LEVEL "expr1" + [ [ "parser"; po = OPT ipatt; OPT "|"; pcl = LIST1 parser_case SEP "|" -> + <:expr< $cparser loc po pcl$ >> + | "match"; e = SELF; "with"; "parser"; po = OPT ipatt; OPT "|"; + pcl = LIST1 parser_case SEP "|" -> + <:expr< $cparser_match loc e po pcl$ >> ] ] + ; + parser_case: + [ [ "[<"; sp = stream_patt; ">]"; po = OPT ipatt; "->"; e = expr -> + (sp, po, e) ] ] + ; + stream_patt: + [ [ spc = stream_patt_comp -> [(spc, None)] + | spc = stream_patt_comp; ";" -> [(spc, None)] + | spc = stream_patt_comp; ";"; sp = stream_patt_comp_err_list -> + [(spc, None) :: sp] + | -> (* empty *) [] ] ] + ; + stream_patt_comp_err_list: + [ [ spc = stream_patt_comp_err -> [spc] + | spc = stream_patt_comp_err; ";" -> [spc] + | spc = stream_patt_comp_err; ";"; sp = SELF -> [spc :: sp] ] ] + ; + stream_patt_comp: + [ [ "'"; p = patt; eo = OPT [ "when"; e = expr LEVEL "expr1" -> e ] -> + SpTrm loc p eo + | p = patt; "="; e = expr LEVEL "expr1" -> SpNtr loc p e + | p = patt -> SpStr loc p ] ] + ; + stream_patt_comp_err: + [ [ spc = stream_patt_comp; + eo = OPT [ "?"; e = expr LEVEL "expr1" -> e ] -> + (spc, eo) ] ] + ; + ipatt: + [ [ i = LIDENT -> <:patt< $lid:i$ >> ] ] + ; + expr: LEVEL "simple" + [ [ "[<"; ">]" -> <:expr< $cstream loc []$ >> + | "[<"; sel = stream_expr_comp_list; ">]" -> + <:expr< $cstream loc sel$ >> ] ] + ; + stream_expr_comp_list: + [ [ se = stream_expr_comp; ";"; sel = SELF -> [se :: sel] + | se = stream_expr_comp; ";" -> [se] + | se = stream_expr_comp -> [se] ] ] + ; + stream_expr_comp: + [ [ "'"; e = expr LEVEL "expr1" -> SeTrm loc e + | e = expr LEVEL "expr1" -> SeNtr loc e ] ] + ; +END; diff --git a/camlp4/unmaintained/scheme/.depend b/camlp4/unmaintained/scheme/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/scheme/Makefile b/camlp4/unmaintained/scheme/Makefile new file mode 100644 index 00000000..01036c22 --- /dev/null +++ b/camlp4/unmaintained/scheme/Makefile @@ -0,0 +1,85 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# Makefile for pa_lefteval +# M.Mauny +# + +include ../../config/Makefile.cnf + +OCAMLTOP=../../.. +CAMLP4=../../camlp4/camlp4$(EXE) + +OCAMLC=$(OCAMLTOP)/ocamlc$(EXE) +OCAMLOPT=$(OCAMLTOP)/ocamlopt$(EXE) + +P4INCLUDES= -nolib -I ../../meta -I ../../etc +OCAMLINCLUDES= -nostdlib -I $(OCAMLTOP)/stdlib -I ../../camlp4 -I ../../lib -I ../../etc +OCAMLCFLAGS=-warn-error A $(OCAMLINCLUDES) + +SCHSRC=pa_scheme.sc +SRC=pa_scheme.ml pr_scheme.ml pr_schp_main.ml +OBJS=$(SRC:.ml=.cmo) +OBJSX=$(OCAMLSRC:.ml=.cmx) + +all: $(OBJS) pr_schemep.cmo camlp4sch$(EXE) + +opt: all + +bootstrap: camlp4sch$(EXE) save + ./camlp4sch$(EXE) ../../etc/q_phony.cmo ../../meta/pa_extend.cmo ../../etc/pr_r.cmo ../../etc/pr_extend.cmo ../../etc/pr_rp.cmo -impl pa_scheme.sc \ + | sed -e 's/^;; \(.*\)$$/(* \1 *)/' -e 's/^; \(.*\)$$/(* \1 *)/' \ + -e 's/$$Id.*\$$/File generated by pretty print; do not edit!/' > pa_scheme.ml + @if cmp -s pa_scheme.ml SAVED/pa_scheme.ml; then \ + echo 'pa_scheme.ml and SAVED/pa_scheme.ml are identical' ; \ + else \ + echo '**** Note: pa_scheme.ml differs from SAVED/pa_scheme.ml'; \ + fi + +save: + test -d SAVED || mkdir SAVED + mkdir SAVED.$$$$ && mv SAVED pa_scheme.ml SAVED.$$$$ && mv SAVED.$$$$ SAVED + +restore: + mv SAVED SAVED.$$$$ && mv SAVED.$$$$/* . && rmdir SAVED.$$$$ + +depend: + cp .depend .depend.bak + > .depend + for file in $(SRC); do \ + $(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $$file` pr_depend.cmo $$i | \ + sed -e 's| \.\./\.\./\.\.| $$(OCAMLTOP)|g' >> .depend; \ + done + +clean: + rm -f camlp4sch$(EXE) *.cm* *.$(O) *.bak .*.bak + +camlp4sch: pa_scheme.cmo + rm -f camlp4sch + DIR=`pwd` && cd ../../camlp4 && $(MAKE) CAMLP4=$$DIR/camlp4sch CAMLP4M="-I $$DIR pa_scheme.cmo ../meta/pr_dump.cmo" + +pr_schemep.cmo: pr_schp_main.cmo + $(OCAMLC) ../../etc/parserify.cmo pr_schp_main.cmo -a -o $@ + +.SUFFIXES: .cmx .cmo .cmi .ml .mli + +.mli.cmi: + $(OCAMLC) $(OCAMLCFLAGS) -c $< + + +.ml.cmo: + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<` -loc loc" -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<` -loc loc" -c $< + +include .depend diff --git a/camlp4/unmaintained/scheme/README b/camlp4/unmaintained/scheme/README new file mode 100644 index 00000000..809d42f2 --- /dev/null +++ b/camlp4/unmaintained/scheme/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + diff --git a/camlp4/unmaintained/scheme/pa_scheme.ml b/camlp4/unmaintained/scheme/pa_scheme.ml new file mode 100644 index 00000000..43893210 --- /dev/null +++ b/camlp4/unmaintained/scheme/pa_scheme.ml @@ -0,0 +1,1093 @@ +(* pa_r.cmo pa_rp.cmo pa_extend.cmo q_MLast.cmo pr_dump.cmo *) +(* ********************************************************************** *) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(* ********************************************************************** *) +(* File generated by pretty print; do not edit! *) + +open Pcaml; +open Stdpp; + +type choice 'a 'b = + [ Left of 'a + | Right of 'b ] +; + +(* Buffer *) + +module Buff = + struct + value buff = ref (String.create 80); + value store len x = + do { + if len >= String.length buff.val then + buff.val := buff.val ^ String.create (String.length buff.val) + else (); + buff.val.[len] := x; + succ len + } + ; + value get len = String.sub buff.val 0 len; + end +; + +(* Lexer *) + +value rec skip_to_eol = + parser + [ [: `'\n' | '\r' :] -> () + | [: `_; s :] -> skip_to_eol s ] +; + +value no_ident = ['('; ')'; '['; ']'; '{'; '}'; ' '; '\t'; '\n'; '\r'; ';']; + +value rec ident len = + parser + [ [: `'.' :] -> (Buff.get len, True) + | [: `x when not (List.mem x no_ident); s :] -> ident (Buff.store len x) s + | [: :] -> (Buff.get len, False) ] +; + +value identifier kwt (s, dot) = + let con = + try do { (Hashtbl.find kwt s : unit); "" } with + [ Not_found -> + match s.[0] with + [ 'A'..'Z' -> if dot then "UIDENTDOT" else "UIDENT" + | _ -> if dot then "LIDENTDOT" else "LIDENT" ] ] + in + (con, s) +; + +value rec string len = + parser + [ [: `'"' :] -> Buff.get len + | [: `'\\'; `c; s :] -> string (Buff.store (Buff.store len '\\') c) s + | [: `x; s :] -> string (Buff.store len x) s ] +; + +value rec end_exponent_part_under len = + parser + [ [: `('0'..'9' as c); s :] -> end_exponent_part_under (Buff.store len c) s + | [: :] -> ("FLOAT", Buff.get len) ] +; + +value end_exponent_part len = + parser + [ [: `('0'..'9' as c); s :] -> end_exponent_part_under (Buff.store len c) s + | [: :] -> raise (Stream.Error "ill-formed floating-point constant") ] +; + +value exponent_part len = + parser + [ [: `('+' | '-' as c); s :] -> end_exponent_part (Buff.store len c) s + | [: a = end_exponent_part len :] -> a ] +; + +value rec decimal_part len = + parser + [ [: `('0'..'9' as c); s :] -> decimal_part (Buff.store len c) s + | [: `'e' | 'E'; s :] -> exponent_part (Buff.store len 'E') s + | [: :] -> ("FLOAT", Buff.get len) ] +; + +value rec number len = + parser + [ [: `('0'..'9' as c); s :] -> number (Buff.store len c) s + | [: `'.'; s :] -> decimal_part (Buff.store len '.') s + | [: `'e' | 'E'; s :] -> exponent_part (Buff.store len 'E') s + | [: :] -> ("INT", Buff.get len) ] +; + +value binary = parser [: `('0'..'1' as c) :] -> c; + +value octal = parser [: `('0'..'7' as c) :] -> c; + +value hexa = parser [: `('0'..'9' | 'a'..'f' | 'A'..'F' as c) :] -> c; + +value rec digits_under kind len = + parser + [ [: d = kind; s :] -> digits_under kind (Buff.store len d) s + | [: :] -> Buff.get len ] +; + +value digits kind bp len = + parser + [ [: d = kind; s :] -> ("INT", digits_under kind (Buff.store len d) s) + | [: s :] ep -> + raise_with_loc + (Reloc.shift_pos bp Reloc.zero_loc, Reloc.shift_pos ep Reloc.zero_loc) + (Failure "ill-formed integer constant") ] +; + +value base_number kwt bp len = + parser + [ [: `'b' | 'B'; s :] -> digits binary bp (Buff.store len 'b') s + | [: `'o' | 'O'; s :] -> digits octal bp (Buff.store len 'o') s + | [: `'x' | 'X'; s :] -> digits hexa bp (Buff.store len 'x') s + | [: id = ident (Buff.store 0 '#') :] -> identifier kwt id ] +; + +value rec operator len = + parser + [ [: `'.' :] -> Buff.get (Buff.store len '.') + | [: :] -> Buff.get len ] +; + +value char_or_quote_id x = + parser + [ [: `''' :] -> ("CHAR", String.make 1 x) + | [: s :] ep -> + if List.mem x no_ident then + Stdpp.raise_with_loc + (Reloc.shift_pos (ep - 2) Reloc.zero_loc, + Reloc.shift_pos (ep - 1) Reloc.zero_loc) + (Stream.Error "bad quote") + else + let len = Buff.store (Buff.store 0 ''') x in + let (s, dot) = ident len s in + (if dot then "LIDENTDOT" else "LIDENT", s) ] +; + +value rec char len = + parser + [ [: `''' :] -> len + | [: `x; s :] -> char (Buff.store len x) s ] +; + +value quote = + parser + [ [: `'\\'; len = char (Buff.store 0 '\\') :] -> ("CHAR", Buff.get len) + | [: `x; s :] -> char_or_quote_id x s ] +; + +(* The system with LIDENTDOT and UIDENTDOT is not great (it would be *) +(* better to have a token DOT (actually SPACEDOT and DOT)) but it is *) +(* the only way (that I have found) to have a good behaviour in the *) +(* toplevel (not expecting tokens after a phrase). Drawbacks: 1/ to be *) +(* complete, we should have STRINGDOT, RIGHTPARENDOT, and so on 2/ the *) +(* parser rule with dot is right associative and we have to reverse *) +(* the resulting tree (using the function leftify). *) +(* This is a complicated issue: the behaviour of the OCaml toplevel *) +(* is strange, anyway. For example, even without Camlp4, The OCaml *) +(* toplevel accepts that: *) +(* # let x = 32;; foo bar match let ) *) + +value rec lexer kwt = parser [: t = lexer0 kwt; _ = no_dot :] -> t +and no_dot = + parser + [ [: `'.' :] ep -> + Stdpp.raise_with_loc + (Reloc.shift_pos (ep - 1) Reloc.zero_loc, + Reloc.shift_pos ep Reloc.zero_loc) + (Stream.Error "bad dot") + | [: :] -> () ] +and lexer0 kwt = + parser bp + [ [: `'\t' | '\n' | '\r'; s :] -> lexer0 kwt s + | [: `' '; s :] -> after_space kwt s + | [: `';'; _ = skip_to_eol; s :] -> lexer kwt s + | [: `'(' :] -> (("", "("), (bp, bp + 1)) + | [: `')'; s :] ep -> (("", rparen s), (bp, ep)) + | [: `'[' :] -> (("", "["), (bp, bp + 1)) + | [: `']' :] -> (("", "]"), (bp, bp + 1)) + | [: `'{' :] -> (("", "{"), (bp, bp + 1)) + | [: `'}' :] -> (("", "}"), (bp, bp + 1)) + | [: `'"'; s = string 0 :] ep -> (("STRING", s), (bp, ep)) + | [: `'''; tok = quote :] ep -> (tok, (bp, ep)) + | [: `'<'; tok = less kwt :] ep -> (tok, (bp, ep)) + | [: `'-'; tok = minus kwt :] ep -> (tok, (bp, ep)) + | [: `'~'; tok = tilde :] ep -> (tok, (bp, ep)) + | [: `'?'; tok = question :] ep -> (tok, (bp, ep)) + | [: `'#'; tok = base_number kwt bp (Buff.store 0 '0') :] ep -> + (tok, (bp, ep)) + | [: `('0'..'9' as c); tok = number (Buff.store 0 c) :] ep -> + (tok, (bp, ep)) + | [: `('+' | '*' | '/' as c); id = operator (Buff.store 0 c) :] ep -> + (identifier kwt (id, False), (bp, ep)) + | [: `x; id = ident (Buff.store 0 x) :] ep -> (identifier kwt id, (bp, ep)) + | [: :] -> (("EOI", ""), (bp, bp + 1)) ] +and rparen = + parser + [ [: `'.' :] -> ")." + | [: ___ :] -> ")" ] +and after_space kwt = + parser + [ [: `'.' :] ep -> (("", "."), (ep - 1, ep)) + | [: x = lexer0 kwt :] -> x ] +and tilde = + parser + [ [: `('a'..'z' as c); (s, dot) = ident (Buff.store 0 c) :] -> + ("TILDEIDENT", s) + | [: :] -> ("LIDENT", "~") ] +and question = + parser + [ [: `('a'..'z' as c); (s, dot) = ident (Buff.store 0 c) :] -> + ("QUESTIONIDENT", s) + | [: :] -> ("LIDENT", "?") ] +and minus kwt = + parser + [ [: `'.' :] -> identifier kwt ("-.", False) + | [: `('0'..'9' as c); n = number (Buff.store (Buff.store 0 '-') c) :] -> + n + | [: id = ident (Buff.store 0 '-') :] -> identifier kwt id ] +and less kwt = + parser + [ [: `':'; lab = label 0; `'<' ? "'<' expected"; q = quotation 0 :] -> + ("QUOT", lab ^ ":" ^ q) + | [: id = ident (Buff.store 0 '<') :] -> identifier kwt id ] +and label len = + parser + [ [: `('a'..'z' | 'A'..'Z' | '_' as c); s :] -> label (Buff.store len c) s + | [: :] -> Buff.get len ] +and quotation len = + parser + [ [: `'>'; s :] -> quotation_greater len s + | [: `x; s :] -> quotation (Buff.store len x) s + | [: :] -> failwith "quotation not terminated" ] +and quotation_greater len = + parser + [ [: `'>' :] -> Buff.get len + | [: a = quotation (Buff.store len '>') :] -> a ] +; + +value lexer_using kwt (con, prm) = + match con with + [ "CHAR" | "EOI" | "INT" | "FLOAT" | "LIDENT" | "LIDENTDOT" | + "QUESTIONIDENT" | "QUOT" | "STRING" | "TILDEIDENT" | "UIDENT" | + "UIDENTDOT" -> + () + | "ANTIQUOT" -> () + | "" -> + try Hashtbl.find kwt prm with [ Not_found -> Hashtbl.add kwt prm () ] + | _ -> + raise + (Token.Error + ("the constructor \"" ^ con ^ "\" is not recognized by Plexer")) ] +; + +value lexer_text (con, prm) = + if con = "" then "'" ^ prm ^ "'" + else if prm = "" then con + else con ^ " \"" ^ prm ^ "\"" +; + +value lexer_gmake () = + let kwt = Hashtbl.create 89 in + {Token.tok_func = + Token.lexer_func_of_parser + (fun s -> + let (r, (bp, ep)) = lexer kwt s in + (r, + (Reloc.shift_pos bp Reloc.zero_loc, + Reloc.shift_pos ep Reloc.zero_loc))); + Token.tok_using = lexer_using kwt; Token.tok_removing = fun []; + Token.tok_match = Token.default_match; Token.tok_text = lexer_text; + Token.tok_comm = None} +; + +(* Building AST *) + +type sexpr = + [ Sacc of Loc.t and sexpr and sexpr + | Schar of Loc.t and string + | Sexpr of Loc.t and list sexpr + | Sint of Loc.t and string + | Sfloat of Loc.t and string + | Slid of Loc.t and string + | Slist of Loc.t and list sexpr + | Sqid of Loc.t and string + | Squot of Loc.t and string and string + | Srec of Loc.t and list sexpr + | Sstring of Loc.t and string + | Stid of Loc.t and string + | Suid of Loc.t and string ] +; + +value loc_of_sexpr = + fun [ + Sacc loc _ _ | Schar loc _ | Sexpr loc _ | Sint loc _ | Sfloat loc _ | + Slid loc _ | Slist loc _ | Sqid loc _ | Squot loc _ _ | Srec loc _ | + Sstring loc _ | Stid loc _ | Suid loc _ -> + loc ] +; +value error_loc loc err = + raise_with_loc loc (Stream.Error (err ^ " expected")) +; +value error se err = error_loc (loc_of_sexpr se) err; + +value strm_n = "__strm"; +value peek_fun loc = <:expr< Stream.peek >>; +value junk_fun loc = <:expr< Stream.junk >>; + +value assoc_left_parsed_op_list = + ["+"; "*"; "+."; "*."; "land"; "lor"; "lxor"] +; +value assoc_right_parsed_op_list = ["and"; "or"; "^"; "@"]; +value and_by_couple_op_list = ["="; "<>"; "<"; ">"; "<="; ">="; "=="; "!="]; + +value op_apply loc e1 e2 = + fun + [ "and" -> <:expr< $e1$ && $e2$ >> + | "or" -> <:expr< $e1$ || $e2$ >> + | x -> <:expr< $lid:x$ $e1$ $e2$ >> ] +; + +value string_se = + fun + [ Sstring loc s -> s + | se -> error se "string" ] +; + +value mod_ident_se = + fun + [ Suid _ s -> [Pcaml.rename_id.val s] + | Slid _ s -> [Pcaml.rename_id.val s] + | se -> error se "mod_ident" ] +; + +value lident_expr loc s = + if String.length s > 1 && s.[0] = '`' then + let s = String.sub s 1 (String.length s - 1) in + <:expr< ` $s$ >> + else <:expr< $lid:(Pcaml.rename_id.val s)$ >> +; + +value rec module_expr_se = + fun + [ Sexpr loc [Slid _ "functor"; Suid _ s; se1; se2] -> + let s = Pcaml.rename_id.val s in + let mt = module_type_se se1 in + let me = module_expr_se se2 in + <:module_expr< functor ($s$ : $mt$) -> $me$ >> + | Sexpr loc [Slid _ "struct" :: sl] -> + let mel = List.map str_item_se sl in + <:module_expr< struct $list:mel$ end >> + | Sexpr loc [se1; se2] -> + let me1 = module_expr_se se1 in + let me2 = module_expr_se se2 in + <:module_expr< $me1$ $me2$ >> + | Suid loc s -> <:module_expr< $uid:(Pcaml.rename_id.val s)$ >> + | se -> error se "module expr" ] +and module_type_se = + fun + [ Sexpr loc [Slid _ "functor"; Suid _ s; se1; se2] -> + let s = Pcaml.rename_id.val s in + let mt1 = module_type_se se1 in + let mt2 = module_type_se se2 in + <:module_type< functor ($s$ : $mt1$) -> $mt2$ >> + | Sexpr loc [Slid _ "sig" :: sel] -> + let sil = List.map sig_item_se sel in + <:module_type< sig $list:sil$ end >> + | Sexpr loc [Slid _ "with"; se; Sexpr _ sel] -> + let mt = module_type_se se in + let wcl = List.map with_constr_se sel in + <:module_type< $mt$ with $list:wcl$ >> + | Suid loc s -> <:module_type< $uid:(Pcaml.rename_id.val s)$ >> + | se -> error se "module type" ] +and with_constr_se = + fun + [ Sexpr loc [Slid _ "type"; se1; se2] -> + let tn = mod_ident_se se1 in + let te = ctyp_se se2 in + MLast.WcTyp loc tn [] te + | se -> error se "with constr" ] +and sig_item_se = + fun + [ Sexpr loc [Slid _ "type" :: sel] -> + let tdl = type_declaration_list_se sel in + <:sig_item< type $list:tdl$ >> + | Sexpr loc [Slid _ "exception"; Suid _ c :: sel] -> + let c = Pcaml.rename_id.val c in + let tl = List.map ctyp_se sel in + <:sig_item< exception $c$ of $list:tl$ >> + | Sexpr loc [Slid _ "value"; Slid _ s; se] -> + let s = Pcaml.rename_id.val s in + let t = ctyp_se se in + <:sig_item< value $s$ : $t$ >> + | Sexpr loc [Slid _ "external"; Slid _ i; se :: sel] -> + let i = Pcaml.rename_id.val i in + let pd = List.map string_se sel in + let t = ctyp_se se in + <:sig_item< external $i$ : $t$ = $list:pd$ >> + | Sexpr loc [Slid _ "module"; Suid _ s; se] -> + let s = Pcaml.rename_id.val s in + let mb = module_type_se se in + <:sig_item< module $s$ : $mb$ >> + | Sexpr loc [Slid _ "moduletype"; Suid _ s; se] -> + let s = Pcaml.rename_id.val s in + let mt = module_type_se se in + <:sig_item< module type $s$ = $mt$ >> + | se -> error se "sig item" ] +and str_item_se se = + match se with + [ Sexpr loc [Slid _ "open"; se] -> + let s = mod_ident_se se in + <:str_item< open $s$ >> + | Sexpr loc [Slid _ "type" :: sel] -> + let tdl = type_declaration_list_se sel in + <:str_item< type $list:tdl$ >> + | Sexpr loc [Slid _ "exception"; Suid _ c :: sel] -> + let c = Pcaml.rename_id.val c in + let tl = List.map ctyp_se sel in + <:str_item< exception $c$ of $list:tl$ >> + | Sexpr loc [Slid _ ("define" | "definerec" as r); se :: sel] -> + let r = r = "definerec" in + let (p, e) = fun_binding_se se (begin_se loc sel) in + <:str_item< value $opt:r$ $p$ = $e$ >> + | Sexpr loc [Slid _ ("define*" | "definerec*" as r) :: sel] -> + let r = r = "definerec*" in + let lbs = List.map let_binding_se sel in + <:str_item< value $opt:r$ $list:lbs$ >> + | Sexpr loc [Slid _ "external"; Slid _ i; se :: sel] -> + let i = Pcaml.rename_id.val i in + let pd = List.map string_se sel in + let t = ctyp_se se in + <:str_item< external $i$ : $t$ = $list:pd$ >> + | Sexpr loc [Slid _ "module"; Suid _ i; se] -> + let i = Pcaml.rename_id.val i in + let mb = module_binding_se se in + <:str_item< module $i$ = $mb$ >> + | Sexpr loc [Slid _ "moduletype"; Suid _ s; se] -> + let s = Pcaml.rename_id.val s in + let mt = module_type_se se in + <:str_item< module type $s$ = $mt$ >> + | _ -> + let loc = loc_of_sexpr se in + let e = expr_se se in + <:str_item< $exp:e$ >> ] +and module_binding_se se = module_expr_se se +and expr_se = + fun + [ Sacc loc se1 se2 -> + let e1 = expr_se se1 in + match se2 with + [ Slist loc [se2] -> + let e2 = expr_se se2 in + <:expr< $e1$ .[ $e2$ ] >> + | Sexpr loc [se2] -> + let e2 = expr_se se2 in + <:expr< $e1$ .( $e2$ ) >> + | _ -> + let e2 = expr_se se2 in + <:expr< $e1$ . $e2$ >> ] + | Slid loc s -> lident_expr loc s + | Suid loc s -> <:expr< $uid:(Pcaml.rename_id.val s)$ >> + | Sint loc s -> <:expr< $int:s$ >> + | Sfloat loc s -> <:expr< $flo:s$ >> + | Schar loc s -> <:expr< $chr:s$ >> + | Sstring loc s -> <:expr< $str:s$ >> + | Stid loc s -> <:expr< ~ $(Pcaml.rename_id.val s)$ >> + | Sqid loc s -> <:expr< ? $(Pcaml.rename_id.val s)$ >> + | Sexpr loc [] -> <:expr< () >> + | Sexpr loc [Slid _ s; e1 :: ([_ :: _] as sel)] + when List.mem s assoc_left_parsed_op_list -> + let rec loop e1 = + fun + [ [] -> e1 + | [e2 :: el] -> loop (op_apply loc e1 e2 s) el ] + in + loop (expr_se e1) (List.map expr_se sel) + | Sexpr loc [Slid _ s :: ([_; _ :: _] as sel)] + when List.mem s assoc_right_parsed_op_list -> + let rec loop = + fun + [ [] -> assert False + | [e1] -> e1 + | [e1 :: el] -> + let e2 = loop el in + op_apply loc e1 e2 s ] + in + loop (List.map expr_se sel) + | Sexpr loc [Slid _ s :: ([_; _ :: _] as sel)] + when List.mem s and_by_couple_op_list -> + let rec loop = + fun + [ [] | [_] -> assert False + | [e1; e2] -> <:expr< $lid:s$ $e1$ $e2$ >> + | [e1 :: ([e2; _ :: _] as el)] -> + let a1 = op_apply loc e1 e2 s in + let a2 = loop el in + <:expr< $a1$ && $a2$ >> ] + in + loop (List.map expr_se sel) + | Sexpr loc [Stid _ s; se] -> + let e = expr_se se in + <:expr< ~ $s$ : $e$ >> + | Sexpr loc [Slid _ "-"; se] -> + let e = expr_se se in + <:expr< - $e$ >> + | Sexpr loc [Slid _ "if"; se; se1] -> + let e = expr_se se in + let e1 = expr_se se1 in + <:expr< if $e$ then $e1$ else () >> + | Sexpr loc [Slid _ "if"; se; se1; se2] -> + let e = expr_se se in + let e1 = expr_se se1 in + let e2 = expr_se se2 in + <:expr< if $e$ then $e1$ else $e2$ >> + | Sexpr loc [Slid _ "cond" :: sel] -> + let rec loop = + fun + [ [Sexpr loc [Slid _ "else" :: sel]] -> begin_se loc sel + | [Sexpr loc [se1 :: sel1] :: sel] -> + let e1 = expr_se se1 in + let e2 = begin_se loc sel1 in + let e3 = loop sel in + <:expr< if $e1$ then $e2$ else $e3$ >> + | [] -> <:expr< () >> + | [se :: _] -> error se "cond clause" ] + in + loop sel + | Sexpr loc [Slid _ "while"; se :: sel] -> + let e = expr_se se in + let el = List.map expr_se sel in + <:expr< while $e$ do { $list:el$ } >> + | Sexpr loc [Slid _ "for"; Slid _ i; se1; se2 :: sel] -> + let i = Pcaml.rename_id.val i in + let e1 = expr_se se1 in + let e2 = expr_se se2 in + let el = List.map expr_se sel in + <:expr< for $i$ = $e1$ to $e2$ do { $list:el$ } >> + | Sexpr loc [Slid loc1 "lambda"] -> <:expr< fun [] >> + | Sexpr loc [Slid loc1 "lambda"; sep :: sel] -> + let e = begin_se loc1 sel in + match ipatt_opt_se sep with + [ Left p -> <:expr< fun $p$ -> $e$ >> + | Right (se, sel) -> + List.fold_right + (fun se e -> + let p = ipatt_se se in + <:expr< fun $p$ -> $e$ >>) + [se :: sel] e ] + | Sexpr loc [Slid _ "lambda_match" :: sel] -> + let pel = List.map (match_case loc) sel in + <:expr< fun [ $list:pel$ ] >> + | Sexpr loc [Slid _ ("let" | "letrec" as r) :: sel] -> + match sel with + [ [Sexpr _ sel1 :: sel2] -> + let r = r = "letrec" in + let lbs = List.map let_binding_se sel1 in + let e = begin_se loc sel2 in + <:expr< let $opt:r$ $list:lbs$ in $e$ >> + | [Slid _ n; Sexpr _ sl :: sel] -> + let n = Pcaml.rename_id.val n in + let (pl, el) = + List.fold_right + (fun se (pl, el) -> + match se with + [ Sexpr _ [se1; se2] -> + ([patt_se se1 :: pl], [expr_se se2 :: el]) + | se -> error se "named let" ]) + sl ([], []) + in + let e1 = + List.fold_right (fun p e -> <:expr< fun $p$ -> $e$ >>) pl + (begin_se loc sel) + in + let e2 = + List.fold_left (fun e1 e2 -> <:expr< $e1$ $e2$ >>) + <:expr< $lid:n$ >> el + in + <:expr< let rec $lid:n$ = $e1$ in $e2$ >> + | [se :: _] -> error se "let_binding" + | _ -> error_loc loc "let_binding" ] + | Sexpr loc [Slid _ "let*" :: sel] -> + match sel with + [ [Sexpr _ sel1 :: sel2] -> + List.fold_right + (fun se ek -> + let (p, e) = let_binding_se se in + <:expr< let $p$ = $e$ in $ek$ >>) + sel1 (begin_se loc sel2) + | [se :: _] -> error se "let_binding" + | _ -> error_loc loc "let_binding" ] + | Sexpr loc [Slid _ "match"; se :: sel] -> + let e = expr_se se in + let pel = List.map (match_case loc) sel in + <:expr< match $e$ with [ $list:pel$ ] >> + | Sexpr loc [Slid _ "parser" :: sel] -> + let e = + match sel with + [ [(Slid _ _ as se) :: sel] -> + let p = patt_se se in + let pc = parser_cases_se loc sel in + <:expr< let $p$ = Stream.count $lid:strm_n$ in $pc$ >> + | _ -> parser_cases_se loc sel ] + in + <:expr< fun ($lid:strm_n$ : Stream.t _) -> $e$ >> + | Sexpr loc [Slid _ "match_with_parser"; se :: sel] -> + let me = expr_se se in + let (bpo, sel) = + match sel with + [ [(Slid _ _ as se) :: sel] -> (Some (patt_se se), sel) + | _ -> (None, sel) ] + in + let pc = parser_cases_se loc sel in + let e = + match bpo with + [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $pc$ >> + | None -> pc ] + in + match me with + [ <:expr< $lid:x$ >> when x = strm_n -> e + | _ -> <:expr< let ($lid:strm_n$ : Stream.t _) = $me$ in $e$ >> ] + | Sexpr loc [Slid _ "try"; se :: sel] -> + let e = expr_se se in + let pel = List.map (match_case loc) sel in + <:expr< try $e$ with [ $list:pel$ ] >> + | Sexpr loc [Slid _ "begin" :: sel] -> + let el = List.map expr_se sel in + <:expr< do { $list:el$ } >> + | Sexpr loc [Slid _ ":="; se1; se2] -> + let e1 = expr_se se1 in + let e2 = expr_se se2 in + <:expr< $e1$ := $e2$ >> + | Sexpr loc [Slid _ "values" :: sel] -> + let el = List.map expr_se sel in + <:expr< ( $list:el$ ) >> + | Srec loc [Slid _ "with"; se :: sel] -> + let e = expr_se se in + let lel = List.map (label_expr_se loc) sel in + <:expr< { ($e$) with $list:lel$ } >> + | Srec loc sel -> + let lel = List.map (label_expr_se loc) sel in + <:expr< { $list:lel$ } >> + | Sexpr loc [Slid _ ":"; se1; se2] -> + let e = expr_se se1 in + let t = ctyp_se se2 in + <:expr< ( $e$ : $t$ ) >> + | Sexpr loc [se] -> + let e = expr_se se in + <:expr< $e$ () >> + | Sexpr loc [Slid _ "assert"; Suid _ "False"] -> <:expr< assert False >> + | Sexpr loc [Slid _ "assert"; se] -> + let e = expr_se se in + <:expr< assert $e$ >> + | Sexpr loc [Slid _ "lazy"; se] -> + let e = expr_se se in + <:expr< lazy $e$ >> + | Sexpr loc [se :: sel] -> + List.fold_left + (fun e se -> + let e1 = expr_se se in + <:expr< $e$ $e1$ >>) + (expr_se se) sel + | Slist loc sel -> + let rec loop = + fun + [ [] -> <:expr< [] >> + | [se1; Slid _ "."; se2] -> + let e = expr_se se1 in + let el = expr_se se2 in + <:expr< [$e$ :: $el$] >> + | [se :: sel] -> + let e = expr_se se in + let el = loop sel in + <:expr< [$e$ :: $el$] >> ] + in + loop sel + | Squot loc typ txt -> Pcaml.handle_expr_quotation loc (typ, txt) ] +and begin_se loc = + fun + [ [] -> <:expr< () >> + | [se] -> expr_se se + | sel -> + let el = List.map expr_se sel in + let loc = (fst (loc_of_sexpr (List.hd sel)), snd loc) in + <:expr< do { $list:el$ } >> ] +and let_binding_se = + fun + [ Sexpr loc [se :: sel] -> + let e = begin_se loc sel in + match ipatt_opt_se se with + [ Left p -> (p, e) + | Right _ -> fun_binding_se se e ] + | se -> error se "let_binding" ] +and fun_binding_se se e = + match se with + [ Sexpr _ [Slid _ "values" :: _] -> (ipatt_se se, e) + | Sexpr _ [Slid loc s :: sel] -> + let s = Pcaml.rename_id.val s in + let e = + List.fold_right + (fun se e -> + let loc = (fst (loc_of_sexpr se), snd (MLast.loc_of_expr e)) in + let p = ipatt_se se in + <:expr< fun $p$ -> $e$ >>) + sel e + in + let p = <:patt< $lid:s$ >> in + (p, e) + | _ -> (ipatt_se se, e) ] +and match_case loc = + fun + [ Sexpr loc [Sexpr _ [Slid _ "when"; se; sew] :: sel] -> + (patt_se se, Some (expr_se sew), begin_se loc sel) + | Sexpr loc [se :: sel] -> (patt_se se, None, begin_se loc sel) + | se -> error se "match_case" ] +and label_expr_se loc = + fun + [ Sexpr _ [se1; se2] -> (patt_se se1, expr_se se2) + | se -> error se "label_expr" ] +and label_patt_se loc = + fun + [ Sexpr _ [se1; se2] -> (patt_se se1, patt_se se2) + | se -> error se "label_patt" ] +and parser_cases_se loc = + fun + [ [] -> <:expr< raise Stream.Failure >> + | [Sexpr loc [Sexpr _ spsel :: act] :: sel] -> + let ekont _ = parser_cases_se loc sel in + let act = + match act with + [ [se] -> expr_se se + | [sep; se] -> + let p = patt_se sep in + let e = expr_se se in + <:expr< let $p$ = Stream.count $lid:strm_n$ in $e$ >> + | _ -> error_loc loc "parser_case" ] + in + stream_pattern_se loc act ekont spsel + | [se :: _] -> error se "parser_case" ] +and stream_pattern_se loc act ekont = + fun + [ [] -> act + | [se :: sel] -> + let ckont err = <:expr< raise (Stream.Error $err$) >> in + let skont = stream_pattern_se loc act ckont sel in + stream_pattern_component skont ekont <:expr< "" >> se ] +and stream_pattern_component skont ekont err = + fun + [ Sexpr loc [Slid _ "`"; se :: wol] -> + let wo = + match wol with + [ [se] -> Some (expr_se se) + | [] -> None + | _ -> error_loc loc "stream_pattern_component" ] + in + let e = peek_fun loc in + let p = patt_se se in + let j = junk_fun loc in + let k = ekont err in + <:expr< match $e$ $lid:strm_n$ with + [ Some $p$ $when:wo$ -> do { $j$ $lid:strm_n$ ; $skont$ } + | _ -> $k$ ] >> + | Sexpr loc [se1; se2] -> + let p = patt_se se1 in + let e = + let e = expr_se se2 in + <:expr< try Some ($e$ $lid:strm_n$) with [ Stream.Failure -> None ] >> + in + let k = ekont err in + <:expr< match $e$ with [ Some $p$ -> $skont$ | _ -> $k$ ] >> + | Sexpr loc [Slid _ "?"; se1; se2] -> + stream_pattern_component skont ekont (expr_se se2) se1 + | Slid loc s -> + let s = Pcaml.rename_id.val s in + <:expr< let $lid:s$ = $lid:strm_n$ in $skont$ >> + | se -> error se "stream_pattern_component" ] +and patt_se = + fun + [ Sacc loc se1 se2 -> + let p1 = patt_se se1 in + let p2 = patt_se se2 in + <:patt< $p1$ . $p2$ >> + | Slid loc "_" -> <:patt< _ >> + | Slid loc s -> <:patt< $lid:(Pcaml.rename_id.val s)$ >> + | Suid loc s -> <:patt< $uid:(Pcaml.rename_id.val s)$ >> + | Sint loc s -> <:patt< $int:s$ >> + | Sfloat loc s -> <:patt< $flo:s$ >> + | Schar loc s -> <:patt< $chr:s$ >> + | Sstring loc s -> <:patt< $str:s$ >> + | Stid loc _ -> error_loc loc "patt" + | Sqid loc _ -> error_loc loc "patt" + | Srec loc sel -> + let lpl = List.map (label_patt_se loc) sel in + <:patt< { $list:lpl$ } >> + | Sexpr loc [Slid _ ":"; se1; se2] -> + let p = patt_se se1 in + let t = ctyp_se se2 in + <:patt< ($p$ : $t$) >> + | Sexpr loc [Slid _ "or"; se :: sel] -> + List.fold_left + (fun p se -> + let p1 = patt_se se in + <:patt< $p$ | $p1$ >>) + (patt_se se) sel + | Sexpr loc [Slid _ "range"; se1; se2] -> + let p1 = patt_se se1 in + let p2 = patt_se se2 in + <:patt< $p1$ .. $p2$ >> + | Sexpr loc [Slid _ "values" :: sel] -> + let pl = List.map patt_se sel in + <:patt< ( $list:pl$ ) >> + | Sexpr loc [Slid _ "as"; se1; se2] -> + let p1 = patt_se se1 in + let p2 = patt_se se2 in + <:patt< ($p1$ as $p2$) >> + | Sexpr loc [se :: sel] -> + List.fold_left + (fun p se -> + let p1 = patt_se se in + <:patt< $p$ $p1$ >>) + (patt_se se) sel + | Sexpr loc [] -> <:patt< () >> + | Slist loc sel -> + let rec loop = + fun + [ [] -> <:patt< [] >> + | [se1; Slid _ "."; se2] -> + let p = patt_se se1 in + let pl = patt_se se2 in + <:patt< [$p$ :: $pl$] >> + | [se :: sel] -> + let p = patt_se se in + let pl = loop sel in + <:patt< [$p$ :: $pl$] >> ] + in + loop sel + | Squot loc typ txt -> Pcaml.handle_patt_quotation loc (typ, txt) ] +and ipatt_se se = + match ipatt_opt_se se with + [ Left p -> p + | Right (se, _) -> error se "ipatt" ] +and ipatt_opt_se = + fun + [ Slid loc "_" -> Left <:patt< _ >> + | Slid loc s -> Left <:patt< $lid:(Pcaml.rename_id.val s)$ >> + | Stid loc s -> Left <:patt< ~ $(Pcaml.rename_id.val s)$ >> + | Sqid loc s -> Left <:patt< ? $(Pcaml.rename_id.val s)$ >> + | Sexpr loc [Sqid _ s; se] -> + let s = Pcaml.rename_id.val s in + let e = expr_se se in + Left <:patt< ? ( $lid:s$ = $e$ ) >> + | Sexpr loc [Slid _ ":"; se1; se2] -> + let p = ipatt_se se1 in + let t = ctyp_se se2 in + Left <:patt< ($p$ : $t$) >> + | Sexpr loc [Slid _ "values" :: sel] -> + let pl = List.map ipatt_se sel in + Left <:patt< ( $list:pl$ ) >> + | Sexpr loc [] -> Left <:patt< () >> + | Sexpr loc [se :: sel] -> Right (se, sel) + | se -> error se "ipatt" ] +and type_declaration_list_se = + fun + [ [se1; se2 :: sel] -> + let (n1, loc1, tpl) = + match se1 with + [ Sexpr _ [Slid loc n :: sel] -> + (n, loc, List.map type_parameter_se sel) + | Slid loc n -> (n, loc, []) + | se -> error se "type declaration" ] + in + [((loc1, Pcaml.rename_id.val n1), tpl, ctyp_se se2, []) :: + type_declaration_list_se sel] + | [] -> [] + | [se :: _] -> error se "type_declaration" ] +and type_parameter_se = + fun + [ Slid _ s when String.length s >= 2 && s.[0] = ''' -> + (String.sub s 1 (String.length s - 1), (False, False)) + | se -> error se "type_parameter" ] +and ctyp_se = + fun + [ Sexpr loc [Slid _ "sum" :: sel] -> + let cdl = List.map constructor_declaration_se sel in + <:ctyp< [ $list:cdl$ ] >> + | Srec loc sel -> + let ldl = List.map label_declaration_se sel in + <:ctyp< { $list:ldl$ } >> + | Sexpr loc [Slid _ "->" :: ([_; _ :: _] as sel)] -> + let rec loop = + fun + [ [] -> assert False + | [se] -> ctyp_se se + | [se :: sel] -> + let t1 = ctyp_se se in + let loc = (fst (loc_of_sexpr se), snd loc) in + let t2 = loop sel in + <:ctyp< $t1$ -> $t2$ >> ] + in + loop sel + | Sexpr loc [Slid _ "*" :: sel] -> + let tl = List.map ctyp_se sel in + <:ctyp< ($list:tl$) >> + | Sexpr loc [se :: sel] -> + List.fold_left + (fun t se -> + let t2 = ctyp_se se in + <:ctyp< $t$ $t2$ >>) + (ctyp_se se) sel + | Sacc loc se1 se2 -> + let t1 = ctyp_se se1 in + let t2 = ctyp_se se2 in + <:ctyp< $t1$ . $t2$ >> + | Slid loc "_" -> <:ctyp< _ >> + | Slid loc s -> + if s.[0] = ''' then + let s = String.sub s 1 (String.length s - 1) in + <:ctyp< '$s$ >> + else <:ctyp< $lid:(Pcaml.rename_id.val s)$ >> + | Suid loc s -> <:ctyp< $uid:(Pcaml.rename_id.val s)$ >> + | se -> error se "ctyp" ] +and constructor_declaration_se = + fun + [ Sexpr loc [Suid _ ci :: sel] -> + (loc, Pcaml.rename_id.val ci, List.map ctyp_se sel) + | se -> error se "constructor_declaration" ] +and label_declaration_se = + fun + [ Sexpr loc [Slid _ lab; Slid _ "mutable"; se] -> + (loc, Pcaml.rename_id.val lab, True, ctyp_se se) + | Sexpr loc [Slid _ lab; se] -> + (loc, Pcaml.rename_id.val lab, False, ctyp_se se) + | se -> error se "label_declaration" ] +; + +value directive_se = + fun + [ Sexpr _ [Slid _ s] -> (s, None) + | Sexpr _ [Slid _ s; se] -> + let e = expr_se se in + (s, Some e) + | se -> error se "directive" ] +; + +(* Parser *) + +Pcaml.syntax_name.val := "Scheme"; +Pcaml.no_constructors_arity.val := False; + +do { + Grammar.Unsafe.gram_reinit gram (lexer_gmake ()); + Grammar.Unsafe.clear_entry interf; + Grammar.Unsafe.clear_entry implem; + Grammar.Unsafe.clear_entry top_phrase; + Grammar.Unsafe.clear_entry use_file; + Grammar.Unsafe.clear_entry module_type; + Grammar.Unsafe.clear_entry module_expr; + Grammar.Unsafe.clear_entry sig_item; + Grammar.Unsafe.clear_entry str_item; + Grammar.Unsafe.clear_entry expr; + Grammar.Unsafe.clear_entry patt; + Grammar.Unsafe.clear_entry ctyp; + Grammar.Unsafe.clear_entry let_binding; + Grammar.Unsafe.clear_entry type_declaration; + Grammar.Unsafe.clear_entry class_type; + Grammar.Unsafe.clear_entry class_expr; + Grammar.Unsafe.clear_entry class_sig_item; + Grammar.Unsafe.clear_entry class_str_item +}; + +Pcaml.parse_interf.val := Grammar.Entry.parse interf; +Pcaml.parse_implem.val := Grammar.Entry.parse implem; + +value sexpr = Grammar.Entry.create gram "sexpr"; + +value rec leftify = + fun + [ Sacc loc1 se1 se2 -> + match leftify se2 with + [ Sacc loc2 se2 se3 -> Sacc loc1 (Sacc loc2 se1 se2) se3 + | se2 -> Sacc loc1 se1 se2 ] + | x -> x ] +; + +EXTEND + GLOBAL: implem interf top_phrase use_file str_item sig_item expr patt sexpr; + implem: + [ [ "#"; se = sexpr -> + let (n, dp) = directive_se se in + ([(<:str_item< # $n$ $opt:dp$ >>, loc)], True) + | si = str_item; x = SELF -> + let (sil, stopped) = x in + let loc = MLast.loc_of_str_item si in + ([(si, loc) :: sil], stopped) + | EOI -> ([], False) ] ] + ; + interf: + [ [ "#"; se = sexpr -> + let (n, dp) = directive_se se in + ([(<:sig_item< # $n$ $opt:dp$ >>, loc)], True) + | si = sig_item; x = SELF -> + let (sil, stopped) = x in + let loc = MLast.loc_of_sig_item si in + ([(si, loc) :: sil], stopped) + | EOI -> ([], False) ] ] + ; + top_phrase: + [ [ "#"; se = sexpr -> + let (n, dp) = directive_se se in + Some <:str_item< # $n$ $opt:dp$ >> + | se = sexpr -> Some (str_item_se se) + | EOI -> None ] ] + ; + use_file: + [ [ "#"; se = sexpr -> + let (n, dp) = directive_se se in + ([<:str_item< # $n$ $opt:dp$ >>], True) + | si = str_item; x = SELF -> + let (sil, stopped) = x in + ([si :: sil], stopped) + | EOI -> ([], False) ] ] + ; + str_item: + [ [ se = sexpr -> str_item_se se + | e = expr -> <:str_item< $exp:e$ >> ] ] + ; + sig_item: + [ [ se = sexpr -> sig_item_se se ] ] + ; + expr: + [ "top" + [ se = sexpr -> expr_se se ] ] + ; + patt: + [ [ se = sexpr -> patt_se se ] ] + ; + sexpr: + [ [ se1 = sexpr_dot; se2 = SELF -> leftify (Sacc loc se1 se2) ] + | [ "("; sl = LIST0 sexpr; ")" -> Sexpr loc sl + | "("; sl = LIST0 sexpr; ")."; se = SELF -> + leftify (Sacc loc (Sexpr loc sl) se) + | "["; sl = LIST0 sexpr; "]" -> Slist loc sl + | "{"; sl = LIST0 sexpr; "}" -> Srec loc sl + | a = pa_extend_keyword -> Slid loc a + | s = LIDENT -> Slid loc s + | s = UIDENT -> Suid loc s + | s = TILDEIDENT -> Stid loc s + | s = QUESTIONIDENT -> Sqid loc s + | s = INT -> Sint loc s + | s = FLOAT -> Sfloat loc s + | s = CHAR -> Schar loc s + | s = STRING -> Sstring loc s + | s = QUOT -> + let i = String.index s ':' in + let typ = String.sub s 0 i in + let txt = String.sub s (i + 1) (String.length s - i - 1) in + Squot loc typ txt ] ] + ; + sexpr_dot: + [ [ s = LIDENTDOT -> Slid loc s + | s = UIDENTDOT -> Suid loc s ] ] + ; + pa_extend_keyword: + [ [ "_" -> "_" + | "," -> "," + | "=" -> "=" + | ":" -> ":" + | "." -> "." + | "/" -> "/" ] ] + ; +END; diff --git a/camlp4/unmaintained/scheme/pa_scheme.sc b/camlp4/unmaintained/scheme/pa_scheme.sc new file mode 100644 index 00000000..cc6de189 --- /dev/null +++ b/camlp4/unmaintained/scheme/pa_scheme.sc @@ -0,0 +1,1029 @@ +; pa_r.cmo pa_rp.cmo pa_extend.cmo q_MLast.cmo pr_dump.cmo +; ********************************************************************** +; +; Camlp4 +; +; Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt +; +; Copyright 2002 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. +; +; ********************************************************************** + +(open Pcaml) +(open Stdpp) + +(type (choice 'a 'b) (sum (Left 'a) (Right 'b))) + +; Buffer + +(module Buff + (struct + (define buff (ref (String.create 80))) + (define (store len x) + (if (>= len (String.length buff.val)) + (:= buff.val (^ buff.val (String.create (String.length buff.val))))) + (:= buff.val.[len] x) + (succ len)) + (define (get len) (String.sub buff.val 0 len)))) + +; Lexer + +(definerec skip_to_eol + (parser + (((` (or '\n' '\r'))) ()) + (((` _) s) (skip_to_eol s)))) + +(define no_ident ['(' ')' '[' ']' '{' '}' ' ' '\t' '\n' '\r' ';']) + +(definerec (ident len) + (parser + (((` '.')) (values (Buff.get len) True)) + (((` x (not (List.mem x no_ident))) s) (ident (Buff.store len x) s)) + (() (values (Buff.get len) False)))) + +(define (identifier kwt (values s dot)) + (let ((con + (try (begin (: (Hashtbl.find kwt s) unit) "") + (Not_found + (match s.[0] + ((range 'A' 'Z') (if dot "UIDENTDOT" "UIDENT")) + (_ (if dot "LIDENTDOT" "LIDENT"))))))) + (values con s))) + +(definerec (string len) + (parser + (((` '"')) (Buff.get len)) + (((` '\\') (` c) s) (string (Buff.store (Buff.store len '\\') c) s)) + (((` x) s) (string (Buff.store len x) s)))) + +(definerec (end_exponent_part_under len) + (parser + (((` (as (range '0' '9') c)) s) + (end_exponent_part_under (Buff.store len c) s)) + (() (values "FLOAT" (Buff.get len))))) + +(define (end_exponent_part len) + (parser + (((` (as (range '0' '9') c)) s) + (end_exponent_part_under (Buff.store len c) s)) + (() (raise (Stream.Error "ill-formed floating-point constant"))))) + +(define (exponent_part len) + (parser + (((` (as (or '+' '-') c)) s) (end_exponent_part (Buff.store len c) s)) + (((a (end_exponent_part len))) a))) + +(definerec (decimal_part len) + (parser + (((` (as (range '0' '9') c)) s) (decimal_part (Buff.store len c) s)) + (((` (or 'e' 'E')) s) (exponent_part (Buff.store len 'E') s)) + (() (values "FLOAT" (Buff.get len))))) + +(definerec (number len) + (parser + (((` (as (range '0' '9') c)) s) (number (Buff.store len c) s)) + (((` '.') s) (decimal_part (Buff.store len '.') s)) + (((` (or 'e' 'E')) s) (exponent_part (Buff.store len 'E') s)) + (() (values "INT" (Buff.get len))))) + +(define binary + (parser + (((` (as (range '0' '1') c))) c))) + +(define octal + (parser + (((` (as (range '0' '7') c))) c))) + +(define hexa + (parser + (((` (as (or (range '0' '9') (range 'a' 'f') (range 'A' 'F')) c))) c))) + +(definerec (digits_under kind len) + (parser + (((d kind) s) (digits_under kind (Buff.store len d) s)) + (() (Buff.get len)))) + +(define (digits kind bp len) + (parser + (((d kind) s) (values "INT" (digits_under kind (Buff.store len d) s))) + ((s) ep + (raise_with_loc (values + (Reloc.shift_pos bp Reloc.zero_loc) + (Reloc.shift_pos ep Reloc.zero_loc)) + (Failure "ill-formed integer constant"))))) + +(define (base_number kwt bp len) + (parser + (((` (or 'b' 'B')) s) (digits binary bp (Buff.store len 'b') s)) + (((` (or 'o' 'O')) s) (digits octal bp (Buff.store len 'o') s)) + (((` (or 'x' 'X')) s) (digits hexa bp (Buff.store len 'x') s)) + (((id (ident (Buff.store 0 '#')))) (identifier kwt id)))) + +(definerec (operator len) + (parser + (((` '.')) (Buff.get (Buff.store len '.'))) + (() (Buff.get len)))) + +(define (char_or_quote_id x) + (parser + (((` ''')) (values "CHAR" (String.make 1 x))) + ((s) ep + (if (List.mem x no_ident) + (Stdpp.raise_with_loc (values + (Reloc.shift_pos (- ep 2) Reloc.zero_loc) + (Reloc.shift_pos (- ep 1) Reloc.zero_loc)) + (Stream.Error "bad quote")) + (let* ((len (Buff.store (Buff.store 0 ''') x)) + ((values s dot) (ident len s))) + (values (if dot "LIDENTDOT" "LIDENT") s)))))) + +(definerec (char len) + (parser + (((` ''')) len) + (((` x) s) (char (Buff.store len x) s)))) + +(define quote + (parser + (((` '\\') (len (char (Buff.store 0 '\\')))) + (values "CHAR" (Buff.get len))) + (((` x) s) (char_or_quote_id x s)))) + +; The system with LIDENTDOT and UIDENTDOT is not great (it would be +; better to have a token DOT (actually SPACEDOT and DOT)) but it is +; the only way (that I have found) to have a good behaviour in the +; toplevel (not expecting tokens after a phrase). Drawbacks: 1/ to be +; complete, we should have STRINGDOT, RIGHTPARENDOT, and so on 2/ the +; parser rule with dot is right associative and we have to reverse +; the resulting tree (using the function leftify). +; This is a complicated issue: the behaviour of the OCaml toplevel +; is strange, anyway. For example, even without Camlp4, The OCaml +; toplevel accepts that: +; # let x = 32;; foo bar match let ) + +(definerec* + ((lexer kwt) + (parser + (((t (lexer0 kwt)) + (_ no_dot)) t))) + (no_dot + (parser + (((` '.')) ep + (Stdpp.raise_with_loc (values + (Reloc.shift_pos (- ep 1) Reloc.zero_loc) + (Reloc.shift_pos ep Reloc.zero_loc)) + (Stream.Error "bad dot"))) + (() ()))) + ((lexer0 kwt) + (parser bp + (((` (or '\t' '\n' '\r')) s) (lexer0 kwt s)) + (((` ' ') s) (after_space kwt s)) + (((` ';') (_ skip_to_eol) s) (lexer kwt s)) + (((` '(')) (values (values "" "(") (values bp (+ bp 1)))) + (((` ')') s) ep (values (values "" (rparen s)) (values bp ep))) + (((` '[')) (values (values "" "[") (values bp (+ bp 1)))) + (((` ']')) (values (values "" "]") (values bp (+ bp 1)))) + (((` '{')) (values (values "" "{") (values bp (+ bp 1)))) + (((` '}')) (values (values "" "}") (values bp (+ bp 1)))) + (((` '"') (s (string 0))) ep + (values (values "STRING" s) (values bp ep))) + (((` ''') (tok quote)) ep (values tok (values bp ep))) + (((` '<') (tok (less kwt))) ep (values tok (values bp ep))) + (((` '-') (tok (minus kwt))) ep (values tok (values bp ep))) + (((` '~') (tok tilde)) ep (values tok (values bp ep))) + (((` '?') (tok question)) ep (values tok (values bp ep))) + (((` '#') (tok (base_number kwt bp (Buff.store 0 '0')))) ep + (values tok (values bp ep))) + (((` (as (range '0' '9') c)) (tok (number (Buff.store 0 c)))) ep + (values tok (values bp ep))) + (((` (as (or '+' '*' '/') c)) (id (operator (Buff.store 0 c)))) ep + (values (identifier kwt (values id False)) (values bp ep))) + (((` x) (id (ident (Buff.store 0 x)))) ep + (values (identifier kwt id) (values bp ep))) + (() (values (values "EOI" "") (values bp (+ bp 1)))))) + (rparen + (parser + (((` '.')) ").") + ((_) ")"))) + ((after_space kwt) + (parser + (((` '.')) ep (values (values "" ".") (values (- ep 1) ep))) + (((x (lexer0 kwt))) x))) + (tilde + (parser + (((` (as (range 'a' 'z') c)) ((values s dot) (ident (Buff.store 0 c)))) + (values "TILDEIDENT" s)) + (() (values "LIDENT" "~")))) + (question + (parser + (((` (as (range 'a' 'z') c)) ((values s dot) (ident (Buff.store 0 c)))) + (values "QUESTIONIDENT" s)) + (() (values "LIDENT" "?")))) + ((minus kwt) + (parser + (((` '.')) (identifier kwt (values "-." False))) + (((` (as (range '0' '9') c)) + (n (number (Buff.store (Buff.store 0 '-') c)))) ep n) + (((id (ident (Buff.store 0 '-')))) (identifier kwt id)))) + ((less kwt) + (parser + (((` ':') (lab (label 0)) (? (` '<') "'<' expected") (q (quotation 0))) + (values "QUOT" (^ lab ":" q))) + (((id (ident (Buff.store 0 '<')))) (identifier kwt id)))) + ((label len) + (parser + (((` (as (or (range 'a' 'z') (range 'A' 'Z') '_') c)) s) + (label (Buff.store len c) s)) + (() (Buff.get len)))) + ((quotation len) + (parser + (((` '>') s) (quotation_greater len s)) + (((` x) s) (quotation (Buff.store len x) s)) + (() (failwith "quotation not terminated")))) + ((quotation_greater len) + (parser + (((` '>')) (Buff.get len)) + (((a (quotation (Buff.store len '>')))) a)))) + +(define (lexer_using kwt (values con prm)) + (match con + ((or "CHAR" "EOI" "INT" "FLOAT" "LIDENT" "LIDENTDOT" "QUESTIONIDENT" + "QUOT" "STRING" "TILDEIDENT" "UIDENT" "UIDENTDOT") + ()) + ("ANTIQUOT" ()) + ("" (try (Hashtbl.find kwt prm) (Not_found (Hashtbl.add kwt prm ())))) + (_ + (raise + (Token.Error + (^ "the constructor \"" con "\" is not recognized by Plexer")))))) + +(define (lexer_text (values con prm)) + (cond + ((= con "") (^ "'"prm "'")) + ((= prm "") con) + (else (^ con " \"" prm "\"")))) + +(define (lexer_gmake ()) + (let ((kwt (Hashtbl.create 89))) + {(Token.tok_func + (Token.lexer_func_of_parser + (lambda (s) + (let (((values r (values bp ep)) (lexer kwt s))) + (values r (values (Reloc.shift_pos bp Reloc.zero_loc) + (Reloc.shift_pos ep Reloc.zero_loc))))))) + (Token.tok_using (lexer_using kwt)) + (Token.tok_removing (lambda)) + (Token.tok_match Token.default_match) + (Token.tok_text lexer_text) + (Token.tok_comm None)})) + +; Building AST + +(type sexpr + (sum + (Sacc MLast.loc sexpr sexpr) + (Schar MLast.loc string) + (Sexpr MLast.loc (list sexpr)) + (Sint MLast.loc string) + (Sfloat MLast.loc string) + (Slid MLast.loc string) + (Slist MLast.loc (list sexpr)) + (Sqid MLast.loc string) + (Squot MLast.loc string string) + (Srec MLast.loc (list sexpr)) + (Sstring MLast.loc string) + (Stid MLast.loc string) + (Suid MLast.loc string))) + +(define loc_of_sexpr + (lambda_match + ((or (Sacc loc _ _) (Schar loc _) (Sexpr loc _) (Sint loc _) + (Sfloat loc _) (Slid loc _) (Slist loc _) (Sqid loc _) (Squot loc _ _) + (Srec loc _) (Sstring loc _) (Stid loc _) (Suid loc _)) + loc))) +(define (error_loc loc err) + (raise_with_loc loc (Stream.Error (^ err " expected")))) +(define (error se err) (error_loc (loc_of_sexpr se) err)) + +(define strm_n "strm__") +(define (peek_fun loc) <:expr< Stream.peek >>) +(define (junk_fun loc) <:expr< Stream.junk >>) + +(define assoc_left_parsed_op_list ["+" "*" "+." "*." "land" "lor" "lxor"]) +(define assoc_right_parsed_op_list ["and" "or" "^" "@"]) +(define and_by_couple_op_list ["=" "<>" "<" ">" "<=" ">=" "==" "!="]) + +(define (op_apply loc e1 e2) + (lambda_match + ("and" <:expr< $e1$ && $e2$ >>) + ("or" <:expr< $e1$ || $e2$ >>) + (x <:expr< $lid:x$ $e1$ $e2$ >>))) + +(define string_se + (lambda_match + ((Sstring loc s) s) + (se (error se "string")))) + +(define mod_ident_se + (lambda_match + ((Suid _ s) [(Pcaml.rename_id.val s)]) + ((Slid _ s) [(Pcaml.rename_id.val s)]) + (se (error se "mod_ident")))) + +(define (lident_expr loc s) + (if (&& (> (String.length s) 1) (= s.[0] '`')) + (let ((s (String.sub s 1 (- (String.length s) 1)))) + <:expr< ` $s$ >>) + <:expr< $lid:(Pcaml.rename_id.val s)$ >>)) + +(definerec* + (module_expr_se + (lambda_match + ((Sexpr loc [(Slid _ "functor") (Suid _ s) se1 se2]) + (let* ((s (Pcaml.rename_id.val s)) + (mt (module_type_se se1)) + (me (module_expr_se se2))) + <:module_expr< functor ($s$ : $mt$) -> $me$ >>)) + ((Sexpr loc [(Slid _ "struct") . sl]) + (let ((mel (List.map str_item_se sl))) + <:module_expr< struct $list:mel$ end >>)) + ((Sexpr loc [se1 se2]) + (let* ((me1 (module_expr_se se1)) + (me2 (module_expr_se se2))) + <:module_expr< $me1$ $me2$ >>)) + ((Suid loc s) <:module_expr< $uid:(Pcaml.rename_id.val s)$ >>) + (se (error se "module expr")))) + (module_type_se + (lambda_match + ((Sexpr loc [(Slid _ "functor") (Suid _ s) se1 se2]) + (let* ((s (Pcaml.rename_id.val s)) + (mt1 (module_type_se se1)) + (mt2 (module_type_se se2))) + <:module_type< functor ($s$ : $mt1$) -> $mt2$ >>)) + ((Sexpr loc [(Slid _ "sig") . sel]) + (let ((sil (List.map sig_item_se sel))) + <:module_type< sig $list:sil$ end >>)) + ((Sexpr loc [(Slid _ "with") se (Sexpr _ sel)]) + (let* ((mt (module_type_se se)) + (wcl (List.map with_constr_se sel))) + <:module_type< $mt$ with $list:wcl$ >>)) + ((Suid loc s) <:module_type< $uid:(Pcaml.rename_id.val s)$ >>) + (se (error se "module type")))) + (with_constr_se + (lambda_match + ((Sexpr loc [(Slid _ "type") se1 se2]) + (let* ((tn (mod_ident_se se1)) + (te (ctyp_se se2))) + (MLast.WcTyp loc tn [] te))) + (se (error se "with constr")))) + (sig_item_se + (lambda_match + ((Sexpr loc [(Slid _ "type") . sel]) + (let ((tdl (type_declaration_list_se sel))) + <:sig_item< type $list:tdl$ >>)) + ((Sexpr loc [(Slid _ "exception") (Suid _ c) . sel]) + (let* ((c (Pcaml.rename_id.val c)) + (tl (List.map ctyp_se sel))) + <:sig_item< exception $c$ of $list:tl$ >>)) + ((Sexpr loc [(Slid _ "value") (Slid _ s) se]) + (let* ((s (Pcaml.rename_id.val s)) + (t (ctyp_se se))) + <:sig_item< value $s$ : $t$ >>)) + ((Sexpr loc [(Slid _ "external") (Slid _ i) se . sel]) + (let* ((i (Pcaml.rename_id.val i)) + (pd (List.map string_se sel)) + (t (ctyp_se se))) + <:sig_item< external $i$ : $t$ = $list:pd$ >>)) + ((Sexpr loc [(Slid _ "module") (Suid _ s) se]) + (let* ((s (Pcaml.rename_id.val s)) + (mb (module_type_se se))) + <:sig_item< module $s$ : $mb$ >>)) + ((Sexpr loc [(Slid _ "moduletype") (Suid _ s) se]) + (let* ((s (Pcaml.rename_id.val s)) + (mt (module_type_se se))) + <:sig_item< module type $s$ = $mt$ >>)) + (se (error se "sig item")))) + ((str_item_se se) + (match se + ((Sexpr loc [(Slid _ "open") se]) + (let ((s (mod_ident_se se))) <:str_item< open $s$ >>)) + ((Sexpr loc [(Slid _ "type") . sel]) + (let ((tdl (type_declaration_list_se sel))) + <:str_item< type $list:tdl$ >>)) + ((Sexpr loc [(Slid _ "exception") (Suid _ c) . sel]) + (let* ((c (Pcaml.rename_id.val c)) + (tl (List.map ctyp_se sel))) + <:str_item< exception $c$ of $list:tl$ >>)) + ((Sexpr loc [(Slid _ (as (or "define" "definerec") r)) se . sel]) + (let* ((r (= r "definerec")) + ((values p e) (fun_binding_se se (begin_se loc sel)))) + <:str_item< value $opt:r$ $p$ = $e$ >>)) + ((Sexpr loc [(Slid _ (as (or "define*" "definerec*") r)) . sel]) + (let* ((r (= r "definerec*")) + (lbs (List.map let_binding_se sel))) + <:str_item< value $opt:r$ $list:lbs$ >>)) + ((Sexpr loc [(Slid _ "external") (Slid _ i) se . sel]) + (let* ((i (Pcaml.rename_id.val i)) + (pd (List.map string_se sel)) + (t (ctyp_se se))) + <:str_item< external $i$ : $t$ = $list:pd$ >>)) + ((Sexpr loc [(Slid _ "module") (Suid _ i) se]) + (let* ((i (Pcaml.rename_id.val i)) + (mb (module_binding_se se))) + <:str_item< module $i$ = $mb$ >>)) + ((Sexpr loc [(Slid _ "moduletype") (Suid _ s) se]) + (let* ((s (Pcaml.rename_id.val s)) + (mt (module_type_se se))) + <:str_item< module type $s$ = $mt$ >>)) + (_ + (let* ((loc (loc_of_sexpr se)) + (e (expr_se se))) + <:str_item< $exp:e$ >>)))) + ((module_binding_se se) (module_expr_se se)) + (expr_se + (lambda_match + ((Sacc loc se1 se2) + (let ((e1 (expr_se se1))) + (match se2 + ((Slist loc [se2]) + (let ((e2 (expr_se se2))) <:expr< $e1$ .[ $e2$ ] >>)) + ((Sexpr loc [se2]) + (let ((e2 (expr_se se2))) <:expr< $e1$ .( $e2$ ) >>)) + (_ (let ((e2 (expr_se se2))) <:expr< $e1$ . $e2$ >>))))) + ((Slid loc s) (lident_expr loc s)) + ((Suid loc s) <:expr< $uid:(Pcaml.rename_id.val s)$ >>) + ((Sint loc s) <:expr< $int:s$ >>) + ((Sfloat loc s) <:expr< $flo:s$ >>) + ((Schar loc s) <:expr< $chr:s$ >>) + ((Sstring loc s) <:expr< $str:s$ >>) + ((Stid loc s) <:expr< ~ $(Pcaml.rename_id.val s)$ >>) + ((Sqid loc s) <:expr< ? $(Pcaml.rename_id.val s)$ >>) + ((Sexpr loc []) <:expr< () >>) + ((when (Sexpr loc [(Slid _ s) e1 . (as [_ . _] sel)]) + (List.mem s assoc_left_parsed_op_list)) + (letrec + (((loop e1) + (lambda_match + ([] e1) + ([e2 . el] (loop (op_apply loc e1 e2 s) el))))) + (loop (expr_se e1) (List.map expr_se sel)))) + ((when (Sexpr loc [(Slid _ s) . (as [_ _ . _] sel)]) + (List.mem s assoc_right_parsed_op_list)) + (letrec + ((loop + (lambda_match + ([] + (assert False)) + ([e1] e1) + ([e1 . el] (let ((e2 (loop el))) (op_apply loc e1 e2 s)))))) + (loop (List.map expr_se sel)))) + ((when (Sexpr loc [(Slid _ s) . (as [_ _ . _] sel)]) + (List.mem s and_by_couple_op_list)) + (letrec + ((loop + (lambda_match + ((or [] [_]) (assert False)) + ([e1 e2] <:expr< $lid:s$ $e1$ $e2$ >>) + ([e1 . (as [e2 _ . _] el)] + (let* ((a1 (op_apply loc e1 e2 s)) + (a2 (loop el))) + <:expr< $a1$ && $a2$ >>))))) + (loop (List.map expr_se sel)))) + ((Sexpr loc [(Stid _ s) se]) + (let ((e (expr_se se))) <:expr< ~ $s$ : $e$ >>)) + ((Sexpr loc [(Slid _ "-") se]) + (let ((e (expr_se se))) <:expr< - $e$ >>)) + ((Sexpr loc [(Slid _ "if") se se1]) + (let* ((e (expr_se se)) + (e1 (expr_se se1))) + <:expr< if $e$ then $e1$ else () >>)) + ((Sexpr loc [(Slid _ "if") se se1 se2]) + (let* ((e (expr_se se)) + (e1 (expr_se se1)) + (e2 (expr_se se2))) + <:expr< if $e$ then $e1$ else $e2$ >>)) + ((Sexpr loc [(Slid _ "cond") . sel]) + (letrec + ((loop + (lambda_match + ([(Sexpr loc [(Slid _ "else") . sel])] (begin_se loc sel)) + ([(Sexpr loc [se1 . sel1]) . sel] + (let* ((e1 (expr_se se1)) + (e2 (begin_se loc sel1)) + (e3 (loop sel))) + <:expr< if $e1$ then $e2$ else $e3$ >>)) + ([] <:expr< () >>) + ([se . _] (error se "cond clause"))))) + (loop sel))) + ((Sexpr loc [(Slid _ "while") se . sel]) + (let* ((e (expr_se se)) + (el (List.map expr_se sel))) + <:expr< while $e$ do { $list:el$ } >>)) + ((Sexpr loc [(Slid _ "for") (Slid _ i) se1 se2 . sel]) + (let* ((i (Pcaml.rename_id.val i)) + (e1 (expr_se se1)) + (e2 (expr_se se2)) + (el (List.map expr_se sel))) + <:expr< for $i$ = $e1$ to $e2$ do { $list:el$ } >>)) + ((Sexpr loc [(Slid loc1 "lambda")]) <:expr< fun [] >>) + ((Sexpr loc [(Slid loc1 "lambda") sep . sel]) + (let ((e (begin_se loc1 sel))) + (match (ipatt_opt_se sep) + ((Left p) <:expr< fun $p$ -> $e$ >>) + ((Right (values se sel)) + (List.fold_right + (lambda (se e) + (let ((p (ipatt_se se))) <:expr< fun $p$ -> $e$ >>)) + [se . sel] e))))) + ((Sexpr loc [(Slid _ "lambda_match") . sel]) + (let ((pel (List.map (match_case loc) sel))) + <:expr< fun [ $list:pel$ ] >>)) + ((Sexpr loc [(Slid _ (as (or "let" "letrec") r)) . sel]) + (match sel + ([(Sexpr _ sel1) . sel2] + (let* ((r (= r "letrec")) + (lbs (List.map let_binding_se sel1)) + (e (begin_se loc sel2))) + <:expr< let $opt:r$ $list:lbs$ in $e$ >>)) + ([(Slid _ n) (Sexpr _ sl) . sel] + (let* ((n (Pcaml.rename_id.val n)) + ((values pl el) + (List.fold_right + (lambda (se (values pl el)) + (match se + ((Sexpr _ [se1 se2]) + (values [(patt_se se1) . pl] + [(expr_se se2) . el])) + (se (error se "named let")))) + sl (values [] []))) + (e1 + (List.fold_right + (lambda (p e) <:expr< fun $p$ -> $e$ >>) + pl (begin_se loc sel))) + (e2 + (List.fold_left + (lambda (e1 e2) <:expr< $e1$ $e2$ >>) + <:expr< $lid:n$ >> el))) + <:expr< let rec $lid:n$ = $e1$ in $e2$ >>)) + ([se . _] (error se "let_binding")) + (_ (error_loc loc "let_binding")))) + ((Sexpr loc [(Slid _ "let*") . sel]) + (match sel + ([(Sexpr _ sel1) . sel2] + (List.fold_right + (lambda (se ek) + (let (((values p e) (let_binding_se se))) + <:expr< let $p$ = $e$ in $ek$ >>)) + sel1 (begin_se loc sel2))) + ([se . _] (error se "let_binding")) + (_ (error_loc loc "let_binding")))) + ((Sexpr loc [(Slid _ "match") se . sel]) + (let* ((e (expr_se se)) + (pel (List.map (match_case loc) sel))) + <:expr< match $e$ with [ $list:pel$ ] >>)) + ((Sexpr loc [(Slid _ "parser") . sel]) + (let ((e + (match sel + ([(as (Slid _ _) se) . sel] + (let* ((p (patt_se se)) + (pc (parser_cases_se loc sel))) + <:expr< let $p$ = Stream.count $lid:strm_n$ in $pc$ >>)) + (_ (parser_cases_se loc sel))))) + <:expr< fun ($lid:strm_n$ : Stream.t _) -> $e$ >>)) + ((Sexpr loc [(Slid _ "match_with_parser") se . sel]) + (let* ((me (expr_se se)) + ((values bpo sel) + (match sel + ([(as (Slid _ _) se) . sel] (values (Some (patt_se se)) sel)) + (_ (values None sel)))) + (pc (parser_cases_se loc sel)) + (e + (match bpo + ((Some bp) + <:expr< let $bp$ = Stream.count $lid:strm_n$ in $pc$ >>) + (None pc)))) + (match me + ((when <:expr< $lid:x$ >> (= x strm_n)) e) + (_ <:expr< let ($lid:strm_n$ : Stream.t _) = $me$ in $e$ >>)))) + ((Sexpr loc [(Slid _ "try") se . sel]) + (let* ((e (expr_se se)) + (pel (List.map (match_case loc) sel))) + <:expr< try $e$ with [ $list:pel$ ] >>)) + ((Sexpr loc [(Slid _ "begin") . sel]) + (let ((el (List.map expr_se sel))) <:expr< do { $list:el$ } >>)) + ((Sexpr loc [(Slid _ ":=") se1 se2]) + (let* ((e1 (expr_se se1)) + (e2 (expr_se se2))) + <:expr< $e1$ := $e2$ >>)) + ((Sexpr loc [(Slid _ "values") . sel]) + (let ((el (List.map expr_se sel))) <:expr< ( $list:el$ ) >>)) + ((Srec loc [(Slid _ "with") se . sel]) + (let* ((e (expr_se se)) + (lel (List.map (label_expr_se loc) sel))) + <:expr< { ($e$) with $list:lel$ } >>)) + ((Srec loc sel) + (let ((lel (List.map (label_expr_se loc) sel))) + <:expr< { $list:lel$ } >>)) + ((Sexpr loc [(Slid _ ":") se1 se2]) + (let* ((e (expr_se se1)) (t (ctyp_se se2))) <:expr< ( $e$ : $t$ ) >>)) + ((Sexpr loc [se]) (let ((e (expr_se se))) <:expr< $e$ () >>)) + ((Sexpr loc [(Slid _ "assert") (Suid _ "False")]) + <:expr< assert False >>) + ((Sexpr loc [(Slid _ "assert") se]) + (let ((e (expr_se se))) <:expr< assert $e$ >>)) + ((Sexpr loc [(Slid _ "lazy") se]) + (let ((e (expr_se se))) <:expr< lazy $e$ >>)) + ((Sexpr loc [se . sel]) + (List.fold_left + (lambda (e se) (let ((e1 (expr_se se))) <:expr< $e$ $e1$ >>)) + (expr_se se) sel)) + ((Slist loc sel) + (letrec ((loop + (lambda_match + ([] <:expr< [] >>) + ([se1 (Slid _ ".") se2] + (let* ((e (expr_se se1)) + (el (expr_se se2))) + <:expr< [$e$ :: $el$] >>)) + ([se . sel] + (let* ((e (expr_se se)) + (el (loop sel))) + <:expr< [$e$ :: $el$] >>))))) + (loop sel))) + ((Squot loc typ txt) + (Pcaml.handle_expr_quotation loc (values typ txt))))) + ((begin_se loc) + (lambda_match + ([] <:expr< () >>) + ([se] (expr_se se)) + ((sel) + (let* ((el (List.map expr_se sel)) + (loc (values (fst (loc_of_sexpr (List.hd sel))) (snd loc)))) + <:expr< do { $list:el$ } >>)))) + (let_binding_se + (lambda_match + ((Sexpr loc [se . sel]) + (let ((e (begin_se loc sel))) + (match (ipatt_opt_se se) + ((Left p) (values p e)) + ((Right _) (fun_binding_se se e))))) + (se (error se "let_binding")))) + ((fun_binding_se se e) + (match se + ((Sexpr _ [(Slid _ "values") . _]) (values (ipatt_se se) e)) + ((Sexpr _ [(Slid loc s) . sel]) + (let* ((s (Pcaml.rename_id.val s)) + (e + (List.fold_right + (lambda (se e) + (let* ((loc + (values (fst (loc_of_sexpr se)) + (snd (MLast.loc_of_expr e)))) + (p (ipatt_se se))) + <:expr< fun $p$ -> $e$ >>)) + sel e)) + (p <:patt< $lid:s$ >>)) + (values p e))) + ((_) (values (ipatt_se se) e)))) + ((match_case loc) + (lambda_match + ((Sexpr loc [(Sexpr _ [(Slid _ "when") se sew]) . sel]) + (values (patt_se se) (Some (expr_se sew)) (begin_se loc sel))) + ((Sexpr loc [se . sel]) + (values (patt_se se) None (begin_se loc sel))) + (se (error se "match_case")))) + ((label_expr_se loc) + (lambda_match + ((Sexpr _ [se1 se2]) (values (patt_se se1) (expr_se se2))) + (se (error se "label_expr")))) + ((label_patt_se loc) + (lambda_match + ((Sexpr _ [se1 se2]) (values (patt_se se1) (patt_se se2))) + (se (error se "label_patt")))) + ((parser_cases_se loc) + (lambda_match + ([] <:expr< raise Stream.Failure >>) + ([(Sexpr loc [(Sexpr _ spsel) . act]) . sel] + (let* ((ekont (lambda _ (parser_cases_se loc sel))) + (act (match act + ([se] (expr_se se)) + ([sep se] + (let* ((p (patt_se sep)) + (e (expr_se se))) + <:expr< let $p$ = Stream.count $lid:strm_n$ in $e$ >>)) + (_ (error_loc loc "parser_case"))))) + (stream_pattern_se loc act ekont spsel))) + ([se . _] + (error se "parser_case")))) + ((stream_pattern_se loc act ekont) + (lambda_match + ([] act) + ([se . sel] + (let* ((ckont (lambda err <:expr< raise (Stream.Error $err$) >>)) + (skont (stream_pattern_se loc act ckont sel))) + (stream_pattern_component skont ekont <:expr< "" >> se))))) + ((stream_pattern_component skont ekont err) + (lambda_match + ((Sexpr loc [(Slid _ "`") se . wol]) + (let* ((wo (match wol + ([se] (Some (expr_se se))) + ([] None) + (_ (error_loc loc "stream_pattern_component")))) + (e (peek_fun loc)) + (p (patt_se se)) + (j (junk_fun loc)) + (k (ekont err))) + <:expr< match $e$ $lid:strm_n$ with + [ Some $p$ $when:wo$ -> do { $j$ $lid:strm_n$ ; $skont$ } + | _ -> $k$ ] >>)) + ((Sexpr loc [se1 se2]) + (let* ((p (patt_se se1)) + (e (let ((e (expr_se se2))) + <:expr< try Some ($e$ $lid:strm_n$) with [ Stream.Failure -> None ] >>)) + (k (ekont err))) + <:expr< match $e$ with [ Some $p$ -> $skont$ | _ -> $k$ ] >>)) + ((Sexpr loc [(Slid _ "?") se1 se2]) + (stream_pattern_component skont ekont (expr_se se2) se1)) + ((Slid loc s) + (let ((s (Pcaml.rename_id.val s))) + <:expr< let $lid:s$ = $lid:strm_n$ in $skont$ >>)) + (se + (error se "stream_pattern_component")))) + (patt_se + (lambda_match + ((Sacc loc se1 se2) + (let* ((p1 (patt_se se1)) (p2 (patt_se se2))) <:patt< $p1$ . $p2$ >>)) + ((Slid loc "_") <:patt< _ >>) + ((Slid loc s) <:patt< $lid:(Pcaml.rename_id.val s)$ >>) + ((Suid loc s) <:patt< $uid:(Pcaml.rename_id.val s)$ >>) + ((Sint loc s) <:patt< $int:s$ >>) + ((Sfloat loc s) <:patt< $flo:s$ >>) + ((Schar loc s) <:patt< $chr:s$ >>) + ((Sstring loc s) <:patt< $str:s$ >>) + ((Stid loc _) (error_loc loc "patt")) + ((Sqid loc _) (error_loc loc "patt")) + ((Srec loc sel) + (let ((lpl (List.map (label_patt_se loc) sel))) + <:patt< { $list:lpl$ } >>)) + ((Sexpr loc [(Slid _ ":") se1 se2]) + (let* ((p (patt_se se1)) (t (ctyp_se se2))) <:patt< ($p$ : $t$) >>)) + ((Sexpr loc [(Slid _ "or") se . sel]) + (List.fold_left + (lambda (p se) (let ((p1 (patt_se se))) <:patt< $p$ | $p1$ >>)) + (patt_se se) sel)) + ((Sexpr loc [(Slid _ "range") se1 se2]) + (let* ((p1 (patt_se se1)) (p2 (patt_se se2))) <:patt< $p1$ .. $p2$ >>)) + ((Sexpr loc [(Slid _ "values") . sel]) + (let ((pl (List.map patt_se sel))) <:patt< ( $list:pl$ ) >>)) + ((Sexpr loc [(Slid _ "as") se1 se2]) + (let* ((p1 (patt_se se1)) + (p2 (patt_se se2))) + <:patt< ($p1$ as $p2$) >>)) + ((Sexpr loc [se . sel]) + (List.fold_left + (lambda (p se) (let ((p1 (patt_se se))) <:patt< $p$ $p1$ >>)) + (patt_se se) sel)) + ((Sexpr loc []) <:patt< () >>) + ((Slist loc sel) + (letrec ((loop + (lambda_match + ([] <:patt< [] >>) + ([se1 (Slid _ ".") se2] + (let* ((p (patt_se se1)) + (pl (patt_se se2))) + <:patt< [$p$ :: $pl$] >>)) + ([se . sel] + (let* ((p (patt_se se)) + (pl (loop sel))) + <:patt< [$p$ :: $pl$] >>))))) + (loop sel))) + ((Squot loc typ txt) + (Pcaml.handle_patt_quotation loc (values typ txt))))) + ((ipatt_se se) + (match (ipatt_opt_se se) + ((Left p) p) + ((Right (values se _)) (error se "ipatt")))) + (ipatt_opt_se + (lambda_match + ((Slid loc "_") (Left <:patt< _ >>)) + ((Slid loc s) (Left <:patt< $lid:(Pcaml.rename_id.val s)$ >>)) + ((Stid loc s) (Left <:patt< ~ $(Pcaml.rename_id.val s)$ >>)) + ((Sqid loc s) (Left <:patt< ? $(Pcaml.rename_id.val s)$ >>)) + ((Sexpr loc [(Sqid _ s) se]) + (let* ((s (Pcaml.rename_id.val s)) + (e (expr_se se))) + (Left <:patt< ? ( $lid:s$ = $e$ ) >>))) + ((Sexpr loc [(Slid _ ":") se1 se2]) + (let* ((p (ipatt_se se1)) (t (ctyp_se se2))) + (Left <:patt< ($p$ : $t$) >>))) + ((Sexpr loc [(Slid _ "values") . sel]) + (let ((pl (List.map ipatt_se sel))) (Left <:patt< ( $list:pl$ ) >>))) + ((Sexpr loc []) (Left <:patt< () >>)) + ((Sexpr loc [se . sel]) (Right (values se sel))) + (se (error se "ipatt")))) + (type_declaration_list_se + (lambda_match + ([se1 se2 . sel] + (let (((values n1 loc1 tpl) + (match se1 + ((Sexpr _ [(Slid loc n) . sel]) + (values n loc (List.map type_parameter_se sel))) + ((Slid loc n) + (values n loc [])) + ((se) + (error se "type declaration"))))) + [(values (values loc1 (Pcaml.rename_id.val n1)) tpl (ctyp_se se2) []) . + (type_declaration_list_se sel)])) + ([] []) + ([se . _] (error se "type_declaration")))) + (type_parameter_se + (lambda_match + ((when (Slid _ s) (and (>= (String.length s) 2) (= s.[0] '''))) + (values (String.sub s 1 (- (String.length s) 1)) (values False False))) + (se + (error se "type_parameter")))) + (ctyp_se + (lambda_match + ((Sexpr loc [(Slid _ "sum") . sel]) + (let ((cdl (List.map constructor_declaration_se sel))) + <:ctyp< [ $list:cdl$ ] >>)) + ((Srec loc sel) + (let ((ldl (List.map label_declaration_se sel))) + <:ctyp< { $list:ldl$ } >>)) + ((Sexpr loc [(Slid _ "->") . (as [_ _ . _] sel)]) + (letrec + ((loop + (lambda_match + ([] (assert False)) + ([se] (ctyp_se se)) + ([se . sel] + (let* ((t1 (ctyp_se se)) + (loc (values (fst (loc_of_sexpr se)) (snd loc))) + (t2 (loop sel))) + <:ctyp< $t1$ -> $t2$ >>))))) + (loop sel))) + ((Sexpr loc [(Slid _ "*") . sel]) + (let ((tl (List.map ctyp_se sel))) <:ctyp< ($list:tl$) >>)) + ((Sexpr loc [se . sel]) + (List.fold_left + (lambda (t se) (let ((t2 (ctyp_se se))) <:ctyp< $t$ $t2$ >>)) + (ctyp_se se) sel)) + ((Sacc loc se1 se2) + (let* ((t1 (ctyp_se se1)) (t2 (ctyp_se se2))) <:ctyp< $t1$ . $t2$ >>)) + ((Slid loc "_") <:ctyp< _ >>) + ((Slid loc s) + (if (= s.[0] ''') + (let ((s (String.sub s 1 (- (String.length s) 1)))) + <:ctyp< '$s$ >>) + <:ctyp< $lid:(Pcaml.rename_id.val s)$ >>)) + ((Suid loc s) <:ctyp< $uid:(Pcaml.rename_id.val s)$ >>) + (se (error se "ctyp")))) + (constructor_declaration_se + (lambda_match + ((Sexpr loc [(Suid _ ci) . sel]) + (values loc (Pcaml.rename_id.val ci) (List.map ctyp_se sel))) + (se + (error se "constructor_declaration")))) + (label_declaration_se + (lambda_match + ((Sexpr loc [(Slid _ lab) (Slid _ "mutable") se]) + (values loc (Pcaml.rename_id.val lab) True (ctyp_se se))) + ((Sexpr loc [(Slid _ lab) se]) + (values loc (Pcaml.rename_id.val lab) False (ctyp_se se))) + (se + (error se "label_declaration"))))) + +(define directive_se + (lambda_match + ((Sexpr _ [(Slid _ s)]) (values s None)) + ((Sexpr _ [(Slid _ s) se]) (let ((e (expr_se se))) (values s (Some e)))) + (se (error se "directive")))) + +; Parser + +(:= Pcaml.syntax_name.val "Scheme") +(:= Pcaml.no_constructors_arity.val False) + +(begin + (Grammar.Unsafe.gram_reinit gram (lexer_gmake ())) + (Grammar.Unsafe.clear_entry interf) + (Grammar.Unsafe.clear_entry implem) + (Grammar.Unsafe.clear_entry top_phrase) + (Grammar.Unsafe.clear_entry use_file) + (Grammar.Unsafe.clear_entry module_type) + (Grammar.Unsafe.clear_entry module_expr) + (Grammar.Unsafe.clear_entry sig_item) + (Grammar.Unsafe.clear_entry str_item) + (Grammar.Unsafe.clear_entry expr) + (Grammar.Unsafe.clear_entry patt) + (Grammar.Unsafe.clear_entry ctyp) + (Grammar.Unsafe.clear_entry let_binding) + (Grammar.Unsafe.clear_entry type_declaration) + (Grammar.Unsafe.clear_entry class_type) + (Grammar.Unsafe.clear_entry class_expr) + (Grammar.Unsafe.clear_entry class_sig_item) + (Grammar.Unsafe.clear_entry class_str_item)) + +(:= Pcaml.parse_interf.val (Grammar.Entry.parse interf)) +(:= Pcaml.parse_implem.val (Grammar.Entry.parse implem)) + +(define sexpr (Grammar.Entry.create gram "sexpr")) + +(definerec leftify + (lambda_match + ((Sacc loc1 se1 se2) + (match (leftify se2) + ((Sacc loc2 se2 se3) (Sacc loc1 (Sacc loc2 se1 se2) se3)) + (se2 (Sacc loc1 se1 se2)))) + (x x))) + +EXTEND + GLOBAL : implem interf top_phrase use_file str_item sig_item expr + patt sexpr / + implem : + [ [ "#" / se = sexpr -> + (let (((values n dp) (directive_se se))) + (values [(values <:str_item< # $n$ $opt:dp$ >> loc)] True)) + | si = str_item / x = SELF -> + (let* (((values sil stopped) x) + (loc (MLast.loc_of_str_item si))) + (values [(values si loc) . sil] stopped)) + | EOI -> (values [] False) ] ] + / + interf : + [ [ "#" / se = sexpr -> + (let (((values n dp) (directive_se se))) + (values [(values <:sig_item< # $n$ $opt:dp$ >> loc)] True)) + | si = sig_item / x = SELF -> + (let* (((values sil stopped) x) + (loc (MLast.loc_of_sig_item si))) + (values [(values si loc) . sil] stopped)) + | EOI -> (values [] False) ] ] + / + top_phrase : + [ [ "#" / se = sexpr -> + (let (((values n dp) (directive_se se))) + (Some <:str_item< # $n$ $opt:dp$ >>)) + | se = sexpr -> (Some (str_item_se se)) + | EOI -> None ] ] + / + use_file : + [ [ "#" / se = sexpr -> + (let (((values n dp) (directive_se se))) + (values [<:str_item< # $n$ $opt:dp$ >>] True)) + | si = str_item / x = SELF -> + (let (((values sil stopped) x)) (values [si . sil] stopped)) + | EOI -> (values [] False) ] ] + / + str_item : + [ [ se = sexpr -> (str_item_se se) + | e = expr -> <:str_item< $exp:e$ >> ] ] + / + sig_item : + [ [ se = sexpr -> (sig_item_se se) ] ] + / + expr : + [ "top" + [ se = sexpr -> (expr_se se) ] ] + / + patt : + [ [ se = sexpr -> (patt_se se) ] ] + / + sexpr : + [ [ se1 = sexpr_dot / se2 = sexpr -> (leftify (Sacc loc se1 se2)) ] + | [ "(" / sl = LIST0 sexpr / ")" -> (Sexpr loc sl) + | "(" / sl = LIST0 sexpr / ")." / se = sexpr -> + (leftify (Sacc loc (Sexpr loc sl) se)) + | "[" / sl = LIST0 sexpr / "]" -> (Slist loc sl) + | "{" / sl = LIST0 sexpr / "}" -> (Srec loc sl) + | a = pa_extend_keyword -> (Slid loc a) + | s = LIDENT -> (Slid loc s) + | s = UIDENT -> (Suid loc s) + | s = TILDEIDENT -> (Stid loc s) + | s = QUESTIONIDENT -> (Sqid loc s) + | s = INT -> (Sint loc s) + | s = FLOAT -> (Sfloat loc s) + | s = CHAR -> (Schar loc s) + | s = STRING -> (Sstring loc s) + | s = QUOT -> + (let* ((i (String.index s ':')) + (typ (String.sub s 0 i)) + (txt (String.sub s (+ i 1) (- (- (String.length s) i) 1)))) + (Squot loc typ txt)) ] ] + / + sexpr_dot : + [ [ s = LIDENTDOT -> (Slid loc s) + | s = UIDENTDOT -> (Suid loc s) ] ] + / + pa_extend_keyword : + [ [ "_" -> "_" + | "," -> "," + | "=" -> "=" + | ":" -> ":" + | "." -> "." + | "/" -> "/" ] ] + / +END diff --git a/camlp4/unmaintained/scheme/pr_scheme.ml b/camlp4/unmaintained/scheme/pr_scheme.ml new file mode 100644 index 00000000..a9cf348e --- /dev/null +++ b/camlp4/unmaintained/scheme/pr_scheme.ml @@ -0,0 +1,826 @@ +(* pa_r.cmo q_MLast.cmo pa_extfun.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + +open Pcaml; +open Format; + +type printer_t 'a = + { pr_fun : mutable string -> next 'a; + pr_levels : mutable list (pr_level 'a) } +and pr_level 'a = + { pr_label : string; + pr_box : formatter -> (formatter -> unit) -> 'a -> unit; + pr_rules : mutable pr_rule 'a } +and pr_rule 'a = + Extfun.t 'a (formatter -> curr 'a -> next 'a -> string -> kont -> unit) +and curr 'a = formatter -> ('a * string * kont) -> unit +and next 'a = formatter -> ('a * string * kont) -> unit +and kont = formatter -> unit; + +value not_impl name x ppf k = + let desc = + if Obj.is_block (Obj.repr x) then + "tag = " ^ string_of_int (Obj.tag (Obj.repr x)) + else "int_val = " ^ string_of_int (Obj.magic x) + in + fprintf ppf "%t" name desc k +; + +value pr_fun name pr lab = + loop False pr.pr_levels where rec loop app = + fun + [ [] -> fun ppf (x, dg, k) -> failwith ("unable to print " ^ name) + | [lev :: levl] -> + if app || lev.pr_label = lab then + let next = loop True levl in + let rec curr ppf (x, dg, k) = + Extfun.apply lev.pr_rules x ppf curr next dg k + in + fun ppf ((x, _, _) as n) -> lev.pr_box ppf (fun ppf -> curr ppf n) x + else loop app levl ] +; + +value rec find_pr_level lab = + fun + [ [] -> failwith ("level " ^ lab ^ " not found") + | [lev :: levl] -> + if lev.pr_label = lab then lev else find_pr_level lab levl ] +; + +value pr_constr_decl = {pr_fun = fun []; pr_levels = []}; +value constr_decl ppf (x, k) = pr_constr_decl.pr_fun "top" ppf (x, "", k); +pr_constr_decl.pr_fun := pr_fun "constr_decl" pr_constr_decl; + +value pr_ctyp = {pr_fun = fun []; pr_levels = []}; +pr_ctyp.pr_fun := pr_fun "ctyp" pr_ctyp; +value ctyp ppf (x, k) = pr_ctyp.pr_fun "top" ppf (x, "", k); + +value pr_expr = {pr_fun = fun []; pr_levels = []}; +pr_expr.pr_fun := pr_fun "expr" pr_expr; +value expr ppf (x, k) = pr_expr.pr_fun "top" ppf (x, "", k); + +value pr_label_decl = {pr_fun = fun []; pr_levels = []}; +value label_decl ppf (x, k) = pr_label_decl.pr_fun "top" ppf (x, "", k); +pr_label_decl.pr_fun := pr_fun "label_decl" pr_label_decl; + +value pr_let_binding = {pr_fun = fun []; pr_levels = []}; +pr_let_binding.pr_fun := pr_fun "let_binding" pr_let_binding; +value let_binding ppf (x, k) = pr_let_binding.pr_fun "top" ppf (x, "", k); + +value pr_match_assoc = {pr_fun = fun []; pr_levels = []}; +pr_match_assoc.pr_fun := pr_fun "match_assoc" pr_match_assoc; +value match_assoc ppf (x, k) = pr_match_assoc.pr_fun "top" ppf (x, "", k); + +value pr_mod_ident = {pr_fun = fun []; pr_levels = []}; +pr_mod_ident.pr_fun := pr_fun "mod_ident" pr_mod_ident; +value mod_ident ppf (x, k) = pr_mod_ident.pr_fun "top" ppf (x, "", k); + +value pr_module_binding = {pr_fun = fun []; pr_levels = []}; +pr_module_binding.pr_fun := pr_fun "module_binding" pr_module_binding; +value module_binding ppf (x, k) = + pr_module_binding.pr_fun "top" ppf (x, "", k); + +value pr_module_expr = {pr_fun = fun []; pr_levels = []}; +pr_module_expr.pr_fun := pr_fun "module_expr" pr_module_expr; +value module_expr ppf (x, k) = pr_module_expr.pr_fun "top" ppf (x, "", k); + +value pr_module_type = {pr_fun = fun []; pr_levels = []}; +pr_module_type.pr_fun := pr_fun "module_type" pr_module_type; +value module_type ppf (x, k) = pr_module_type.pr_fun "top" ppf (x, "", k); + +value pr_patt = {pr_fun = fun []; pr_levels = []}; +pr_patt.pr_fun := pr_fun "patt" pr_patt; +value patt ppf (x, k) = pr_patt.pr_fun "top" ppf (x, "", k); + +value pr_sig_item = {pr_fun = fun []; pr_levels = []}; +pr_sig_item.pr_fun := pr_fun "sig_item" pr_sig_item; +value sig_item ppf (x, k) = pr_sig_item.pr_fun "top" ppf (x, "", k); + +value pr_str_item = {pr_fun = fun []; pr_levels = []}; +pr_str_item.pr_fun := pr_fun "str_item" pr_str_item; +value str_item ppf (x, k) = pr_str_item.pr_fun "top" ppf (x, "", k); + +value pr_type_decl = {pr_fun = fun []; pr_levels = []}; +value type_decl ppf (x, k) = pr_type_decl.pr_fun "top" ppf (x, "", k); +pr_type_decl.pr_fun := pr_fun "type_decl" pr_type_decl; + +value pr_type_params = {pr_fun = fun []; pr_levels = []}; +value type_params ppf (x, k) = pr_type_params.pr_fun "top" ppf (x, "", k); +pr_type_params.pr_fun := pr_fun "type_params" pr_type_params; + +value pr_with_constr = {pr_fun = fun []; pr_levels = []}; +value with_constr ppf (x, k) = pr_with_constr.pr_fun "top" ppf (x, "", k); +pr_with_constr.pr_fun := pr_fun "with_constr" pr_with_constr; + +(* general functions *) + +value nok ppf = (); +value ks s k ppf = fprintf ppf "%s%t" s k; + +value rec list f ppf (l, k) = + match l with + [ [] -> k ppf + | [x] -> f ppf (x, k) + | [x :: l] -> fprintf ppf "%a@ %a" f (x, nok) (list f) (l, k) ] +; + +value rec listwb b f ppf (l, k) = + match l with + [ [] -> k ppf + | [x] -> f ppf ((b, x), k) + | [x :: l] -> fprintf ppf "%a@ %a" f ((b, x), nok) (listwb "" f) (l, k) ] +; + +(* specific functions *) + +value rec is_irrefut_patt = + fun + [ <:patt< $lid:_$ >> -> True + | <:patt< () >> -> True + | <:patt< _ >> -> True + | <:patt< ($x$ as $y$) >> -> is_irrefut_patt x && is_irrefut_patt y + | <:patt< { $list:fpl$ } >> -> + List.for_all (fun (_, p) -> is_irrefut_patt p) fpl + | <:patt< ($p$ : $_$) >> -> is_irrefut_patt p + | <:patt< ($list:pl$) >> -> List.for_all is_irrefut_patt pl + | <:patt< ? $_$ : ( $p$ ) >> -> is_irrefut_patt p + | <:patt< ? $_$ : ($p$ = $_$) >> -> is_irrefut_patt p + | <:patt< ~ $_$ >> -> True + | <:patt< ~ $_$ : $p$ >> -> is_irrefut_patt p + | _ -> False ] +; + +value expr_fun_args ge = Extfun.apply pr_expr_fun_args.val ge; + +pr_expr_fun_args.val := + extfun Extfun.empty with + [ <:expr< fun [$p$ -> $e$] >> as ge -> + if is_irrefut_patt p then + let (pl, e) = expr_fun_args e in + ([p :: pl], e) + else ([], ge) + | ge -> ([], ge) ]; + +value sequence ppf (e, k) = + match e with + [ <:expr< do { $list:el$ } >> -> + fprintf ppf "@[%a@]" (list expr) (el, k) + | _ -> expr ppf (e, k) ] +; + +value string ppf (s, k) = fprintf ppf "\"%s\"%t" s k; + +value int_repr s = + if String.length s > 2 && s.[0] = '0' then + match s.[1] with + [ 'b' | 'o' | 'x' | 'B' | 'O' | 'X' -> + "#" ^ String.sub s 1 (String.length s - 1) + | _ -> s ] + else s +; + +value assoc_left_parsed_op_list = ["+"; "*"; "land"; "lor"; "lxor"]; +value assoc_right_parsed_op_list = ["and"; "or"; "^"; "@"]; +value and_by_couple_op_list = ["="; "<>"; "<"; ">"; "<="; ">="; "=="; "!="]; + +(* extensible pretty print functions *) + +pr_constr_decl.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ (loc, c, []) -> + fun ppf curr next dg k -> fprintf ppf "(@[%s%t@]" c (ks ")" k) + | (loc, c, tl) -> + fun ppf curr next dg k -> + fprintf ppf "(@[%s@ %a@]" c (list ctyp) (tl, ks ")" k) ]}]; + +pr_ctyp.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:ctyp< [ $list:cdl$ ] >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[sum@ %a@]" (list constr_decl) (cdl, ks ")" k) + | <:ctyp< { $list:cdl$ } >> -> + fun ppf curr next dg k -> + fprintf ppf "{@[%a@]" (list label_decl) (cdl, ks "}" k) + | <:ctyp< ( $list:tl$ ) >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[* @[%a@]@]" (list ctyp) (tl, ks ")" k) + | <:ctyp< $t1$ -> $t2$ >> -> + fun ppf curr next dg k -> + let tl = + loop t2 where rec loop = + fun + [ <:ctyp< $t1$ -> $t2$ >> -> [t1 :: loop t2] + | t -> [t] ] + in + fprintf ppf "(@[-> @[%a@]@]" (list ctyp) + ([t1 :: tl], ks ")" k) + | <:ctyp< $t1$ $t2$ >> -> + fun ppf curr next dg k -> + let (t, tl) = + loop [t2] t1 where rec loop tl = + fun + [ <:ctyp< $t1$ $t2$ >> -> loop [t2 :: tl] t1 + | t1 -> (t1, tl) ] + in + fprintf ppf "(@[%a@ %a@]" ctyp (t, nok) (list ctyp) (tl, ks ")" k) + | <:ctyp< $t1$ . $t2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "%a.%a" ctyp (t1, nok) ctyp (t2, k) + | <:ctyp< $lid:s$ >> | <:ctyp< $uid:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" s k + | <:ctyp< ' $s$ >> -> + fun ppf curr next dg k -> fprintf ppf "'%s%t" s k + | <:ctyp< _ >> -> + fun ppf curr next dg k -> fprintf ppf "_%t" k + | x -> + fun ppf curr next dg k -> not_impl "ctyp" x ppf k ]}]; + +pr_expr.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:expr< fun [] >> -> + fun ppf curr next dg k -> + fprintf ppf "(lambda%t" (ks ")" k) + | <:expr< fun $lid:s$ -> $e$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(lambda@ %s@;<1 1>%a" s expr (e, ks ")" k) + | <:expr< fun [ $list:pwel$ ] >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[lambda_match@ %a@]" (list match_assoc) + (pwel, ks ")" k) + | <:expr< match $e$ with [ $list:pwel$ ] >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[match@ %a@]@ %a@]" expr (e, nok) + (list match_assoc) (pwel, ks ")" k) + | <:expr< try $e$ with [ $list:pwel$ ] >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[try@ %a@]@ %a@]" expr (e, nok) + (list match_assoc) (pwel, ks ")" k) + | <:expr< let $p1$ = $e1$ in $e2$ >> -> + fun ppf curr next dg k -> + let (pel, e) = + loop [(p1, e1)] e2 where rec loop pel = + fun + [ <:expr< let $p1$ = $e1$ in $e2$ >> -> + loop [(p1, e1) :: pel] e2 + | e -> (List.rev pel, e) ] + in + let b = + match pel with + [ [_] -> "let" + | _ -> "let*" ] + in + fprintf ppf "(@[@[%s (@[%a@]@]@;<1 2>%a@]" b + (listwb "" let_binding) (pel, ks ")" nok) + sequence (e, ks ")" k) + | <:expr< let $opt:rf$ $list:pel$ in $e$ >> -> + fun ppf curr next dg k -> + let b = if rf then "letrec" else "let" in + fprintf ppf "(@[%s@ (@[%a@]@ %a@]" b + (listwb "" let_binding) (pel, ks ")" nok) expr (e, ks ")" k) + | <:expr< if $e1$ then $e2$ else () >> -> + fun ppf curr next dg k -> + fprintf ppf "(if @[%a@;<1 0>%a@]" expr (e1, nok) + expr (e2, ks ")" k) + | <:expr< if $e1$ then $e2$ else $e3$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(if @[%a@ %a@ %a@]" expr (e1, nok) + expr (e2, nok) expr (e3, ks ")" k) + | <:expr< do { $list:el$ } >> -> + fun ppf curr next dg k -> + fprintf ppf "(begin@;<1 1>@[%a@]" (list expr) (el, ks ")" k) + | <:expr< for $i$ = $e1$ to $e2$ do { $list:el$ } >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[for %s@ %a@ %a %a@]" i expr (e1, nok) + expr (e2, nok) (list expr) (el, ks ")" k) + | <:expr< ($e$ : $t$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(:@ %a@ %a" expr (e, nok) ctyp (t, ks ")" k) + | <:expr< ($list:el$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(values @[%a@]" (list expr) (el, ks ")" k) + | <:expr< { $list:fel$ } >> -> + fun ppf curr next dg k -> + let record_binding ppf ((p, e), k) = + fprintf ppf "(@[%a@ %a@]" patt (p, nok) expr (e, ks ")" k) + in + fprintf ppf "{@[%a@]" (list record_binding) (fel, ks "}" k) + | <:expr< { ($e$) with $list:fel$ } >> -> + fun ppf curr next dg k -> + let record_binding ppf ((p, e), k) = + fprintf ppf "(@[%a@ %a@]" patt (p, nok) expr (e, ks ")" k) + in + fprintf ppf "{@[@[with@ %a@]@ @[%a@]@]" expr (e, nok) + (list record_binding) (fel, ks "}" k) + | <:expr< $e1$ := $e2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(:=@;<1 1>%a@;<1 1>%a" expr (e1, nok) + expr (e2, ks ")" k) + | <:expr< [$_$ :: $_$] >> as e -> + fun ppf curr next dg k -> + let (el, c) = + make_list e where rec make_list e = + match e with + [ <:expr< [$e$ :: $y$] >> -> + let (el, c) = make_list y in + ([e :: el], c) + | <:expr< [] >> -> ([], None) + | x -> ([], Some e) ] + in + match c with + [ None -> + fprintf ppf "[%a" (list expr) (el, ks "]" k) + | Some x -> + fprintf ppf "[%a@ %a" (list expr) (el, ks " ." nok) + expr (x, ks "]" k) ] + | <:expr< lazy ($x$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[lazy@ %a@]" expr (x, ks ")" k) + | <:expr< $lid:s$ $e1$ $e2$ >> + when List.mem s assoc_right_parsed_op_list -> + fun ppf curr next dg k -> + let el = + loop [e1] e2 where rec loop el = + fun + [ <:expr< $lid:s1$ $e1$ $e2$ >> when s1 = s -> + loop [e1 :: el] e2 + | e -> List.rev [e :: el] ] + in + fprintf ppf "(@[%s %a@]" s (list expr) (el, ks ")" k) + | <:expr< $e1$ $e2$ >> -> + fun ppf curr next dg k -> + let (f, el) = + loop [e2] e1 where rec loop el = + fun + [ <:expr< $e1$ $e2$ >> -> loop [e2 :: el] e1 + | e1 -> (e1, el) ] + in + fprintf ppf "(@[%a@ %a@]" expr (f, nok) (list expr) (el, ks ")" k) + | <:expr< ~ $s$ : ($e$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(~%s@ %a" s expr (e, ks ")" k) + | <:expr< $e1$ .[ $e2$ ] >> -> + fun ppf curr next dg k -> + fprintf ppf "%a.[%a" expr (e1, nok) expr (e2, ks "]" k) + | <:expr< $e1$ .( $e2$ ) >> -> + fun ppf curr next dg k -> + fprintf ppf "%a.(%a" expr (e1, nok) expr (e2, ks ")" k) + | <:expr< $e1$ . $e2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "%a.%a" expr (e1, nok) expr (e2, k) + | <:expr< $int:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" (int_repr s) k + | <:expr< $lid:s$ >> | <:expr< $uid:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" s k + | <:expr< ` $s$ >> -> + fun ppf curr next dg k -> fprintf ppf "`%s%t" s k + | <:expr< $str:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "\"%s\"%t" s k + | <:expr< $chr:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "'%s'%t" s k + | x -> + fun ppf curr next dg k -> not_impl "expr" x ppf k ]}]; + +pr_label_decl.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ (loc, f, m, t) -> + fun ppf curr next dg k -> + fprintf ppf "(@[%s%t@ %a@]" f + (fun ppf -> if m then fprintf ppf "@ mutable" else ()) + ctyp (t, ks ")" k) ]}]; + +pr_let_binding.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ (b, (p, e)) -> + fun ppf curr next dg k -> + let (pl, e) = expr_fun_args e in + match pl with + [ [] -> + fprintf ppf "(@[%s%s%a@ %a@]" b + (if b = "" then "" else " ") patt (p, nok) + sequence (e, ks ")" k) + | _ -> + fprintf ppf "(@[%s%s(%a)@ %a@]" b + (if b = "" then "" else " ") (list patt) ([p :: pl], nok) + sequence (e, ks ")" k) ] ]}]; + +pr_match_assoc.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ (p, we, e) -> + fun ppf curr next dg k -> + fprintf ppf "(@[%t@ %a@]" + (fun ppf -> + match we with + [ Some e -> + fprintf ppf "(when@ %a@ %a" patt (p, nok) + expr (e, ks ")" nok) + | None -> patt ppf (p, nok) ]) + sequence (e, ks ")" k) ]}]; + +pr_mod_ident.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ [s] -> + fun ppf curr next dg k -> + fprintf ppf "%s%t" s k + | [s :: sl] -> + fun ppf curr next dg k -> + fprintf ppf "%s.%a" s curr (sl, "", k) + | x -> + fun ppf curr next dg k -> not_impl "mod_ident" x ppf k ]}]; + +pr_module_binding.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ (b, s, me) -> + fun ppf curr next dg k -> + fprintf ppf "%s@ %s@ %a" b s module_expr (me, k) ]}]; + +pr_module_expr.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:module_expr< functor ($i$ : $mt$) -> $me$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[@[functor@ %s@]@ %a@]@ %a@]" + i module_type (mt, nok) module_expr (me, ks ")" k) + | <:module_expr< struct $list:sil$ end >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[struct@ @[%a@]@]" (list str_item) + (sil, ks ")" k) + | <:module_expr< $me1$ $me2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[%a@ %a@]" module_expr (me1, nok) + module_expr (me2, ks ")" k) + | <:module_expr< $uid:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" s k + | x -> + fun ppf curr next dg k -> not_impl "module_expr" x ppf k ]}]; + +pr_module_type.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:module_type< functor ($i$ : $mt1$) -> $mt2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[@[functor@ %s@]@ %a@]@ %a@]" + i module_type (mt1, nok) module_type (mt2, ks ")" k) + | <:module_type< sig $list:sil$ end >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[sig@ @[%a@]@]" (list sig_item) (sil, ks ")" k) + | <:module_type< $mt$ with $list:wcl$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[with@;<1 2>@[%a@ (%a@]@]" module_type (mt, nok) + (list with_constr) (wcl, ks "))" k) + | <:module_type< $uid:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" s k + | x -> + fun ppf curr next dg k -> not_impl "module_type" x ppf k ]}]; + +pr_patt.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:patt< $p1$ | $p2$ >> -> + fun ppf curr next dg k -> + let (f, pl) = + loop [p2] p1 where rec loop pl = + fun + [ <:patt< $p1$ | $p2$ >> -> loop [p2 :: pl] p1 + | p1 -> (p1, pl) ] + in + fprintf ppf "(@[or@ %a@ %a@]" patt (f, nok) (list patt) + (pl, ks ")" k) + | <:patt< ($p1$ as $p2$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[as@ %a@ %a@]" patt (p1, nok) patt (p2, ks ")" k) + | <:patt< $p1$ .. $p2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[range@ %a@ %a@]" patt (p1, nok) patt (p2, ks ")" k) + | <:patt< [$_$ :: $_$] >> as p -> + fun ppf curr next dg k -> + let (pl, c) = + make_list p where rec make_list p = + match p with + [ <:patt< [$p$ :: $y$] >> -> + let (pl, c) = make_list y in + ([p :: pl], c) + | <:patt< [] >> -> ([], None) + | x -> ([], Some p) ] + in + match c with + [ None -> + fprintf ppf "[%a" (list patt) (pl, ks "]" k) + | Some x -> + fprintf ppf "[%a@ %a" (list patt) (pl, ks " ." nok) + patt (x, ks "]" k) ] + | <:patt< $p1$ $p2$ >> -> + fun ppf curr next dg k -> + let pl = + loop [p2] p1 where rec loop pl = + fun + [ <:patt< $p1$ $p2$ >> -> loop [p2 :: pl] p1 + | p1 -> [p1 :: pl] ] + in + fprintf ppf "(@[%a@]" (list patt) (pl, ks ")" k) + | <:patt< ($p$ : $t$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(:@ %a@ %a" patt (p, nok) ctyp (t, ks ")" k) + | <:patt< ($list:pl$) >> -> + fun ppf curr next dg k -> + fprintf ppf "(values @[%a@]" (list patt) (pl, ks ")" k) + | <:patt< { $list:fpl$ } >> -> + fun ppf curr next dg k -> + let record_binding ppf ((p1, p2), k) = + fprintf ppf "(@[%a@ %a@]" patt (p1, nok) patt (p2, ks ")" k) + in + fprintf ppf "(@[{}@ %a@]" (list record_binding) (fpl, ks ")" k) + | <:patt< ? $x$ >> -> + fun ppf curr next dg k -> fprintf ppf "?%s%t" x k + | <:patt< ? ($lid:x$ = $e$) >> -> + fun ppf curr next dg k -> fprintf ppf "(?%s@ %a" x expr (e, ks ")" k) + | <:patt< $p1$ . $p2$ >> -> + fun ppf curr next dg k -> + fprintf ppf "%a.%a" patt (p1, nok) patt (p2, k) + | <:patt< $lid:s$ >> | <:patt< $uid:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" s k + | <:patt< $str:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "\"%s\"%t" s k + | <:patt< $chr:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "'%s'%t" s k + | <:patt< $int:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" (int_repr s) k + | <:patt< $flo:s$ >> -> + fun ppf curr next dg k -> fprintf ppf "%s%t" s k + | <:patt< _ >> -> + fun ppf curr next dg k -> fprintf ppf "_%t" k + | x -> + fun ppf curr next dg k -> not_impl "patt" x ppf k ]}]; + +pr_sig_item.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:sig_item< type $list:tdl$ >> -> + fun ppf curr next dg k -> + match tdl with + [ [td] -> fprintf ppf "(%a" type_decl (("type", td), ks ")" k) + | tdl -> + fprintf ppf "(@[type@ %a@]" (listwb "" type_decl) + (tdl, ks ")" k) ] + | <:sig_item< exception $c$ of $list:tl$ >> -> + fun ppf curr next dg k -> + match tl with + [ [] -> fprintf ppf "(@[exception@ %s%t@]" c (ks ")" k) + | tl -> + fprintf ppf "(@[@[exception@ %s@]@ %a@]" c + (list ctyp) (tl, ks ")" k) ] + | <:sig_item< value $i$ : $t$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[value %s@]@ %a@]" i ctyp (t, ks ")" k) + | <:sig_item< external $i$ : $t$ = $list:pd$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[external@ %s@]@ %a@ %a@]" i ctyp (t, nok) + (list string) (pd, ks ")" k) + | <:sig_item< module $s$ : $mt$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[module@ %s@]@ %a@]" s + module_type (mt, ks ")" k) + | <:sig_item< module type $s$ = $mt$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[moduletype@ %s@]@ %a@]" s + module_type (mt, ks ")" k) + | <:sig_item< declare $list:s$ end >> -> + fun ppf curr next dg k -> + if s = [] then fprintf ppf "; ..." + else fprintf ppf "%a" (list sig_item) (s, k) + | MLast.SgUse _ _ _ -> + fun ppf curr next dg k -> () + | x -> + fun ppf curr next dg k -> not_impl "sig_item" x ppf k ]}]; + +pr_str_item.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ <:str_item< open $i$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(open@ %a" mod_ident (i, ks ")" k) + | <:str_item< type $list:tdl$ >> -> + fun ppf curr next dg k -> + match tdl with + [ [td] -> fprintf ppf "(%a" type_decl (("type", td), ks ")" k) + | tdl -> + fprintf ppf "(@[type@ %a@]" (listwb "" type_decl) + (tdl, ks ")" k) ] + | <:str_item< exception $c$ of $list:tl$ >> -> + fun ppf curr next dg k -> + match tl with + [ [] -> fprintf ppf "(@[exception@ %s%t@]" c (ks ")" k) + | tl -> + fprintf ppf "(@[@[exception@ %s@]@ %a@]" c + (list ctyp) (tl, ks ")" k) ] + | <:str_item< value $opt:rf$ $list:pel$ >> -> + fun ppf curr next dg k -> + let b = if rf then "definerec" else "define" in + match pel with + [ [(p, e)] -> + fprintf ppf "%a" let_binding ((b, (p, e)), k) + | pel -> + fprintf ppf "(@[%s*@ %a@]" b (listwb "" let_binding) + (pel, ks ")" k) ] + | <:str_item< module $s$ = $me$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(%a" module_binding (("module", s, me), ks ")" k) + | <:str_item< module type $s$ = $mt$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[@[moduletype@ %s@]@ %a@]" s + module_type (mt, ks ")" k) + | <:str_item< external $i$ : $t$ = $list:pd$ >> -> + fun ppf curr next dg k -> + fprintf ppf "(@[external@ %s@ %a@ %a@]" i ctyp (t, nok) + (list string) (pd, ks ")" k) + | <:str_item< $exp:e$ >> -> + fun ppf curr next dg k -> + fprintf ppf "%a" expr (e, k) + | <:str_item< # $s$ $opt:x$ >> -> + fun ppf curr next dg k -> + match x with + [ Some e -> fprintf ppf "; # (%s %a" s expr (e, ks ")" k) + | None -> fprintf ppf "; # (%s%t" s (ks ")" k) ] + | <:str_item< declare $list:s$ end >> -> + fun ppf curr next dg k -> + if s = [] then fprintf ppf "; ..." + else fprintf ppf "%a" (list str_item) (s, k) + | MLast.StUse _ _ _ -> + fun ppf curr next dg k -> () + | x -> + fun ppf curr next dg k -> not_impl "str_item" x ppf k ]}]; + +pr_type_decl.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ (b, ((_, tn), tp, te, cl)) -> + fun ppf curr next dg k -> + fprintf ppf "%t%t@;<1 1>%a" + (fun ppf -> + if b <> "" then fprintf ppf "%s@ " b + else ()) + (fun ppf -> + match tp with + [ [] -> fprintf ppf "%s" tn + | tp -> fprintf ppf "(%s%a)" tn type_params (tp, nok) ]) + ctyp (te, k) ]}]; + +pr_type_params.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ [(s, vari) :: tpl] -> + fun ppf curr next dg k -> + fprintf ppf "@ '%s%a" s type_params (tpl, k) + | [] -> + fun ppf curr next dg k -> () ]}]; + +pr_with_constr.pr_levels := + [{pr_label = "top"; + pr_box ppf f x = fprintf ppf "@[%t@]" f; + pr_rules = + extfun Extfun.empty with + [ MLast.WcTyp _ m tp te -> + fun ppf curr next dg k -> + fprintf ppf "(type@ %t@;<1 1>%a" + (fun ppf -> + match tp with + [ [] -> fprintf ppf "%a" mod_ident (m, nok) + | tp -> + fprintf ppf "(%a@ %a)" mod_ident (m, nok) + type_params (tp, nok) ]) + ctyp (te, ks ")" k) + | x -> + fun ppf curr next dg k -> not_impl "with_constr" x ppf k ]}]; + +(* main *) + +value output_string_eval ppf s = + loop 0 where rec loop i = + if i == String.length s then () + else if i == String.length s - 1 then pp_print_char ppf s.[i] + else + match (s.[i], s.[i + 1]) with + [ ('\\', 'n') -> do { pp_print_char ppf '\n'; loop (i + 2) } + | (c, _) -> do { pp_print_char ppf c; loop (i + 1) } ] +; + +value sep = Pcaml.inter_phrases; + +value input_source ic len = + let buff = Buffer.create 20 in + try + let rec loop i = + if i >= len then Buffer.contents buff + else do { let c = input_char ic in Buffer.add_char buff c; loop (i + 1) } + in + loop 0 + with + [ End_of_file -> + let s = Buffer.contents buff in + if s = "" then + match sep.val with + [ Some s -> s + | None -> "\n" ] + else s ] +; + +value copy_source ppf (ic, first, bp, ep) = + match sep.val with + [ Some str -> + if first then () + else if ep == in_channel_length ic then pp_print_string ppf "\n" + else output_string_eval ppf str + | None -> + do { + seek_in ic bp; + let s = input_source ic (ep - bp) in pp_print_string ppf s + } ] +; + +value copy_to_end ppf (ic, first, bp) = + let ilen = in_channel_length ic in + if bp < ilen then copy_source ppf (ic, first, bp, ilen) + else pp_print_string ppf "\n" +; + +value apply_printer printer ast = + let ppf = std_formatter in + if Pcaml.input_file.val <> "-" && Pcaml.input_file.val <> "" then do { + let ic = open_in_bin Pcaml.input_file.val in + try + let (first, last_pos) = + List.fold_left + (fun (first, last_pos) (si, (bp, ep)) -> + do { + fprintf ppf "@[%a@]@?" copy_source (ic, first, last_pos.Lexing.pos_cnum, bp.Lexing.pos_cnum); + fprintf ppf "@[%a@]@?" printer (si, nok); + (False, ep) + }) + (True, Token.nowhere) ast + in + fprintf ppf "@[%a@]@?" copy_to_end (ic, first, last_pos.Lexing.pos_cnum) + with x -> + do { fprintf ppf "@."; close_in ic; raise x }; + close_in ic; + } + else failwith "not implemented" +; + +Pcaml.print_interf.val := apply_printer sig_item; +Pcaml.print_implem.val := apply_printer str_item; + +Pcaml.add_option "-l" (Arg.Int (fun x -> set_margin x)) + " Maximum line length for pretty printing."; + +Pcaml.add_option "-sep" (Arg.String (fun x -> sep.val := Some x)) + " Use this string between phrases instead of reading source."; diff --git a/camlp4/unmaintained/scheme/pr_schp_main.ml b/camlp4/unmaintained/scheme/pr_schp_main.ml new file mode 100644 index 00000000..4d3a6fb4 --- /dev/null +++ b/camlp4/unmaintained/scheme/pr_schp_main.ml @@ -0,0 +1,132 @@ +(* pa_r.cmo q_MLast.cmo pa_extfun.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + +open Format; +open Pcaml; +open Parserify; + +value nok = Pr_scheme.nok; +value ks = Pr_scheme.ks; +value patt = Pr_scheme.patt; +value expr = Pr_scheme.expr; +value find_pr_level = Pr_scheme.find_pr_level; +value pr_expr = Pr_scheme.pr_expr; +type printer_t 'a = Pr_scheme.printer_t 'a == + { pr_fun : mutable string -> Pr_scheme.next 'a; + pr_levels : mutable list (pr_level 'a) } +and pr_level 'a = Pr_scheme.pr_level 'a == + { pr_label : string; + pr_box : formatter -> (formatter -> unit) -> 'a -> unit; + pr_rules : mutable Pr_scheme.pr_rule 'a } +; + +(* extensions for rebuilding syntax of parsers *) + +value parser_cases ppf (spel, k) = + let rec parser_cases ppf (spel, k) = + match spel with + [ [] -> fprintf ppf "[: `HVbox [: b; k :] :]" + | [(sp, epo, e)] -> parser_case ppf (sp, epo, e, k) + | [(sp, epo, e) :: spel] -> + fprintf ppf "%a@ %a" parser_case (sp, epo, e, nok) + parser_cases (spel, k) ] + and parser_case ppf (sp, epo, e, k) = + fprintf ppf "(@[@[(%a)%t@]@ %a@]" stream_patt (sp, nok) + (fun ppf -> + match epo with + [ Some p -> fprintf ppf "@ %a" patt (p, nok) + | None -> () ]) + expr (e, ks ")" k) + and stream_patt ppf (sp, k) = + match sp with + [ [] -> k ppf + | [(spc, None)] -> fprintf ppf "%a" stream_patt_comp (spc, k) + | [(spc, Some e)] -> + fprintf ppf "(@[? %a@ %a@]" stream_patt_comp (spc, nok) + expr (e, ks ")" k) + | [(spc, None) :: spcl] -> + fprintf ppf "%a@ %a" stream_patt_comp (spc, nok) stream_patt (spcl, k) + | [(spc, Some e) :: spcl] -> + fprintf ppf "(@[? %a@ %a@]@ %a" stream_patt_comp (spc, nok) + expr (e, ks ")" nok) stream_patt (spcl, k) ] + and stream_patt_comp ppf (spc, k) = + match spc with + [ SPCterm (p, w) -> + match w with + [ Some e -> + fprintf ppf "(` %a@ %a" patt (p, nok) expr (e, ks ")" k) + | None -> fprintf ppf "(` %a" patt (p, ks ")" k) ] + | SPCnterm p e -> + fprintf ppf "(@[%a %a@]" patt (p, nok) expr (e, ks ")" k) + | SPCsterm p -> fprintf ppf "%a" patt (p, k) ] + in + parser_cases ppf (spel, k) +; + +value parser_body ppf (e, k) = + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + match parser_of_expr e with + [ [] -> + fprintf ppf "(parser%t%t" + (fun ppf -> + match bp with + [ Some p -> fprintf ppf "@ %a" patt (p, nok) + | _ -> ()]) + (ks ")" k) + | spel -> + fprintf ppf "(@[@[parser%t@]@ @[%a@]@]" + (fun ppf -> + match bp with + [ Some p -> fprintf ppf "@ %a" patt (p, nok) + | _ -> ()]) + parser_cases (spel, ks ")" k) ] +; + +value pmatch ppf (e, k) = + let (me, e) = + match e with + [ <:expr< let (__strm : Stream.t _) = $me$ in $e$ >> -> (me, e) + | _ -> failwith "Pr_schp_main.pmatch" ] + in + let (bp, e) = + match e with + [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e) + | e -> (None, e) ] + in + let spel = parser_of_expr e in + fprintf ppf "(@[@[match_with_parser@ %a@]%t@ @[%a@]@]" expr (me, nok) + (fun ppf -> + match bp with + [ Some p -> fprintf ppf "@ %a" patt (p, nok) + | _ -> () ]) + parser_cases (spel, ks ")" k) +; + +pr_expr_fun_args.val := + extfun pr_expr_fun_args.val with + [ <:expr< fun [(__strm : $_$) -> $_$] >> as ge -> ([], ge) ]; + +let lev = find_pr_level "top" pr_expr.pr_levels in +lev.pr_rules := + extfun lev.pr_rules with + [ <:expr< fun (__strm : $_$) -> $x$ >> -> + fun ppf curr next dg k -> fprintf ppf "%a" parser_body (x, k) + | <:expr< let (__strm : Stream.t _) = $_$ in $_$ >> as e -> + fun ppf curr next dg k -> fprintf ppf "%a" pmatch (e, k) ]; diff --git a/camlp4/unmaintained/sml/.depend b/camlp4/unmaintained/sml/.depend new file mode 100644 index 00000000..e69de29b diff --git a/camlp4/unmaintained/sml/Makefile b/camlp4/unmaintained/sml/Makefile new file mode 100644 index 00000000..ea3980be --- /dev/null +++ b/camlp4/unmaintained/sml/Makefile @@ -0,0 +1,68 @@ +######################################################################### +# # +# Objective Caml # +# # +# Camlp4 # +# # +# Copyright 2004 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. # +# # +######################################################################### +# +# Makefile for pa_sml +# M.Mauny +# + +include ../../config/Makefile.cnf + +OCAMLTOP=../../.. + +OCAMLC=$(OCAMLTOP)/ocamlc$(EXE) -nostdlib -I $(OCAMLTOP)/stdlib +OCAMLOPT=$(OCAMLTOP)/ocamlopt$(EXE) -nostdlib -I $(OCAMLTOP)/stdlib + +P4INCLUDES=-I ../../meta -I ../../etc -I ../../lib -I ../../camlp4 +OCAMLINCLUDES=-I ../../meta -I ../../lib -I ../../camlp4 + +CAMLP4=camlp4$(EXE) -nolib +OCAMLCFLAGS=-warn-error A $(OCAMLINCLUDES) + +SRC=pa_sml.ml +OBJS=$(SRC:.ml=.cmo) +OBJSX=$(SRC:.ml=.cmx) + +all: $(OBJS) smllib.cmo + +opt: $(OBJSX) smllib.cmx + +depend: + cp .depend .depend.bak + > .depend + for file in $(SRC); do \ + $(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $$file` pr_depend.cmo $$i | \ + sed -e 's| \.\./\.\./\.\.| $$(OCAMLTOP)|g' >> .depend; \ + done + +clean: + rm -f *.cm* *.o *.bak .*.bak + + +.SUFFIXES: .cmx .cmo .cmi .ml .mli .sml + +.mli.cmi: + $(OCAMLC) $(OCAMLCFLAGS) -c $< + + +.sml.cmo: + $(OCAMLC) -I ../../../otherlibs/unix -pp "$(CAMLP4) ./pa_sml.cmo ../../meta/pr_dump.cmo -impl" -c -o $*.cmo -impl $< + +.sml.cmx: + $(OCAMLOPT) -I ../../../otherlibs/unix -pp "$(CAMLP4) ./pa_sml.cmo ../../meta/pr_dump.cmo -impl" -c -o $*.cmx -impl $< + +.ml.cmo: + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + +include .depend diff --git a/camlp4/unmaintained/sml/README b/camlp4/unmaintained/sml/README new file mode 100644 index 00000000..809d42f2 --- /dev/null +++ b/camlp4/unmaintained/sml/README @@ -0,0 +1,15 @@ +This is an application of or an extension for Camlp4. Although it is +currently distributed with OCaml/Camlp4, it may or may not be +actively maintained. + +It probably won't be part of future OCaml/Camlp4 distributions but be +accessible from the Camlp4 hump. If you are interested in developing +this package further and/or actively maintain it, please let us know +(caml@inria.fr) + +This package is distributed under the same license as the Objective +Caml Library (that is, LGPL with a special exception allowing both +static and dynamic link). + +-- Michel Mauny + diff --git a/camlp4/unmaintained/sml/pa_sml.ml b/camlp4/unmaintained/sml/pa_sml.ml new file mode 100644 index 00000000..1808cdea --- /dev/null +++ b/camlp4/unmaintained/sml/pa_sml.ml @@ -0,0 +1,952 @@ +(* pa_r.cmo pa_rp.cmo pa_extend.cmo q_MLast.cmo pr_dump.cmo *) +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 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. *) +(* *) +(***********************************************************************) + + + +open Stdpp; +open Pcaml; + +value ocaml_records = ref False; + +Pcaml.no_constructors_arity.val := True; + +value lexer = Plexer.gmake (); + +do { + Grammar.Unsafe.gram_reinit gram lexer; + Grammar.Unsafe.clear_entry interf; + Grammar.Unsafe.clear_entry implem; + Grammar.Unsafe.clear_entry top_phrase; + Grammar.Unsafe.clear_entry use_file; + Grammar.Unsafe.clear_entry module_type; + Grammar.Unsafe.clear_entry module_expr; + Grammar.Unsafe.clear_entry sig_item; + Grammar.Unsafe.clear_entry str_item; + Grammar.Unsafe.clear_entry expr; + Grammar.Unsafe.clear_entry patt; + Grammar.Unsafe.clear_entry ctyp; + Grammar.Unsafe.clear_entry let_binding; +}; + +Pcaml.parse_interf.val := Grammar.Entry.parse interf; +Pcaml.parse_implem.val := Grammar.Entry.parse implem; + +value not_impl loc s = + raise_with_loc loc (Stream.Error ("not implemented feature [" ^ s ^ "]")) +; + +type altern 'a 'b = [ Left of 'a | Right of 'b ]; + +value get_seq = + fun + [ <:expr< do { $list:el$ } >> -> el + | e -> [e] ] +; + +value choose_tvar tpl = + let rec find_alpha v = + let s = String.make 1 v in + if List.mem_assoc s tpl then + if v = 'z' then None else find_alpha (Char.chr (Char.code v + 1)) + else Some (String.make 1 v) + in + let rec make_n n = + let v = "a" ^ string_of_int n in + if List.mem_assoc v tpl then make_n (succ n) else v + in + match find_alpha 'a' with + [ Some x -> x + | None -> make_n 1 ] +; + +value mklistexp loc last = + loop True where rec loop top = + fun + [ [] -> + match last with + [ Some e -> e + | None -> <:expr< [] >> ] + | [e1 :: el] -> + let loc = if top then loc else (fst (MLast.loc_of_expr e1), snd loc) in + <:expr< [$e1$ :: $loop False el$] >> ] +; + +value mklistpat loc last = + loop True where rec loop top = + fun + [ [] -> + match last with + [ Some p -> p + | None -> <:patt< [] >> ] + | [p1 :: pl] -> + let loc = if top then loc else (fst (MLast.loc_of_patt p1), snd loc) in + <:patt< [$p1$ :: $loop False pl$] >> ] +; + +value expr_of_patt p = + let loc = MLast.loc_of_patt p in + match p with + [ <:patt< $lid:x$ >> -> <:expr< $lid:x$ >> + | _ -> Stdpp.raise_with_loc loc (Stream.Error "identifier expected") ] +; + +value apply_bind loc e bl = + let rec loop e = + fun + [ [] -> e + | [<:str_item< value $p1$ = $e1$ >> :: list] -> + loop_let e [(p1, e1)] list + | [<:str_item< value rec $p1$ = $e1$ >> :: list] -> + loop_letrec e [(p1, e1)] list + | [<:str_item< module $s$ = $me$ >> :: list] -> + let e = <:expr< let module $s$ = $me$ in $e$ >> in + loop e list + | [si :: list] -> + raise Exit ] + and loop_let e pel = + fun + [ [<:str_item< value $p1$ = $e1$ >> :: list] -> + loop_let e [(p1, e1) :: pel] list + | list -> + let e = <:expr< let $list:pel$ in $e$ >> in + loop e list ] + and loop_letrec e pel = + fun + [ [<:str_item< value rec $p1$ = $e1$ >> :: list] -> + loop_letrec e [(p1, e1) :: pel] list + | list -> + let e = <:expr< let rec $list:pel$ in $e$ >> in + loop e list ] + in + loop e (List.rev bl) +; + +value make_local loc sl1 sl2 = + try + let pl = + List.map + (fun + [ <:str_item< value $opt:_$ $p$ = $_$ >> -> p + | _ -> raise Exit ]) + sl2 + in + let e1 = + match List.map expr_of_patt pl with + [ [e] -> e + | el -> <:expr< ($list:el$) >> ] + in + let p1 = + match pl with + [ [p] -> p + | pl -> <:patt< ($list:pl$) >> ] + in + let e = apply_bind loc e1 sl2 in + let e = apply_bind loc e sl1 in + <:str_item< value $p1$ = $e$ >> + with + [ Exit -> + do { + Printf.eprintf "\ +*** Warning: a 'local' statement will be defined global because of bindings +which cannot be defined as first class values (modules, exceptions, ...)\n"; + flush stderr; + <:str_item< declare $list:sl1 @ sl2$ end >> + } ] +; + +value str_declare loc = + fun + [ [d] -> d + | dl -> <:str_item< declare $list:dl$ end >> ] +; + +value sig_declare loc = + fun + [ [d] -> d + | dl -> <:sig_item< declare $list:dl$ end >> ] +; + +value extract_label_types loc tn tal cdol = + let (cdl, aux) = + List.fold_right + (fun (loc, c, tl, aux_opt) (cdl, aux) -> + match aux_opt with + [ Some anon_record_type -> + let new_tn = tn ^ "_" ^ c in + let loc = MLast.loc_of_ctyp anon_record_type in + let aux_def = ((loc, new_tn), [], anon_record_type, []) in + let tl = [<:ctyp< $lid:new_tn$ >>] in + ([(loc, c, tl) :: cdl], [aux_def :: aux]) + | None -> ([(loc, c, tl) :: cdl], aux) ]) + cdol ([], []) + in + [((loc, tn), tal, <:ctyp< [ $list:cdl$ ] >>, []) :: aux] +; + +value function_of_clause_list loc xl = + let (fname, fname_loc, nbpat, l) = + List.fold_left + (fun (fname, fname_loc, nbpat, l) ((x1, loc), x2, x3, x4) -> + let (fname, fname_loc, nbpat) = + if fname = "" then (x1, loc, List.length x2) + else if x1 <> fname then + raise_with_loc loc + (Stream.Error ("'" ^ fname ^ "' expected")) + else if List.length x2 <> nbpat then + raise_with_loc loc + (Stream.Error "bad number of patterns in that clause") + else (fname, fname_loc, nbpat) + in + let x4 = + match x3 with + [ Some t -> <:expr< ($x4$ : $t$) >> + | _ -> x4 ] + in + let l = [(x2, x4) :: l] in + (fname, fname_loc, nbpat, l)) + ("", loc, 0, []) xl + in + let l = List.rev l in + let e = + match l with + [ [(pl, e)] -> + List.fold_right (fun p e -> <:expr< fun $p$ -> $e$ >>) pl e + | _ -> + if nbpat = 1 then + let pwel = + List.map + (fun (pl, e) -> (<:patt< $List.hd pl$ >>, None, e)) l + in + <:expr< fun [ $list:pwel$ ] >> + else + let sl = + loop 0 where rec loop n = + if n = nbpat then [] + else ["a" ^ string_of_int (n + 1) :: loop (n + 1)] + in + let e = + let el = List.map (fun s -> <:expr< $lid:s$ >>) sl in + let pwel = + List.map + (fun (pl, e) -> (<:patt< ($list:pl$) >>, None, e)) l + in + <:expr< match ($list:el$) with [ $list:pwel$ ] >> + in + List.fold_right (fun s e -> <:expr< fun $lid:s$ -> $e$ >>) sl e ] + in + (let loc = fname_loc in <:patt< $lid:fname$ >>, e) +; + +value record_expr loc x1 = + if ocaml_records.val then <:expr< { $list:x1$ } >> + else + let list1 = + List.map + (fun (l, v) -> + let id = + match l with + [ <:patt< $lid:l$ >> -> l + | _ -> "" ] + in + let loc = MLast.loc_of_expr v in + <:class_str_item< value $id$ = $v$ >>) + x1 + in + let list2 = + List.map + (fun (l, v) -> + let id = + match l with + [ <:patt< $lid:l$ >> -> l + | _ -> "" ] + in + let loc = MLast.loc_of_patt l in + <:class_str_item< method $id$ = $lid:id$ >>) + x1 + in + <:expr< + let module M = + struct + class a = object $list:list1 @ list2$ end; + end + in + new M.a + >> +; + +value record_match_assoc loc lpl e = + if ocaml_records.val then (<:patt< { $list:lpl$ } >>, e) + else + let pl = List.map (fun (_, p) -> p) lpl in + let e = + let el = + List.map + (fun (l, _) -> + let s = + match l with + [ <:patt< $lid:l$ >> -> l + | _ -> "" ] + in + let loc = MLast.loc_of_patt l in + <:expr< v # $lid:s$ >>) + lpl + in + let loc = MLast.loc_of_expr e in + <:expr< let v = $e$ in ($list:el$) >> + in + let p = <:patt< ($list:pl$) >> in + (p, e) +; + +value op = + Grammar.Entry.of_parser gram "op" + (parser [: `("", "op"); `(_, x) :] -> x) +; +lexer.Token.tok_using ("", "op"); + +value special x = + if String.length x >= 2 then + match x.[0] with + [ '+' | '<' | '^' -> True + | _ -> False ] + else False +; + +value idd = + let p = + parser + [ [: `("LIDENT", x) :] -> x + | [: `("UIDENT", x) :] -> x + | [: `("", "op"); `(_, x) :] -> x + | [: `("", x) when special x :] -> x ] + in + Grammar.Entry.of_parser Pcaml.gram "ID" p +; + +value uncap s = String.uncapitalize s; + +EXTEND + GLOBAL: implem interf top_phrase use_file sig_item str_item ctyp patt expr + module_type module_expr; + + implem: + [ [ x = interdec; EOI -> x ] ] + ; + interf: + [ [ x = LIST1 [ s = sig_item; OPT ";" -> (s, loc) ] -> (x, False) ] ] + ; + top_phrase: + [ [ ph = phrase; ";" -> Some ph + | EOI -> None ] ] + ; + use_file: + [ [ l = LIST0 phrase; EOI -> (l, False) ] ] + ; + phrase: + [ [ x = str_item -> x + | x = expr -> <:str_item< $exp:x$ >> + | "#"; n = LIDENT; dp = dir_param -> MLast.StDir loc n dp ] ] + ; + dir_param: + [ [ -> None + | e = expr -> Some e ] ] + ; + sdecs: + [ [ x = sdec; l = sdecs -> [x :: l] + | ";"; l = sdecs -> l + | -> [] ] ] + ; + + fsigb: [ [ -> not_impl loc "fsigb" ] ]; + fsigconstraint_op: [ [ -> not_impl loc "fsigconstraint_op" ] ]; + fct_exp: [ [ -> not_impl loc "fct_exp" ] ]; + exp_pa: [ [ -> not_impl loc "exp_pa" ] ]; + rvb: [ [ -> not_impl loc "rvb" ] ]; + tyvarseq: [ [ -> not_impl loc "tyvarseq" ] ]; + + tyvar_pc: + [ [ "'"; x1 = LIDENT -> [(x1, (False, False))] + | "'"; x1 = LIDENT; ","; l = tyvar_pc -> [(x1, (False, False)) :: l] ] ] + ; + id: + [ [ x1 = idd -> x1 + | "*" -> "*" ] ] + ; + ident: + [ [ x1 = idd -> x1 + | "*" -> "*" + | "=" -> "=" + | "<" -> "<" + | ">" -> ">" + | "<=" -> "<=" + | ">=" -> ">=" + | "^" -> "^" ] ] + ; + op_op: + [ [ x1 = op -> not_impl loc "op_op 1" + | -> () ] ] + ; + qid: + [ [ x1 = idd; "."; x2 = qid -> <:module_expr< $uid:x1$ . $x2$ >> + | x1 = idd -> <:module_expr< $uid:x1$ >> + | x1 = "*" -> <:module_expr< $uid:x1$ >> + | x1 = "=" -> <:module_expr< $uid:x1$ >> ] ] + ; + eqid: + [ [ x1 = UIDENT; "."; x2 = eqid -> <:expr< $uid:x1$ . $x2$ >> + | x1 = UIDENT -> <:expr< $uid:x1$ >> + | x1 = idd -> <:expr< $lid:x1$ >> + | x1 = "*" -> <:expr< $lid:x1$ >> + | x1 = "=" -> <:expr< $lid:x1$ >> ] ] + ; + sqid: + [ [ x1 = idd; "."; x2 = sqid -> [x1 :: x2] + | x1 = idd -> [x1] + | x1 = "*" -> [x1] + | x1 = "=" -> [x1] ] ] + ; + tycon: + [ [ LIDENT "real" -> <:ctyp< float >> + | x1 = idd; "."; x2 = tycon -> + let r = <:ctyp< $uid:x1$ . $x2$ >> in + loop r where rec loop = + fun + [ <:ctyp< $a$ . ($b$ . $c$) >> -> <:ctyp< $a$ . $b$ . $loop c$ >> + | x -> x ] + | x1 = idd -> <:ctyp< $lid:uncap x1$ >> ] ] + ; + selector: + [ [ x1 = id -> x1 + | x1 = INT -> not_impl loc "selector 1" ] ] + ; + tlabel: + [ [ x1 = selector; ":"; x2 = ctyp -> (loc, x1, False, x2) ] ] + ; + tuple_ty: + [ [ x1 = ctyp LEVEL "ty'"; "*"; x2 = tuple_ty -> [x1 :: x2] + | x1 = ctyp LEVEL "ty'" -> [x1] ] ] + ; + ctyp: + [ RIGHTA + [ x1 = ctyp; "->"; x2 = ctyp -> <:ctyp< $x1$ -> $x2$ >> ] + | [ x1 = ctyp; "*"; x2 = tuple_ty -> <:ctyp< ($list:[x1 :: x2]$) >> ] + | "ty'" + [ "'"; x1 = LIDENT -> <:ctyp< '$x1$ >> + | "'"; "'"; x1 = LIDENT -> <:ctyp< '$x1$ >> + | "{"; x1 = LIST1 tlabel SEP ","; "}" -> + if ocaml_records.val then <:ctyp< { $list:x1$ } >> + else + let list = List.map (fun (_, l, _, t) -> (l, t)) x1 in + <:ctyp< < $list:list$ > >> + | "{"; "}" -> not_impl loc "ty' 3" + | "("; x1 = ctyp; ","; x2 = LIST1 ctyp SEP ","; ")"; x3 = tycon -> + List.fold_left (fun t1 t2 -> <:ctyp< $t1$ $t2$ >>) x3 [x1 :: x2] + | "("; x1 = ctyp; ")" -> x1 + | x1 = ctyp; x2 = tycon -> <:ctyp< $x2$ $x1$ >> + | x1 = tycon -> x1 ] ] + ; + rule: + [ [ x1 = patt; "=>"; x2 = expr -> (x1, None, x2) ] ] + ; + elabel: + [ [ x1 = selector; "="; x2 = expr -> (<:patt< $lid:x1$ >>, x2) ] ] + ; + exp_ps: + [ [ x1 = expr -> x1 + | x1 = expr; ";"; x2 = exp_ps -> + <:expr< do { $list:[x1 :: get_seq x2]$ } >> ] ] + ; + expr: + [ [ "if"; x1 = expr; "then"; x2 = expr; "else"; x3 = expr -> + <:expr< if $x1$ then $x2$ else $x3$ >> + | "fn"; x1 = LIST1 rule SEP "|" -> <:expr< fun [$list:x1$] >> + | "case"; x1 = expr; "of"; x2 = LIST1 rule SEP "|" -> + <:expr< match $x1$ with [$list:x2$] >> + | "while"; x1 = expr; "do"; x2 = expr -> + <:expr< while $x1$ do { $x2$ } >> + | x1 = expr; "handle"; x2 = LIST1 rule SEP "|" -> + <:expr< try $x1$ with [$list:x2$] >> ] + | RIGHTA + [ "raise"; x1 = expr -> <:expr< raise $x1$ >> ] + | [ e1 = expr; ":="; e2 = expr -> <:expr< $e1$.val := $e2$ >> ] + | LEFTA + [ x1 = expr; "orelse"; x2 = expr -> <:expr< $x1$ || $x2$ >> ] + | LEFTA + [ x1 = expr; "andalso"; x2 = expr -> <:expr< $x1$ && $x2$ >> ] + | LEFTA + [ x1 = expr; ":"; x2 = ctyp -> <:expr< ($x1$ : $x2$) >> ] + | "4" NONA + [ x1 = expr; "<"; x2 = expr -> <:expr< $x1$ < $x2$ >> + | x1 = expr; ">"; x2 = expr -> <:expr< $x1$ > $x2$ >> + | x1 = expr; "<>"; x2 = expr -> <:expr< $x1$ <> $x2$ >> + | x1 = expr; "="; x2 = expr -> <:expr< $x1$ = $x2$ >> + | x1 = expr; ">="; x2 = expr -> <:expr< $x1$ >= $x2$ >> + | x1 = expr; "<="; x2 = expr -> <:expr< $x1$ <= $x2$ >> ] + | RIGHTA + [ x1 = expr; "^"; x2 = expr -> <:expr< $x1$ ^ $x2$ >> + | x1 = expr; "@"; x2 = expr -> <:expr< $x1$ @ $x2$ >> + | x1 = expr; "o"; x2 = expr -> <:expr< ooo $x1$ $x2$ >> ] + | "5" RIGHTA + [ x1 = expr; "::"; x2 = expr -> <:expr< [$x1$ :: $x2$] >> ] + | "6" LEFTA + [ x1 = expr; "+"; x2 = expr -> <:expr< $x1$ + $x2$ >> + | x1 = expr; "-"; x2 = expr -> <:expr< $x1$ - $x2$ >> ] + | "7" LEFTA + [ x1 = expr; "*"; x2 = expr -> <:expr< $x1$ * $x2$ >> + | x1 = expr; "/"; x2 = expr -> <:expr< $x1$ / $x2$ >> + | x1 = expr; "div"; x2 = expr -> <:expr< $x1$ / $x2$ >> + | x1 = expr; "mod"; x2 = expr -> <:expr< $x1$ mod $x2$ >> ] + | LEFTA + [ x1 = expr; x2 = expr -> <:expr< $x1$ $x2$ >> ] + | [ "#"; x1 = STRING -> <:expr< $chr:x1$ >> + | "#"; x1 = selector; x2 = expr -> + if ocaml_records.val then <:expr< $x2$ . $lid:x1$ >> + else <:expr< $x2$ # $lid:x1$ >> + | x1 = expr; "ocaml_record_access"; x2 = expr -> <:expr< $x1$ . $x2$ >> ] + | [ "!"; x1 = expr -> <:expr< $x1$ . val >> + | "~"; x1 = expr -> <:expr< - $x1$ >> ] + | [ x1 = LIDENT -> + match x1 with + [ "true" | "false" -> <:expr< $uid:String.capitalize x1$ >> + | "nil" -> <:expr< [] >> + | _ -> <:expr< $lid:x1$ >> ] + | x1 = UIDENT -> <:expr< $uid:x1$ >> + | x1 = UIDENT; "."; x2 = eqid -> <:expr< $uid:x1$ . $x2$ >> + | x1 = INT -> <:expr< $int:x1$ >> + | x1 = FLOAT -> <:expr< $flo:x1$ >> + | x1 = STRING -> <:expr< $str:x1$ >> + | "~"; x1 = INT -> <:expr< $int:"-"^x1$ >> + | i = op -> + if i = "::" then <:expr< fun (x, y) -> [x :: y] >> + else <:expr< fun (x, y) -> $lid:i$ x y >> + | "let"; x1 = ldecs; "in"; x2 = exp_ps; "end" -> + List.fold_right + (fun pel x2 -> + let loc = + match pel with + [ [(p, _) :: _] -> + (fst (MLast.loc_of_patt p), snd (MLast.loc_of_expr x2)) + | _ -> loc ] + in + match pel with + [ [(_, <:expr< fun [$list:_$] >>) :: _] -> + <:expr< let rec $list:pel$ in $x2$ >> + | _ -> + let pel = + List.map + (fun (p, e) -> + match p with + [ <:patt< { $list:lpl$ } >> -> + record_match_assoc (MLast.loc_of_patt p) lpl e + | _ -> (p, e) ]) + pel + in + <:expr< let $list:pel$ in $x2$ >> ]) + x1 x2 + | "{"; x1 = LIST1 elabel SEP ","; "}" -> record_expr loc x1 + | "["; "]" -> <:expr< [] >> + | "["; x1 = expr; "]" -> <:expr< [$x1$] >> + | "["; x1 = expr; ","; x2 = LIST1 SELF SEP ","; "]" -> + mklistexp loc None [x1 :: x2] + | "("; ")" -> <:expr< () >> + | "("; x1 = expr; ","; x2 = LIST1 SELF SEP ","; ")" -> + <:expr< ($list:[x1::x2]$) >> + | "("; x1 = expr; ";"; x2 = LIST1 SELF SEP ";"; ")" -> + <:expr< do { $list:[x1::x2]$ } >> + | "("; x1 = expr; ")" -> x1 ] ] + ; + fixity: + [ [ "infix" -> ("infix", None) + | "infix"; x1 = INT -> not_impl loc "fixity 2" + | "infixr" -> not_impl loc "fixity 3" + | "infixr"; x1 = INT -> ("infixr", Some x1) + | "nonfix" -> not_impl loc "fixity 5" ] ] + ; + patt: + [ [ x1 = patt; "as"; x2 = patt -> <:patt< ($x1$ as $x2$) >> ] + | LEFTA + [ x1 = patt; ":"; x2 = ctyp -> <:patt< ($x1$ : $x2$) >> ] + | RIGHTA + [ x1 = patt; "::"; x2 = patt -> <:patt< [$x1$ :: $x2$] >> ] + | [ x1 = patt; x2 = patt -> + match x1 with + [ <:patt< ref >> -> <:patt< {contents = $x2$} >> + | _ -> <:patt< $x1$ $x2$ >> ] ] + | "apat" + [ x1 = patt; "."; x2 = patt -> <:patt< $x1$ . $x2$ >> + | x1 = INT -> <:patt< $int:x1$ >> + | x1 = UIDENT -> <:patt< $uid:x1$ >> + | x1 = STRING -> <:patt< $str:x1$ >> + | "#"; x1 = STRING -> <:patt< $chr:x1$ >> + | "~"; x1 = INT -> <:patt< $int:"-"^x1$ >> + | LIDENT "nil" -> <:patt< [] >> + | LIDENT "false" -> <:patt< False >> + | LIDENT "true" -> <:patt< True >> + | x1 = id -> <:patt< $lid:x1$ >> + | x1 = op -> <:patt< $lid:x1$ >> + | "_" -> <:patt< _ >> + | "["; "]" -> <:patt< [] >> + | "["; x1 = patt; "]" -> <:patt< [$x1$] >> + | "["; x1 = patt; ","; x2 = LIST1 SELF SEP ","; "]" -> + mklistpat loc None [x1 :: x2] + | "{"; x1 = LIST1 plabel SEP ","; "}" -> <:patt< {$list:x1$} >> + | "("; ")" -> <:patt< () >> + | "("; x1 = patt; ","; x2 = LIST1 SELF SEP ","; ")" -> + <:patt< ($list:[x1::x2]$) >> + | "("; x1 = patt; ")" -> x1 ] ] + ; + plabel: + [ [ x1 = selector; "="; x2 = patt -> (<:patt< $lid:x1$ >>, x2) + | x1 = selector -> (<:patt< $lid:x1$ >>, <:patt< $lid:x1$ >>) ] ] + ; + vb: + [ [ "lazy"; x1 = patt; "="; x2 = expr -> not_impl loc "vb 1" + | x1 = patt; "="; x2 = expr -> (x1, x2) ] ] + ; + constrain: + [ [ -> None + | ":"; x1 = ctyp -> Some x1 ] ] + ; + fb: + [ [ xl = LIST1 clause SEP "|" -> function_of_clause_list loc xl + | "lazy"; x1 = LIST1 clause SEP "|" -> not_impl loc "fb 2" ] ] + ; + clause: + [ [ x1 = patt LEVEL "apat"; x2 = LIST1 (patt LEVEL "apat"); + x3 = constrain; "="; x4 = expr -> + let x1 = + match x1 with + [ <:patt< $lid:id$ >> -> (id, MLast.loc_of_patt x1) + | _ -> not_impl loc "clause 1" ] + in + (x1, x2, x3, x4) ] ] + ; + tb: + [ [ x1 = tyvars; x2 = idd; "="; x3 = ctyp -> + ((loc, uncap x2), x1, x3, []) + | x1 = tyvars; x2 = idd; "="; x3 = ctyp; "=="; x4 = dbrhs -> + let x4 = List.map (fun (loc, c, tl, _) -> (loc, c, tl)) x4 in + ((loc, uncap x2), x1, <:ctyp< $x3$ == [ $list:x4$ ] >>, []) ] ] + ; + tyvars: + [ [ "'"; x1 = LIDENT -> [(x1, (False, False))] + | "("; x1 = tyvar_pc; ")" -> x1 + | -> [] ] ] + ; + db1: + [ [ x1 = tyvars; x2 = ident; "="; x3 = dbrhs -> + let x2 = uncap x2 in + extract_label_types loc x2 x1 x3 + | "lazy"; x1 = tyvars; x2 = ident; "="; x3 = dbrhs -> + not_impl loc "db 2" ] ] + ; + db: + [ [ x1 = LIST1 db1 SEP "and" -> + List.fold_right (fun td tdl -> td @ tdl) x1 [] ] ] + ; + dbrhs: + [ [ x1 = LIST1 constr SEP "|" -> x1 + | "datatype"; x1 = tycon -> not_impl loc "dbrhs 2" ] ] + ; + constr: + [ [ x1 = op_op; x2 = ident -> (loc, x2, [], None) + | x1 = op_op; x2 = ident; "of"; x3 = ctyp -> + match x3 with + [ <:ctyp< {$list:_$} >> -> (loc, x2, [], Some x3) + | _ -> (loc, x2, [x3], None) ] ] ] + ; + eb: + [ [ x1 = op_op; x2 = ident -> (x2, [], []) + | x1 = op_op; x2 = ident; "of"; x3 = ctyp -> (x2, [x3], []) + | x1 = op_op; x2 = ident; "="; x3 = sqid -> (x2, [], x3) ] ] + ; + ldec1: + [ [ "val"; x1 = LIST1 vb SEP "and" -> x1 + | "fun"; x1 = LIST1 fb SEP "and" -> x1 ] ] + ; + ldecs: + [ [ -> [] + | x1 = ldec1; x2 = ldecs -> [x1 :: x2] + | ";"; x1 = ldecs -> x1 + | "local"; x1 = ldecs; "in"; x2 = ldecs; "end"; x3 = ldecs -> + not_impl loc "ldecs 4" ] ] + ; + spec_s: + [ [ -> [] + | x1 = spec; x2 = spec_s -> [x1 :: x2] + | ";"; x1 = spec_s -> x1 ] ] + ; + spec: + [ [ "structure"; x1 = LIST1 strspec SEP "and" -> sig_declare loc x1 + | "functor"; x1 = LIST1 fctspec SEP "and" -> sig_declare loc x1 + | "datatype"; x1 = db -> <:sig_item< type $list:x1$ >> + | "type"; x1 = LIST1 tyspec SEP "and" -> <:sig_item< type $list:x1$ >> + | "eqtype"; x1 = LIST1 tyspec SEP "and" -> <:sig_item< type $list:x1$ >> + | "val"; x1 = LIST1 valspec SEP "and" -> sig_declare loc x1 + | "exception"; x1 = LIST1 exnspec SEP "and" -> sig_declare loc x1 + | "sharing"; x1 = LIST1 sharespec SEP "and" -> <:sig_item< declare end >> + | "include"; x1 = module_type -> <:sig_item< include $x1$ >> ] ] + ; + sig_item: + [ [ x = spec -> x ] ] + ; + strspec: + [ [ x1 = ident; ":"; x2 = module_type; x3 = LIST0 sharing_def -> + let x2 = + List.fold_left + (fun mt sdl -> + List.fold_right + (fun spl mt -> + match spl with + [ Right ([m1], m2) -> + let (m1, m2) = + match m2 with + [ <:module_expr< $uid:x$ . $_$ >> -> + if x = x1 then (m2, m1) else (m1, m2) + | _ -> (m1, m2) ] + in + let m1 = + loop m1 where rec loop = + fun + [ <:module_expr< $uid:x$ >> -> x + | <:module_expr< $uid:x$ . $y$ >> -> loop y + | _ -> not_impl loc "strspec 2" ] + in + <:module_type< $mt$ with module $[m1]$ = $m2$ >> + | _ -> not_impl loc "strspec 1" ]) + sdl mt) + x2 x3 + in + <:sig_item< module $x1$ : $x2$ >> ] ] + ; + sharing_def: + [ [ "sharing"; x3 = LIST1 sharespec SEP "and" -> x3 ] ] + ; + fctspec: + [ [ x1 = ident; x2 = fsig -> <:sig_item< module $x1$ : $x2$ >> ] ] + ; + tyspec: + [ [ x1 = tyvars; x2 = idd -> + ((loc, uncap x2), x1, <:ctyp< '$choose_tvar x1$ >>, []) + | x1 = tyvars; x2 = idd; "="; x3 = ctyp -> + ((loc, uncap x2), x1, x3, []) ] ] + ; + valspec: + [ [ x1 = op_op; x2 = ident; ":"; x3 = ctyp -> + <:sig_item< value $x2$ : $x3$ >> ] ] + ; + exnspec: + [ [ x1 = ident -> <:sig_item< exception $x1$ >> + | x1 = ident; "of"; x2 = ctyp -> + <:sig_item< exception $x1$ of $x2$ >> ] ] + ; + sharespec: + [ [ "type"; x1 = patheqn -> Left x1 + | x1 = patheqn -> Right x1 ] ] + ; + patheqn: + [ [ l = patheqn1 -> l ] ] + ; + patheqn1: + [ [ (l, y) = patheqn1; "="; x = qid -> ([y :: l], x) + | x = qid -> ([], x) ] ] + ; + whspec: + [ [ "type"; x1 = tyvars; x2 = sqid; "="; x3 = ctyp -> + MLast.WcTyp loc x2 x1 x3 + | x1 = sqid; "="; x2 = qid -> MLast.WcMod loc x1 x2 ] ] + ; + module_type: + [ [ x1 = ident -> <:module_type< $uid:x1$ >> + | "sig"; x1 = spec_s; "end" -> <:module_type< sig $list:x1$ end >> + | x1 = module_type; "where"; x2 = LIST1 whspec SEP "and" -> + <:module_type< $x1$ with $list:x2$ >> ] ] + ; + sigconstraint_op: + [ [ -> None + | ":"; x1 = module_type -> Some x1 + | ":>"; x1 = module_type -> not_impl loc "sigconstraint_op 3" ] ] + ; + sigb: + [ [ x1 = ident; "="; x2 = module_type -> + <:str_item< module type $x1$ = $x2$ >> ] ] + ; + fsig: + [ [ ":"; x1 = ident -> not_impl loc "fsig 1" + | x1 = fparamList; ":"; x2 = module_type -> not_impl loc "fsig 2" ] ] + ; + module_expr: + [ [ x1 = qid -> x1 + | "struct"; x1 = strdecs; "end" -> <:module_expr< struct $list:x1$ end >> + | x1 = qid; x2 = arg_fct -> + match x2 with + [ Left [] -> x1 + | Left x2 -> <:module_expr< $x1$ (struct $list:x2$ end) >> + | Right x2 -> <:module_expr< $x1$ $x2$ >> ] + | "let"; x1 = strdecs; "in"; x2 = module_expr; "end" -> + not_impl loc "str 4" + | x1 = module_expr; ":"; x2 = module_type -> not_impl loc "str 5" + | x1 = module_expr; x2 = ":>"; x3 = module_type -> + not_impl loc "str 6" ] ] + ; + arg_fct: + [ [ "("; x1 = strdecs; ")"; x2 = arg_fct -> not_impl loc "arg_fct 1" + | "("; x1 = module_expr; ")"; x2 = arg_fct -> not_impl loc "arg_fct 2" + | "("; x1 = module_expr; ")" -> Right x1 + | "("; x2 = strdecs; ")" -> Left x2 ] ] + ; + strdecs: + [ [ x1 = str_item LEVEL "strdec"; x2 = strdecs -> [x1 :: x2] + | ";"; x1 = strdecs -> x1 + | -> [] ] ] + ; + str_item: + [ [ "signature"; x1 = LIST1 sigb SEP "and" -> str_declare loc x1 + | "funsig"; x1 = fsigb -> not_impl loc "sdec 3" ] + | "strdec" + [ "structure"; x1 = LIST1 strb SEP "and" -> str_declare loc x1 + | "functor"; x1 = LIST1 fctb SEP "and" -> str_declare loc x1 + | "local"; x1 = sdecs; "in"; x2 = sdecs; "end" -> + make_local loc x1 x2 ] + | [ "val"; x1 = LIST1 vb SEP "and" -> <:str_item< value $list:x1$ >> + | "val"; x1 = tyvarseq; x3 = LIST1 vb SEP "and" -> + not_impl loc "ldec 2" + | "val"; "rec"; x1 = rvb -> not_impl loc "ldec 3" + | "val"; "rec"; x1 = tyvarseq; x2 = rvb -> not_impl loc "ldec 4" + | "fun"; x1 = LIST1 fb SEP "and" -> <:str_item< value rec $list:x1$ >> + | "fun"; x1 = tyvarseq; x2 = fb -> not_impl loc "ldec 6" + | "type"; x1 = LIST1 tb SEP "and" -> <:str_item< type $list:x1$ >> + | "datatype"; x1 = db -> <:str_item< type $list:x1$ >> + | "datatype"; x1 = db; "withtype"; x2 = tb -> + <:str_item< type $list:x1 @ [x2]$ >> + | "abstype"; x1 = db; "with"; x2 = ldecs; "end" -> not_impl loc "ldec 10" + | "abstype"; x1 = db; "withtype"; x2 = tb; "with"; x3 = ldecs; "end" -> + not_impl loc "ldec 11" + | "exception"; x1 = LIST1 eb SEP "and" -> + let dl = + List.map + (fun (s, tl, eqn) -> + <:str_item< exception $s$ of $list:tl$ = $eqn$ >>) + x1 + in + str_declare loc dl + | "open"; x1 = LIST1 sqid -> + let dl = List.map (fun sl -> <:str_item< open $sl$ >>) x1 in + str_declare loc dl + | LIDENT "use"; s = STRING -> + <:str_item< #use $str:s$ >> + | x1 = fixity; list = LIST1 idd -> + match x1 with + [ ("infixr", Some n) -> + do { + List.iter + (fun s -> + EXTEND + expr: LEVEL $n$ + [ [ x1 = expr; $s$; x2 = expr -> + <:expr< $lid:s$ ($x1$, $x2$) >> ] ] + ; + END) + list; + str_declare loc [] + } + | ("infix", None) -> + do { + List.iter + (fun s -> + EXTEND + expr: LEVEL "4" + [ [ x1 = expr; $s$; x2 = expr -> + <:expr< $lid:s$ ($x1$, $x2$) >> ] ] + ; + clause: + [ [ x1 = patt LEVEL "apat"; $s$; + x2 = patt LEVEL "apat"; "="; x4 = expr -> + ((s, loc), [<:patt< ($x1$, $x2$) >>], + None, x4) ] ] + ; + END) + list; + str_declare loc [] + } + | _ -> not_impl loc "ldec 14" ] + | "overload"; x1 = ident; ":"; x2 = ctyp; "as"; x3 = exp_pa -> + not_impl loc "ldec 15" + | x = expr -> <:str_item< $exp:x$ >> ] ] + ; + sdec: + [ [ x = str_item -> x ] ] + ; + strb: + [ [ x1 = ident; x2 = sigconstraint_op; "="; x3 = module_expr -> + let x3 = + match x2 with + [ Some x2 -> <:module_expr< ($x3$ : $x2$) >> + | None -> x3 ] + in + <:str_item< module $x1$ = $x3$ >> ] ] + ; + fparam: + [ [ x1 = idd; ":"; x2 = module_type -> [<:sig_item< module $x1$ : $x2$ >>] + | x1 = spec_s -> x1 ] ] + ; + fparamList: + [ [ "("; x1 = fparam; ")" -> [x1] + | "("; x1 = fparam; ")"; x2 = fparamList -> [x1 :: x2] ] ] + ; + fctb: + [ [ x1 = ident; x2 = fparamList; x3 = sigconstraint_op; "="; + x4 = module_expr -> + let list = List.flatten x2 in + let x4 = + if list = [] then x4 + else + match x4 with + [ <:module_expr< struct $list:list$ end >> -> + let si = + let loc = (Token.nowhere, Token.nowhere) in + <:str_item< open AAA >> in + <:module_expr< struct $list:[si :: list]$ end >> + | _ -> not_impl loc "fctb 1" ] + in + let x4 = + match x3 with + [ Some x3 -> <:module_expr< ($x4$ : $x3$) >> + | None -> x4 ] + in + let x4 = + if list = [] then x4 + else + let mt = + let loc = + (fst (MLast.loc_of_sig_item (List.hd list)), + snd (MLast.loc_of_sig_item (List.hd (List.rev list)))) + in + <:module_type< sig $list:list$ end >> + in + <:module_expr< functor (AAA : $mt$) -> $x4$ >> + in + <:str_item< module $x1$ = $x4$ >> + | x1 = ident; x2 = fsigconstraint_op; "="; x3 = fct_exp -> + not_impl loc "fctb 2" ] ] + ; + interdec: + [ [ x = LIST1 [ s = str_item; OPT ";" -> (s, loc) ] -> (x, False) + | x = expr; OPT ";" -> not_impl loc "interdec 2" ] ] + ; +END; + +Pcaml.add_option "-records" (Arg.Set ocaml_records) + "Convert record into OCaml records, instead of objects"; diff --git a/camlp4/unmaintained/sml/smllib.sml b/camlp4/unmaintained/sml/smllib.sml new file mode 100644 index 00000000..5ecd0937 --- /dev/null +++ b/camlp4/unmaintained/sml/smllib.sml @@ -0,0 +1,395 @@ +(***********************************************************************) +(* *) +(* Camlp4 *) +(* *) +(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 Institut National de Recherche en Informatique et *) +(* Automatique. Distributed only by permission. *) +(* *) +(***********************************************************************) + + + +datatype 'a option = SOME of 'a | NONE +exception Fail of string +exception Domain +exception Subscript +type 'a vector = 'a array + +structure OCaml = + struct + structure List = List + structure String = String + end + +structure Time = + struct + datatype time = TIME of { sec : int, usec : int } + fun toString _ = failwith "not implemented Time.toString" + fun now _ = failwith "not implemented Time.now" + end + +datatype cpu_timer = + CPUT of { gc : Time.time, sys : Time.time, usr : Time.time } + +datatype real_timer = + RealT of Time.time + +structure Char = + struct + val ord = Char.code + end + +structure General = + struct + datatype order = LESS | EQUAL | GREATER + end +type order = General.order == LESS | EQUAL | GREATER + +structure OS = + struct + exception SysErr + structure Path = + struct + fun dir s = + let val r = Filename.dirname s in + if r = "." then "" else r + end + val file = Filename.basename + fun ext s = + let fun loop i = + if i < 0 then NONE + else if String.get s i = #"." then + let val len = String.length s - i - 1 in + if len = 0 then NONE else SOME (String.sub s (i + 1) len) + end + else loop (i - 1) + in + loop (String.length s - 1) + end + fun splitDirFile s = + {dir = Filename.dirname s, + file = Filename.basename s} + fun joinDirFile x = + let val {dir,file} = x in Filename.concat dir file end + end + structure FileSys = + struct + datatype access_mode = A_READ | A_WRITE | A_EXEC + val chDir = Sys.chdir + fun isDir s = + (Unix.stat s) ocaml_record_access Unix.st_kind = Unix.S_DIR + handle Unix.Unix_error _ => raise SysErr + fun access (s, accs) = + let val st = Unix.stat s + val prm = st ocaml_record_access Unix.st_perm + val prm = + if st ocaml_record_access Unix.st_uid = Unix.getuid () then + lsr prm 6 + else if st ocaml_record_access Unix.st_uid = Unix.getgid () + then + lsr prm 3 + else prm + val rf = + if List.mem A_READ accs then land prm 4 <> 0 else true + val wf = + if List.mem A_WRITE accs then land prm 2 <> 0 else true + val xf = + if List.mem A_EXEC accs then land prm 1 <> 0 else true + in + rf andalso wf andalso xf + end + handle Unix.Unix_error (_, f, _) => + if f = "stat" then false else raise SysErr + end + structure Process = + struct + fun system s = (flush stdout; flush stderr; Sys.command s) + fun getEnv s = SOME (Sys.getenv s) handle Not_found => NONE + val success = 0 + end + end + +exception SysErr = OS.SysErr + +structure IO = + struct + exception Io of {cause:exn, function:string, name:string} + end + +structure TextIO = + struct + type instream = in_channel * char option option ref + type outstream = out_channel + type elem = char + type vector = string + fun openIn fname = + (open_in fname, ref NONE) handle exn => + raise IO.Io {cause = exn, function = "openIn", name = fname} + val openOut = open_out + fun closeIn (ic, ahc) = (ahc := SOME NONE; close_in ic) + val closeOut = close_out + val stdIn = (stdin, ref (NONE : char option option)) + fun endOfStream (ic, _) = pos_in ic = in_channel_length ic + fun inputLine (ic, ahc) = + case !ahc of + NONE => + (input_line ic ^ "\n" handle End_of_file => (ahc := SOME NONE; "")) + | SOME NONE => "" + | SOME (SOME c) => + (ahc := NONE; + if c = #"\n" then "\n" + else + String.make 1 c ^ input_line ic ^ "\n" handle + End_of_file => (ahc := SOME NONE; "")) + fun input1 (ic, ahc) = + case !ahc of + NONE => + (SOME (input_char ic) handle End_of_file => (ahc := SOME NONE; NONE)) + | SOME NONE => NONE + | SOME x => (ahc := NONE; x) + fun inputN (ins, n) = + let fun loop n = + if n <= 0 then "" + else + case input1 ins of + SOME c => String.make 1 c ^ loop (n - 1) + | NONE => "" + in + loop n + end + fun output (oc, v) = output_string oc v + fun inputAll ic = failwith "not implemented TextIO.inputAll" + fun lookahead (ic, ahc) = + case !ahc of + NONE => let val r = SOME (input_char ic) in ahc := SOME r; r end + | SOME x => x + fun print s = (print_string s; flush stdout) + end + +structure Timer = + struct + fun startRealTimer () = failwith "not implemented Timer.startRealTimer" + fun startCPUTimer () = failwith "not implemented Timer.startCPUTimer" + fun checkRealTimer _ = failwith "not implemented Timer.checkRealTimer" + fun checkCPUTimer _ = failwith "not implemented Timer.checkCPUTimer" + end + +structure Date = + struct + datatype month = + Jan | Feb | Mar | Apr | May | Jun | Jul | Sep | Oct | Nov | Dec + datatype wday = Sun | Mon | Tue | Wed | Thu | Fri | Sat + datatype date = + DATE of + {day : int, hour : int, isDst : bool option, minute : int, + month : month, offset : int option, second : int, wday : wday, + yday : int, year : int} + fun fmt _ _ = failwith "not implemented Date.fmt" + fun fromTimeLocal _ = failwith "not implemented Date.fromTimeLocal" + end + +structure Posix = + struct + structure ProcEnv = + struct + fun getenv s = SOME (Sys.getenv s) handle Not_found => NONE + end + end + +structure SMLofNJ = + struct + fun exportML s = failwith ("not implemented exportML " ^ s) + end + +fun null x = x = [] +fun explode s = + let fun loop i = + if i = String.length s then [] + else String.get s i :: loop (i + 1) + in + loop 0 + end + +val app = List.iter +fun implode [] = "" + | implode (c :: l) = String.make 1 c ^ implode l + +fun ooo f g x = f (g x) + +structure Array = + struct + fun array (len, v) = Array.create len v + fun sub _ = failwith "not implemented Array.sub" + fun update _ = failwith "not implemented Array.update" + (* for make the profiler work *) + val set = Array.set + val get = Array.get + end + +structure Vector = + struct + fun tabulate _ = failwith "not implemented Vector.tabulate" + fun sub _ = failwith "not implemented Vector.sub" + end + +structure Bool = + struct + val toString = string_of_bool + end + +structure String = + struct + val size = String.length + fun substring (s, beg, len) = + String.sub s beg len handle Invalid_argument _ => raise Subscript + val concat = String.concat "" + fun sub (s, i) = String.get s i + val str = String.make 1 + fun compare (s1, s2) = + if s1 < s2 then LESS + else if s1 > s2 then GREATER + else EQUAL + fun isPrefix s1 s2 = + let fun loop i1 i2 = + if i1 >= String.length s1 then true + else if i2 >= String.length s2 then false + else if String.get s1 i1 = String.get s2 i2 then loop (i1 + 1) (i2 + 1) + else false + in + loop 0 0 + end + fun tokens p s = + let fun loop tok i = + if i >= String.length s then + if tok = "" then [] else [tok] + else if p (String.get s i) then + if tok <> "" then tok :: loop "" (i + 1) + else loop "" (i + 1) + else loop (tok ^ String.make 1 (String.get s i)) (i + 1) + in + loop "" 0 + end + fun extract _ = failwith "not implemented String.extract" + end + +structure Substring = + struct + type substring = string * int * int + fun string (s : substring) = String.substring s + fun all s : substring = (s, 0, String.size s) + fun splitl f ((s, beg, len) : substring) : substring * substring = + let fun loop di = + if di = len then ((s, beg, len), (s, 0, 0)) + else if f (String.sub (s, beg + di)) then loop (di + 1) + else ((s, beg, di), (s, beg + di, len - di)) + in + loop 0 + end + fun getc (s, i, len) = + if len > 0 andalso i < String.size s then + SOME (String.sub (s, i), (s, i+1, len-1)) + else NONE + fun slice _ = failwith "not implemented: Substring.slice" + fun isEmpty (s, beg, len) = len = 0 + fun concat sl = String.concat (List.map string sl) + end +type substring = Substring.substring + +structure StringCvt = + struct + datatype radix = BIN | OCT | DEC | HEX + type ('a, 'b) reader = 'b -> ('a * 'b) option + end + +structure ListPair = + struct + fun zip (a1::l1, a2::l2) = (a1, a2) :: zip (l1, l2) + | zip _ = [] + val unzip = List.split + fun all f (x1 :: l1, x2 :: l2) = f (x1, x2) andalso all f (l1, l2) + | all _ _ = true + fun map f (a1::l1, a2::l2) = + let val r = f (a1, a2) in r :: map f (l1, l2) end + | map _ _ = [] + end + +structure ListMergeSort = + struct + fun uniqueSort cmp l = + List.sort + (fn x => fn y => + case cmp (x, y) of + LESS => ~1 + | EQUAL => 0 + | GREATER => 1) + l + end + +structure List = + struct + exception Empty + fun hd [] = raise Empty + | hd (x :: l) = x + fun tl [] = raise Empty + | tl (x :: l) = l + fun foldr f a l = + let fun loop a [] = a + | loop a (x :: l) = loop (f (x, a)) l + in + loop a (List.rev l) + end + fun foldl f a l = List.fold_left (fn a => fn x => f (x, a)) a l + val concat = List.flatten + val exists = List.exists + val filter = List.filter + val length = List.length + val map = List.map + val rev = List.rev + val all = List.for_all + fun find f [] = NONE + | find f (x :: l) = if f x then SOME x else find f l + fun last s = + case List.rev s of + [] => raise Empty + | x :: _ => x + fun take _ = failwith "not implemented: List.take" + fun partition _ = failwith "not implemented: List.partition" + fun mapPartial f [] = [] + | mapPartial f (x :: l) = + case f x of + NONE => mapPartial f l + | SOME y => y :: mapPartial f l + fun op @ l1 l2 = List.rev_append (List.rev l1) l2 + end + +structure Int = + struct + type int1 = int + type int = int1 + val toString = string_of_int + fun fromString s = SOME (int_of_string s) handle Failure _ => NONE + fun min (x, y) = if x < y then x else y + fun max (x, y) = if x > y then x else y + fun scan radix getc src = failwith "not impl: Int.scan" + end + +val foldr = List.foldr +val exists = List.exists +val size = String.size +val substring = String.substring +val concat = String.concat +val length = List.length +val op @ = List.op @ +val hd = List.hd +val tl = List.tl +val map = List.map +val rev = List.rev +val use_hook = ref (fn (s : string) => (failwith "no defined directive use" : unit)) +fun use s = !use_hook s +fun isSome (SOME _) = true + | isSome NONE = false +fun valOf (SOME x) = x + | valOf NONE = failwith "valOf" +val print = TextIO.print diff --git a/config/.cvsignore b/config/.cvsignore index df99fdc7..9fc1c014 100644 --- a/config/.cvsignore +++ b/config/.cvsignore @@ -2,4 +2,3 @@ m.h s.h Makefile config.sh - diff --git a/config/Makefile-templ b/config/Makefile-templ index bf514217..dd65452a 100644 --- a/config/Makefile-templ +++ b/config/Makefile-templ @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile-templ 9313 2009-07-15 12:13:31Z xleroy $ +# $Id$ ### Compile-time configuration @@ -31,7 +31,7 @@ MANDIR=/usr/local/man MANEXT=1 ### Do #! scripts work on your system? -### Beware: on some systems (e.g. SunOS 4), this will work only if +### Beware: on some systems (e.g. SunOS 4), this will work only if ### the string "#!$(BINDIR)/ocamlrun" is less than 32 characters long. ### In doubt, set SHARPBANGSCRIPTS to false. SHARPBANGSCRIPTS=true @@ -224,7 +224,7 @@ PARTIALLD=ld -r $(NATIVECCLINKOPTS) # unix Unix system calls # str Regular expressions and high-level string processing # num Arbitrary-precision rational arithmetic -# threads Lightweight concurrent processes +# threads Lightweight concurrent processes # systhreads Same as threads, requires POSIX threads # graph Portable drawing primitives for X11 # dynlink Dynamic linking of bytecode diff --git a/config/Makefile.mingw b/config/Makefile.mingw index e338d8f9..d1e40bb1 100644 --- a/config/Makefile.mingw +++ b/config/Makefile.mingw @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.mingw 9508 2010-01-04 15:52:44Z xleroy $ +# $Id$ # Configuration for Windows, Mingw compiler @@ -153,5 +153,5 @@ TK_LINK=$(TK_ROOT)/bin/tk85.dll $(TK_ROOT)/bin/tcl85.dll -lws2_32 ############# Aliases for common commands -MAKEREC=$(MAKE) -f Makefile.nt +MAKEREC=$(MAKE) -f Makefile.nt MAKECMD=$(MAKE) diff --git a/config/Makefile.msvc b/config/Makefile.msvc index 6ad0a339..4bbf5445 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.msvc 9526 2010-01-14 14:42:00Z xclerc $ +# $Id$ # Configuration for Windows, Visual C++ compiler @@ -159,5 +159,5 @@ TK_LINK=tk85.lib tcl85.lib ws2_32.lib ############# Aliases for common commands -MAKEREC=$(MAKE) -f Makefile.nt +MAKEREC=$(MAKE) -f Makefile.nt MAKECMD=$(MAKE) diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 7dacd789..5088fc17 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.msvc64 9526 2010-01-14 14:42:00Z xclerc $ +# $Id$ # Configuration for Windows, Visual C++ compiler @@ -154,5 +154,5 @@ TK_LINK= ############# Aliases for common commands -MAKEREC=$(MAKE) -f Makefile.nt +MAKEREC=$(MAKE) -f Makefile.nt MAKECMD=$(MAKE) diff --git a/config/auto-aux/align.c b/config/auto-aux/align.c index b98e33da..0bedf77a 100644 --- a/config/auto-aux/align.c +++ b/config/auto-aux/align.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: align.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/config/auto-aux/async_io.c b/config/auto-aux/async_io.c index 10aaa764..2b5faa2d 100644 --- a/config/auto-aux/async_io.c +++ b/config/auto-aux/async_io.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: async_io.c 5393 2003-02-11 14:05:36Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/config/auto-aux/bytecopy.c b/config/auto-aux/bytecopy.c index a16f3978..923b444e 100644 --- a/config/auto-aux/bytecopy.c +++ b/config/auto-aux/bytecopy.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bytecopy.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ char buffer[27]; diff --git a/config/auto-aux/dblalign.c b/config/auto-aux/dblalign.c index 76c021b7..c2520381 100644 --- a/config/auto-aux/dblalign.c +++ b/config/auto-aux/dblalign.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dblalign.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include @@ -52,4 +52,3 @@ int main(void) #endif exit(res); } - diff --git a/config/auto-aux/divmod.c b/config/auto-aux/divmod.c index c4ddf861..8f69dabf 100644 --- a/config/auto-aux/divmod.c +++ b/config/auto-aux/divmod.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -/* $Id: divmod.c 6043 2003-12-31 00:00:57Z doligez $ */ +/* $Id$ */ /* Test semantics of division and modulus for negative arguments */ -long div4[] = +long div4[] = { -4,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,-1,-1,0,0,0, 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4 }; diff --git a/config/auto-aux/elf.c b/config/auto-aux/elf.c index e0f6653a..026c4838 100644 --- a/config/auto-aux/elf.c +++ b/config/auto-aux/elf.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: elf.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include diff --git a/config/auto-aux/endian.c b/config/auto-aux/endian.c index d3b622a0..def617f0 100644 --- a/config/auto-aux/endian.c +++ b/config/auto-aux/endian.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: endian.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include "m.h" diff --git a/config/auto-aux/getgroups.c b/config/auto-aux/getgroups.c index 547d5e4a..1ed8a1fb 100644 --- a/config/auto-aux/getgroups.c +++ b/config/auto-aux/getgroups.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getgroups.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/config/auto-aux/gethostbyaddr.c b/config/auto-aux/gethostbyaddr.c index c11bb019..c5dd1297 100644 --- a/config/auto-aux/gethostbyaddr.c +++ b/config/auto-aux/gethostbyaddr.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gethostbyaddr.c 4771 2002-05-06 08:29:52Z xleroy $ */ +/* $Id$ */ #ifndef _REENTRANT /* This helps detection on Digital Unix... */ diff --git a/config/auto-aux/gethostbyname.c b/config/auto-aux/gethostbyname.c index 270905f2..043b9d33 100644 --- a/config/auto-aux/gethostbyname.c +++ b/config/auto-aux/gethostbyname.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gethostbyname.c 4771 2002-05-06 08:29:52Z xleroy $ */ +/* $Id$ */ #ifndef _REENTRANT /* This helps detection on Digital Unix... */ diff --git a/config/auto-aux/ia32sse2.c b/config/auto-aux/ia32sse2.c index 41d62017..cbe11462 100644 --- a/config/auto-aux/ia32sse2.c +++ b/config/auto-aux/ia32sse2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: ia32sse2.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ /* Test whether IA32 assembler supports SSE2 instructions */ diff --git a/config/auto-aux/initgroups.c b/config/auto-aux/initgroups.c new file mode 100644 index 00000000..b6e0ffbd --- /dev/null +++ b/config/auto-aux/initgroups.c @@ -0,0 +1,26 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Copyright 2009 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Contributed by Stephane Glondu */ + +/* $Id$ */ + +#include + +#include +#include +#include + +int main(void) +{ + if (initgroups("root", 0) == -1 && errno != EPERM) return 1; + return 0; +} diff --git a/config/auto-aux/int64align.c b/config/auto-aux/int64align.c index 482fad10..6bdd2556 100644 --- a/config/auto-aux/int64align.c +++ b/config/auto-aux/int64align.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: int64align.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include @@ -53,4 +53,3 @@ int main(void) #endif exit(res); } - diff --git a/config/auto-aux/longlong.c b/config/auto-aux/longlong.c index fd77588d..bcdf4c97 100644 --- a/config/auto-aux/longlong.c +++ b/config/auto-aux/longlong.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: longlong.c 4833 2002-05-25 08:33:26Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/config/auto-aux/schar.c b/config/auto-aux/schar.c index 2499f537..55d49f31 100644 --- a/config/auto-aux/schar.c +++ b/config/auto-aux/schar.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: schar.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ char foo[]="\377"; diff --git a/config/auto-aux/schar2.c b/config/auto-aux/schar2.c index ef913aa5..d1d781a5 100644 --- a/config/auto-aux/schar2.c +++ b/config/auto-aux/schar2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: schar2.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ signed char foo[]="\377"; diff --git a/config/auto-aux/setgroups.c b/config/auto-aux/setgroups.c new file mode 100644 index 00000000..5cfe49c0 --- /dev/null +++ b/config/auto-aux/setgroups.c @@ -0,0 +1,28 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Copyright 2009 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Contributed by Stephane Glondu */ + +/* $Id$ */ + +#include + +#include +#include +#include + +int main(void) +{ + gid_t gidset[1]; + gidset[0] = 0; + if (setgroups(1, gidset) == -1 && errno != EPERM) return 1; + return 0; +} diff --git a/config/auto-aux/sighandler.c b/config/auto-aux/sighandler.c index e27d4820..7e748df5 100644 --- a/config/auto-aux/sighandler.c +++ b/config/auto-aux/sighandler.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sighandler.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include diff --git a/config/auto-aux/signals.c b/config/auto-aux/signals.c index 7f51be85..df0a8b0b 100644 --- a/config/auto-aux/signals.c +++ b/config/auto-aux/signals.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ /* To determine the semantics of signal handlers (System V: signal is reset to default behavior on entrance to the handler diff --git a/config/auto-aux/sizes.c b/config/auto-aux/sizes.c index b6014ce7..992c47a6 100644 --- a/config/auto-aux/sizes.c +++ b/config/auto-aux/sizes.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sizes.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include diff --git a/config/auto-aux/stackov.c b/config/auto-aux/stackov.c index 15c74ab0..39e4e832 100644 --- a/config/auto-aux/stackov.c +++ b/config/auto-aux/stackov.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stackov.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ #include #include @@ -55,7 +55,7 @@ int main(int argc, char ** argv) #else act.sa_sigaction = segv_handler; act.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER; -#endif +#endif sigemptyset(&act.sa_mask); system_stack_top = (char *) &act; if (sigaltstack(&stk, NULL) != 0) { perror("sigaltstack"); return 2; } diff --git a/config/m-nt.h b/config/m-nt.h index d56ab817..7a928281 100644 --- a/config/m-nt.h +++ b/config/m-nt.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: m-nt.h 7408 2006-05-09 16:02:09Z xleroy $ */ +/* $Id$ */ /* Machine configuration, Intel x86 processors, Win32, Visual C++ or Mingw compiler */ @@ -43,4 +43,3 @@ #define ARCH_INT64_PRINTF_FORMAT "I64" #undef NONSTANDARD_DIV_MOD - diff --git a/config/m-templ.h b/config/m-templ.h index 8245ba18..392ec562 100644 --- a/config/m-templ.h +++ b/config/m-templ.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: m-templ.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* Processor dependencies */ diff --git a/config/s-nt.h b/config/s-nt.h index 1017e933..5eaf3770 100644 --- a/config/s-nt.h +++ b/config/s-nt.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: s-nt.h 4933 2002-06-18 13:01:53Z xleroy $ */ +/* $Id$ */ /* Operating system dependencies, Intel x86 processors, Windows NT */ diff --git a/config/s-templ.h b/config/s-templ.h index 0e473e98..a65b178a 100644 --- a/config/s-templ.h +++ b/config/s-templ.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: s-templ.h 6304 2004-05-18 08:50:22Z xleroy $ */ +/* $Id$ */ /* Operating system and standard library dependencies. */ @@ -52,6 +52,11 @@ /* Define SUPPORT_DYNAMIC_LINKING if dynamic loading of C stub code via dlopen() is available. */ +#define HAS_EXPM1_LOG1P + +/* Define HAS_EXPM1_LOG1P if the math functions expm1() and log1p() + are available. (Standard C99 but not C89.) */ + /* 2. For the Unix library. */ #define HAS_SOCKETS @@ -139,6 +144,14 @@ /* Define HAS_GETGROUPS if you have getgroups(). */ +#define HAS_SETGROUPS + +/* Define HAS_SETGROUPS if you have setgroups(). */ + +#define HAS_INITGROUPS + +/* Define HAS_INITGROUPS if you have initgroups(). */ + #define HAS_TERMIOS /* Define HAS_TERMIOS if you have /usr/include/termios.h and it is @@ -180,7 +193,7 @@ #define HAS_LOCALE -/* Define HAS_LOCALE if you have the include file and the +/* Define HAS_LOCALE if you have the include file and the setlocale() function. */ #define HAS_MMAP @@ -191,13 +204,13 @@ #define HAS_GETHOSTBYNAME_R 6 /* Define HAS_GETHOSTBYNAME_R if gethostbyname_r() is available. - The value of this symbol is the number of arguments of + The value of this symbol is the number of arguments of gethostbyname_r(): either 5 or 6 depending on prototype. (5 is the Solaris version, 6 is the Linux version). */ #define HAS_GETHOSTBYADDR_R 8 /* Define HAS_GETHOSTBYADDR_R if gethostbyname_r() is available. - The value of this symbol is the number of arguments of + The value of this symbol is the number of arguments of gethostbyaddr_r(): either 7 or 8 depending on prototype. (7 is the Solaris version, 8 is the Linux version). */ diff --git a/configure b/configure index 1797b0c2..40a89e85 100755 --- a/configure +++ b/configure @@ -13,7 +13,7 @@ # # ######################################################################### -# $Id: configure 9414 2009-11-17 13:28:44Z weis $ +# $Id$ configure_options="$*" prefix=/usr/local @@ -576,7 +576,7 @@ if test $withsharedlibs = "yes"; then byteccrpath="-Wl,-rpath," mksharedlibrpath="-rpath " shared_libraries_supported=true;; - i[3456]86-*-darwin*) + i[3456]86-*-darwin[4-9]*) mksharedlib="$bytecc -bundle -flat_namespace -undefined suppress -read_only_relocs suppress" bytecccompopts="$dl_defs $bytecccompopts" dl_needs_underscore=false @@ -824,7 +824,14 @@ else fi fi -# For the sys module +# For the Pervasives module + +if sh ./trycompile expm1.c $mathlib; then + echo "expm1() and log1p() found." + echo "#define HAS_EXPM1_LOG1P" >> s.h +fi + +# For the Sys module if sh ./hasgot getrusage; then echo "getrusage() found." @@ -992,6 +999,16 @@ if sh ./hasgot -i limits.h && sh ./runtest getgroups.c; then echo "#define HAS_GETGROUPS" >> s.h fi +if sh ./hasgot -i limits.h -i grp.h && sh ./runtest setgroups.c; then + echo "setgroups() found." + echo "#define HAS_SETGROUPS" >> s.h +fi + +if sh ./hasgot -i limits.h -i grp.h && sh ./runtest initgroups.c; then + echo "initgroups() found." + echo "#define HAS_INITGROUPS" >> s.h +fi + if sh ./hasgot -i termios.h && sh ./hasgot tcgetattr tcsetattr tcsendbreak tcflush tcflow; then echo "POSIX termios found." @@ -1130,7 +1147,6 @@ case "$arch" in fi;; mips) bng_arch=mips; bng_asm_level=1;; power) bng_arch=ppc; bng_asm_level=1;; - sparc) bng_arch=sparc; bng_asm_level=1;; amd64) bng_arch=amd64; bng_asm_level=1;; *) bng_arch=generic; bng_asm_level=0;; esac @@ -1568,7 +1584,8 @@ echo "DEBUGGER=$debugger" >> Makefile echo "CC_PROFILE=$cc_profile" >> Makefile echo "SYSTHREAD_SUPPORT=$systhread_support" >> Makefile echo "PARTIALLD=$partialld" >> Makefile -echo "PACKLD=\$(PARTIALLD) \$(NATIVECCLINKOPTS) -o " >> Makefile +echo "PACKLD=\$(PARTIALLD) \$(NATIVECCLINKOPTS) -o " \ + | sed -e 's/ $/\\ /' >> Makefile echo "DLLCCCOMPOPTS=$dllccompopts" >> Makefile echo "IFLEXDIR=$iflexdir" >> Makefile echo "O=o" >> Makefile diff --git a/debugger/.depend b/debugger/.depend index 972240d3..1a04b1ea 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -1,45 +1,45 @@ -breakpoints.cmi: primitives.cmi ../bytecomp/instruct.cmi -checkpoints.cmi: primitives.cmi debugcom.cmi -command_line.cmi: -debugcom.cmi: primitives.cmi -debugger_config.cmi: -dynlink.cmi: -envaux.cmi: ../typing/path.cmi ../bytecomp/instruct.cmi ../typing/env.cmi +breakpoints.cmi: primitives.cmi ../bytecomp/instruct.cmi +checkpoints.cmi: primitives.cmi debugcom.cmi +command_line.cmi: +debugcom.cmi: primitives.cmi +debugger_config.cmi: +dynlink.cmi: +envaux.cmi: ../typing/path.cmi ../bytecomp/instruct.cmi ../typing/env.cmi eval.cmi: ../typing/types.cmi ../typing/path.cmi parser_aux.cmi \ ../parsing/longident.cmi ../bytecomp/instruct.cmi ../typing/ident.cmi \ - ../typing/env.cmi debugcom.cmi -events.cmi: ../bytecomp/instruct.cmi -exec.cmi: -frames.cmi: primitives.cmi ../bytecomp/instruct.cmi -history.cmi: -input_handling.cmi: primitives.cmi -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 -pattern_matching.cmi: ../typing/typedtree.cmi parser_aux.cmi debugcom.cmi -pos.cmi: ../bytecomp/instruct.cmi -primitives.cmi: $(UNIXDIR)/unix.cmi + ../typing/env.cmi debugcom.cmi +events.cmi: ../bytecomp/instruct.cmi +exec.cmi: +frames.cmi: primitives.cmi ../bytecomp/instruct.cmi +history.cmi: +input_handling.cmi: primitives.cmi +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 +pattern_matching.cmi: ../typing/typedtree.cmi parser_aux.cmi debugcom.cmi +pos.cmi: ../bytecomp/instruct.cmi +primitives.cmi: $(UNIXDIR)/unix.cmi printval.cmi: ../typing/types.cmi ../typing/path.cmi parser_aux.cmi \ - ../typing/env.cmi debugcom.cmi -program_loading.cmi: primitives.cmi -program_management.cmi: -question.cmi: -show_information.cmi: ../bytecomp/instruct.cmi -show_source.cmi: ../bytecomp/instruct.cmi -source.cmi: -symbols.cmi: ../bytecomp/instruct.cmi -time_travel.cmi: primitives.cmi -trap_barrier.cmi: -unix_tools.cmi: $(UNIXDIR)/unix.cmi + ../typing/env.cmi debugcom.cmi +program_loading.cmi: primitives.cmi +program_management.cmi: +question.cmi: +show_information.cmi: ../bytecomp/instruct.cmi +show_source.cmi: ../bytecomp/instruct.cmi +source.cmi: +symbols.cmi: ../bytecomp/instruct.cmi +time_travel.cmi: primitives.cmi +trap_barrier.cmi: +unix_tools.cmi: $(UNIXDIR)/unix.cmi breakpoints.cmo: symbols.cmi primitives.cmi pos.cmi ../bytecomp/instruct.cmi \ - exec.cmi debugcom.cmi checkpoints.cmi breakpoints.cmi + exec.cmi debugcom.cmi checkpoints.cmi breakpoints.cmi breakpoints.cmx: symbols.cmx primitives.cmx pos.cmx ../bytecomp/instruct.cmx \ - exec.cmx debugcom.cmx checkpoints.cmx breakpoints.cmi -checkpoints.cmo: primitives.cmi int64ops.cmi debugcom.cmi checkpoints.cmi -checkpoints.cmx: primitives.cmx int64ops.cmx debugcom.cmx checkpoints.cmi + exec.cmx debugcom.cmx checkpoints.cmx breakpoints.cmi +checkpoints.cmo: primitives.cmi int64ops.cmi debugcom.cmi checkpoints.cmi +checkpoints.cmx: primitives.cmx int64ops.cmx debugcom.cmx checkpoints.cmi command_line.cmo: unix_tools.cmi $(UNIXDIR)/unix.cmi \ ../typing/types.cmi time_travel.cmi symbols.cmi source.cmi \ show_source.cmi show_information.cmi question.cmi program_management.cmi \ @@ -49,7 +49,7 @@ command_line.cmo: unix_tools.cmi $(UNIXDIR)/unix.cmi \ ../bytecomp/instruct.cmi input_handling.cmi history.cmi frames.cmi \ events.cmi eval.cmi envaux.cmi debugger_config.cmi debugcom.cmi \ ../typing/ctype.cmi ../utils/config.cmi checkpoints.cmi breakpoints.cmi \ - command_line.cmi + command_line.cmi command_line.cmx: unix_tools.cmx $(UNIXDIR)/unix.cmx \ ../typing/types.cmx time_travel.cmx symbols.cmx source.cmx \ show_source.cmx show_information.cmx question.cmx program_management.cmx \ @@ -59,154 +59,154 @@ command_line.cmx: unix_tools.cmx $(UNIXDIR)/unix.cmx \ ../bytecomp/instruct.cmx input_handling.cmx history.cmx frames.cmx \ events.cmx eval.cmx envaux.cmx debugger_config.cmx debugcom.cmx \ ../typing/ctype.cmx ../utils/config.cmx checkpoints.cmx breakpoints.cmx \ - command_line.cmi + command_line.cmi debugcom.cmo: primitives.cmi ../utils/misc.cmi int64ops.cmi \ - input_handling.cmi debugcom.cmi + input_handling.cmi debugcom.cmi debugcom.cmx: primitives.cmx ../utils/misc.cmx int64ops.cmx \ - input_handling.cmx debugcom.cmi -debugger_config.cmo: int64ops.cmi debugger_config.cmi -debugger_config.cmx: int64ops.cmx debugger_config.cmi + input_handling.cmx debugcom.cmi +debugger_config.cmo: int64ops.cmi debugger_config.cmi +debugger_config.cmx: int64ops.cmx debugger_config.cmi dynlink.cmo: ../bytecomp/symtable.cmi ../bytecomp/opcodes.cmo \ ../utils/misc.cmi ../bytecomp/meta.cmi ../bytecomp/dll.cmi \ ../utils/consistbl.cmi ../utils/config.cmi ../bytecomp/cmo_format.cmi \ - dynlink.cmi + dynlink.cmi dynlink.cmx: ../bytecomp/symtable.cmx ../bytecomp/opcodes.cmx \ ../utils/misc.cmx ../bytecomp/meta.cmx ../bytecomp/dll.cmx \ ../utils/consistbl.cmx ../utils/config.cmx ../bytecomp/cmo_format.cmi \ - dynlink.cmi + dynlink.cmi envaux.cmo: ../typing/types.cmi ../typing/subst.cmi ../typing/printtyp.cmi \ ../typing/path.cmi ../typing/mtype.cmi ../utils/misc.cmi \ - ../bytecomp/instruct.cmi ../typing/env.cmi envaux.cmi + ../bytecomp/instruct.cmi ../typing/env.cmi envaux.cmi envaux.cmx: ../typing/types.cmx ../typing/subst.cmx ../typing/printtyp.cmx \ ../typing/path.cmx ../typing/mtype.cmx ../utils/misc.cmx \ - ../bytecomp/instruct.cmx ../typing/env.cmx envaux.cmi + ../bytecomp/instruct.cmx ../typing/env.cmx envaux.cmi eval.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi ../typing/subst.cmi \ printval.cmi ../typing/printtyp.cmi ../typing/predef.cmi \ ../typing/path.cmi parser_aux.cmi ../utils/misc.cmi \ ../parsing/longident.cmi ../bytecomp/instruct.cmi ../typing/ident.cmi \ frames.cmi ../typing/env.cmi debugcom.cmi ../typing/ctype.cmi \ - ../typing/btype.cmi eval.cmi + ../typing/btype.cmi eval.cmi eval.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx ../typing/subst.cmx \ printval.cmx ../typing/printtyp.cmx ../typing/predef.cmx \ ../typing/path.cmx parser_aux.cmi ../utils/misc.cmx \ ../parsing/longident.cmx ../bytecomp/instruct.cmx ../typing/ident.cmx \ frames.cmx ../typing/env.cmx debugcom.cmx ../typing/ctype.cmx \ - ../typing/btype.cmx eval.cmi -events.cmo: ../parsing/location.cmi ../bytecomp/instruct.cmi events.cmi -events.cmx: ../parsing/location.cmx ../bytecomp/instruct.cmx events.cmi -exec.cmo: exec.cmi -exec.cmx: exec.cmi + ../typing/btype.cmx eval.cmi +events.cmo: ../parsing/location.cmi ../bytecomp/instruct.cmi events.cmi +events.cmx: ../parsing/location.cmx ../bytecomp/instruct.cmx events.cmi +exec.cmo: exec.cmi +exec.cmx: exec.cmi frames.cmo: symbols.cmi ../utils/misc.cmi ../bytecomp/instruct.cmi events.cmi \ - debugcom.cmi frames.cmi + debugcom.cmi frames.cmi frames.cmx: symbols.cmx ../utils/misc.cmx ../bytecomp/instruct.cmx events.cmx \ - debugcom.cmx frames.cmi + debugcom.cmx frames.cmi history.cmo: primitives.cmi int64ops.cmi debugger_config.cmi checkpoints.cmi \ - history.cmi + history.cmi history.cmx: primitives.cmx int64ops.cmx debugger_config.cmx checkpoints.cmx \ - history.cmi + history.cmi input_handling.cmo: $(UNIXDIR)/unix.cmi primitives.cmi \ - input_handling.cmi + input_handling.cmi input_handling.cmx: $(UNIXDIR)/unix.cmx primitives.cmx \ - input_handling.cmi -int64ops.cmo: int64ops.cmi -int64ops.cmx: int64ops.cmi -lexer.cmo: parser.cmi lexer.cmi -lexer.cmx: parser.cmx lexer.cmi + input_handling.cmi +int64ops.cmo: int64ops.cmi +int64ops.cmx: int64ops.cmi +lexer.cmo: parser.cmi lexer.cmi +lexer.cmx: parser.cmx lexer.cmi loadprinter.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi printval.cmi \ ../typing/printtyp.cmi ../typing/path.cmi ../utils/misc.cmi \ ../parsing/longident.cmi ../typing/ident.cmi ../typing/env.cmi \ - dynlink.cmi ../typing/ctype.cmi ../utils/config.cmi loadprinter.cmi + dynlink.cmi ../typing/ctype.cmi ../utils/config.cmi loadprinter.cmi loadprinter.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx printval.cmx \ ../typing/printtyp.cmx ../typing/path.cmx ../utils/misc.cmx \ ../parsing/longident.cmx ../typing/ident.cmx ../typing/env.cmx \ - dynlink.cmx ../typing/ctype.cmx ../utils/config.cmx loadprinter.cmi + dynlink.cmx ../typing/ctype.cmx ../utils/config.cmx loadprinter.cmi main.cmo: unix_tools.cmi $(UNIXDIR)/unix.cmi time_travel.cmi \ show_information.cmi question.cmi program_management.cmi primitives.cmi \ parameters.cmi ../utils/misc.cmi input_handling.cmi frames.cmi exec.cmi \ ../typing/env.cmi debugger_config.cmi ../utils/config.cmi \ - command_line.cmi ../utils/clflags.cmi checkpoints.cmi + command_line.cmi ../utils/clflags.cmi checkpoints.cmi main.cmx: unix_tools.cmx $(UNIXDIR)/unix.cmx time_travel.cmx \ show_information.cmx question.cmx program_management.cmx primitives.cmx \ parameters.cmx ../utils/misc.cmx input_handling.cmx frames.cmx exec.cmx \ ../typing/env.cmx debugger_config.cmx ../utils/config.cmx \ - command_line.cmx ../utils/clflags.cmx checkpoints.cmx + command_line.cmx ../utils/clflags.cmx checkpoints.cmx parameters.cmo: primitives.cmi envaux.cmi debugger_config.cmi \ - ../utils/config.cmi parameters.cmi + ../utils/config.cmi parameters.cmi parameters.cmx: primitives.cmx envaux.cmx debugger_config.cmx \ - ../utils/config.cmx parameters.cmi + ../utils/config.cmx parameters.cmi parser.cmo: parser_aux.cmi ../parsing/longident.cmi int64ops.cmi \ - input_handling.cmi parser.cmi + input_handling.cmi parser.cmi parser.cmx: parser_aux.cmi ../parsing/longident.cmx int64ops.cmx \ - input_handling.cmx parser.cmi + input_handling.cmx parser.cmi pattern_matching.cmo: ../typing/typedtree.cmi parser_aux.cmi \ ../utils/misc.cmi debugger_config.cmi debugcom.cmi ../typing/ctype.cmi \ - pattern_matching.cmi + pattern_matching.cmi pattern_matching.cmx: ../typing/typedtree.cmx parser_aux.cmi \ ../utils/misc.cmx debugger_config.cmx debugcom.cmx ../typing/ctype.cmx \ - pattern_matching.cmi + pattern_matching.cmi pos.cmo: source.cmi primitives.cmi ../parsing/location.cmi \ - ../bytecomp/instruct.cmi pos.cmi + ../bytecomp/instruct.cmi pos.cmi pos.cmx: source.cmx primitives.cmx ../parsing/location.cmx \ - ../bytecomp/instruct.cmx pos.cmi -primitives.cmo: $(UNIXDIR)/unix.cmi primitives.cmi -primitives.cmx: $(UNIXDIR)/unix.cmx primitives.cmi + ../bytecomp/instruct.cmx pos.cmi +primitives.cmo: $(UNIXDIR)/unix.cmi primitives.cmi +primitives.cmx: $(UNIXDIR)/unix.cmx primitives.cmi printval.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi \ ../typing/printtyp.cmi ../typing/path.cmi parser_aux.cmi \ ../typing/outcometree.cmi ../typing/oprint.cmi \ - ../toplevel/genprintval.cmi debugcom.cmi printval.cmi + ../toplevel/genprintval.cmi debugcom.cmi printval.cmi printval.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx \ ../typing/printtyp.cmx ../typing/path.cmx parser_aux.cmi \ ../typing/outcometree.cmi ../typing/oprint.cmx \ - ../toplevel/genprintval.cmx debugcom.cmx printval.cmi + ../toplevel/genprintval.cmx debugcom.cmx printval.cmi program_loading.cmo: unix_tools.cmi $(UNIXDIR)/unix.cmi primitives.cmi \ - parameters.cmi input_handling.cmi debugger_config.cmi program_loading.cmi + parameters.cmi input_handling.cmi debugger_config.cmi program_loading.cmi program_loading.cmx: unix_tools.cmx $(UNIXDIR)/unix.cmx primitives.cmx \ - parameters.cmx input_handling.cmx debugger_config.cmx program_loading.cmi + parameters.cmx input_handling.cmx debugger_config.cmx program_loading.cmi program_management.cmo: unix_tools.cmi $(UNIXDIR)/unix.cmi \ time_travel.cmi symbols.cmi question.cmi program_loading.cmi \ primitives.cmi parameters.cmi int64ops.cmi input_handling.cmi history.cmi \ - debugger_config.cmi breakpoints.cmi program_management.cmi + debugger_config.cmi breakpoints.cmi program_management.cmi program_management.cmx: unix_tools.cmx $(UNIXDIR)/unix.cmx \ time_travel.cmx symbols.cmx question.cmx program_loading.cmx \ primitives.cmx parameters.cmx int64ops.cmx input_handling.cmx history.cmx \ - debugger_config.cmx breakpoints.cmx program_management.cmi -question.cmo: primitives.cmi lexer.cmi input_handling.cmi question.cmi -question.cmx: primitives.cmx lexer.cmx input_handling.cmx question.cmi + debugger_config.cmx breakpoints.cmx program_management.cmi +question.cmo: primitives.cmi lexer.cmi input_handling.cmi question.cmi +question.cmx: primitives.cmx lexer.cmx input_handling.cmx question.cmi show_information.cmo: symbols.cmi source.cmi show_source.cmi printval.cmi \ ../utils/misc.cmi ../bytecomp/instruct.cmi frames.cmi events.cmi \ - debugcom.cmi checkpoints.cmi breakpoints.cmi show_information.cmi + debugcom.cmi checkpoints.cmi breakpoints.cmi show_information.cmi show_information.cmx: symbols.cmx source.cmx show_source.cmx printval.cmx \ ../utils/misc.cmx ../bytecomp/instruct.cmx frames.cmx events.cmx \ - debugcom.cmx checkpoints.cmx breakpoints.cmx show_information.cmi + debugcom.cmx checkpoints.cmx breakpoints.cmx show_information.cmi show_source.cmo: source.cmi primitives.cmi parameters.cmi \ ../parsing/location.cmi ../bytecomp/instruct.cmi events.cmi \ - debugger_config.cmi show_source.cmi + debugger_config.cmi show_source.cmi show_source.cmx: source.cmx primitives.cmx parameters.cmx \ ../parsing/location.cmx ../bytecomp/instruct.cmx events.cmx \ - debugger_config.cmx show_source.cmi + debugger_config.cmx show_source.cmi source.cmo: primitives.cmi ../utils/misc.cmi debugger_config.cmi \ - ../utils/config.cmi source.cmi + ../utils/config.cmi source.cmi source.cmx: primitives.cmx ../utils/misc.cmx debugger_config.cmx \ - ../utils/config.cmx source.cmi + ../utils/config.cmx source.cmi symbols.cmo: ../bytecomp/symtable.cmi program_loading.cmi \ ../bytecomp/instruct.cmi events.cmi debugger_config.cmi debugcom.cmi \ - checkpoints.cmi ../bytecomp/bytesections.cmi symbols.cmi + checkpoints.cmi ../bytecomp/bytesections.cmi symbols.cmi symbols.cmx: ../bytecomp/symtable.cmx program_loading.cmx \ ../bytecomp/instruct.cmx events.cmx debugger_config.cmx debugcom.cmx \ - checkpoints.cmx ../bytecomp/bytesections.cmx symbols.cmi + checkpoints.cmx ../bytecomp/bytesections.cmx symbols.cmi time_travel.cmo: trap_barrier.cmi symbols.cmi question.cmi \ program_loading.cmi primitives.cmi ../utils/misc.cmi int64ops.cmi \ ../bytecomp/instruct.cmi input_handling.cmi exec.cmi events.cmi \ debugger_config.cmi debugcom.cmi checkpoints.cmi breakpoints.cmi \ - time_travel.cmi + time_travel.cmi time_travel.cmx: trap_barrier.cmx symbols.cmx question.cmx \ program_loading.cmx primitives.cmx ../utils/misc.cmx int64ops.cmx \ ../bytecomp/instruct.cmx input_handling.cmx exec.cmx events.cmx \ debugger_config.cmx debugcom.cmx checkpoints.cmx breakpoints.cmx \ - time_travel.cmi -trap_barrier.cmo: exec.cmi debugcom.cmi checkpoints.cmi trap_barrier.cmi -trap_barrier.cmx: exec.cmx debugcom.cmx checkpoints.cmx trap_barrier.cmi + time_travel.cmi +trap_barrier.cmo: exec.cmi debugcom.cmi checkpoints.cmi trap_barrier.cmi +trap_barrier.cmx: exec.cmx debugcom.cmx checkpoints.cmx trap_barrier.cmi unix_tools.cmo: $(UNIXDIR)/unix.cmi primitives.cmi ../utils/misc.cmi \ - unix_tools.cmi + unix_tools.cmi unix_tools.cmx: $(UNIXDIR)/unix.cmx primitives.cmx ../utils/misc.cmx \ - unix_tools.cmi + unix_tools.cmi diff --git a/debugger/Makefile b/debugger/Makefile index cd623dcf..3ff1b54a 100644 --- a/debugger/Makefile +++ b/debugger/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile 8955 2008-07-29 08:31:41Z xleroy $ +# $Id$ UNIXDIR=../otherlibs/unix include Makefile.shared diff --git a/debugger/Makefile.nt b/debugger/Makefile.nt index d179ac54..70263e94 100644 --- a/debugger/Makefile.nt +++ b/debugger/Makefile.nt @@ -10,8 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8955 2008-07-29 08:31:41Z xleroy $ +# $Id$ UNIXDIR=../otherlibs/win32unix include Makefile.shared - diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index 1698183b..4372cf74 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.shared 9529 2010-01-15 09:20:00Z doligez $ +# $Id$ include ../config/Makefile @@ -44,7 +44,7 @@ OTHEROBJS=\ OBJS=\ - dynlink.cmo \ + dynlink.cmo \ int64ops.cmo \ primitives.cmo \ unix_tools.cmo \ diff --git a/debugger/breakpoints.ml b/debugger/breakpoints.ml index f47101f8..1da4b74e 100644 --- a/debugger/breakpoints.ml +++ b/debugger/breakpoints.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: breakpoints.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (******************************* Breakpoints ***************************) @@ -123,7 +123,7 @@ let change_version version pos = (function () -> current_version := version; positions := pos) - + (* Execute given function with no breakpoint in current checkpoint. *) (* --- `goto' runs faster this way (does not stop on each breakpoint). *) let execute_without_breakpoints f = diff --git a/debugger/breakpoints.mli b/debugger/breakpoints.mli index a4a1dc11..091f6099 100644 --- a/debugger/breakpoints.mli +++ b/debugger/breakpoints.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: breakpoints.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (******************************* Breakpoints ***************************) diff --git a/debugger/checkpoints.ml b/debugger/checkpoints.ml index 28aa76cb..ffcff35e 100644 --- a/debugger/checkpoints.ml +++ b/debugger/checkpoints.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: checkpoints.ml 5200 2002-10-29 17:53:24Z doligez $ *) +(* $Id$ *) (*************************** Checkpoints *******************************) diff --git a/debugger/checkpoints.mli b/debugger/checkpoints.mli index e489875d..17c1037a 100644 --- a/debugger/checkpoints.mli +++ b/debugger/checkpoints.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: checkpoints.mli 5200 2002-10-29 17:53:24Z doligez $ *) +(* $Id$ *) (***************************** Checkpoints *****************************) diff --git a/debugger/command_line.ml b/debugger/command_line.ml index 74db2092..5fdf3da4 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: command_line.ml 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) (************************ Reading and executing commands ***************) @@ -77,10 +77,10 @@ let error text = raise Toplevel let check_not_windows feature = - match Sys.os_type with + match Sys.os_type with | "Win32" -> error ("'"^feature^"' feature not supported on Windows") - | _ -> + | _ -> () let eol = @@ -227,7 +227,7 @@ let instr_shell ppf lexbuf = let cmd = String.concat " " cmdarg in (* perhaps we should use $SHELL -c ? *) let err = Sys.command cmd in - if (err != 0) then + if (err != 0) then eprintf "Shell command %S failed with exit code %d\n%!" cmd err let instr_pwd ppf lexbuf = @@ -363,8 +363,8 @@ let print_info_list ppf = let instr_complete ppf lexbuf = let ppf = Format.err_formatter in - let rec print_list l = - try + let rec print_list l = + try eol lexbuf; List.iter (function i -> fprintf ppf "%s@." i) l with _ -> @@ -395,7 +395,7 @@ let instr_complete ppf lexbuf = | [i] -> if i.info_name = ident then [] else [i.info_name] | l -> List.map (fun i -> i.info_name) l end - | None -> + | None -> List.map (fun i -> i.info_name) !info_list end else ["info"] @@ -1065,7 +1065,7 @@ using \"load_printer\"." }; var_action = loading_mode_variable ppf; var_help = "mode of loading.\n\ -It can be either : +It can be either :\n\ direct : the program is directly called by the debugger.\n\ runtime : the debugger execute `ocamlrun programname arguments'.\n\ manual : the program is not launched by the debugger,\n\ @@ -1075,7 +1075,7 @@ It can be either : checkpoint_max_count; var_help = "maximum number of process to keep." }; - { var_name = "checkpoints"; + { var_name = "checkpoints"; var_action = boolean_variable false make_checkpoints; var_help = "whether to make checkpoints or not." }; diff --git a/debugger/command_line.mli b/debugger/command_line.mli index 24d720eb..dd2349d2 100644 --- a/debugger/command_line.mli +++ b/debugger/command_line.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: command_line.mli 2919 2000-03-07 18:22:19Z weis $ *) +(* $Id$ *) (************************ Reading and executing commands ***************) diff --git a/debugger/debugcom.ml b/debugger/debugcom.ml index 5d595ca0..5bfbb2bf 100644 --- a/debugger/debugcom.ml +++ b/debugger/debugcom.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: debugcom.ml 8955 2008-07-29 08:31:41Z xleroy $ *) +(* $Id$ *) (* Low-level communication with the debuggee *) @@ -183,7 +183,7 @@ exception Marshalling_error module Remote_value = struct type t = Remote of string | Local of Obj.t - + let obj = function | Local obj -> Obj.obj obj | Remote v -> diff --git a/debugger/debugcom.mli b/debugger/debugcom.mli index 179595c2..6c7a5344 100644 --- a/debugger/debugcom.mli +++ b/debugger/debugcom.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: debugcom.mli 5200 2002-10-29 17:53:24Z doligez $ *) +(* $Id$ *) (* Low-level communication with the debuggee *) @@ -83,7 +83,7 @@ exception Marshalling_error module Remote_value : sig type t - + val obj : t -> 'a val is_block : t -> bool val tag : t -> int diff --git a/debugger/debugger_config.ml b/debugger/debugger_config.ml index acfadfed..54d6b2d5 100644 --- a/debugger/debugger_config.ml +++ b/debugger/debugger_config.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: debugger_config.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (**************************** Configuration file ***********************) @@ -23,7 +23,7 @@ exception Toplevel (*ISO 6429 color sequences 00 to restore default color -01 for brighter colors +01 for brighter colors 04 for underlined text 05 for flashing text 30 for black foreground diff --git a/debugger/debugger_config.mli b/debugger/debugger_config.mli index 0d3b663d..18faf9c6 100644 --- a/debugger/debugger_config.mli +++ b/debugger/debugger_config.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: debugger_config.mli 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (********************** Configuration file *****************************) @@ -33,4 +33,3 @@ val checkpoint_big_step : int64 ref val checkpoint_small_step : int64 ref val checkpoint_max_count : int ref val make_checkpoints : bool ref - diff --git a/debugger/dynlink.ml b/debugger/dynlink.ml index 03895885..a8b6efa7 100644 --- a/debugger/dynlink.ml +++ b/debugger/dynlink.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dynlink.ml 9222 2009-04-02 09:21:20Z xclerc $ *) +(* $Id$ *) (* Dynamic loading of .cmo files *) @@ -212,7 +212,7 @@ let loadfile file_name = let toc_pos = input_binary_int ic in (* Go to table of contents *) seek_in ic toc_pos; let lib = (input_value ic : library) in - begin try + begin try Dll.open_dlls Dll.For_execution (List.map Dll.extract_dll_name lib.lib_dllibs) with Failure reason -> diff --git a/debugger/dynlink.mli b/debugger/dynlink.mli index 31604dc5..7cca68c5 100644 --- a/debugger/dynlink.mli +++ b/debugger/dynlink.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dynlink.mli 9222 2009-04-02 09:21:20Z xclerc $ *) +(* $Id$ *) (** Dynamic loading of object files. *) @@ -23,9 +23,9 @@ val is_native: bool val loadfile : string -> unit (** In bytecode: load the given bytecode object file ([.cmo] file) or - bytecode library file ([.cma] file), and link it with the running + bytecode library file ([.cma] file), and link it with the running program. In native code: load the given OCaml plugin file (usually - [.cmxs]), and link it with the running + [.cmxs]), and link it with the running program. All toplevel expressions in the loaded compilation units are evaluated. No facilities are provided to diff --git a/debugger/envaux.ml b/debugger/envaux.ml index b0ca5a53..8d462e2f 100644 --- a/debugger/envaux.ml +++ b/debugger/envaux.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: envaux.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) open Misc open Types @@ -60,7 +60,7 @@ let rec env_from_summary sum subst = let env = env_from_summary s subst in let path' = Subst.module_path subst path in let mty = - try + try Env.find_module path' env with Not_found -> raise (Error (Module_not_found path')) diff --git a/debugger/envaux.mli b/debugger/envaux.mli index 3b9d7715..8b122cc3 100644 --- a/debugger/envaux.mli +++ b/debugger/envaux.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: envaux.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) open Format diff --git a/debugger/eval.ml b/debugger/eval.ml index cd52cd08..7ee1339f 100644 --- a/debugger/eval.ml +++ b/debugger/eval.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: eval.ml 9236 2009-04-19 08:42:43Z xleroy $ *) +(* $Id$ *) open Misc open Path @@ -197,7 +197,7 @@ let report_error ppf = function "@[Cannot extract item number %i from a value of type@ %a@]@." pos Printtyp.type_expr ty | Wrong_label(ty, lbl) -> - fprintf ppf + fprintf ppf "@[The record type@ %a@ has no label named %s@]@." Printtyp.type_expr ty lbl | Not_a_record ty -> diff --git a/debugger/eval.mli b/debugger/eval.mli index f9888488..b2a2998f 100644 --- a/debugger/eval.mli +++ b/debugger/eval.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: eval.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) open Types open Parser_aux diff --git a/debugger/events.ml b/debugger/events.ml index c2988f04..2521c064 100644 --- a/debugger/events.ml +++ b/debugger/events.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: events.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (********************************* Events ******************************) diff --git a/debugger/events.mli b/debugger/events.mli index f12dd401..7166f2c9 100644 --- a/debugger/events.mli +++ b/debugger/events.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: events.mli 7031 2005-08-25 15:35:16Z doligez $ *) +(* $Id$ *) open Instruct @@ -27,4 +27,3 @@ val current_event : debug_event option ref val get_current_event : unit -> debug_event val current_event_is_before : unit -> bool - diff --git a/debugger/exec.ml b/debugger/exec.ml index 6390f2a5..1ea16597 100644 --- a/debugger/exec.ml +++ b/debugger/exec.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: exec.ml 8955 2008-07-29 08:31:41Z xleroy $ *) +(* $Id$ *) (* Handling of keyboard interrupts *) diff --git a/debugger/exec.mli b/debugger/exec.mli index c6c3ab4f..9d3b9860 100644 --- a/debugger/exec.mli +++ b/debugger/exec.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: exec.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Handling of keyboard interrupts *) diff --git a/debugger/frames.ml b/debugger/frames.ml index fa36eff9..c533782f 100644 --- a/debugger/frames.ml +++ b/debugger/frames.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: frames.ml 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) (***************************** Frames **********************************) @@ -75,7 +75,7 @@ let select_frame frame_number = | _ -> set_initial_frame(); selected_event := Some(move_up frame_number curr_event); - current_frame := frame_number + current_frame := frame_number with Not_found -> set_frame initial_sp; raise Not_found diff --git a/debugger/frames.mli b/debugger/frames.mli index 7767d126..b4863433 100644 --- a/debugger/frames.mli +++ b/debugger/frames.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: frames.mli 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) (****************************** Frames *********************************) diff --git a/debugger/history.ml b/debugger/history.ml index b273b949..e8c5ed8f 100644 --- a/debugger/history.ml +++ b/debugger/history.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: history.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) open Int64ops open Checkpoints diff --git a/debugger/history.mli b/debugger/history.mli index 2c217b77..249629fd 100644 --- a/debugger/history.mli +++ b/debugger/history.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: history.mli 5200 2002-10-29 17:53:24Z doligez $ *) +(* $Id$ *) val empty_history : unit -> unit diff --git a/debugger/input_handling.ml b/debugger/input_handling.ml index b9b9b450..f25d4742 100644 --- a/debugger/input_handling.ml +++ b/debugger/input_handling.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: input_handling.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (**************************** Input control ****************************) diff --git a/debugger/input_handling.mli b/debugger/input_handling.mli index 227ae833..959547df 100644 --- a/debugger/input_handling.mli +++ b/debugger/input_handling.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: input_handling.mli 7767 2006-12-09 13:49:10Z ertai $ *) +(* $Id$ *) (***************************** Input control ***************************) diff --git a/debugger/int64ops.ml b/debugger/int64ops.ml index 667d6c07..b854a6c3 100644 --- a/debugger/int64ops.ml +++ b/debugger/int64ops.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: int64ops.ml 5200 2002-10-29 17:53:24Z doligez $ *) +(* $Id$ *) (****************** arithmetic operators for Int64 *********************) diff --git a/debugger/int64ops.mli b/debugger/int64ops.mli index b6edfbc3..98f7228d 100644 --- a/debugger/int64ops.mli +++ b/debugger/int64ops.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: int64ops.mli 5200 2002-10-29 17:53:24Z doligez $ *) +(* $Id$ *) (****************** arithmetic operators for Int64 *********************) diff --git a/debugger/lexer.mli b/debugger/lexer.mli index cc04aca8..7214ed2b 100644 --- a/debugger/lexer.mli +++ b/debugger/lexer.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mli 6394 2004-06-13 12:46:11Z xleroy $ *) +(* $Id$ *) val line: Lexing.lexbuf -> string val lexeme: Lexing.lexbuf -> Parser.token diff --git a/debugger/lexer.mll b/debugger/lexer.mll index b1b0246b..eea8ed02 100644 --- a/debugger/lexer.mll +++ b/debugger/lexer.mll @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mll 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) { diff --git a/debugger/loadprinter.ml b/debugger/loadprinter.ml index 7ed5e44d..ac5aa018 100644 --- a/debugger/loadprinter.ml +++ b/debugger/loadprinter.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: loadprinter.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (* Loading and installation of user-defined printer functions *) @@ -120,10 +120,10 @@ let find_printer_type lid = with Ctype.Unify _ -> (match_printer_type desc "printer_type_old", true) in (ty_arg, path, is_old_style) - with + with | Not_found -> raise(Error(Unbound_identifier lid)) | Ctype.Unify _ -> raise(Error(Wrong_type lid)) - + let install_printer ppf lid = let (ty_arg, path, is_old_style) = find_printer_type lid in let v = @@ -167,5 +167,3 @@ let report_error ppf = function | No_active_printer lid -> fprintf ppf "@[%a is not currently active as a printing function.@]@." Printtyp.longident lid - - diff --git a/debugger/loadprinter.mli b/debugger/loadprinter.mli index ffc94a58..bdaf77a2 100644 --- a/debugger/loadprinter.mli +++ b/debugger/loadprinter.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: loadprinter.mli 2919 2000-03-07 18:22:19Z weis $ *) +(* $Id$ *) (* Loading and installation of user-defined printer functions *) diff --git a/debugger/main.ml b/debugger/main.ml index 02eb1822..f836bf9f 100644 --- a/debugger/main.ml +++ b/debugger/main.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: main.ml 9310 2009-07-08 14:30:05Z xclerc $ *) +(* $Id$ *) open Input_handling open Question @@ -179,9 +179,9 @@ let speclist = [ let main () = try - socket_name := + socket_name := (match Sys.os_type with - "Win32" -> + "Win32" -> (Unix.string_of_inet_addr Unix.inet_addr_loopback)^ ":"^ (string_of_int (10000 + ((Unix.getpid ()) mod 10000))) diff --git a/debugger/parameters.ml b/debugger/parameters.ml index 482c9709..9d518e54 100644 --- a/debugger/parameters.ml +++ b/debugger/parameters.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parameters.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* Miscellaneous parameters *) diff --git a/debugger/parameters.mli b/debugger/parameters.mli index e65d8dd2..8f750e68 100644 --- a/debugger/parameters.mli +++ b/debugger/parameters.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parameters.mli 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* Miscellaneous parameters *) diff --git a/debugger/parser.mly b/debugger/parser.mly index f32e0fe3..6fc8392a 100644 --- a/debugger/parser.mly +++ b/debugger/parser.mly @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: parser.mly 9275 2009-05-23 14:42:57Z xclerc $ */ +/* $Id$ */ %{ @@ -187,7 +187,7 @@ opt_longident : | { None }; opt_longident_eol : - opt_longident end_of_line { $1 }; + opt_longident end_of_line { $1 }; identifier : LIDENT { $1 } diff --git a/debugger/parser_aux.mli b/debugger/parser_aux.mli index 4fca52e9..a68e08d5 100644 --- a/debugger/parser_aux.mli +++ b/debugger/parser_aux.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parser_aux.mli 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (*open Globals*) @@ -31,4 +31,3 @@ type break_arg = | BA_pos1 of Longident.t option * int * int option (* break @ [MODULE] LINE [POS] *) | BA_pos2 of Longident.t option * int (* break @ [MODULE] # OFFSET *) - diff --git a/debugger/pattern_matching.ml b/debugger/pattern_matching.ml index bc6ad849..97af9326 100644 --- a/debugger/pattern_matching.ml +++ b/debugger/pattern_matching.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: pattern_matching.ml 3359 2000-12-28 13:07:42Z weis $ *) +(* $Id$ *) (************************ Simple pattern matching **********************) @@ -150,7 +150,7 @@ and match_concrete_type pattern obj cstr ty ty_list = | Variant_type constr_list -> let tag = value_tag obj in (try - let constr = + let constr = if same_type_constr cstr constr_type_exn then find_exception tag else diff --git a/debugger/pattern_matching.mli b/debugger/pattern_matching.mli index b3862190..3490edef 100644 --- a/debugger/pattern_matching.mli +++ b/debugger/pattern_matching.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: pattern_matching.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (************************ Simple pattern matching **********************) diff --git a/debugger/pos.ml b/debugger/pos.ml index f790ab6e..4beba3de 100644 --- a/debugger/pos.ml +++ b/debugger/pos.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: pos.ml 7767 2006-12-09 13:49:10Z ertai $ *) +(* $Id$ *) open Instruct;; open Lexing;; diff --git a/debugger/pos.mli b/debugger/pos.mli index ee083272..e7632e42 100644 --- a/debugger/pos.mli +++ b/debugger/pos.mli @@ -10,6 +10,6 @@ (* *) (***********************************************************************) -(* $Id: pos.mli 5966 2003-11-21 16:10:57Z doligez $ *) +(* $Id$ *) val get_desc : Instruct.debug_event -> string;; diff --git a/debugger/primitives.ml b/debugger/primitives.ml index 2040c7e4..d4ba22e5 100644 --- a/debugger/primitives.ml +++ b/debugger/primitives.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: primitives.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (*********************** Basic functions and types *********************) diff --git a/debugger/primitives.mli b/debugger/primitives.mli index 60d15901..4333128f 100644 --- a/debugger/primitives.mli +++ b/debugger/primitives.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: primitives.mli 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (********************* Basic functions and types ***********************) diff --git a/debugger/printval.ml b/debugger/printval.ml index 17dd7c63..5f36e1a7 100644 --- a/debugger/printval.ml +++ b/debugger/printval.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printval.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (* To print values *) @@ -106,4 +106,3 @@ let print_named_value max_depth exp env obj ppf ty = print_value_name exp Printtyp.type_expr ty (print_value max_depth env obj) ty - diff --git a/debugger/printval.mli b/debugger/printval.mli index 38e48eb6..bb631888 100644 --- a/debugger/printval.mli +++ b/debugger/printval.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printval.mli 3566 2001-07-03 11:04:10Z xleroy $ *) +(* $Id$ *) open Format @@ -28,6 +28,6 @@ val reset_named_values : unit -> unit val find_named_value : int -> Debugcom.Remote_value.t * Types.type_expr val install_printer : - Path.t -> Types.type_expr -> formatter -> + Path.t -> Types.type_expr -> formatter -> (formatter -> Obj.t -> unit) -> unit val remove_printer : Path.t -> unit diff --git a/debugger/program_loading.ml b/debugger/program_loading.ml index 54b5a45f..79577ff4 100644 --- a/debugger/program_loading.ml +++ b/debugger/program_loading.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: program_loading.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (* Program loading *) diff --git a/debugger/program_loading.mli b/debugger/program_loading.mli index 48847ea1..d1210d1a 100644 --- a/debugger/program_loading.mli +++ b/debugger/program_loading.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: program_loading.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (*** Debugging. ***) diff --git a/debugger/program_management.ml b/debugger/program_management.ml index 7cc864cf..cc908b4d 100644 --- a/debugger/program_management.ml +++ b/debugger/program_management.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: program_management.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (* Manage the loading of the program *) diff --git a/debugger/program_management.mli b/debugger/program_management.mli index 2ec0209e..8e2f28e5 100644 --- a/debugger/program_management.mli +++ b/debugger/program_management.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: program_management.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (*** Program loading and initializations. ***) diff --git a/debugger/question.ml b/debugger/question.ml index 8b2d4598..2eeec3ab 100644 --- a/debugger/question.ml +++ b/debugger/question.ml @@ -33,4 +33,3 @@ let yes_or_no message = raise x else false - diff --git a/debugger/show_information.ml b/debugger/show_information.ml index 0c9ee2d0..bd746eb7 100644 --- a/debugger/show_information.ml +++ b/debugger/show_information.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: show_information.ml 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) open Instruct open Format diff --git a/debugger/show_information.mli b/debugger/show_information.mli index e7ef20e2..3069f933 100644 --- a/debugger/show_information.mli +++ b/debugger/show_information.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: show_information.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) open Format;; diff --git a/debugger/show_source.ml b/debugger/show_source.ml index 263caff1..2826c9e6 100644 --- a/debugger/show_source.ml +++ b/debugger/show_source.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: show_source.ml 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) open Debugger_config open Instruct diff --git a/debugger/show_source.mli b/debugger/show_source.mli index 0d4106fe..5ba418af 100644 --- a/debugger/show_source.mli +++ b/debugger/show_source.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: show_source.mli 7767 2006-12-09 13:49:10Z ertai $ *) +(* $Id$ *) (* Print the line containing the point *) val show_point : Instruct.debug_event -> bool -> unit;; diff --git a/debugger/source.ml b/debugger/source.ml index 1d8600c2..f0d3d48f 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: source.ml 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) (************************ Source management ****************************) diff --git a/debugger/source.mli b/debugger/source.mli index 5250313b..273cb517 100644 --- a/debugger/source.mli +++ b/debugger/source.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: source.mli 9299 2009-06-17 08:15:39Z xclerc $ *) +(* $Id$ *) (************************ Source management ****************************) diff --git a/debugger/symbols.ml b/debugger/symbols.ml index b3dda25b..392da976 100644 --- a/debugger/symbols.ml +++ b/debugger/symbols.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: symbols.ml 9300 2009-06-18 11:17:16Z xclerc $ *) +(* $Id$ *) (* Handling of symbol tables (globals and events) *) diff --git a/debugger/symbols.mli b/debugger/symbols.mli index f1ec0544..57ac8007 100644 --- a/debugger/symbols.mli +++ b/debugger/symbols.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: symbols.mli 7031 2005-08-25 15:35:16Z doligez $ *) +(* $Id$ *) (* Modules used by the program. *) val modules : string list ref diff --git a/debugger/time_travel.ml b/debugger/time_travel.ml index 855c7eca..a4a4c83f 100644 --- a/debugger/time_travel.ml +++ b/debugger/time_travel.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: time_travel.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (**************************** Time travel ******************************) diff --git a/debugger/time_travel.mli b/debugger/time_travel.mli index c5d81154..453e4df0 100644 --- a/debugger/time_travel.mli +++ b/debugger/time_travel.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: time_travel.mli 7745 2006-11-20 10:29:45Z ertai $ *) +(* $Id$ *) (**************************** Time travel ******************************) diff --git a/debugger/trap_barrier.ml b/debugger/trap_barrier.ml index ecdfe893..dba9c929 100644 --- a/debugger/trap_barrier.ml +++ b/debugger/trap_barrier.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: trap_barrier.ml 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (************************** Trap barrier *******************************) diff --git a/debugger/trap_barrier.mli b/debugger/trap_barrier.mli index e72a9f7c..28bba5a3 100644 --- a/debugger/trap_barrier.mli +++ b/debugger/trap_barrier.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: trap_barrier.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (************************* Trap barrier ********************************) diff --git a/debugger/unix_tools.ml b/debugger/unix_tools.ml index a95dcc69..9926e05d 100644 --- a/debugger/unix_tools.ml +++ b/debugger/unix_tools.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix_tools.ml 9226 2009-04-02 09:44:21Z xclerc $ *) +(* $Id$ *) (****************** Tools for Unix *************************************) diff --git a/debugger/unix_tools.mli b/debugger/unix_tools.mli index 3a702b9d..b5e4ee6c 100644 --- a/debugger/unix_tools.mli +++ b/debugger/unix_tools.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix_tools.mli 5232 2002-11-02 22:36:46Z doligez $ *) +(* $Id$ *) (**************************** Tools for Unix ***************************) diff --git a/driver/compile.ml b/driver/compile.ml index 8e14272f..4e2d8566 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: compile.ml 9074 2008-10-06 13:53:54Z doligez $ *) +(* $Id$ *) (* The batch compiler *) diff --git a/driver/compile.mli b/driver/compile.mli index de9ebb26..507d61bb 100644 --- a/driver/compile.mli +++ b/driver/compile.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: compile.mli 6395 2004-06-13 12:46:41Z xleroy $ *) +(* $Id$ *) (* Compile a .ml or .mli file *) diff --git a/driver/errors.ml b/driver/errors.ml index e7cd2648..22dd1fc6 100644 --- a/driver/errors.ml +++ b/driver/errors.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: errors.ml 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) (* WARNING: if you change something in this file, you must look at opterrors.ml and ocamldoc/odoc_analyse.ml diff --git a/driver/errors.mli b/driver/errors.mli index 7abc0d72..ac203a53 100644 --- a/driver/errors.mli +++ b/driver/errors.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: errors.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) (* Error report *) open Format diff --git a/driver/main.ml b/driver/main.ml index 50e10eee..cae487b8 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: main.ml 9164 2009-01-14 13:19:32Z doligez $ *) +(* $Id$ *) open Config open Clflags @@ -85,7 +85,7 @@ let show_config () = exit 0; ;; -module Options = Main_args.Make_options (struct +module Options = Main_args.Make_bytecomp_options (struct let set r () = r := true let unset r () = r := false let _a = set make_archive @@ -108,6 +108,7 @@ module Options = Main_args.Make_options (struct let _linkall = set link_everything let _make_runtime () = custom_runtime := true; make_runtime := true; link_everything := true + let _no_app_funct = unset applicative_functors let _noassert = set noassert let _nolabels = set classic let _noautolink = set no_auto_link @@ -118,6 +119,7 @@ module Options = Main_args.Make_options (struct let _pp s = preprocessor := Some s let _principal = set principal let _rectypes = set recursive_types + let _strict_sequence = set strict_sequence let _thread = set use_threads let _vmthread = set use_vmthreads let _unsafe = set fast diff --git a/driver/main.mli b/driver/main.mli index f7f414f7..d175a3ca 100644 --- a/driver/main.mli +++ b/driver/main.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: main.mli 2740 2000-01-07 16:03:04Z doligez $ *) +(* $Id$ *) (* this "empty" file is here to speed up garbage collection in ocamlc.opt diff --git a/driver/main_args.ml b/driver/main_args.ml index 5eb8adae..8b6cedd8 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -10,157 +10,736 @@ (* *) (***********************************************************************) -(* $Id: main_args.ml 8232 2007-05-16 08:21:41Z doligez $ *) - -module Make_options (F : - sig - val _a : unit -> unit - val _annot : unit -> unit - val _c : unit -> unit - val _cc : string -> unit - val _cclib : string -> unit - val _ccopt : string -> unit - val _config : unit -> unit - val _custom : unit -> unit - val _dllib : string -> unit - val _dllpath : string -> unit - val _g : unit -> unit - val _i : unit -> unit - val _I : string -> unit - val _impl : string -> unit - val _intf : string -> unit - val _intf_suffix : string -> unit - val _labels : unit -> unit - val _linkall : unit -> unit - val _make_runtime : unit -> unit - val _noassert : unit -> unit - val _noautolink : unit -> unit - val _nolabels : unit -> unit - val _nostdlib : unit -> unit - val _o : string -> unit - val _output_obj : unit -> unit - val _pack : unit -> unit - val _pp : string -> unit - val _principal : unit -> unit - val _rectypes : unit -> unit - val _thread : unit -> unit - val _vmthread : unit -> unit - val _unsafe : unit -> unit - val _use_prims : string -> unit - val _use_runtime : string -> unit - val _v : unit -> unit - val _version : unit -> unit - val _verbose : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _where : unit -> unit - - val _nopervasives : unit -> unit - val _dparsetree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit - val _dinstr : unit -> unit - val anonymous : string -> unit - end) = +(* $Id$ *) + +let mk_a f = + "-a", Arg.Unit f, " Build a library" +;; + +let mk_annot f = + "-annot", Arg.Unit f, " Save information in .annot" +;; + +let mk_c f = + "-c", Arg.Unit f, " Compile only (do not link)" +;; + +let mk_cc f = + "-cc", Arg.String f, " Use as the C compiler and linker" +;; + +let mk_cclib f = + "-cclib", Arg.String f, " Pass option to the C linker" +;; + +let mk_ccopt f = + "-ccopt", Arg.String f, " Pass option to the C compiler and linker" +;; + +let mk_compact f = + "-compact", Arg.Unit f, " Optimize code size rather than speed" +;; + +let mk_config f = + "-config", Arg.Unit f, " Print configuration values and exit" +;; + +let mk_custom f = + "-custom", Arg.Unit f, " Link in custom mode" +;; + +let mk_dllib f = + "-dllib", Arg.String f, " Use the dynamically-loaded library " +;; + +let mk_dllpath f = + "-dllpath", Arg.String f, + " Add to the run-time search path for shared libraries" +;; + +let mk_dtypes f = + "-dtypes", Arg.Unit f, " (deprecated) same as -annot" +;; + +let mk_for_pack_byt () = + "-for-pack", Arg.String ignore, + " Ignored (for compatibility with ocamlopt)" +;; + +let mk_for_pack_opt f = + "-for-pack", Arg.String f, + " Generate code that can later be `packed' with\n\ + \ ocamlopt -pack -o .cmx" +;; + +let mk_g_byt f = + "-g", Arg.Unit f, " Save debugging information" +;; + +let mk_g_opt f = + "-g", Arg.Unit f, " Record debugging information for exception backtrace" +;; + +let mk_i f = + "-i", Arg.Unit f, " Print inferred interface" +;; + +let mk_I f = + "-I", Arg.String f, " Add to the list of include directories" +;; + +let mk_impl f = + "-impl", Arg.String f, " Compile as a .ml file" +;; + +let mk_init f = + "-init", Arg.String f, " Load instead of default init file" +;; + +let mk_inline f = + "-inline", Arg.Int f, " Set aggressiveness of inlining to " +;; + +let mk_intf f = + "-intf", Arg.String f, " Compile as a .mli file" +;; + +let mk_intf_suffix f = + "-intf-suffix", Arg.String f, + " Suffix for interface files (default: .mli)" +;; + +let mk_intf_suffix_2 f = + "-intf_suffix", Arg.String f, " (deprecated) same as -intf-suffix" +;; + +let mk_labels f = + "-labels", Arg.Unit f, " Use commuting label mode" +;; + +let mk_linkall f = + "-linkall", Arg.Unit f, " Link all modules, even unused ones" +;; + +let mk_make_runtime f = + "-make-runtime", Arg.Unit f, + " Build a runtime system with given C objects and libraries" +;; + +let mk_make_runtime_2 f = + "-make_runtime", Arg.Unit f, " (deprecated) same as -make-runtime" +;; + +let mk_modern f = + "-modern", Arg.Unit f, " (deprecated) same as -labels" +;; + +let mk_no_app_funct f = + "-no-app-funct", Arg.Unit f, " Deactivate applicative functors" +;; + +let mk_noassert f = + "-noassert", Arg.Unit f, " Do not compile assertion checks" +;; + +let mk_noautolink_byt f = + "-noautolink", Arg.Unit f, + " Do not automatically link C libraries specified in .cma files" +;; + +let mk_noautolink_opt f = + "-noautolink", Arg.Unit f, + " Do not automatically link C libraries specified in .cmxa files" +;; + +let mk_nodynlink f = + "-nodynlink", Arg.Unit f, + " Enable optimizations for code that will not be dynlinked" +;; + +let mk_nolabels f = + "-nolabels", Arg.Unit f, " Ignore non-optional labels in types" +;; + +let mk_noprompt f = + "-noprompt", Arg.Unit f, " Suppress all prompts" +;; + +let mk_nostdlib f = + "-nostdlib", Arg.Unit f, + " Do not add default directory to the list of include directories" +;; + +let mk_o f = + "-o", Arg.String f, " Set output file name to " +;; + +let mk_output_obj f = + "-output-obj", Arg.Unit f, " Output a C object file instead of an executable" +;; + +let mk_p f = + "-p", Arg.Unit f, + " Compile and link with profiling support for \"gprof\"\n\ + \ (not supported on all platforms)" +;; + +let mk_pack_byt f = + "-pack", Arg.Unit f, " Package the given .cmo files into one .cmo" +;; + +let mk_pack_opt f = + "-pack", Arg.Unit f, " Package the given .cmx files into one .cmx" +;; + +let mk_pp f = + "-pp", Arg.String f, " Pipe sources through preprocessor " +;; + +let mk_principal f = + "-principal", Arg.Unit f, " Check principality of type inference" +;; + +let mk_rectypes f = + "-rectypes", Arg.Unit f, " Allow arbitrary recursive types" +;; + +let mk_S f = + "-S", Arg.Unit f, " Keep intermediate assembly file" +;; + +let mk_strict_sequence f = + "-strict-sequence", Arg.Unit f, + " Left-hand part of a sequence must have type unit" +;; + +let mk_shared f = + "-shared", Arg.Unit f, " Produce a dynlinkable plugin" +;; + +let mk_thread f = + "-thread", Arg.Unit f, + " Generate code that supports the system threads library" +;; + +let mk_unsafe f = + "-unsafe", Arg.Unit f, + " Do not compile bounds checking on array and string access" +;; + +let mk_use_runtime f = + "-use-runtime", Arg.String f, + " Generate bytecode for the given runtime system" +;; + +let mk_use_runtime_2 f = + "-use_runtime", Arg.String f, + " (deprecated) same as -use-runtime" +;; + +let mk_v f = + "-v", Arg.Unit f, + " Print compiler version and location of standard library and exit" +;; + +let mk_version f = + "-version", Arg.Unit f, " Print version and exit" +;; + +let mk_verbose f = + "-verbose", Arg.Unit f, " Print calls to external commands" +;; + +let mk_vmthread f = + "-vmthread", Arg.Unit f, + " Generate code that supports the threads library with VM-level\n\ + \ scheduling" +;; + +let mk_w f = + "-w", Arg.String f, + " Enable or disable warnings according to :\n\ + \ + enable warning \n\ + \ + enable set \n\ + \ - disable warning \n\ + \ - disable set \n\ + \ @ enable warning and treat it as an error\n\ + \ @ enable set and treat them as errors\n\ + \ default setting is \"+a-4-6-9-27-28-29\"" +;; + +let mk_warn_error f = + "-warn-error", Arg.String f, + " Enable or disable error status for warnings according\n\ + \ to . See option -w for the syntax of .\n\ + \ Default setting is \"-a\"" +;; + +let mk_where f = + "-where", Arg.Unit f, " Print location of standard library and exit" +;; + +let mk_nopervasives f = + "-nopervasives", Arg.Unit f, " (undocumented)" +;; + +let mk_use_prims f = + "-use-prims", Arg.String f, " (undocumented)" +;; + +let mk_dparsetree f = + "-dparsetree", Arg.Unit f, " (undocumented)" +;; + +let mk_drawlambda f = + "-drawlambda", Arg.Unit f, " (undocumented)" +;; + +let mk_dlambda f = + "-dlambda", Arg.Unit f, " (undocumented)" +;; + +let mk_dinstr f = + "-dinstr", Arg.Unit f, " (undocumented)" +;; + +let mk_dcmm f = + "-dcmm", Arg.Unit f, " (undocumented)" +;; + +let mk_dsel f = + "-dsel", Arg.Unit f, " (undocumented)" +;; + +let mk_dcombine f = + "-dcombine", Arg.Unit f, " (undocumented)" +;; + +let mk_dlive f = + "-dlive", Arg.Unit f, " (undocumented)" +;; + +let mk_dspill f = + "-dspill", Arg.Unit f, " (undocumented)" +;; + +let mk_dsplit f = + "-dsplit", Arg.Unit f, " (undocumented)" +;; + +let mk_dinterf f = + "-dinterf", Arg.Unit f, " (undocumented)" +;; + +let mk_dprefer f = + "-dprefer", Arg.Unit f, " (undocumented)" +;; + +let mk_dalloc f = + "-dalloc", Arg.Unit f, " (undocumented)" +;; + +let mk_dreload f = + "-dreload", Arg.Unit f, " (undocumented)" +;; + +let mk_dscheduling f = + "-dscheduling", Arg.Unit f, " (undocumented)" +;; + +let mk_dlinear f = + "-dlinear", Arg.Unit f, " (undocumented)" +;; + +let mk_dstartup f = + "-dstartup", Arg.Unit f, " (undocumented)" +;; + +let mk__ f = + "-", Arg.String f, + " Treat as a file name (even if it starts with `-')" +;; + +module type Bytecomp_options = sig + val _a : unit -> unit + val _annot : unit -> unit + val _c : unit -> unit + val _cc : string -> unit + val _cclib : string -> unit + val _ccopt : string -> unit + val _config : unit -> unit + val _custom : unit -> unit + val _dllib : string -> unit + val _dllpath : string -> unit + val _g : unit -> unit + val _i : unit -> unit + val _I : string -> unit + val _impl : string -> unit + val _intf : string -> unit + val _intf_suffix : string -> unit + val _labels : unit -> unit + val _linkall : unit -> unit + val _make_runtime : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _noautolink : unit -> unit + val _nolabels : unit -> unit + val _nostdlib : unit -> unit + val _o : string -> unit + val _output_obj : unit -> unit + val _pack : unit -> unit + val _pp : string -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _thread : unit -> unit + val _vmthread : unit -> unit + val _unsafe : unit -> unit + val _use_runtime : string -> unit + val _v : unit -> unit + val _version : unit -> unit + val _verbose : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + val _where : unit -> unit + + val _nopervasives : unit -> unit + val _use_prims : string -> unit + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dinstr : unit -> unit + + val anonymous : string -> unit +end;; + +module type Bytetop_options = sig + val _I : string -> unit + val _init : string -> unit + val _labels : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _nolabels : unit -> unit + val _noprompt : unit -> unit + val _nostdlib : unit -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _unsafe : unit -> unit + val _version : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dinstr : unit -> unit + + val anonymous : string -> unit +end;; + +module type Optcomp_options = sig + val _a : unit -> unit + val _annot : unit -> unit + val _c : unit -> unit + val _cc : string -> unit + val _cclib : string -> unit + val _ccopt : string -> unit + val _compact : unit -> unit + val _config : unit -> unit + val _for_pack : string -> unit + val _g : unit -> unit + val _i : unit -> unit + val _I : string -> unit + val _impl : string -> unit + val _inline : int -> unit + val _intf : string -> unit + val _intf_suffix : string -> unit + val _labels : unit -> unit + val _linkall : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _noautolink : unit -> unit + val _nodynlink : unit -> unit + val _nolabels : unit -> unit + val _nostdlib : unit -> unit + val _o : string -> unit + val _output_obj : unit -> unit + val _p : unit -> unit + val _pack : unit -> unit + val _pp : string -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _shared : unit -> unit + val _S : unit -> unit + val _thread : unit -> unit + val _unsafe : unit -> unit + val _v : unit -> unit + val _version : unit -> unit + val _verbose : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + val _where : unit -> unit + + val _nopervasives : unit -> unit + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dcmm : unit -> unit + val _dsel : unit -> unit + val _dcombine : unit -> unit + val _dlive : unit -> unit + val _dspill : unit -> unit + val _dsplit : unit -> unit + val _dinterf : unit -> unit + val _dprefer : unit -> unit + val _dalloc : unit -> unit + val _dreload : unit -> unit + val _dscheduling : unit -> unit + val _dlinear : unit -> unit + val _dstartup : unit -> unit + + val anonymous : string -> unit +end;; + +module type Opttop_options = sig + val _compact : unit -> unit + val _I : string -> unit + val _init : string -> unit + val _inline : int -> unit + val _labels : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _nolabels : unit -> unit + val _noprompt : unit -> unit + val _nostdlib : unit -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _S : unit -> unit + val _unsafe : unit -> unit + val _version : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dcmm : unit -> unit + val _dsel : unit -> unit + val _dcombine : unit -> unit + val _dlive : unit -> unit + val _dspill : unit -> unit + val _dsplit : unit -> unit + val _dinterf : unit -> unit + val _dprefer : unit -> unit + val _dalloc : unit -> unit + val _dreload : unit -> unit + val _dscheduling : unit -> unit + val _dlinear : unit -> unit + val _dstartup : unit -> unit + + val anonymous : string -> unit +end;; + +module type Arg_list = sig + val list : (string * Arg.spec * string) list +end;; + +module Make_bytecomp_options (F : Bytecomp_options) = +struct + let list = [ + mk_a F._a; + mk_annot F._annot; + mk_c F._c; + mk_cc F._cc; + mk_cclib F._cclib; + mk_ccopt F._ccopt; + mk_config F._config; + mk_custom F._custom; + mk_dllib F._dllib; + mk_dllpath F._dllpath; + mk_dtypes F._annot; + mk_for_pack_byt (); + mk_g_byt F._g; + mk_i F._i; + mk_I F._I; + mk_impl F._impl; + mk_intf F._intf; + mk_intf_suffix F._intf_suffix; + mk_intf_suffix_2 F._intf_suffix; + mk_labels F._labels; + mk_linkall F._linkall; + mk_make_runtime F._make_runtime; + mk_make_runtime_2 F._make_runtime; + mk_modern F._labels; + mk_no_app_funct F._no_app_funct; + mk_noassert F._noassert; + mk_noautolink_byt F._noautolink; + mk_nolabels F._nolabels; + mk_nostdlib F._nostdlib; + mk_o F._o; + mk_output_obj F._output_obj; + mk_pack_byt F._pack; + mk_pp F._pp; + mk_principal F._principal; + mk_rectypes F._rectypes; + mk_strict_sequence F._strict_sequence; + mk_thread F._thread; + mk_unsafe F._unsafe; + mk_use_runtime F._use_runtime; + mk_use_runtime_2 F._use_runtime; + mk_v F._v; + mk_version F._version; + mk_verbose F._verbose; + mk_vmthread F._vmthread; + mk_w F._w; + mk_warn_error F._warn_error; + mk_where F._where; + + mk_nopervasives F._nopervasives; + mk_use_prims F._use_prims; + mk_dparsetree F._dparsetree; + mk_drawlambda F._drawlambda; + mk_dlambda F._dlambda; + mk_dinstr F._dinstr; + + mk__ F.anonymous; + ] +end;; + +module Make_bytetop_options (F : Bytetop_options) = struct let list = [ - "-a", Arg.Unit F._a, " Build a library"; - "-annot", Arg.Unit F._annot, " Save information in .annot"; - "-c", Arg.Unit F._c, " Compile only (do not link)"; - "-cc", Arg.String F._cc, - " Use as the C compiler and linker"; - "-cclib", Arg.String F._cclib, " Pass option to the C linker"; - "-ccopt", Arg.String F._ccopt, - " Pass option to the C compiler and linker"; - "-config", Arg.Unit F._config, - " print configuration values and exit"; - "-custom", Arg.Unit F._custom, " Link in custom mode"; - "-dllib", Arg.String F._dllib, - " Use the dynamically-loaded library "; - "-dllpath", Arg.String F._dllpath, - " Add to the run-time search path for shared libraries"; - "-dtypes", Arg.Unit F._annot, " (deprecated) same as -annot"; - "-for-pack", Arg.String (fun s -> ()), - " Ignored (for compatibility with ocamlopt)"; - "-g", Arg.Unit F._g, " Save debugging information"; - "-i", Arg.Unit F._i, " Print inferred interface"; - "-I", Arg.String F._I, - " Add to the list of include directories"; - "-impl", Arg.String F._impl, " Compile as a .ml file"; - "-intf", Arg.String F._intf, " Compile as a .mli file"; - "-intf-suffix", Arg.String F._intf_suffix, - " Suffix for interface files (default: .mli)"; - "-intf_suffix", Arg.String F._intf_suffix, - " (deprecated) same as -intf-suffix"; - "-labels", Arg.Unit F._labels, " Use commuting label mode"; - "-linkall", Arg.Unit F._linkall, " Link all modules, even unused ones"; - "-make-runtime", Arg.Unit F._make_runtime, - " Build a runtime system with given C objects and libraries"; - "-make_runtime", Arg.Unit F._make_runtime, - " (deprecated) same as -make-runtime"; - "-modern", Arg.Unit F._labels, " (deprecated) same as -labels"; - "-noassert", Arg.Unit F._noassert, " Don't compile assertion checks"; - "-noautolink", Arg.Unit F._noautolink, - " Don't automatically link C libraries specified in .cma files"; - "-nolabels", Arg.Unit F._nolabels, " Ignore non-optional labels in types"; - "-nostdlib", Arg.Unit F._nostdlib, - " do not add default directory to the list of include directories"; - "-o", Arg.String F._o, " Set output file name to "; - "-output-obj", Arg.Unit F._output_obj, - " Output a C object file instead of an executable"; - "-pack", Arg.Unit F._pack, - " Package the given .cmo files into one .cmo"; - "-pp", Arg.String F._pp, - " Pipe sources through preprocessor "; - "-principal", Arg.Unit F._principal, - " Check principality of type inference"; - "-rectypes", Arg.Unit F._rectypes, " Allow arbitrary recursive types"; - "-thread", Arg.Unit F._thread, - " Generate code that supports the system threads library"; - "-unsafe", Arg.Unit F._unsafe, - " No bounds checking on array and string access"; - "-use-runtime", Arg.String F._use_runtime, - " Generate bytecode for the given runtime system"; - "-use_runtime", Arg.String F._use_runtime, - " (deprecated) same as -use-runtime"; - "-v", Arg.Unit F._v, - " Print compiler version and location of standard library and exit"; - "-version", Arg.Unit F._version, " Print compiler version and exit"; - "-verbose", Arg.Unit F._verbose, " Print calls to external commands"; - "-vmthread", Arg.Unit F._vmthread, - " Generate code that supports the threads library with VM-level\n\ - \ scheduling"; - "-w", Arg.String F._w, - " Enable or disable warnings according to :\n\ - \032 C/c enable/disable suspicious comment\n\ - \032 D/d enable/disable deprecated features\n\ - \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 overriden 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 overriden 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\ - \032 A/a enable/disable all warnings\n\ - \032 default setting is \"Aelz\""; - "-warn-error" , Arg.String F._warn_error, - " Treat the warnings of as errors, if they are\n\ - \ enabled. See option -w for the list of flags.\n\ - \ Default setting is \"a\" (warnings are not errors)"; - "-where", Arg.Unit F._where, - " Print location of standard library and exit"; - "-nopervasives", Arg.Unit F._nopervasives, " (undocumented)"; - "-dparsetree", Arg.Unit F._dparsetree, " (undocumented)"; - "-drawlambda", Arg.Unit F._drawlambda, " (undocumented)"; - "-dlambda", Arg.Unit F._dlambda, " (undocumented)"; - "-dinstr", Arg.Unit F._dinstr, " (undocumented)"; - "-use-prims", Arg.String F._use_prims, " (undocumented)"; - - "-", Arg.String F.anonymous, - " Treat as a file name (even if it starts with `-')"; + mk_I F._I; + mk_init F._init; + mk_labels F._labels; + mk_no_app_funct F._no_app_funct; + mk_noassert F._noassert; + mk_nolabels F._nolabels; + mk_noprompt F._noprompt; + mk_nostdlib F._nostdlib; + mk_principal F._principal; + mk_rectypes F._rectypes; + mk_strict_sequence F._strict_sequence; + mk_unsafe F._unsafe; + mk_version F._version; + mk_w F._w; + mk_warn_error F._warn_error; + + mk_dparsetree F._dparsetree; + mk_drawlambda F._drawlambda; + mk_dlambda F._dlambda; + mk_dinstr F._dinstr; + + mk__ F.anonymous; + ] +end;; + +module Make_optcomp_options (F : Optcomp_options) = +struct + let list = [ + mk_a F._a; + mk_annot F._annot; + mk_c F._c; + mk_cc F._cc; + mk_cclib F._cclib; + mk_ccopt F._ccopt; + mk_compact F._compact; + mk_config F._config; + mk_dtypes F._annot; + mk_for_pack_opt F._for_pack; + mk_g_opt F._g; + mk_i F._i; + mk_I F._I; + mk_impl F._impl; + mk_inline F._inline; + mk_intf F._intf; + mk_intf_suffix F._intf_suffix; + mk_labels F._labels; + mk_linkall F._linkall; + mk_no_app_funct F._no_app_funct; + mk_noassert F._noassert; + mk_noautolink_opt F._noautolink; + mk_nodynlink F._nodynlink; + mk_nolabels F._nolabels; + mk_nostdlib F._nostdlib; + mk_o F._o; + mk_output_obj F._output_obj; + mk_p F._p; + mk_pack_opt F._pack; + mk_pp F._pp; + mk_principal F._principal; + mk_rectypes F._rectypes; + mk_S F._S; + mk_strict_sequence F._strict_sequence; + mk_shared F._shared; + mk_thread F._thread; + mk_unsafe F._unsafe; + mk_v F._v; + mk_version F._version; + mk_verbose F._verbose; + mk_w F._w; + mk_warn_error F._warn_error; + mk_where F._where; + + mk_nopervasives F._nopervasives; + mk_dparsetree F._dparsetree; + mk_drawlambda F._drawlambda; + mk_dcmm F._dcmm; + mk_dsel F._dsel; + mk_dcombine F._dcombine; + mk_dlive F._dlive; + mk_dspill F._dspill; + mk_dinterf F._dinterf; + mk_dprefer F._dprefer; + mk_dalloc F._dalloc; + mk_dreload F._dreload; + mk_dscheduling F._dscheduling; + mk_dlinear F._dlinear; + mk_dstartup F._dstartup; + + mk__ F.anonymous; + ] +end;; + +module Make_opttop_options (F : Opttop_options) = struct + let list = [ + mk_compact F._compact; + mk_I F._I; + mk_init F._init; + mk_inline F._inline; + mk_labels F._labels; + mk_no_app_funct F._no_app_funct; + mk_noassert F._noassert; + mk_nolabels F._nolabels; + mk_noprompt F._noprompt; + mk_nostdlib F._nostdlib; + mk_principal F._principal; + mk_rectypes F._rectypes; + mk_S F._S; + mk_strict_sequence F._strict_sequence; + mk_unsafe F._unsafe; + mk_version F._version; + mk_w F._w; + mk_warn_error F._warn_error; + + mk_dparsetree F._dparsetree; + mk_drawlambda F._drawlambda; + mk_dcmm F._dcmm; + mk_dsel F._dsel; + mk_dcombine F._dcombine; + mk_dlive F._dlive; + mk_dspill F._dspill; + mk_dinterf F._dinterf; + mk_dprefer F._dprefer; + mk_dalloc F._dalloc; + mk_dreload F._dreload; + mk_dscheduling F._dscheduling; + mk_dlinear F._dlinear; + mk_dstartup F._dstartup; + + mk__ F.anonymous; ] end;; diff --git a/driver/main_args.mli b/driver/main_args.mli index 20f394b1..874410f9 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -10,58 +10,198 @@ (* *) (***********************************************************************) -(* $Id: main_args.mli 8232 2007-05-16 08:21:41Z doligez $ *) +(* $Id$ *) -module Make_options (F : - sig - val _a : unit -> unit - val _annot : unit -> unit - val _c : unit -> unit - val _cc : string -> unit - val _cclib : string -> unit - val _ccopt : string -> unit - val _config : unit -> unit - val _custom : unit -> unit - val _dllib : string -> unit - val _dllpath : string -> unit - val _g : unit -> unit - val _i : unit -> unit - val _I : string -> unit - val _impl : string -> unit - val _intf : string -> unit - val _intf_suffix : string -> unit - val _labels : unit -> unit - val _linkall : unit -> unit - val _make_runtime : unit -> unit - val _noassert : unit -> unit - val _noautolink : unit -> unit - val _nolabels : unit -> unit - val _nostdlib : unit -> unit - val _o : string -> unit - val _output_obj : unit -> unit - val _pack : unit -> unit - val _pp : string -> unit - val _principal : unit -> unit - val _rectypes : unit -> unit - val _thread : unit -> unit - val _vmthread : unit -> unit - val _unsafe : unit -> unit - val _use_prims : string -> unit - val _use_runtime : string -> unit - val _v : unit -> unit - val _version : unit -> unit - val _verbose : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _where : unit -> unit - - val _nopervasives : unit -> unit - val _dparsetree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit - val _dinstr : unit -> unit - val anonymous : string -> unit - end) : +module type Bytecomp_options = sig - val list : (string * Arg.spec * string) list + val _a : unit -> unit + val _annot : unit -> unit + val _c : unit -> unit + val _cc : string -> unit + val _cclib : string -> unit + val _ccopt : string -> unit + val _config : unit -> unit + val _custom : unit -> unit + val _dllib : string -> unit + val _dllpath : string -> unit + val _g : unit -> unit + val _i : unit -> unit + val _I : string -> unit + val _impl : string -> unit + val _intf : string -> unit + val _intf_suffix : string -> unit + val _labels : unit -> unit + val _linkall : unit -> unit + val _make_runtime : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _noautolink : unit -> unit + val _nolabels : unit -> unit + val _nostdlib : unit -> unit + val _o : string -> unit + val _output_obj : unit -> unit + val _pack : unit -> unit + val _pp : string -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _thread : unit -> unit + val _vmthread : unit -> unit + val _unsafe : unit -> unit + val _use_runtime : string -> unit + val _v : unit -> unit + val _version : unit -> unit + val _verbose : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + val _where : unit -> unit + + val _nopervasives : unit -> unit + val _use_prims : string -> unit + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dinstr : unit -> unit + + val anonymous : string -> unit end +;; + +module type Bytetop_options = sig + val _I : string -> unit + val _init : string -> unit + val _labels : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _nolabels : unit -> unit + val _noprompt : unit -> unit + val _nostdlib : unit -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _unsafe : unit -> unit + val _version : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dinstr : unit -> unit + + val anonymous : string -> unit +end;; + +module type Optcomp_options = sig + val _a : unit -> unit + val _annot : unit -> unit + val _c : unit -> unit + val _cc : string -> unit + val _cclib : string -> unit + val _ccopt : string -> unit + val _compact : unit -> unit + val _config : unit -> unit + val _for_pack : string -> unit + val _g : unit -> unit + val _i : unit -> unit + val _I : string -> unit + val _impl : string -> unit + val _inline : int -> unit + val _intf : string -> unit + val _intf_suffix : string -> unit + val _labels : unit -> unit + val _linkall : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _noautolink : unit -> unit + val _nodynlink : unit -> unit + val _nolabels : unit -> unit + val _nostdlib : unit -> unit + val _o : string -> unit + val _output_obj : unit -> unit + val _p : unit -> unit + val _pack : unit -> unit + val _pp : string -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _shared : unit -> unit + val _S : unit -> unit + val _thread : unit -> unit + val _unsafe : unit -> unit + val _v : unit -> unit + val _version : unit -> unit + val _verbose : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + val _where : unit -> unit + + val _nopervasives : unit -> unit + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dcmm : unit -> unit + val _dsel : unit -> unit + val _dcombine : unit -> unit + val _dlive : unit -> unit + val _dspill : unit -> unit + val _dsplit : unit -> unit + val _dinterf : unit -> unit + val _dprefer : unit -> unit + val _dalloc : unit -> unit + val _dreload : unit -> unit + val _dscheduling : unit -> unit + val _dlinear : unit -> unit + val _dstartup : unit -> unit + + val anonymous : string -> unit +end;; + +module type Opttop_options = sig + val _compact : unit -> unit + val _I : string -> unit + val _init : string -> unit + val _inline : int -> unit + val _labels : unit -> unit + val _no_app_funct : unit -> unit + val _noassert : unit -> unit + val _nolabels : unit -> unit + val _noprompt : unit -> unit + val _nostdlib : unit -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _strict_sequence : unit -> unit + val _S : unit -> unit + val _unsafe : unit -> unit + val _version : unit -> unit + val _w : string -> unit + val _warn_error : string -> unit + + val _dparsetree : unit -> unit + val _drawlambda : unit -> unit + val _dlambda : unit -> unit + val _dcmm : unit -> unit + val _dsel : unit -> unit + val _dcombine : unit -> unit + val _dlive : unit -> unit + val _dspill : unit -> unit + val _dsplit : unit -> unit + val _dinterf : unit -> unit + val _dprefer : unit -> unit + val _dalloc : unit -> unit + val _dreload : unit -> unit + val _dscheduling : unit -> unit + val _dlinear : unit -> unit + val _dstartup : unit -> unit + + val anonymous : string -> unit +end;; + +module type Arg_list = sig + val list : (string * Arg.spec * string) list +end;; + +module Make_bytecomp_options (F : Bytecomp_options) : Arg_list;; +module Make_bytetop_options (F : Bytetop_options) : Arg_list;; +module Make_optcomp_options (F : Optcomp_options) : Arg_list;; +module Make_opttop_options (F : Opttop_options) : Arg_list;; diff --git a/driver/optcompile.ml b/driver/optcompile.ml index acbf223c..29afc628 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: optcompile.ml 9094 2008-10-17 14:01:35Z doligez $ *) +(* $Id$ *) (* The batch compiler *) diff --git a/driver/optcompile.mli b/driver/optcompile.mli index 47eb0656..507d61bb 100644 --- a/driver/optcompile.mli +++ b/driver/optcompile.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: optcompile.mli 6395 2004-06-13 12:46:41Z xleroy $ *) +(* $Id$ *) (* Compile a .ml or .mli file *) diff --git a/driver/opterrors.ml b/driver/opterrors.ml index ba83ab3c..58178199 100644 --- a/driver/opterrors.ml +++ b/driver/opterrors.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opterrors.ml 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) (* WARNING: if you change something in this file, you must look at errors.ml to see if you need to make the same changes there. diff --git a/driver/opterrors.mli b/driver/opterrors.mli index 44ea1dd3..d09dc733 100644 --- a/driver/opterrors.mli +++ b/driver/opterrors.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opterrors.mli 2910 2000-03-07 05:02:33Z garrigue $ *) +(* $Id$ *) (* Error report *) diff --git a/driver/optmain.ml b/driver/optmain.ml index 193ba4ae..53b19a75 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: optmain.ml 9084 2008-10-15 08:48:51Z xleroy $ *) +(* $Id$ *) open Config open Clflags @@ -32,14 +32,14 @@ let process_implementation_file ppf name = let process_file ppf name = if Filename.check_suffix name ".ml" - || Filename.check_suffix name ".mlt" then + || Filename.check_suffix name ".mlt" then process_implementation_file ppf name else if Filename.check_suffix name !Config.interface_suffix then begin let opref = output_prefix name in Optcompile.interface ppf name opref; if !make_package then objfiles := (opref ^ ".cmi") :: !objfiles end - else if Filename.check_suffix name ".cmx" + else if Filename.check_suffix name ".cmx" || Filename.check_suffix name ".cmxa" then objfiles := name :: !objfiles else if Filename.check_suffix name ".cmi" && !make_package then @@ -83,139 +83,93 @@ let default_output = function let usage = "Usage: ocamlopt \nOptions are:" +(* Error messages to standard error formatter *) +let anonymous = process_file Format.err_formatter;; +let impl = process_implementation_file Format.err_formatter;; +let intf = process_interface_file Format.err_formatter;; + let show_config () = Config.print_config stdout; exit 0; ;; +module Options = Main_args.Make_optcomp_options (struct + let set r () = r := true + let clear r () = r := false + + let _a = set make_archive + let _annot = set annotations + let _c = set compile_only + let _cc s = c_compiler := Some s + let _cclib s = ccobjs := Misc.rev_split_words s @ !ccobjs + let _ccopt s = ccopts := s :: !ccopts + let _compact = clear optimize_for_speed + let _config () = show_config () + let _for_pack s = for_package := Some s + let _g = set debug + let _i () = print_types := true; compile_only := true + let _I dir = include_dirs := dir :: !include_dirs + let _impl = impl + let _inline n = inline_threshold := n * 8 + let _intf = intf + let _intf_suffix s = Config.interface_suffix := s + let _labels = clear classic + let _linkall = set link_everything + let _no_app_funct = clear applicative_functors + let _noassert = set noassert + let _noautolink = set no_auto_link + let _nodynlink = clear dlcode + let _nolabels = set classic + let _nostdlib = set no_std_include + let _o s = output_name := Some s + let _output_obj = set output_c_object + let _p = set gprofile + let _pack = set make_package + let _pp s = preprocessor := Some s + let _principal = set principal + let _rectypes = set recursive_types + let _strict_sequence = set strict_sequence + let _shared () = shared := true; dlcode := true + let _S = set keep_asm_file + let _thread = set use_threads + let _unsafe = set fast + let _v () = print_version_and_library () + let _version () = print_version_string () + let _verbose = set verbose + let _w s = Warnings.parse_options false s + let _warn_error s = Warnings.parse_options true s + let _where () = print_standard_library () + + let _nopervasives = set nopervasives + let _dparsetree = set dump_parsetree + let _drawlambda = set dump_rawlambda + let _dlambda = set dump_lambda + let _dcmm = set dump_cmm + let _dsel = set dump_selection + let _dcombine = set dump_combine + let _dlive () = dump_live := true; Printmach.print_live := true + let _dspill = set dump_spill + let _dsplit = set dump_split + let _dinterf = set dump_interf + let _dprefer = set dump_prefer + let _dalloc = set dump_regalloc + let _dreload = set dump_reload + let _dscheduling = set dump_scheduling + let _dlinear = set dump_linear + let _dstartup = set keep_startup_file + + let anonymous = anonymous +end);; + let main () = native_code := true; let ppf = Format.err_formatter in try - Arg.parse (Arch.command_line_options @ [ - "-a", Arg.Set make_archive, " Build a library"; - "-annot", Arg.Set annotations, - " Save information in .annot"; - "-c", Arg.Set compile_only, " Compile only (do not link)"; - "-cc", Arg.String(fun s -> c_compiler := Some s), - " Use as the C compiler and linker"; - "-cclib", Arg.String(fun s -> - ccobjs := Misc.rev_split_words s @ !ccobjs), - " Pass option to the C linker"; - "-ccopt", Arg.String(fun s -> ccopts := s :: !ccopts), - " Pass option to the C compiler and linker"; - "-compact", Arg.Clear optimize_for_speed, - " Optimize code size rather than speed"; - "-config", Arg.Unit show_config, - " print configuration values and exit"; - "-dtypes", Arg.Set annotations, - " (deprecated) same as -annot"; - "-for-pack", Arg.String (fun s -> for_package := Some s), - " Generate code that can later be `packed' with\n\ - \ ocamlopt -pack -o .cmx"; - "-g", Arg.Set debug, - " Record debugging information for exception backtrace"; - "-i", Arg.Unit (fun () -> print_types := true; compile_only := true), - " Print inferred interface"; - "-I", Arg.String(fun dir -> include_dirs := dir :: !include_dirs), - " Add to the list of include directories"; - "-impl", Arg.String (process_implementation_file ppf), - " Compile as a .ml file"; - "-inline", Arg.Int(fun n -> inline_threshold := n * 8), - " Set aggressiveness of inlining to "; - "-intf", Arg.String (process_interface_file ppf), - " Compile as a .mli file"; - "-intf-suffix", Arg.String (fun s -> Config.interface_suffix := s), - " Suffix for interface files (default: .mli)"; - "-intf_suffix", Arg.String (fun s -> Config.interface_suffix := s), - " (deprecated) same as -intf-suffix"; - "-labels", Arg.Clear classic, " Use commuting label mode"; - "-linkall", Arg.Set link_everything, - " Link all modules, even unused ones"; - "-noassert", Arg.Set noassert, " Don't compile assertion checks"; - "-noautolink", Arg.Set no_auto_link, - " Don't automatically link C libraries specified in .cmxa files"; - "-nodynlink", Arg.Clear dlcode, - " Enable optimizations for code that will not be dynlinked"; - "-nolabels", Arg.Set classic, " Ignore non-optional labels in types"; - "-nostdlib", Arg.Set no_std_include, - " do not add standard directory to the list of include directories"; - "-o", Arg.String(fun s -> output_name := Some s), - " Set output file name to "; - "-output-obj", Arg.Unit(fun () -> output_c_object := true), - " Output a C object file instead of an executable"; - "-p", Arg.Set gprofile, - " Compile and link with profiling support for \"gprof\"\n\ - \ (not supported on all platforms)"; - "-pack", Arg.Set make_package, - " Package the given .cmx files into one .cmx"; - "-pp", Arg.String(fun s -> preprocessor := Some s), - " Pipe sources through preprocessor "; - "-principal", Arg.Set principal, - " Check principality of type inference"; - "-rectypes", Arg.Set recursive_types, - " Allow arbitrary recursive types"; - "-shared", Arg.Unit (fun () -> shared := true; dlcode := true), - " Produce a dynlinkable plugin"; - "-S", Arg.Set keep_asm_file, " Keep intermediate assembly file"; - "-thread", Arg.Set use_threads, - " Generate code that supports the system threads library"; - "-unsafe", Arg.Set fast, - " No bounds checking on array and string access"; - "-v", Arg.Unit print_version_and_library, - " Print compiler version and standard library location and exit"; - "-version", Arg.Unit print_version_string, - " Print compiler version and exit"; - "-verbose", Arg.Set verbose, " Print calls to external commands"; - "-w", Arg.String (Warnings.parse_options false), - " Enable or disable warnings according to :\n\ - \032 C/c enable/disable suspicious comment\n\ - \032 D/d enable/disable deprecated features\n\ - \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 overriden 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 overriden 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\ - \032 A/a enable/disable all warnings\n\ - \032 default setting is \"Aelz\""; - "-warn-error" , Arg.String (Warnings.parse_options true), - " Treat the warnings of as errors, if they are\n\ - \ enabled. See option -w for the list of flags.\n\ - \ Default setting is \"a\" (warnings are not errors)"; - "-where", Arg.Unit print_standard_library, - " Print location of standard library and exit"; - - "-nopervasives", Arg.Set nopervasives, " (undocumented)"; - "-dparsetree", Arg.Set dump_parsetree, " (undocumented)"; - "-drawlambda", Arg.Set dump_rawlambda, " (undocumented)"; - "-dlambda", Arg.Set dump_lambda, " (undocumented)"; - "-dcmm", Arg.Set dump_cmm, " (undocumented)"; - "-dsel", Arg.Set dump_selection, " (undocumented)"; - "-dcombine", Arg.Set dump_combine, " (undocumented)"; - "-dlive", Arg.Unit(fun () -> dump_live := true; - Printmach.print_live := true), - " (undocumented)"; - "-dspill", Arg.Set dump_spill, " (undocumented)"; - "-dsplit", Arg.Set dump_split, " (undocumented)"; - "-dinterf", Arg.Set dump_interf, " (undocumented)"; - "-dprefer", Arg.Set dump_prefer, " (undocumented)"; - "-dalloc", Arg.Set dump_regalloc, " (undocumented)"; - "-dreload", Arg.Set dump_reload, " (undocumented)"; - "-dscheduling", Arg.Set dump_scheduling, " (undocumented)"; - "-dlinear", Arg.Set dump_linear, " (undocumented)"; - "-dstartup", Arg.Set keep_startup_file, " (undocumented)"; - "-", Arg.String (process_file ppf), - " Treat as a file name (even if it starts with `-')" - ]) (process_file ppf) usage; + Arg.parse (Arch.command_line_options @ Options.list) anonymous usage; if List.length (List.filter (fun x -> !x) - [make_archive;make_package;shared;compile_only;output_c_object]) > 1 + [make_package; make_archive; shared; + compile_only; output_c_object]) > 1 then fatal "Please specify at most one of -pack, -a, -shared, -c, -output-obj"; if !make_archive then begin diff --git a/driver/optmain.mli b/driver/optmain.mli index 08ca44ff..628d2d39 100644 --- a/driver/optmain.mli +++ b/driver/optmain.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: optmain.mli 2740 2000-01-07 16:03:04Z doligez $ *) +(* $Id$ *) (* this "empty" file is here to speed up garbage collection in ocamlopt.opt diff --git a/driver/pparse.ml b/driver/pparse.ml index 1ce335b5..0622ddad 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: pparse.ml 6415 2004-06-16 16:58:46Z doligez $ *) +(* $Id$ *) open Format diff --git a/driver/pparse.mli b/driver/pparse.mli index db2e5612..0ed03913 100644 --- a/driver/pparse.mli +++ b/driver/pparse.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: pparse.mli 4365 2002-02-08 10:14:31Z ddr $ *) +(* $Id$ *) open Format diff --git a/emacs/.cvsignore b/emacs/.cvsignore index e7e261fc..ea6381f9 100644 --- a/emacs/.cvsignore +++ b/emacs/.cvsignore @@ -1,2 +1 @@ ocamltags - diff --git a/emacs/Makefile b/emacs/Makefile index 1df717eb..9519b396 100644 --- a/emacs/Makefile +++ b/emacs/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile 6612 2004-08-20 17:04:35Z doligez $ +# $Id$ include ../config/Makefile @@ -30,28 +30,28 @@ SCRIPTDIR = $(BINDIR) # Command for byte-compiling the files COMPILECMD=(progn \ - (setq load-path (cons "." load-path)) \ - (byte-compile-file "caml-xemacs.el") \ + (setq load-path (cons "." load-path)) \ + (byte-compile-file "caml-xemacs.el") \ (byte-compile-file "caml-emacs.el") \ - (byte-compile-file "caml.el") \ - (byte-compile-file "inf-caml.el") \ - (byte-compile-file "caml-help.el") \ - (byte-compile-file "caml-types.el") \ - (byte-compile-file "camldebug.el")) + (byte-compile-file "caml.el") \ + (byte-compile-file "inf-caml.el") \ + (byte-compile-file "caml-help.el") \ + (byte-compile-file "caml-types.el") \ + (byte-compile-file "camldebug.el")) install: @if test "$(EMACSDIR)" = ""; then \ - set xxx `($(EMACS) --batch --eval "(mapcar 'print load-path)") \ - 2>/dev/null | \ - sed -n -e '/\/site-lisp/s/"//gp'`; \ - if test "$$2" = ""; then \ - echo "Cannot determine Emacs site-lisp directory"; \ - exit 2; \ - fi; \ - $(MAKE) EMACSDIR="$$2" simple-install; \ - else \ - $(MAKE) simple-install; \ - fi + set xxx `($(EMACS) --batch --eval "(mapcar 'print load-path)") \ + 2>/dev/null | \ + sed -n -e '/\/site-lisp/s/"//gp'`; \ + if test "$$2" = ""; then \ + echo "Cannot determine Emacs site-lisp directory"; \ + exit 2; \ + fi; \ + $(MAKE) EMACSDIR="$$2" simple-install; \ + else \ + $(MAKE) simple-install; \ + fi # install the .el files, but do not compile them. install-el: diff --git a/emacs/README b/emacs/README index a1e4782a..7ddb362b 100644 --- a/emacs/README +++ b/emacs/README @@ -1,4 +1,4 @@ - O'Caml emacs mode, snapshot of $Date: 2008-01-11 17:13:18 +0100 (Fri, 11 Jan 2008) $ + O'Caml emacs mode, snapshot of $Date$ The files in this archive define a caml-mode for emacs, for editing Objective Caml and Objective Label programs, as well as an diff --git a/emacs/caml-compat.el b/emacs/caml-compat.el index 0071cf0d..8ba7a99c 100644 --- a/emacs/caml-compat.el +++ b/emacs/caml-compat.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-compat.el 6612 2004-08-20 17:04:35Z doligez $ *) +;(* $Id$ *) ;; function definitions for old versions of emacs @@ -39,4 +39,3 @@ only if necessary. It leaves point at end of indentation." (defalias 'buffer-substring-no-properties 'buffer-substring))) (provide 'caml-compat) - diff --git a/emacs/caml-emacs.el b/emacs/caml-emacs.el index c7eacfd1..d034ff30 100644 --- a/emacs/caml-emacs.el +++ b/emacs/caml-emacs.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-emacs.el 6612 2004-08-20 17:04:35Z doligez $ *) +;(* $Id$ *) ;; for caml-help.el (defalias 'caml-info-other-window 'info-other-window) diff --git a/emacs/caml-font-old.el b/emacs/caml-font-old.el index 4fbcd7cb..8faa542f 100644 --- a/emacs/caml-font-old.el +++ b/emacs/caml-font-old.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-font-old.el 8768 2008-01-11 16:13:18Z doligez $ *) +;(* $Id$ *) ;; useful colors @@ -114,7 +114,7 @@ ((fboundp 'global-font-lock-mode) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults - '(caml-font-lock-keywords nil nil ((?' . "w") (?_ . "w"))))) + '(caml-font-lock-keywords nil nil ((?' . "w") (?_ . "w"))))) (t (setq font-lock-keywords caml-font-lock-keywords))) (make-local-variable 'font-lock-keywords-only) diff --git a/emacs/caml-font.el b/emacs/caml-font.el index e796abdc..f287ffa0 100644 --- a/emacs/caml-font.el +++ b/emacs/caml-font.el @@ -1,6 +1,6 @@ ;; caml-font: font-lock support for OCaml files ;; -;; rewrite and clean-up. +;; rewrite and clean-up. ;; Changes: ;; - fontify strings and comments using syntactic font lock ;; - define a `font-lock-syntactic-face-function' to fontify ocamldoc comments @@ -31,7 +31,7 @@ (unless (facep 'font-lock-preprocessor-face) (defvar font-lock-preprocessor-face - (copy-face 'font-lock-builtin-face + (copy-face 'font-lock-builtin-face 'font-lock-preprocessor-face))) (defconst caml-font-lock-keywords @@ -92,7 +92,7 @@ (defun caml-font-set-font-lock () (setq font-lock-defaults '(caml-font-lock-keywords - nil nil nil nil + nil nil nil nil (font-lock-syntactic-face-function . caml-font-syntactic-face))) (font-lock-mode 1)) (add-hook 'caml-mode-hook 'caml-font-set-font-lock) @@ -106,7 +106,7 @@ (defun inferior-caml-set-font-lock () (setq font-lock-defaults '(inferior-caml-font-lock-keywords - nil nil nil nil + nil nil nil nil (font-lock-syntactic-face-function . caml-font-syntactic-face))) (font-lock-mode 1)) (add-hook 'inferior-caml-mode-hooks 'inferior-caml-set-font-lock) diff --git a/emacs/caml-help.el b/emacs/caml-help.el index 29fde073..e6517185 100644 --- a/emacs/caml-help.el +++ b/emacs/caml-help.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-help.el 6612 2004-08-20 17:04:35Z doligez $ *) +;(* $Id$ *) ;; caml-info.el --- contextual completion and help to caml-mode @@ -27,27 +27,27 @@ ;; - dump some databaes: Info, Lib, ... ;; - accept a search path for local libraries instead of current dir ;; (then distinguish between different modules lying in different -;; directories) +;; directories) ;; - improve the construction for info files. ;; -;; Abstract over +;; Abstract over ;; - the viewing method and the database, so that the documentation for -;; and identifier could be search in +;; and identifier could be search in ;; * info / html / man / mli's sources ;; * viewed in emacs or using an external previewer. ;; ;; Take all identifiers (labels, Constructors, exceptions, etc.) -;; +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (eval-and-compile - (if (and (boundp 'running-xemacs) running-xemacs) + (if (and (boundp 'running-xemacs) running-xemacs) (require 'caml-xemacs) (require 'caml-emacs))) ;; Loading or building databases. -;; +;; ;; variables to be customized @@ -73,7 +73,7 @@ "ocamlc -where"))))) ocaml-lib-path) - + ;; General purpose auxiliary functions @@ -92,17 +92,17 @@ (if (stringp path) (if (file-directory-p path) path nil) (mapconcat '(lambda (d) (if (file-directory-p d) d)) - path " "))) + path " "))) (command (and path-string (concat "find " path-string " '(' " filter " ')' " (if depth (concat " -maxdepth " (int-to-string depth))) - (if split nil " -printf '%\p '") + (if split nil " -printf '%\p '") ))) (files (and command (shell-command-to-string command)))) - (if (and split (stringp files)) (split-string files "\n") files) + (if (and split (stringp files)) (split-string files "\n") files) )) ;; Specialized auxiliary functions @@ -111,7 +111,7 @@ ;; Global table of modules contents of modules loaded lazily. (defvar ocaml-module-alist 'lazy - "A-list of modules with how and where to find help information. + "A-list of modules with how and where to find help information. 'delay means non computed yet") (defun ocaml-add-mli-modules (modules tag &optional path) @@ -209,7 +209,7 @@ alist) )) -;; Local list of visible modules. +;; Local list of visible modules. (defvar ocaml-visible-modules 'lazy "A-list of open modules, local to every file.") @@ -249,8 +249,8 @@ When call interactively, make completion over known modules." (message "%S" (mapcar 'car (ocaml-visible-modules)))) (defun ocaml-close-module (arg) - "*Close module of name ARG when ARG is a string. -When call interactively, make completion over visible modules. + "*Close module of name ARG when ARG is a string. +When call interactively, make completion over visible modules. Otherwise if ARG is true, close all modules and reset to default. " (interactive "P") (if (= (prefix-numeric-value arg) 4) @@ -268,27 +268,27 @@ Otherwise if ARG is true, close all modules and reset to default. " ocaml-visible-modules)) )) (message "%S" (mapcar 'car (ocaml-visible-modules)))) - + ;; Look for identifiers around point (defun ocaml-qualified-identifier (&optional show) - "Search for a qualified identifier (Path. entry) around point. + "Search for a qualified identifier (Path. entry) around point. Entry may be nil. -Currently, the path may only be nil or a single Module. -For paths is of the form Module.Path', it returns Module -and always nil for entry. +Currently, the path may only be nil or a single Module. +For paths is of the form Module.Path', it returns Module +and always nil for entry. -If defined Module and Entry are represented by a region in the buffer, -and are nil otherwise. +If defined Module and Entry are represented by a region in the buffer, +and are nil otherwise. -For debugging purposes, it returns the string Module.entry if called -with an optional non-nil argument. +For debugging purposes, it returns the string Module.entry if called +with an optional non-nil argument. " (save-excursion (let ((module) (entry)) - (if (looking-at "[ \n]") (skip-chars-backward " ")) + (if (looking-at "[ \n]") (skip-chars-backward " ")) (if (re-search-backward "\\([^A-Za-z0-9_.']\\|\\`\\)\\([A-Za-z0-9_']*[.]\\)*[A-Za-z0-9_']*\\=" (- (point) 100) t) @@ -314,7 +314,7 @@ with an optional non-nil argument. (let ((list (or (and module - (list + (list (or (assoc module (ocaml-module-alist)) (error "Unknown module %s" module)))) (ocaml-visible-modules)))) @@ -333,19 +333,19 @@ with an optional non-nil argument. ))) (defun caml-complete (arg) - "Does completion for OCaml identifiers qualified. + "Does completion for OCaml identifiers qualified. -It attemps to recognize an qualified identifier Module . entry +It attemps to recognize an qualified identifier Module . entry around point using function \\[ocaml-qualified-identifier]. If Module is defined, it does completion for identifier in Module. -If Module is undefined, it does completion in visible modules. -Then, if completion fails, it does completion among all modules +If Module is undefined, it does completion in visible modules. +Then, if completion fails, it does completion among all modules where identifier is defined." (interactive "p") (let* ((module-entry (ocaml-qualified-identifier)) (entry) - (module) + (module) (beg) (end) (pattern)) (if (car module-entry) (progn @@ -364,7 +364,7 @@ where identifier is defined." (progn (setq entry (cdr module-entry)) t)) (error "Unknown module %s" module)))) (if (consp (cdr module-entry)) - (progn + (progn (setq beg (cadr module-entry)) (setq end (cddr module-entry))) (if (and module @@ -408,7 +408,7 @@ where identifier is defined." (delete-region (caar module-entry) end) (delete-region beg end)) (insert module "." pattern)))) - + ((not (string-equal pattern completion)) (delete-region beg end) (goto-char beg) @@ -426,10 +426,10 @@ where identifier is defined." (defvar ocaml-info-prefix "ocaml-lib" "Prefix of ocaml info files describing library modules. -Suffix .info will be added to info files. +Suffix .info will be added to info files. Additional suffix .gz may be added if info files are compressed. ") -;; +;; (defun ocaml-hevea-info-add-entries (entries dir name) (let* @@ -470,9 +470,9 @@ Additional suffix .gz may be added if info files are compressed. entries)) (defun ocaml-hevea-info () - "The default way to create an info data base from the value -of \\[Info-default-directory-list] and the base name \\[ocaml-info-name] -of files to look for. + "The default way to create an info data base from the value +of \\[Info-default-directory-list] and the base name \\[ocaml-info-name] +of files to look for. This uses info files produced by HeVeA. " @@ -512,8 +512,8 @@ This uses info files produced by HeVeA. entries)) (defun ocaml-ocamldoc-info () - "The default way to create an info data base from the value -of \\[Info-default-directory-list] and the base name \\[ocaml-info-name] + "The default way to create an info data base from the value +of \\[Info-default-directory-list] and the base name \\[ocaml-info-name] of files to look for. This uses info files produced by ocamldoc." @@ -531,18 +531,18 @@ This uses info files produced by ocamldoc." ;; Continuing (defvar ocaml-info-alist 'ocaml-ocamldoc-info - "A-list binding module names to info entries: + "A-list binding module names to info entries: nil means do not use info. A function to build the list lazily (at the first call). The result of the function call will be assign permanently to this variable for future uses. We provide two default functions \\[ocaml-info-default-function] -(info produced by HeVeA is the default) and \\[ocaml-info-default-function] -(info produced by ocamldoc). +(info produced by HeVeA is the default) and \\[ocaml-info-default-function] +(info produced by ocamldoc). Otherwise, this value should be an alist binding module names to info -entries of the form to \"(entry)section\" be taken by the \\[info] +entries of the form to \"(entry)section\" be taken by the \\[info] command. An entry may be an info module or a complete file name." ) @@ -571,7 +571,7 @@ command. An entry may be an info module or a complete file name." (defun ocaml-buffer-substring (region) (and region (buffer-substring-no-properties (car region) (cdr region)))) -;; Help function. +;; Help function. (defun ocaml-goto-help (&optional module entry same-window) @@ -588,7 +588,7 @@ current buffer using \\[ocaml-qualified-identifier]." (or (assoc module (ocaml-module-alist)) (and (file-exists-p (concat (ocaml-uncapitalize module) ".mli")) - (ocaml-get-or-make-module module)))) + (ocaml-get-or-make-module module)))) (location (cdr (cadr module-info)))) (cond (location @@ -630,27 +630,28 @@ current buffer using \\[ocaml-qualified-identifier]." )) (defun caml-help (arg) - "Find documentation for OCaml qualified identifiers. + "Find documentation for OCaml qualified identifiers. It attemps to recognize an qualified identifier of the form ``Module . entry'' around point using function `ocaml-qualified-identifier'. If Module is undetermined it is temptatively guessed from the identifier name -and according to visible modules. If this is still unsucessful, the user is -then prompted for a Module name. +and according to visible modules. If this is still unsucessful, the user is +then prompted for a Module name. The documentation for Module is first seach in the info manual if available, -then in the ``module.mli'' source file. The entry is then searched in the documentation. +then in the ``module.mli'' source file. The entry is then searched in the +documentation. -Visible modules are computed only once, at the first call. +Visible modules are computed only once, at the first call. Modules can be made visible explicitly with `ocaml-open-module' and -hidden with `ocaml-close-module'. +hidden with `ocaml-close-module'. Prefix arg 0 forces recompilation of visible modules (and their content) -from the file content. +from the file content. Prefix arg 4 prompts for Module and identifier instead of guessing values -from the possition of point in the current buffer. +from the possition of point in the current buffer. " (interactive "p") (let ((module) (entry) (module-entry)) @@ -709,7 +710,7 @@ from the possition of point in the current buffer. (defvar ocaml-links nil "Local links in the current of last info node or interface file. -The car of the list is a key that indentifies the module to prevent +The car of the list is a key that indentifies the module to prevent recompilation when next help command is relative to the same module. The cdr is a list of elments, each of which is an string and a pair of buffer positions." @@ -717,7 +718,7 @@ buffer positions." (make-variable-buffer-local 'ocaml-links) (defun ocaml-info-links (section) - (cdr + (cdr (if (and ocaml-links section (equal (car ocaml-links) section)) ocaml-links (save-excursion @@ -793,19 +794,19 @@ buffer positions." (put-text-property (match-beginning 1) (match-end 1) 'face 'ocaml-link-face))) ) - ;; need to restore flag if buffer was unmodified. + ;; need to restore flag if buffer was unmodified. (unless modified-p (set-buffer-modified-p nil)) )) )))) - + ;; bindings ---now in caml.el ; (and ; (boundp 'caml-mode-map) ; (keymapp caml-mode-map) -; (progn +; (progn ; (define-key caml-mode-map [?\C-c?i] 'ocaml-add-path) ; (define-key caml-mode-map [?\C-c?]] 'ocaml-close-module) ; (define-key caml-mode-map [?\C-c?[] 'ocaml-open-module) @@ -822,7 +823,7 @@ buffer positions." ; (define-key map [open] '("Open module for help" . ocaml-open-module)) ; (define-key map [help] '("Help for identifier" . caml-help)) ; (define-key map [complete] '("Complete identifier" . caml-complete)) -; ) +; ) ; )))) diff --git a/emacs/caml-hilit.el b/emacs/caml-hilit.el index 8c973ff6..697e5817 100644 --- a/emacs/caml-hilit.el +++ b/emacs/caml-hilit.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-hilit.el 6612 2004-08-20 17:04:35Z doligez $ *) +;(* $Id$ *) ; Highlighting patterns for hilit19 under caml-mode diff --git a/emacs/caml-types.el b/emacs/caml-types.el index 38ffe0f3..05b1a2c0 100644 --- a/emacs/caml-types.el +++ b/emacs/caml-types.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-types.el 9364 2009-10-02 12:31:37Z doligez $ *) +;(* $Id$ *) ; An emacs-lisp complement to the "-annot" option of ocamlc and ocamlopt. diff --git a/emacs/caml-xemacs.el b/emacs/caml-xemacs.el index 9a9d8454..fe141c5c 100644 --- a/emacs/caml-xemacs.el +++ b/emacs/caml-xemacs.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-xemacs.el 6824 2005-03-24 17:20:54Z doligez $ *) +;(* $Id$ *) (require 'overlay) diff --git a/emacs/caml.el b/emacs/caml.el index a7155b21..4f03b5a5 100644 --- a/emacs/caml.el +++ b/emacs/caml.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml.el 9150 2008-12-03 16:16:43Z doligez $ *) +;(* $Id$ *) ;;; caml.el --- O'Caml code editing commands for Emacs diff --git a/emacs/camldebug.el b/emacs/camldebug.el index 261e66a8..cc51c826 100644 --- a/emacs/camldebug.el +++ b/emacs/camldebug.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: camldebug.el 7169 2005-10-26 13:23:12Z doligez $ *) +;(* $Id$ *) ;;; Run camldebug under Emacs ;;; Derived from gdb.el. diff --git a/emacs/inf-caml.el b/emacs/inf-caml.el index 1a60a6e7..f2291f90 100644 --- a/emacs/inf-caml.el +++ b/emacs/inf-caml.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: inf-caml.el 6612 2004-08-20 17:04:35Z doligez $ *) +;(* $Id$ *) ;;; inf-caml.el --- run the Caml toplevel in an Emacs buffer @@ -80,7 +80,7 @@ be sent from another buffer in Caml mode. (defconst inferior-caml-buffer-name (concat "*" inferior-caml-buffer-subname "*")) -;; for compatibility with xemacs +;; for compatibility with xemacs (defun caml-sit-for (second &optional mili redisplay) (if (and (boundp 'running-xemacs) running-xemacs) @@ -170,7 +170,7 @@ Input and output via buffer `*inferior-caml*'." ) ) -;; patched by Didier to move cursor after evaluation +;; patched by Didier to move cursor after evaluation (defun inferior-caml-eval-region (start end) "Send the current region to the inferior Caml process." @@ -231,15 +231,15 @@ output can be retreived later, asynchronously.") (defun inferior-caml-eval-phrase (arg &optional min max) "Send the phrase containing the point to the CAML process. -With prefix-arg send as many phrases as its numeric value, +With prefix-arg send as many phrases as its numeric value, If an error occurs during evalutaion, stop at this phrase and -repport the error. +repport the error. Return nil if noerror and position of error if any. If arg's numeric value is zero or negative, evaluate the current phrase -or as many as prefix arg, ignoring evaluation errors. -This allows to jump other erroneous phrases. +or as many as prefix arg, ignoring evaluation errors. +This allows to jump other erroneous phrases. Optional arguments min max defines a region within which the phrase should lies." @@ -327,12 +327,12 @@ should lies." (progn (move-overlay caml-error-overlay beg end (current-buffer)) (beep) (if wait (read-event) (caml-sit-for 60))) - (delete-overlay caml-error-overlay))))) + (delete-overlay caml-error-overlay))))) ;; wait some amount for ouput, that is, until inferior-caml-output is set ;; to true. Hence, interleaves sitting for shorts delays and checking the -;; flag. Give up after some time. Typing into the source buffer will cancel -;; waiting, i.e. may report 'No result yet' +;; flag. Give up after some time. Typing into the source buffer will cancel +;; waiting, i.e. may report 'No result yet' (defun caml-wait-output (&optional before after) (let ((c 1)) @@ -351,11 +351,11 @@ should lies." caml-previous-output (- pos 2)))) ;; additional bindings - + ;(let ((map (lookup-key caml-mode-map [menu-bar caml]))) ; (define-key map [indent-buffer] '("Indent buffer" . caml-indent-buffer)) ; (define-key map [eval-buffer] '("Eval buffer" . caml-eval-buffer)) -;) +;) ;(define-key caml-mode-map "\C-c\C-b" 'caml-eval-buffer) diff --git a/emacs/ocamltags.in b/emacs/ocamltags.in index 55edab33..aa3f8df1 100644 --- a/emacs/ocamltags.in +++ b/emacs/ocamltags.in @@ -12,7 +12,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: ocamltags.in 6612 2004-08-20 17:04:35Z doligez $ *) +;(* $Id$ *) ;; Copyright (C) 1998 Ian Zimmerman ;; This program is free software; you can redistribute it and/or @@ -24,7 +24,7 @@ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. -;; $Id: ocamltags.in 6612 2004-08-20 17:04:35Z doligez $ +;; $Id$ (require 'caml) diff --git a/lex/.depend b/lex/.depend index df03846a..b51dbd3b 100644 --- a/lex/.depend +++ b/lex/.depend @@ -1,34 +1,34 @@ -common.cmi: syntax.cmi lexgen.cmi -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 -parser.cmi: syntax.cmi -syntax.cmi: cset.cmi -table.cmi: -common.cmo: syntax.cmi lexgen.cmi common.cmi -common.cmx: syntax.cmx lexgen.cmx common.cmi -compact.cmo: table.cmi lexgen.cmi compact.cmi -compact.cmx: table.cmx lexgen.cmx compact.cmi -cset.cmo: cset.cmi -cset.cmx: cset.cmi -lexer.cmo: syntax.cmi parser.cmi lexer.cmi -lexer.cmx: syntax.cmx parser.cmx lexer.cmi -lexgen.cmo: table.cmi syntax.cmi cset.cmi lexgen.cmi -lexgen.cmx: table.cmx syntax.cmx cset.cmx lexgen.cmi +common.cmi: syntax.cmi lexgen.cmi +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 +parser.cmi: syntax.cmi +syntax.cmi: cset.cmi +table.cmi: +common.cmo: syntax.cmi lexgen.cmi common.cmi +common.cmx: syntax.cmx lexgen.cmx common.cmi +compact.cmo: table.cmi lexgen.cmi compact.cmi +compact.cmx: table.cmx lexgen.cmx compact.cmi +cset.cmo: cset.cmi +cset.cmx: cset.cmi +lexer.cmo: syntax.cmi parser.cmi lexer.cmi +lexer.cmx: syntax.cmx parser.cmx lexer.cmi +lexgen.cmo: table.cmi syntax.cmi cset.cmi lexgen.cmi +lexgen.cmx: table.cmx syntax.cmx cset.cmx lexgen.cmi main.cmo: syntax.cmi parser.cmi outputbis.cmi output.cmi lexgen.cmi lexer.cmi \ - cset.cmi compact.cmi common.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: syntax.cmi lexgen.cmi compact.cmi common.cmi output.cmi -output.cmx: syntax.cmx lexgen.cmx compact.cmx common.cmx output.cmi -outputbis.cmo: syntax.cmi lexgen.cmi common.cmi outputbis.cmi -outputbis.cmx: syntax.cmx lexgen.cmx common.cmx outputbis.cmi -parser.cmo: syntax.cmi cset.cmi parser.cmi -parser.cmx: syntax.cmx cset.cmx parser.cmi -syntax.cmo: cset.cmi syntax.cmi -syntax.cmx: cset.cmx syntax.cmi -table.cmo: table.cmi -table.cmx: table.cmi + cset.cmx compact.cmx common.cmx +output.cmo: syntax.cmi lexgen.cmi compact.cmi common.cmi output.cmi +output.cmx: syntax.cmx lexgen.cmx compact.cmx common.cmx output.cmi +outputbis.cmo: syntax.cmi lexgen.cmi common.cmi outputbis.cmi +outputbis.cmx: syntax.cmx lexgen.cmx common.cmx outputbis.cmi +parser.cmo: syntax.cmi cset.cmi parser.cmi +parser.cmx: syntax.cmx cset.cmx parser.cmi +syntax.cmo: cset.cmi syntax.cmi +syntax.cmx: cset.cmx syntax.cmi +table.cmo: table.cmi +table.cmx: table.cmi diff --git a/lex/Makefile b/lex/Makefile index 25f32828..f190ed89 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -10,10 +10,10 @@ # # ######################################################################### -# $Id: Makefile 6708 2004-11-29 14:49:24Z doligez $ +# $Id$ # The lexer generator -CAMLC=../boot/ocamlrun ../boot/ocamlc -nostdlib -I ../boot +CAMLC=../boot/ocamlrun ../boot/ocamlc -strict-sequence -nostdlib -I ../boot CAMLOPT=../boot/ocamlrun ../ocamlopt -nostdlib -I ../stdlib COMPFLAGS=-warn-error A CAMLYACC=../boot/ocamlyacc diff --git a/lex/Makefile.nt b/lex/Makefile.nt index 3d5ab69d..cb1ef94a 100644 --- a/lex/Makefile.nt +++ b/lex/Makefile.nt @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt 9528 2010-01-14 21:26:13Z doligez $ +# $Id$ # The lexer generator diff --git a/lex/compact.ml b/lex/compact.ml index 7d7fbadd..abbf5a50 100644 --- a/lex/compact.ml +++ b/lex/compact.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: compact.ml 5193 2002-10-28 16:46:50Z maranget $ *) +(* $Id$ *) (* Compaction of an automata *) @@ -169,7 +169,7 @@ type lex_tables = tbl_backtrk_code : int array; (* nothing / code when Remember *) (* moves to execute before transitions (compacted) *) tbl_default_code : int array; - tbl_trans_code : int array; + tbl_trans_code : int array; tbl_check_code : int array; (* byte code itself *) tbl_code: int array;} @@ -200,7 +200,7 @@ let compact_tables state_v = base_code.(i) <- b_moves; default_code.(i) <- d_moves ; done; let code = Table.trim code in - let tables = + let tables = if Array.length code > 1 then { tbl_base = base; tbl_backtrk = backtrk; @@ -229,6 +229,3 @@ let compact_tables state_v = reset_compact trans ; reset_compact moves ; tables - - - diff --git a/lex/compact.mli b/lex/compact.mli index b91cf13e..18363c3d 100644 --- a/lex/compact.mli +++ b/lex/compact.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: compact.mli 5193 2002-10-28 16:46:50Z maranget $ *) +(* $Id$ *) (* Compaction of an automata *) type lex_tables = @@ -24,7 +24,7 @@ type lex_tables = tbl_backtrk_code : int array; (* nothing / code when Remember *) (* moves to execute before transitions (compacted) *) tbl_default_code : int array; - tbl_trans_code : int array; + tbl_trans_code : int array; tbl_check_code : int array; (* byte code itself *) tbl_code: int array;} diff --git a/lex/cset.ml b/lex/cset.ml index 0b1b2b11..c4594540 100644 --- a/lex/cset.ml +++ b/lex/cset.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: cset.ml 6269 2004-04-29 11:12:49Z maranget $ *) +(* $Id$ *) exception Bad @@ -95,5 +95,3 @@ let env_to_array env = match env with c) rem ; res - - diff --git a/lex/cset.mli b/lex/cset.mli index 3fafeba4..53b58995 100644 --- a/lex/cset.mli +++ b/lex/cset.mli @@ -11,12 +11,11 @@ (* *) (***********************************************************************) -(* $Id: cset.mli 6269 2004-04-29 11:12:49Z maranget $ *) +(* $Id$ *) (* Set of characters encoded as list of intervals *) -type t -exception Bad +type t val empty : t val is_empty : t -> bool @@ -32,6 +31,3 @@ val inter : t -> t -> t val diff : t -> t -> t val complement : t -> t val env_to_array : (t * 'a) list -> 'a array - - - diff --git a/lex/lexer.mli b/lex/lexer.mli index 0a5dd257..be34674e 100644 --- a/lex/lexer.mli +++ b/lex/lexer.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mli 6244 2004-04-21 23:26:06Z doligez $ *) +(* $Id$ *) val main: Lexing.lexbuf -> Parser.token diff --git a/lex/lexer.mll b/lex/lexer.mll index 46569beb..b7280428 100644 --- a/lex/lexer.mll +++ b/lex/lexer.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mll 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) (* The lexical analyzer for lexer definitions. Bootstrapped! *) diff --git a/lex/lexgen.ml b/lex/lexgen.ml index 2e1ff8e6..775e78b0 100644 --- a/lex/lexgen.ml +++ b/lex/lexgen.ml @@ -12,7 +12,7 @@ (* *) (***********************************************************************) -(* $Id: lexgen.ml 8827 2008-03-07 15:24:48Z maranget $ *) +(* $Id$ *) (* Compiling a lexer definition *) @@ -37,7 +37,7 @@ type regexp = | Star of regexp type tag_base = Start | End | Mem of int -type tag_addr = Sum of (tag_base * int) +type tag_addr = Sum of (tag_base * int) type ident_info = | Ident_string of bool * tag_addr * tag_addr | Ident_char of bool * tag_addr @@ -298,7 +298,7 @@ let rec encode_regexp char_vars act = function (* Optimisation, Static optimization : Replace tags by offsets relative to the beginning - or end of matched string. + or end of matched string. Dynamic optimization: Replace some non-optional, non-double tags by offsets w.r.t a previous similar tag. @@ -448,7 +448,7 @@ let opt_regexp all_vars char_vars optional_vars double_vars r = let a = get_tag_addr (n.id,n.start) in r,Some a end - + | Empty -> r,pos | Chars (_,is_eof) -> r,(if is_eof then pos else add_pos pos 1) | Seq (r1,r2) -> @@ -465,10 +465,10 @@ let opt_regexp all_vars char_vars optional_vars double_vars r = | Action _ -> assert false in let r,_ = alloc_exp None r in - let m = + let m = IdSet.fold (fun ((name,_) as x) r -> - + let v = if IdSet.mem x char_vars then Ident_char @@ -482,8 +482,8 @@ let opt_regexp all_vars char_vars optional_vars double_vars r = all_vars [] in m,r, !loc_count - - + + let encode_casedef casedef = let r = List.fold_left @@ -520,7 +520,7 @@ let encode_lexdef def = (chr, entry_list) (* To generate directly a NFA from a regular expression. - Confer Aho-Sethi-Ullman, dragon book, chap. 3 + Confer Aho-Sethi-Ullman, dragon book, chap. 3 Extension to tagged automata. Confer Ville Larikari @@ -533,7 +533,7 @@ let encode_lexdef def = *) type t_transition = - OnChars of int + OnChars of int | ToAction of int type transition = t_transition * Tags.t @@ -608,7 +608,7 @@ let followpos size entry_list = fill (TransSet.union (firstpos r) s) r in List.iter (fun (entry,_,_) -> fill TransSet.empty entry.lex_regexp) entry_list ; v - + (************************) (* The algorithm itself *) (************************) @@ -654,7 +654,7 @@ let dstate {final=(act,(_,m)) ; others=o} = (fun () -> prerr_endline "") o - + let dfa_state_empty = {final=(no_action, (max_int,TagMap.empty)) ; others=MemMap.empty} @@ -663,7 +663,7 @@ and dfa_state_is_empty {final=(act,_) ; others=o} = act = no_action && o = MemMap.empty - + (* A key is an abstraction on a dfa state, two states with the same key can be made the same by copying some memory cells into others *) @@ -688,14 +688,14 @@ type dfa_key = {kstate : StateSet.t ; kmem : MemKey.t} (* Map a state to its key *) let env_to_class m = - let env1 = + let env1 = MemMap.fold (fun _ (tag,s) r -> try let ss = TagMap.find tag r in let r = TagMap.remove tag r in TagMap.add tag (StateSetSet.add s ss) r - with + with | Not_found -> TagMap.add tag (StateSetSet.add s StateSetSet.empty) r) m TagMap.empty in @@ -739,23 +739,23 @@ let key_compare k1 k2 = match StateSet.compare k1.kstate k2.kstate with | r -> r (* Association dfa_state -> state_num *) - + module StateMap = Map.Make(struct type t = dfa_key let compare = key_compare end) let state_map = ref (StateMap.empty : int StateMap.t) -let todo = Stack.create() +let todo = Stack.create() let next_state_num = ref 0 let next_mem_cell = ref 0 let temp_pending = ref false -let tag_cells = Hashtbl.create 17 +let tag_cells = Hashtbl.create 17 let state_table = Table.create dfa_state_empty (* Initial reset of state *) let reset_state () = Stack.clear todo; - next_state_num := 0 ; + next_state_num := 0 ; let _ = Table.trim state_table in () @@ -878,14 +878,14 @@ let get_map t st = match t with m let dest = function | Copy (d,_) | Set d -> d -and orig = function | Copy (_,o) -> o | Set _ -> -1 +and orig = function | Copy (_,o) -> o | Set _ -> -1 let pmv oc mv = fprintf oc "%d <- %d" (dest mv) (orig mv) let pmvs oc mvs = List.iter (fun mv -> fprintf oc "%a " pmv mv) mvs ; output_char oc '\n' ; flush oc - + (* Topological sort << a la louche >> *) let sort_mvs mvs = let rec do_rec r mvs = match mvs with @@ -917,7 +917,7 @@ let sort_mvs mvs = end | _ -> do_rec (here@r) rem in do_rec [] mvs - + let move_to mem_key src tgt = let mvs = MemKey.fold @@ -943,7 +943,7 @@ let move_to mem_key src tgt = sort_mvs mvs -let get_state st = +let get_state st = let key = get_key st in try let num = StateMap.find key !state_map in @@ -992,7 +992,7 @@ let add_tags_to_map gen tags m = let apply_transition gen r pri m = function | ToAction n,tags -> let on,(opri,_) = r.final in - if n < on || (on=n && pri < opri) then + if n < on || (on=n && pri < opri) then let m = add_tags_to_map gen tags m in {r with final=n,(pri,m)} else r @@ -1000,7 +1000,7 @@ let apply_transition gen r pri m = function try let (opri,_) = MemMap.find n r.others in if pri < opri then - let m = add_tags_to_map gen tags m in + let m = add_tags_to_map gen tags m in {r with others=MemMap.add n (pri,m) (MemMap.remove n r.others)} else r @@ -1018,7 +1018,7 @@ let apply_transitions gen r pri m ts = ts r -(* For a given nfa_state pos, refine char partition *) +(* For a given nfa_state pos, refine char partition *) let rec split_env gen follow pos m s = function | [] -> (* Can occur ! because of non-matching regexp ([^'\000'-'\255']) *) [] @@ -1033,20 +1033,20 @@ let rec split_env gen follow pos m s = function rem else split_env gen follow pos m rest rem - and new_st = apply_transitions gen st1 pos m follow in + and new_st = apply_transitions gen st1 pos m follow in let stay = Cset.diff s1 here in if Cset.is_empty stay then (here, new_st)::rem else (stay, st1)::(here, new_st)::rem - + (* For all nfa_state pos in a dfa state st *) let comp_shift gen chars follow st = MemMap.fold (fun pos (_,m) env -> split_env gen follow.(pos) pos m chars.(pos) env) st [Cset.all_chars_eof,dfa_state_empty] - + let reachs chars follow st = let gen = create_new_addr_gen () in @@ -1058,7 +1058,7 @@ let reachs chars follow st = (fun (s,dfa_state) -> s,goto_state dfa_state) env in (* finally build the char indexed array -> new state num *) let shift = Cset.env_to_array env in - shift + shift let get_tag_mem n env t = @@ -1082,8 +1082,8 @@ let do_tag_actions n env m = used,r) env.(n) (used,r) in r - - + + let translate_state shortest_match tags chars follow st = let (n,(_,m)) = st.final in if MemMap.empty = st.others then @@ -1106,7 +1106,7 @@ let dtags chan tags = Tags.iter (fun t -> fprintf chan " %a" dtag t) tags - + let dtransset s = TransSet.iter (fun trans -> match trans with @@ -1169,7 +1169,7 @@ let make_dfa lexdef = map_on_all_states (translate_state shortest tags chars follow) !r_states ; { auto_name = le.lex_name; - auto_args = args ; + auto_args = args ; auto_mem_size = (if !temp_pending then !next_mem_cell+1 else !next_mem_cell) ; auto_initial_state = init_num ; diff --git a/lex/lexgen.mli b/lex/lexgen.mli index 3e43a049..5136f8f2 100644 --- a/lex/lexgen.mli +++ b/lex/lexgen.mli @@ -10,11 +10,11 @@ (* *) (***********************************************************************) -(* $Id: lexgen.mli 7815 2007-01-29 16:44:16Z maranget $ *) +(* $Id$ *) (* raised when there are too many bindings (>= 254 memory cells) *) -exception Memory_overflow +exception Memory_overflow (* Representation of automata *) @@ -39,7 +39,7 @@ type ident = string * Syntax.location (* Representation of entry points *) type tag_base = Start | End | Mem of int -type tag_addr = Sum of (tag_base * int) +type tag_addr = Sum of (tag_base * int) type ident_info = | Ident_string of bool * tag_addr * tag_addr | Ident_char of bool * tag_addr @@ -58,4 +58,3 @@ type ('args,'action) automata_entry = val make_dfa : ('args, 'action) Syntax.entry list -> ('args, 'action) automata_entry list * automata array - diff --git a/lex/main.ml b/lex/main.ml index 199ba861..5540c972 100644 --- a/lex/main.ml +++ b/lex/main.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: main.ml 6612 2004-08-20 17:04:35Z doligez $ *) +(* $Id$ *) (* The lexer generator. Command-line parsing. *) @@ -36,7 +36,7 @@ let specs = "-q", Arg.Set Common.quiet_mode, " Do not display informational messages"; "-v", Arg.Unit print_version_string, " Print version and exit"; "-version", Arg.Unit print_version_string, " Print version and exit"; - ] + ] let _ = Arg.parse @@ -44,11 +44,11 @@ let _ = (fun name -> source_name := Some name) usage - + let main () = let source_name = match !source_name with - | None -> Arg.usage specs usage ; exit 2 + | None -> Arg.usage specs usage ; exit 2 | Some name -> name in let dest_name = match !output_name with | Some name -> name @@ -105,7 +105,7 @@ let main () = | Lexgen.Memory_overflow -> Printf.fprintf stderr "File \"%s\":\n Position memory overflow, too many bindings\n" - source_name + source_name | Output.Table_overflow -> Printf.fprintf stderr "File \"%s\":\ntransition table overflow, automaton is too big\n" @@ -116,4 +116,3 @@ let main () = exit 3 let _ = (* Printexc.catch *) main (); exit 0 - diff --git a/lex/output.ml b/lex/output.ml index e41c8f23..620f67f6 100644 --- a/lex/output.ml +++ b/lex/output.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: output.ml 7815 2007-01-29 16:44:16Z maranget $ *) +(* $Id$ *) (* Output the DFA tables and its entry points *) @@ -74,10 +74,10 @@ let output_tables oc tbl = let output_entry sourcefile ic oc oci e = let init_num, init_moves = e.auto_initial_state in - fprintf oc "%s %alexbuf = + fprintf oc "%s %alexbuf =\n\ %a%a __ocaml_lex_%s_rec %alexbuf %d\n" e.auto_name - output_args e.auto_args + output_args e.auto_args (fun oc x -> if x > 0 then fprintf oc "lexbuf.Lexing.lex_mem <- Array.create %d (-1) ; " x) diff --git a/lex/output.mli b/lex/output.mli index 46ef258b..85f89b30 100644 --- a/lex/output.mli +++ b/lex/output.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: output.mli 5323 2002-12-09 10:44:46Z maranget $ *) +(* $Id$ *) (* Output the DFA tables and its entry points *) diff --git a/lex/outputbis.ml b/lex/outputbis.ml index 7675c7a7..266c0acb 100644 --- a/lex/outputbis.ml +++ b/lex/outputbis.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: outputbis.ml 7815 2007-01-29 16:44:16Z maranget $ *) +(* $Id$ *) (* Output the DFA tables and its entry points *) @@ -20,31 +20,31 @@ open Lexgen open Common let output_auto_defs oc = - fprintf oc "let __ocaml_lex_init_lexbuf lexbuf mem_size = - let pos = lexbuf.Lexing.lex_curr_pos in - lexbuf.Lexing.lex_mem <- Array.create mem_size (-1) ; - lexbuf.Lexing.lex_start_pos <- pos ; - lexbuf.Lexing.lex_last_pos <- pos ; - lexbuf.Lexing.lex_last_action <- -1 - + fprintf oc "let __ocaml_lex_init_lexbuf lexbuf mem_size =\n\ + let pos = lexbuf.Lexing.lex_curr_pos in\n\ + lexbuf.Lexing.lex_mem <- Array.create mem_size (-1) ;\n\ + lexbuf.Lexing.lex_start_pos <- pos ;\n\ + lexbuf.Lexing.lex_last_pos <- pos ;\n\ + lexbuf.Lexing.lex_last_action <- -1\n\ +\n\ " ; - - output_string oc - "let rec __ocaml_lex_next_char lexbuf = - if lexbuf.Lexing.lex_curr_pos >= lexbuf.Lexing.lex_buffer_len then begin - if lexbuf.Lexing.lex_eof_reached then - 256 - else begin - lexbuf.Lexing.refill_buff lexbuf ; - __ocaml_lex_next_char lexbuf - end - end else begin - let i = lexbuf.Lexing.lex_curr_pos in - let c = lexbuf.Lexing.lex_buffer.[i] in - lexbuf.Lexing.lex_curr_pos <- i+1 ; - Char.code c - end + output_string oc + "let rec __ocaml_lex_next_char lexbuf =\n\ + if lexbuf.Lexing.lex_curr_pos >= lexbuf.Lexing.lex_buffer_len then begin\n\ + if lexbuf.Lexing.lex_eof_reached then\n\ + 256\n\ + else begin\n\ + lexbuf.Lexing.refill_buff lexbuf ;\n\ + __ocaml_lex_next_char lexbuf\n\ + end\n\ + end else begin\n\ + let i = lexbuf.Lexing.lex_curr_pos in\n\ + let c = lexbuf.Lexing.lex_buffer.[i] in\n\ + lexbuf.Lexing.lex_curr_pos <- i+1 ;\n\ + Char.code c\n\ + end\n\ +\n\ " @@ -74,7 +74,7 @@ let output_clause oc pats mems r = let output_default_clause oc mems r = fprintf oc " | _ ->\n" ; output_action oc mems r - + let output_moves oc moves = let t = Hashtbl.create 17 in @@ -104,7 +104,7 @@ let output_moves oc moves = t ; output_default_clause oc !most_mems !most_frequent - + let output_tag_actions pref oc mvs = output_string oc "(*" ; List.iter @@ -122,7 +122,7 @@ let output_tag_actions pref oc mvs = fprintf oc "%s%a <- -1 ;\n" pref output_mem_access t) mvs - + let output_trans pref oc i trans = fprintf oc "%s __ocaml_lex_state%d lexbuf = " pref i ; match trans with @@ -140,7 +140,7 @@ let output_trans pref oc i trans = end ; fprintf oc " match __ocaml_lex_next_char lexbuf with\n" ; output_moves oc move - + let output_automata oc auto = output_auto_defs oc ; let n = Array.length auto in @@ -155,12 +155,12 @@ let output_automata oc auto = let output_entry sourcefile ic oc tr e = let init_num, init_moves = e.auto_initial_state in - fprintf oc "%s %alexbuf = - __ocaml_lex_init_lexbuf lexbuf %d; %a - let __ocaml_lex_result = __ocaml_lex_state%d lexbuf in - lexbuf.Lexing.lex_start_p <- lexbuf.Lexing.lex_curr_p; - lexbuf.Lexing.lex_curr_p <- {lexbuf.Lexing.lex_curr_p with - Lexing.pos_cnum = lexbuf.Lexing.lex_abs_pos + lexbuf.Lexing.lex_curr_pos}; + fprintf oc "%s %alexbuf =\n\ + __ocaml_lex_init_lexbuf lexbuf %d; %a\n\ + let __ocaml_lex_result = __ocaml_lex_state%d lexbuf in\n\ + lexbuf.Lexing.lex_start_p <- lexbuf.Lexing.lex_curr_p;\n\ + lexbuf.Lexing.lex_curr_p <- {lexbuf.Lexing.lex_curr_p with\n\ + Lexing.pos_cnum = lexbuf.Lexing.lex_abs_pos + lexbuf.Lexing.lex_curr_pos};\n\ match __ocaml_lex_result with\n" e.auto_name output_args e.auto_args e.auto_mem_size (output_memory_actions " ") init_moves init_num ; diff --git a/lex/outputbis.mli b/lex/outputbis.mli index 9c600413..76f00672 100644 --- a/lex/outputbis.mli +++ b/lex/outputbis.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: outputbis.mli 5323 2002-12-09 10:44:46Z maranget $ *) +(* $Id$ *) val output_lexdef : string -> in_channel -> diff --git a/lex/parser.mly b/lex/parser.mly index b821c7a7..dd818e78 100644 --- a/lex/parser.mly +++ b/lex/parser.mly @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: parser.mly 7815 2007-01-29 16:44:16Z maranget $ */ +/* $Id$ */ /* The grammar for lexer definitions */ diff --git a/lex/syntax.ml b/lex/syntax.ml index 356c5612..d1daa02d 100644 --- a/lex/syntax.ml +++ b/lex/syntax.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: syntax.ml 7815 2007-01-29 16:44:16Z maranget $ *) +(* $Id$ *) (* This apparently useless implmentation file is in fact required by the pa_ocamllex syntax extension *) diff --git a/lex/syntax.mli b/lex/syntax.mli index 19dbdcd1..4864b50e 100644 --- a/lex/syntax.mli +++ b/lex/syntax.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: syntax.mli 7815 2007-01-29 16:44:16Z maranget $ *) +(* $Id$ *) (* The shallow abstract syntax *) diff --git a/lex/table.mli b/lex/table.mli index e5d55f96..b88d7d34 100644 --- a/lex/table.mli +++ b/lex/table.mli @@ -13,7 +13,7 @@ (* Table used for code emission, ie extensible arrays *) type 'a t -val create : 'a -> 'a t +val create : 'a -> 'a t val emit : 'a t -> 'a -> unit @@ -29,5 +29,3 @@ val get : 'a t -> int -> 'a val size : 'a t -> int - - diff --git a/man/Makefile b/man/Makefile index ebd058d1..4753c202 100644 --- a/man/Makefile +++ b/man/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile 4733 2002-04-24 09:09:35Z xleroy $ +# $Id$ include ../config/Makefile diff --git a/man/ocaml.help b/man/ocaml.help deleted file mode 100644 index 466896dc..00000000 --- a/man/ocaml.help +++ /dev/null @@ -1,138 +0,0 @@ -- -OCaml # Objective Caml toplevel -Usage: ocaml -options are: - -I Add to the list of include directories - -unsafe No bound checking on array and string access - -drawlambda (undocumented) - -dlambda (undocumented) - -dinstr (undocumented) - -rectypes (undocumented) - -- -OCamlc # Objective Caml compiler -Usage: ocamlc -Options are: - -a Build a library - -c Compile only (do not link) - -cc Use as the C compiler and linker - -cclib Pass option to the C linker - -ccopt Pass option to the C compiler and linker - -g Save debugging information - -i Print the types - -I Add to the list of include directories - -impl Compile as a .ml file - -intf Compile as a .mli file - -intf-suffix Suffix for interface file (default: .mli) - -intf_suffix (deprecated) same as -intf-suffix - -linkall Link all modules, even unused ones - -make-runtime Build a runtime system with given C objects and libraries - -make_runtime (deprecated) same as -make-runtime - -noassert Do not compile assertion checks - -o Set output file name to - -output-obj Output a C object file instead of an executable - -pp Pipe sources through preprocessor - -thread Use thread-safe standard library - -unsafe No bounds checking on array and string access - -use-runtime Generate bytecode for the given runtime system - -use_runtime (deprecated) same as -use-runtime - -v Print compiler version number - -verbose Print calls to external commands - -w Enable or disable warnings according to : - A/a enable/disable all warnings - C/c enable/disable suspicious comment - F/f enable/disable partially applied function - M/m enable/disable overriden method - P/p enable/disable partial match - S/s enable/disable non-unit statement - U/u enable/disable unused match case - V/v enable/disable hidden instance variable - X/x enable/disable all other warnings - default setting is A (all warnings enabled) - -nopervasives (undocumented) - -dparsetree (undocumented) - -drawlambda (undocumented) - -dlambda (undocumented) - -dinstr (undocumented) - -use-prims (undocumented) - -rectypes (undocumented) - - Treat as a file name (even if it starts with `-') - -- -OCamlc-custom # Objective Caml compiler for custom runtime mode -Usage: ocamlc-custom -Options are: - -a Build a library - -c Compile only (do not link) - -cc Use as the C compiler and linker - -cclib Pass option to the C linker - -ccopt Pass option to the C compiler and linker - -g Save debugging information - -i Print the types - -I Add to the list of include directories - -impl Compile as a .ml file - -intf Compile as a .mli file - -intf-suffix Suffix for interface file (default: .mli) - -intf_suffix (deprecated) same as -intf-suffix - -linkall Link all modules, even unused ones - -make-runtime Build a runtime system with given C objects and libraries - -make_runtime (deprecated) same as -make-runtime - -noassert Do not compile assertion checks - -o Set output file name to - -output-obj Output a C object file instead of an executable - -pp Pipe sources through preprocessor - -thread Use thread-safe standard library - -unsafe No bounds checking on array and string access - -use-runtime Generate bytecode for the given runtime system - -use_runtime (deprecated) same as -use-runtime - -v Print compiler version number - -verbose Print calls to external commands - -w Enable or disable warnings according to : - A/a enable/disable all warnings - C/c enable/disable suspicious comment - F/f enable/disable partially applied function - M/m enable/disable overriden method - P/p enable/disable partial match - S/s enable/disable non-unit statement - U/u enable/disable unused match case - V/v enable/disable hidden instance variable - X/x enable/disable all other warnings - default setting is A (all warnings enabled) - -nopervasives (undocumented) - -dparsetree (undocumented) - -drawlambda (undocumented) - -dlambda (undocumented) - -dinstr (undocumented) - -use-prims (undocumented) - -rectypes (undocumented) - - Treat as a file name (even if it starts with `-') - -- -OCamlDep # Objective Caml dependency generator -Usage: ocamldep [-I ] - -I Add to the list of include directories - -- -OCamlLex # Objective Caml lexer generator -OCamlLex name.mll - -- -OCamlRun # Objective Caml bytecode interpreter -OCamlRun [-v] file [argumentsÉ] - -v # print GC messages - -Environment variable: -Set -e OCamlRunParam ""); - self#html_of_text_element b text; + self#html_of_text b text; bs b "" method html_of_Superscript b t = @@ -765,6 +788,8 @@ class html = "pre { margin-bottom: 4px }" ; "div.sig_block {margin-left: 2em}" ; + + "*:target { background: yellow; } " ; ] (** The style file for all pages. *) @@ -1291,11 +1316,10 @@ class html = (** Print html code for a value. *) method html_of_value b v = Odoc_info.reset_type_names (); - bs b "
    ";
    +      bs b "
    " ;
    +      bp b "" (Naming.value_target v);
           bs b (self#keyword "val");
           bs b " ";
    -      (* html mark *)
    -      bp b "" (Naming.value_target v);
           (
            match v.val_code with
              None -> bs b (self#escape (Name.simple v.val_name))
    @@ -1304,6 +1328,7 @@ class html =
                self#output_code v.val_name (Filename.concat !Args.target_dir file) c;
                bp b "%s" file (self#escape (Name.simple v.val_name))
           );
    +      bs b "";
           bs b " : ";
           self#html_of_type_expr b (Name.father v.val_name) v.val_type;
           bs b "
    "; @@ -1319,12 +1344,11 @@ class html = method html_of_exception b e = Odoc_info.reset_type_names (); bs b "
    ";
    +      bp b "" (Naming.exception_target e);
           bs b (self#keyword "exception");
           bs b " ";
    -      (* html mark *)
    -      bp b "%s"
    -        (Naming.exception_target e)
    -        (Name.simple e.ex_name);
    +      bs b (Name.simple e.ex_name);
    +      bs b "";
           (
            match e.ex_args with
              [] -> ()
    @@ -1361,12 +1385,12 @@ class html =
             | Some _, Type_variant _
             | Some _, Type_record _ -> "
    "
             );
    +      bp b "" (Naming.type_target t);
           bs b ((self#keyword "type")^" ");
    -      (* html mark *)
    -      bp b "" (Naming.type_target t);
           self#html_of_type_expr_param_list b father t;
           (match t.ty_parameters with [] -> () | _ -> bs b " ");
    -      bs b ((Name.simple t.ty_name)^" ");
    +      bs b (Name.simple t.ty_name);
    +      bs b " ";
           let priv = t.ty_private = Asttypes.Private in
           (
            match t.ty_manifest with
    @@ -1471,10 +1495,9 @@ class html =
         method html_of_attribute b a =
           let module_name = Name.father (Name.father a.att_value.val_name) in
           bs b "
    " ;
    +      bp b "" (Naming.attribute_target a);
           bs b (self#keyword "val");
           bs b " ";
    -      (* html mark *)
    -      bp b "" (Naming.attribute_target a);
           (
            if a.att_virtual then
              bs b ((self#keyword "virtual")^ " ")
    @@ -1494,6 +1517,7 @@ class html =
                self#output_code a.att_value.val_name (Filename.concat !Args.target_dir file) c;
                bp b "%s" file (Name.simple a.att_value.val_name);
           );
    +      bs b "";
           bs b " : ";
           self#html_of_type_expr b module_name a.att_value.val_type;
           bs b "
    "; @@ -1503,10 +1527,10 @@ class html = method html_of_method b m = let module_name = Name.father (Name.father m.met_value.val_name) in bs b "
    ";
    -      bs b ((self#keyword "method")^" ");
           (* html mark *)
    -      bp b "" (Naming.method_target m);
    -      if m.met_private then bs b ((self#keyword "private")^" ");
    +      bp b "" (Naming.method_target m);
    +     bs b ((self#keyword "method")^" ");
    +       if m.met_private then bs b ((self#keyword "private")^" ");
           if m.met_virtual then bs b ((self#keyword "virtual")^" ");
           (
            match m.met_value.val_code with
    @@ -1516,6 +1540,7 @@ class html =
                self#output_code m.met_value.val_name (Filename.concat !Args.target_dir file) c;
                bp b "%s" file (Name.simple m.met_value.val_name);
           );
    +      bs b "";
           bs b " : ";
           self#html_of_type_expr b module_name m.met_value.val_type;
           bs b "
    "; @@ -1814,10 +1839,9 @@ class html = Odoc_info.reset_type_names (); let (html_file, _) = Naming.html_files c.cl_name in bs b "
    ";
    -      bs b ((self#keyword "class")^" ");
    -      (* we add a html tag, the same as for a type so we can
    +      (* we add a html id, the same as for a type so we can
              go directly here when the class name is used as a type name *)
    -      bp b ""
    +      bp b ""
             (Naming.type_target
                { ty_name = c.cl_name ;
                  ty_info = None ; ty_parameters = [] ;
    @@ -1826,6 +1850,7 @@ class html =
                  ty_code = None ;
                }
             );
    +      bs b ((self#keyword "class")^" ");
           print_DEBUG "html#html_of_class : virtual or not" ;
           if c.cl_virtual then bs b ((self#keyword "virtual")^" ");
           (
    @@ -1842,7 +1867,7 @@ class html =
            else
              bs b (Name.simple c.cl_name)
           );
    -
    +      bs b "";
           bs b " : " ;
           self#html_of_class_parameter_list b father c ;
           self#html_of_class_kind b father ~cl: c c.cl_kind;
    @@ -1861,10 +1886,9 @@ class html =
           let father = Name.father ct.clt_name in
           let (html_file, _) = Naming.html_files ct.clt_name in
           bs b "
    ";
    -      bs b ((self#keyword "class type")^" ");
    -      (* we add a html tag, the same as for a type so we can
    +      (* we add a html id, the same as for a type so we can
              go directly here when the class type name is used as a type name *)
    -      bp b ""
    +      bp b ""
             (Naming.type_target
                { ty_name = ct.clt_name ;
                  ty_info = None ; ty_parameters = [] ;
    @@ -1873,6 +1897,7 @@ class html =
                  ty_code = None ;
                }
             );
    +      bs b ((self#keyword "class type")^" ");
           if ct.clt_virtual then bs b ((self#keyword "virtual")^" ");
           (
            match ct.clt_type_parameters with
    @@ -1887,6 +1912,7 @@ class html =
           else
             bs b (Name.simple ct.clt_name);
     
    +      bs b "";
           bs b " = ";
           self#html_of_class_type_kind b father ~ct ct.clt_kind;
           bs b "
    "; @@ -2330,9 +2356,9 @@ class html = bs b "
    "; self#html_of_Module_list b (List.map (fun m -> m.m_name) module_list); - bs b "\n" | Some i -> self#html_of_info ~indent: false b info ); + bs b "\n"; Buffer.output_buffer chanout b; close_out chanout with diff --git a/ocamldoc/odoc_info.ml b/ocamldoc/odoc_info.ml index 3eddaff3..4eca5fd2 100644 --- a/ocamldoc/odoc_info.ml +++ b/ocamldoc/odoc_info.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_info.ml 8416 2007-10-08 14:19:34Z doligez $ *) +(* $Id$ *) (** Interface for analysing documented OCaml source files and to the collected information. *) @@ -43,12 +43,13 @@ and text_element = Odoc_types.text_element = | Title of int * string option * text | Latex of string | Link of string * text - | Ref of string * ref_kind option + | Ref of string * ref_kind option * text option | Superscript of text | Subscript of text | Module_list of string list | Index_list | Custom of string * text + | Target of string * string and text = text_element list diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index 2fca47f2..d9c0cfeb 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_info.mli 8932 2008-07-25 13:28:23Z guesdon $ *) +(* $Id$ *) (** Interface to the information collected in source files. *) @@ -45,14 +45,17 @@ and text_element = Odoc_types.text_element = (** Style number, optional label, and text. *) | Latex of string (** A string for latex. *) | Link of string * text (** A reference string and the link text. *) - | Ref of string * ref_kind option - (** A reference to an element. Complete name and kind. *) + | Ref of string * ref_kind option * text option + (** A reference to an element. Complete name and kind. + An optional text can be given to display this text instead + of the element name.*) | Superscript of text (** Superscripts. *) | Subscript of text (** Subscripts. *) | Module_list of string list (** The table of the given modules with their abstract. *) | Index_list (** The links to the various indexes (values, types, ...) *) | Custom of string * text (** to extend \{foo syntax *) + | Target of string * string (** (target, code) : to specify code specific to a target format *) (** A text is a list of [text_element]. The order matters. *) and text = text_element list diff --git a/ocamldoc/odoc_inherit.ml b/ocamldoc/odoc_inherit.ml index 5582ce98..b73796bf 100644 --- a/ocamldoc/odoc_inherit.ml +++ b/ocamldoc/odoc_inherit.ml @@ -9,5 +9,4 @@ (* *) (***********************************************************************) -(* $Id: odoc_inherit.ml 5973 2003-11-24 10:44:07Z starynke $ *) - +(* $Id$ *) diff --git a/ocamldoc/odoc_latex.ml b/ocamldoc/odoc_latex.ml index bf047554..d35b2f31 100644 --- a/ocamldoc/odoc_latex.ml +++ b/ocamldoc/odoc_latex.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_latex.ml 8418 2007-10-09 10:29:37Z weis $ *) +(* $Id$ *) (** Generation of LaTeX documentation. *) @@ -238,15 +238,23 @@ class text = | Odoc_info.Title (n, l_opt, t) -> self#latex_of_Title fmt n l_opt t | Odoc_info.Latex s -> self#latex_of_Latex fmt s | Odoc_info.Link (s, t) -> self#latex_of_Link fmt s t - | Odoc_info.Ref (name, ref_opt) -> self#latex_of_Ref fmt name ref_opt + | Odoc_info.Ref (name, ref_opt, text_opt) -> + self#latex_of_Ref fmt name ref_opt text_opt | Odoc_info.Superscript t -> self#latex_of_Superscript fmt t | Odoc_info.Subscript t -> self#latex_of_Subscript fmt t | Odoc_info.Module_list _ -> () | Odoc_info.Index_list -> () | Odoc_info.Custom (s,t) -> self#latex_of_custom_text fmt s t + | Odoc_info.Target (target, code) -> self#latex_of_Target fmt ~target ~code method latex_of_custom_text fmt s t = () + method latex_of_Target fmt ~target ~code = + if String.lowercase target = "latex" then + self#latex_of_Latex fmt code + else + () + method latex_of_Raw fmt s = ps fmt (self#escape s) @@ -344,11 +352,15 @@ class text = ps fmt s ; ps fmt "}]" - method latex_of_Ref fmt name ref_opt = + method latex_of_Ref fmt name ref_opt text_opt = match ref_opt with None -> - self#latex_of_text_element fmt - (Odoc_info.Code (Odoc_info.use_hidden_modules name)) + self#latex_of_text fmt + (match text_opt with + None -> + [Odoc_info.Code (Odoc_info.use_hidden_modules name)] + | Some t -> t + ) | Some (RK_section _) -> self#latex_of_text_element fmt (Latex ("["^(self#make_ref (self#label ~no_:false (Name.simple name)))^"]")) @@ -366,11 +378,13 @@ class text = | Odoc_info.RK_method -> self#method_label | Odoc_info.RK_section _ -> assert false in + let text = + match text_opt with + None -> [Odoc_info.Code (Odoc_info.use_hidden_modules name)] + | Some t -> t + in self#latex_of_text fmt - [ - Odoc_info.Code (Odoc_info.use_hidden_modules name) ; - Latex ("["^(self#make_ref (f_label name))^"]") - ] + (text @ [Latex ("["^(self#make_ref (f_label name))^"]")]) method latex_of_Superscript fmt t = ps fmt "$^{"; diff --git a/ocamldoc/odoc_latex_style.ml b/ocamldoc/odoc_latex_style.ml index 578751da..a689b268 100644 --- a/ocamldoc/odoc_latex_style.ml +++ b/ocamldoc/odoc_latex_style.ml @@ -11,82 +11,81 @@ (** The content of the LaTeX style to generate when generating LaTeX code. *) -(* $Id: odoc_latex_style.ml 6378 2004-06-11 14:25:50Z guesdon $ *) +(* $Id$ *) -let content =" -%% Support macros for LaTeX documentation generated by ocamldoc. -%% This file is in the public domain; do what you want with it. - -\\NeedsTeXFormat{LaTeX2e} -\\ProvidesPackage{ocamldoc} - [2001/12/04 v1.0 ocamldoc support] - -\\newenvironment{ocamldoccode}{% - \\bgroup - \\leftskip\\@totalleftmargin - \\rightskip\\z@skip - \\parindent\\z@ - \\parfillskip\\@flushglue - \\parskip\\z@skip - %\\noindent - \\@@par\\smallskip - \\@tempswafalse - \\def\\par{% - \\if@tempswa - \\leavevmode\\null\\@@par\\penalty\\interlinepenalty - \\else - \\@tempswatrue - \\ifhmode\\@@par\\penalty\\interlinepenalty\\fi - \\fi} - \\obeylines - \\verbatim@font - \\let\\org@prime~% - \\@noligs - \\let\\org@dospecials\\dospecials - \\g@remfrom@specials{\\\\} - \\g@remfrom@specials{\\{} - \\g@remfrom@specials{\\}} - \\let\\do\\@makeother - \\dospecials - \\let\\dospecials\\org@dospecials - \\frenchspacing\\@vobeyspaces - \\everypar \\expandafter{\\the\\everypar \\unpenalty}} -{\\egroup\\par} - -\\def\\g@remfrom@specials#1{% - \\def\\@new@specials{} - \\def\\@remove##1{% - \\ifx##1#1\\else - \\g@addto@macro\\@new@specials{\\do ##1}\\fi} - \\let\\do\\@remove\\dospecials - \\let\\dospecials\\@new@specials - } - -\\newenvironment{ocamldocdescription} -{\\list{}{\\rightmargin0pt \\topsep0pt}\\raggedright\\item\\noindent\\relax\\ignorespaces} -{\\endlist\\medskip} - -\\newenvironment{ocamldoccomment} -{\\list{}{\\leftmargin 2\\leftmargini \\rightmargin0pt \\topsep0pt}\\raggedright\\item\\noindent\\relax} -{\\endlist} - -\\let \\ocamldocparagraph \\paragraph -\\def \\paragraph #1{\\ocamldocparagraph {#1}\\noindent} -\\let \\ocamldocsubparagraph \\subparagraph -\\def \\subparagraph #1{\\ocamldocsubparagraph {#1}\\noindent} - -\\let\\ocamldocvspace\\vspace - -\\newenvironment{ocamldocindent}{\\list{}{}\\item\\relax}{\\endlist} -\\newenvironment{ocamldocsigend} - {\\noindent\\quad\\texttt{sig}\\ocamldocindent} - {\\endocamldocindent\\vskip -\\lastskip - \\noindent\\quad\\texttt{end}\\medskip} -\\newenvironment{ocamldocobjectend} - {\\noindent\\quad\\texttt{object}\\ocamldocindent} - {\\endocamldocindent\\vskip -\\lastskip - \\noindent\\quad\\texttt{end}\\medskip} - -\\endinput +let content ="\n\ +%% Support macros for LaTeX documentation generated by ocamldoc.\n\ +%% This file is in the public domain; do what you want with it.\n\ +\n\ +\\NeedsTeXFormat{LaTeX2e}\n\ +\\ProvidesPackage{ocamldoc}\n\ + [2001/12/04 v1.0 ocamldoc support]\n\ +\n\ +\\newenvironment{ocamldoccode}{%\n\ + \\bgroup\n\ + \\leftskip\\@totalleftmargin\n\ + \\rightskip\\z@skip\n\ + \\parindent\\z@\n\ + \\parfillskip\\@flushglue\n\ + \\parskip\\z@skip\n\ + %\\noindent\n\ + \\@@par\\smallskip\n\ + \\@tempswafalse\n\ + \\def\\par{%\n\ + \\if@tempswa\n\ + \\leavevmode\\null\\@@par\\penalty\\interlinepenalty\n\ + \\else\n\ + \\@tempswatrue\n\ + \\ifhmode\\@@par\\penalty\\interlinepenalty\\fi\n\ + \\fi}\n\ + \\obeylines\n\ + \\verbatim@font\n\ + \\let\\org@prime~%\n\ + \\@noligs\n\ + \\let\\org@dospecials\\dospecials\n\ + \\g@remfrom@specials{\\\\}\n\ + \\g@remfrom@specials{\\{}\n\ + \\g@remfrom@specials{\\}}\n\ + \\let\\do\\@makeother\n\ + \\dospecials\n\ + \\let\\dospecials\\org@dospecials\n\ + \\frenchspacing\\@vobeyspaces\n\ + \\everypar \\expandafter{\\the\\everypar \\unpenalty}}\n\ +{\\egroup\\par}\n\ +\n\ +\\def\\g@remfrom@specials#1{%\n\ + \\def\\@new@specials{}\n\ + \\def\\@remove##1{%\n\ + \\ifx##1#1\\else\n\ + \\g@addto@macro\\@new@specials{\\do ##1}\\fi}\n\ + \\let\\do\\@remove\\dospecials\n\ + \\let\\dospecials\\@new@specials\n\ + }\n\ +\n\ +\\newenvironment{ocamldocdescription}\n\ +{\\list{}{\\rightmargin0pt \\topsep0pt}\\raggedright\\item\\noindent\\relax\\ignorespaces}\n\ +{\\endlist\\medskip}\n\ +\n\ +\\newenvironment{ocamldoccomment}\n\ +{\\list{}{\\leftmargin 2\\leftmargini \\rightmargin0pt \\topsep0pt}\\raggedright\\item\\noindent\\relax}\n\ +{\\endlist}\n\ +\n\ +\\let \\ocamldocparagraph \\paragraph\n\ +\\def \\paragraph #1{\\ocamldocparagraph {#1}\\noindent}\n\ +\\let \\ocamldocsubparagraph \\subparagraph\n\ +\\def \\subparagraph #1{\\ocamldocsubparagraph {#1}\\noindent}\n\ +\n\ +\\let\\ocamldocvspace\\vspace\n\ +\n\ +\\newenvironment{ocamldocindent}{\\list{}{}\\item\\relax}{\\endlist}\n\ +\\newenvironment{ocamldocsigend}\n\ + {\\noindent\\quad\\texttt{sig}\\ocamldocindent}\n\ + {\\endocamldocindent\\vskip -\\lastskip\n\ + \\noindent\\quad\\texttt{end}\\medskip}\n\ +\\newenvironment{ocamldocobjectend}\n\ + {\\noindent\\quad\\texttt{object}\\ocamldocindent}\n\ + {\\endocamldocindent\\vskip -\\lastskip\n\ + \\noindent\\quad\\texttt{end}\\medskip}\n\ +\n\ +\\endinput\n\ " - diff --git a/ocamldoc/odoc_lexer.mll b/ocamldoc/odoc_lexer.mll index d4772994..da66a008 100644 --- a/ocamldoc/odoc_lexer.mll +++ b/ocamldoc/odoc_lexer.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_lexer.mll 8928 2008-07-23 11:14:22Z guesdon $ *) +(* $Id$ *) (** The lexer for special comments. *) @@ -220,9 +220,9 @@ and special_comment = parse let len = String.length (Lexing.lexeme lexbuf) in lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - len; lexbuf.Lexing.lex_curr_p <- - { lexbuf.Lexing.lex_curr_p with - pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - len - } ; + { lexbuf.Lexing.lex_curr_p with + pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - len + } ; (* we don't increment the Odoc_comments_global.nb_chars *) special_comment_part2 lexbuf } @@ -409,4 +409,3 @@ and simple = parse incr Odoc_comments_global.nb_chars; simple lexbuf } - diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index 028fd7a7..44d503f2 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_man.ml 9109 2008-10-29 11:58:35Z guesdon $ *) +(* $Id$ *) (** The man pages generator. *) open Odoc_info @@ -273,7 +273,7 @@ class man = () | Odoc_info.Link (s, t) -> self#man_of_text2 b t - | Odoc_info.Ref (name, _) -> + | Odoc_info.Ref (name, _, _) -> self#man_of_text_element b (Odoc_info.Code (Odoc_info.use_hidden_modules name)) | Odoc_info.Superscript t -> @@ -285,9 +285,13 @@ class man = | Odoc_info.Index_list -> () | Odoc_info.Custom (s,t) -> self#man_of_custom_text b s t + | Odoc_info.Target (target, code) -> self#man_of_Target b ~target ~code method man_of_custom_text b s t = () + method man_of_Target b ~target ~code = + if String.lowercase target = "man" then bs b code else () + (** Print groff string to display code. *) method man_of_code b s = self#man_of_text b [ Code s ] diff --git a/ocamldoc/odoc_merge.ml b/ocamldoc/odoc_merge.ml index bbf8de10..fd046752 100644 --- a/ocamldoc/odoc_merge.ml +++ b/ocamldoc/odoc_merge.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_merge.ml 8418 2007-10-09 10:29:37Z weis $ *) +(* $Id$ *) (** Merge of information from [.ml] and [.mli] for a module.*) diff --git a/ocamldoc/odoc_merge.mli b/ocamldoc/odoc_merge.mli index aaf42c19..52d39033 100644 --- a/ocamldoc/odoc_merge.mli +++ b/ocamldoc/odoc_merge.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_merge.mli 5973 2003-11-24 10:44:07Z starynke $ *) +(* $Id$ *) (** Merge of information from [.ml] and [.mli] for a module.*) @@ -29,4 +29,3 @@ val merge_info_opt : val merge : Odoc_types.merge_option list -> Odoc_module.t_module list -> Odoc_module.t_module list - diff --git a/ocamldoc/odoc_messages.ml b/ocamldoc/odoc_messages.ml index c634bdb2..078f2d64 100644 --- a/ocamldoc/odoc_messages.ml +++ b/ocamldoc/odoc_messages.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_messages.ml 9229 2009-04-09 13:56:38Z guesdon $ *) +(* $Id$ *) (** The messages of the application. *) diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index 0c6510a7..c439ef31 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_misc.ml 7470 2006-07-06 07:19:06Z pouillar $ *) +(* $Id$ *) let no_blanks s = let len = String.length s in @@ -124,7 +124,9 @@ let rec string_of_text t = | Odoc_types.Latex s -> "{% "^s^" %}" | Odoc_types.Link (s, t) -> "["^s^"]"^(string_of_text t) - | Odoc_types.Ref (name, _) -> + | Odoc_types.Ref (name, _, Some text) -> + Printf.sprintf "[%s]" (string_of_text text) + | Odoc_types.Ref (name, _, None) -> iter (Odoc_types.Code name) | Odoc_types.Superscript t -> "^{"^(string_of_text t)^"}" @@ -138,6 +140,7 @@ let rec string_of_text t = | Odoc_types.Index_list -> "" | Odoc_types.Custom (_, t) -> string_of_text t + | Odoc_types.Target _ -> "" in String.concat "" (List.map iter t) @@ -258,7 +261,8 @@ let rec text_no_title_no_list t = | Odoc_types.Code _ | Odoc_types.CodePre _ | Odoc_types.Verbatim _ - | Odoc_types.Ref _ -> [t_ele] + | Odoc_types.Ref _ + | Odoc_types.Target _ -> [t_ele] | Odoc_types.Newline -> [Odoc_types.Newline] | Odoc_types.Block t -> [Odoc_types.Block (text_no_title_no_list t)] | Odoc_types.Bold t -> [Odoc_types.Bold (text_no_title_no_list t)] @@ -274,7 +278,7 @@ let rec text_no_title_no_list t = | Odoc_types.Module_list l -> list_concat (Odoc_types.Raw ", ") (List.map - (fun s -> Odoc_types.Ref (s, Some Odoc_types.RK_module)) + (fun s -> Odoc_types.Ref (s, Some Odoc_types.RK_module, None)) l ) | Odoc_types.Index_list -> [] @@ -309,6 +313,7 @@ let get_titles_in_text t = | Odoc_types.Module_list _ -> () | Odoc_types.Index_list -> () | Odoc_types.Custom (_, t) -> iter_text t + | Odoc_types.Target _ -> () and iter_text te = List.iter iter_ele te in @@ -400,7 +405,9 @@ and first_sentence_text_ele text_ele = | Odoc_types.Subscript _ | Odoc_types.Module_list _ | Odoc_types.Index_list -> (false, text_ele, None) - | Odoc_types.Custom _ -> (false, text_ele, None) + | Odoc_types.Custom _ + | Odoc_types.Target _ -> (false, text_ele, None) + let first_sentence_of_text t = let (_,t2,_) = first_sentence_text t in @@ -479,7 +486,8 @@ let remove_option typ = | Types.Tobject _ | Types.Tfield _ | Types.Tnil - | Types.Tvariant _ -> t + | Types.Tvariant _ + | Types.Tpackage _ -> t | Types.Tlink t2 | Types.Tsubst t2 -> iter t2.Types.desc in diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index 06b66fc3..4fc83fe8 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_misc.mli 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) (** Miscelaneous functions *) diff --git a/ocamldoc/odoc_module.ml b/ocamldoc/odoc_module.ml index caeffeb4..3352bd8d 100644 --- a/ocamldoc/odoc_module.ml +++ b/ocamldoc/odoc_module.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_module.ml 7619 2006-09-20 11:14:37Z doligez $ *) +(* $Id$ *) (** Representation and manipulation of modules and module types. *) diff --git a/ocamldoc/odoc_name.ml b/ocamldoc/odoc_name.ml index 049dea58..672203ff 100644 --- a/ocamldoc/odoc_name.ml +++ b/ocamldoc/odoc_name.ml @@ -9,12 +9,12 @@ (* *) (***********************************************************************) -(* $Id: odoc_name.ml 9185 2009-03-12 18:21:08Z doligez $ *) +(* $Id$ *) (** Representation of element names. *) -let infix_chars = [ '|' ; - '<' ; +let infix_chars = [ '|' ; + '<' ; '>' ; '@' ; '^' ; @@ -58,7 +58,7 @@ let cut name = '.' when !j = 0 -> if i < len - 1 then match s.[i+1] with - '(' -> + '(' -> j := 1 | _ -> Buffer.add_char buf.(!j) '.' @@ -86,15 +86,15 @@ let head_and_tail n = if pos > 0 then let h = String.sub n 0 pos in try - ignore (String.index h '('); - (n, "") + ignore (String.index h '('); + (n, "") with - Not_found -> - let len = String.length n in - if pos >= (len - 1) then - (h, "") - else - (h, String.sub n (pos + 1) (len - pos - 1)) + Not_found -> + let len = String.length n in + if pos >= (len - 1) then + (h, "") + else + (h, String.sub n (pos + 1) (len - pos - 1)) else (n, "") with @@ -111,7 +111,7 @@ let depth name = let prefix n1 n2 = (n1 <> n2) & - (try + (try let len1 = String.length n1 in ((String.sub n2 0 len1) = n1) & (n2.[len1] = '.') @@ -125,16 +125,16 @@ let rec get_relative_raw n1 n2 = s2 else if f1 = s1 or s1 = "" then - s2 + s2 else - get_relative_raw s1 s2 + get_relative_raw s1 s2 else n2 let get_relative n1 n2 = if prefix n1 n2 then let len1 = String.length n1 in - try + try String.sub n2 (len1+1) ((String.length n2) - len1 - 1) with _ -> n2 @@ -144,12 +144,12 @@ let get_relative n1 n2 = let hide_given_modules l s = let rec iter = function [] -> s - | h :: q -> + | h :: q -> let s2 = get_relative h s in if s = s2 then iter q else - s2 + s2 in iter l @@ -160,8 +160,8 @@ let from_ident ident = Ident.name ident let from_path path = Path.name path -let to_path n = - match +let to_path n = + match List.fold_left (fun acc_opt -> fun s -> match acc_opt with @@ -174,4 +174,3 @@ let to_path n = | Some p -> p let from_longident = Odoc_misc.string_of_longident - diff --git a/ocamldoc/odoc_name.mli b/ocamldoc/odoc_name.mli index 58eeff45..0feb3b83 100644 --- a/ocamldoc/odoc_name.mli +++ b/ocamldoc/odoc_name.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_name.mli 6173 2004-03-26 09:09:50Z guesdon $ *) +(* $Id$ *) (** Representation of element names. *) @@ -63,4 +63,3 @@ val to_path : t -> Path.t (** Get a name from a [Longident.t].*) val from_longident : Longident.t -> t - diff --git a/ocamldoc/odoc_ocamlhtml.mll b/ocamldoc/odoc_ocamlhtml.mll index e2279508..6364a900 100644 --- a/ocamldoc/odoc_ocamlhtml.mll +++ b/ocamldoc/odoc_ocamlhtml.mll @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_ocamlhtml.mll 9125 2008-11-10 13:03:55Z guesdon $ *) +(* $Id$ *) (** Generation of html code to display OCaml code. *) open Lexing @@ -342,9 +342,9 @@ rule token = parse | "*)" { lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - 1; lexbuf.Lexing.lex_curr_p <- - { lexbuf.Lexing.lex_curr_p with - pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 - } ; + { lexbuf.Lexing.lex_curr_p with + pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 + } ; print (Lexing.lexeme lexbuf) ; token lexbuf } diff --git a/ocamldoc/odoc_parameter.ml b/ocamldoc/odoc_parameter.ml index 2d2af1f7..56f175ec 100644 --- a/ocamldoc/odoc_parameter.ml +++ b/ocamldoc/odoc_parameter.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_parameter.ml 6185 2004-04-02 15:10:58Z guesdon $ *) +(* $Id$ *) (** Representation and manipulation of method / function / class parameters. *) @@ -22,9 +22,9 @@ type simple_name = { sn_name : string ; sn_type : Types.type_expr ; mutable sn_text : Odoc_types.text option ; - } + } -(** Representation of parameter names. We need it to represent parameter names in tuples. +(** Representation of parameter names. We need it to represent parameter names in tuples. The value [Tuple ([], t)] stands for an anonymous parameter.*) type param_info = | Simple_name of simple_name @@ -37,7 +37,7 @@ type parameter = param_info (** acces to the name as a string. For tuples, parenthesis and commas are added. *) let complete_name p = - let rec iter pi = + let rec iter pi = match pi with Simple_name sn -> sn.sn_name @@ -49,7 +49,7 @@ let complete_name p = iter p (** access to the complete type *) -let typ pi = +let typ pi = match pi with Simple_name sn -> sn.sn_type | Tuple (_, typ) -> typ @@ -57,7 +57,7 @@ let typ pi = (** Update the text of a parameter using a function returning the optional text associated to a parameter name.*) let update_parameter_text f p = - let rec iter pi = + let rec iter pi = match pi with Simple_name sn -> sn.sn_text <- f sn.sn_name @@ -68,7 +68,7 @@ let update_parameter_text f p = (** access to the description of a specific name. @raise Not_found if no description is associated to the given name. *) -let desc_by_name pi name = +let desc_by_name pi name = let rec iter acc pi = match pi with Simple_name sn -> @@ -92,9 +92,9 @@ let names pi = in iter [] pi -(** access to the type of a specific name. +(** access to the type of a specific name. @raise Not_found if no type is associated to the given name. *) -let type_by_name pi name = +let type_by_name pi name = let rec iter acc pi = match pi with Simple_name sn -> @@ -107,17 +107,17 @@ let type_by_name pi name = (** access to the optional description of a parameter name from an optional info structure.*) let desc_from_info_opt info_opt s = - print_DEBUG "desc_from_info_opt"; + print_DEBUG "desc_from_info_opt"; match info_opt with None -> None | Some i -> match s with "" -> None | _ -> - try + try Some (List.assoc s i.Odoc_types.i_params) with - Not_found -> + Not_found -> print_DEBUG ("desc_from_info_opt "^s^" not found in\n"); List.iter (fun (s, _) -> print_DEBUG s) i.Odoc_types.i_params; None diff --git a/ocamldoc/odoc_parser.mly b/ocamldoc/odoc_parser.mly index d885e2a5..0d9d814d 100644 --- a/ocamldoc/odoc_parser.mly +++ b/ocamldoc/odoc_parser.mly @@ -10,13 +10,13 @@ (* *) (***********************************************************************) -(* $Id: odoc_parser.mly 5973 2003-11-24 10:44:07Z starynke $ *) +(* $Id$ *) open Odoc_types open Odoc_comments_global let uppercase = "[A-Z\192-\214\216-\222]" -let identchar = +let identchar = "[A-Za-z_\192-\214\216-\246\248-\255'0-9]" let blank = "[ \010\013\009\012]" @@ -89,7 +89,7 @@ element: param: T_PARAM Desc - { + { (* isolate the identificator *) (* we only look for simple id, no pattern nor tuples *) let s = $2 in @@ -97,7 +97,7 @@ param: [] | _ :: [] -> raise (Failure "usage: @param id description") - | id :: _ -> + | id :: _ -> print_DEBUG ("Identificator "^id); let reg = identchar^"+" in print_DEBUG ("reg="^reg); @@ -105,7 +105,7 @@ param: let remain = String.sub s (String.length id) ((String.length s) - (String.length id)) in print_DEBUG ("T_PARAM Desc remain="^remain); let remain2 = Str.replace_first (Str.regexp ("^"^blank^"+")) "" remain in - params := !params @ [(id, remain2)] + params := !params @ [(id, remain2)] else raise (Failure (id^" is not a valid parameter identificator in \"@param "^s^"\"")) } @@ -126,25 +126,25 @@ deprecated: T_DEPRECATED Desc { deprecated := Some $2 } ; raise_exc: - T_RAISES Desc - { + T_RAISES Desc + { (* isolate the exception construtor name *) let s = $2 in match Str.split (Str.regexp (blank^"+")) s with [] | _ :: [] -> raise (Failure "usage: @raise Exception description") - | id :: _ -> + | id :: _ -> print_DEBUG ("exception "^id); let reg = uppercase^identchar^"*"^"\\(\\."^uppercase^identchar^"*\\)*" in print_DEBUG ("reg="^reg); if Str.string_match (Str.regexp reg) id 0 then let remain = String.sub s (String.length id) ((String.length s) - (String.length id)) in let remain2 = Str.replace_first (Str.regexp ("^"^blank^"+")) "" remain in - raised_exceptions := !raised_exceptions @ [(id, remain2)] + raised_exceptions := !raised_exceptions @ [(id, remain2)] else raise (Failure (id^" is not a valid exception constructor in \"@raise "^s^"\"")) - } + } ; return: T_RETURN Desc { return_value := Some $2 } @@ -155,4 +155,4 @@ custom: ; -%% +%% diff --git a/ocamldoc/odoc_print.ml b/ocamldoc/odoc_print.ml index 116d22b9..5cc8e038 100644 --- a/ocamldoc/odoc_print.ml +++ b/ocamldoc/odoc_print.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_print.ml 6307 2004-05-18 13:28:00Z garrigue $ *) +(* $Id$ *) open Format @@ -20,14 +20,14 @@ let new_fmt () = pp_print_flush fmt (); let s = Buffer.contents buf in Buffer.reset buf ; - s + s in (fmt, flush) let (type_fmt, flush_type_fmt) = new_fmt () let _ = - let (out, flush, outnewline, outspace) = - pp_get_all_formatter_output_functions type_fmt () + let (out, flush, outnewline, outspace) = + pp_get_all_formatter_output_functions type_fmt () in pp_set_all_formatter_output_functions type_fmt ~out ~flush @@ -56,12 +56,12 @@ let simpl_module_type ?code t = let rec iter t = match t with Types.Tmty_ident p -> t - | Types.Tmty_signature _ -> - ( - match code with - None -> Types.Tmty_signature [] - | Some s -> raise (Use_code s) - ) + | Types.Tmty_signature _ -> + ( + match code with + None -> Types.Tmty_signature [] + | Some s -> raise (Use_code s) + ) | Types.Tmty_functor (id, mt1, mt2) -> Types.Tmty_functor (id, iter mt1, iter mt2) in @@ -85,7 +85,7 @@ let simpl_class_type t = (* on vire les vals et methods pour ne pas qu'elles soient imprimées quand on affichera le type *) let tnil = { Types.desc = Types.Tnil ; Types.level = 0; Types.id = 0 } in - Types.Tcty_signature { Types.cty_self = { cs.Types.cty_self with + Types.Tcty_signature { Types.cty_self = { cs.Types.cty_self with Types.desc = Types.Tobject (tnil, ref None) }; Types.cty_vars = Types.Vars.empty ; Types.cty_concr = Types.Concr.empty ; @@ -97,7 +97,7 @@ let simpl_class_type t = in iter t -let string_of_class_type ?(complete=false) t = +let string_of_class_type ?(complete=false) t = let t2 = if complete then t else simpl_class_type t in (* A VOIR : ma propre version de Printtyp.class_type pour ne pas faire reset_names *) Printtyp.class_type modtype_fmt t2; diff --git a/ocamldoc/odoc_print.mli b/ocamldoc/odoc_print.mli index 69e7526f..01b319c3 100644 --- a/ocamldoc/odoc_print.mli +++ b/ocamldoc/odoc_print.mli @@ -9,15 +9,15 @@ (* *) (***********************************************************************) -(* $Id: odoc_print.mli 6173 2004-03-26 09:09:50Z guesdon $ *) +(* $Id$ *) (** Printing functions. *) -(** This function takes a Types.type_expr and returns a string. +(** This function takes a Types.type_expr and returns a string. It writes in and flushes [Format.str_formatter].*) val string_of_type_expr : Types.type_expr -> string -(** This function returns a string representing a [Types.module_type]. +(** This function returns a string representing a [Types.module_type]. @param complete indicates if we must print complete signatures or just [sig end]. Default if [false]. @param code if [complete = false] and the type contains something else @@ -25,9 +25,8 @@ val string_of_type_expr : Types.type_expr -> string *) val string_of_module_type : ?code: string -> ?complete: bool -> Types.module_type -> string -(** This function returns a string representing a [Types.class_type]. +(** This function returns a string representing a [Types.class_type]. @param complete indicates if we must print complete signatures or just [object end]. Default if [false]. *) val string_of_class_type : ?complete: bool -> Types.class_type -> string - diff --git a/ocamldoc/odoc_scan.ml b/ocamldoc/odoc_scan.ml index d7d694f8..839092df 100644 --- a/ocamldoc/odoc_scan.ml +++ b/ocamldoc/odoc_scan.ml @@ -9,19 +9,19 @@ (* *) (***********************************************************************) -(* $Id: odoc_scan.ml 5973 2003-11-24 10:44:07Z starynke $ *) +(* $Id$ *) (** Scanning of modules and elements. The class scanner defined in this module can be used to develop generators which perform controls on the elements - and their comments. + and their comments. *) open Odoc_types (** Class which defines the scanning of a list of modules and their - elements. Inherit this class to develop your own scanner, by + elements. Inherit this class to develop your own scanner, by overriding some methods.*) class scanner = object (self) @@ -34,23 +34,23 @@ class scanner = method scan_method (m : Odoc_value.t_method) = () method scan_included_module (im : Odoc_module.included_module) = () - (** Scan of a class. *) + (** Scan of a class. *) (** Scan of a comment inside a class. *) method scan_class_comment (t : text) = () (** Override this method to perform controls on the class comment - and params. This method is called before scanning the class elements. + and params. This method is called before scanning the class elements. @return true if the class elements must be scanned.*) method scan_class_pre (c : Odoc_class.t_class) = true - (** This method scan the elements of the given class. + (** This method scan the elements of the given class. A VOIR : scan des classes héritées.*) method scan_class_elements c = - List.iter - (fun ele -> + List.iter + (fun ele -> match ele with - Odoc_class.Class_attribute a -> self#scan_attribute a + Odoc_class.Class_attribute a -> self#scan_attribute a | Odoc_class.Class_method m -> self#scan_method m | Odoc_class.Class_comment t -> self#scan_class_comment t ) @@ -66,17 +66,17 @@ class scanner = method scan_class_type_comment (t : text) = () (** Override this method to perform controls on the class type comment - and form. This method is called before scanning the class type elements. + and form. This method is called before scanning the class type elements. @return true if the class type elements must be scanned.*) method scan_class_type_pre (ct : Odoc_class.t_class_type) = true - (** This method scan the elements of the given class type. + (** This method scan the elements of the given class type. A VOIR : scan des classes héritées.*) method scan_class_type_elements ct = - List.iter - (fun ele -> + List.iter + (fun ele -> match ele with - Odoc_class.Class_attribute a -> self#scan_attribute a + Odoc_class.Class_attribute a -> self#scan_attribute a | Odoc_class.Class_method m -> self#scan_method m | Odoc_class.Class_comment t -> self#scan_class_type_comment t ) @@ -92,14 +92,14 @@ class scanner = method scan_module_comment (t : text) = () (** Override this method to perform controls on the module comment - and form. This method is called before scanning the module elements. + and form. This method is called before scanning the module elements. @return true if the module elements must be scanned.*) method scan_module_pre (m : Odoc_module.t_module) = true (** This method scan the elements of the given module. *) method scan_module_elements m = - List.iter - (fun ele -> + List.iter + (fun ele -> match ele with Odoc_module.Element_module m -> self#scan_module m | Odoc_module.Element_module_type mt -> self#scan_module_type mt @@ -123,14 +123,14 @@ class scanner = method scan_module_type_comment (t : text) = () (** Override this method to perform controls on the module type comment - and form. This method is called before scanning the module type elements. + and form. This method is called before scanning the module type elements. @return true if the module type elements must be scanned. *) method scan_module_type_pre (mt : Odoc_module.t_module_type) = true (** This method scan the elements of the given module type. *) method scan_module_type_elements mt = - List.iter - (fun ele -> + List.iter + (fun ele -> match ele with Odoc_module.Element_module m -> self#scan_module m | Odoc_module.Element_module_type mt -> self#scan_module_type mt @@ -146,7 +146,7 @@ class scanner = (** Scan of a module type. Should not be overriden. It calls [scan_module_type_pre] and if [scan_module_type_pre] returns [true], then it calls scan_module_type_elements.*) - method scan_module_type mt = + method scan_module_type mt = if self#scan_module_type_pre mt then self#scan_module_type_elements mt (** Main scanning method. *) diff --git a/ocamldoc/odoc_search.ml b/ocamldoc/odoc_search.ml index c5d7eff1..65d602d3 100644 --- a/ocamldoc/odoc_search.ml +++ b/ocamldoc/odoc_search.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_search.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) (** Research of elements through modules. *) @@ -66,7 +66,7 @@ module Search = | T.CodePre _ | T.Latex _ | T.Verbatim _ - | T.Ref (_, _) -> [] + | T.Ref (_, _, _) -> [] | T.Bold t | T.Italic t | T.Center t @@ -76,13 +76,14 @@ module Search = | T.Block t | T.Superscript t | T.Subscript t - | T.Custom (_,t) + | T.Custom (_,t) | T.Link (_, t) -> search_text root t v | T.List l | T.Enum l -> List.flatten (List.map (fun t -> search_text root t v) l) | T.Newline - | T.Module_list _ - | T.Index_list -> [] + | T.Module_list _ + | T.Index_list -> [] + | T.Target _ -> [] | T.Title (n, l_opt, t) -> (match l_opt with None -> [] @@ -542,7 +543,7 @@ let type_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_type _ -> true + Res_type _ -> true | _ -> false ) l @@ -551,7 +552,7 @@ let value_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_value _ -> true + Res_value _ -> true | _ -> false ) l @@ -560,7 +561,7 @@ let class_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_class _ -> true + Res_class _ -> true | _ -> false ) l @@ -569,7 +570,7 @@ let class_type_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_class_type _ -> true + Res_class_type _ -> true | _ -> false ) l @@ -578,7 +579,7 @@ let module_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_module _ -> true + Res_module _ -> true | _ -> false ) l @@ -587,7 +588,7 @@ let module_type_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_module_type _ -> true + Res_module_type _ -> true | _ -> false ) l @@ -596,7 +597,7 @@ let exception_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_exception _ -> true + Res_exception _ -> true | _ -> false ) l @@ -605,7 +606,7 @@ let attribute_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_attribute _ -> true + Res_attribute _ -> true | _ -> false ) l @@ -614,7 +615,7 @@ let method_exists mods regexp = let l = Search_by_name.search mods regexp in List.exists (function - Res_method _ -> true + Res_method _ -> true | _ -> false ) l @@ -624,12 +625,12 @@ let find_section mods regexp = match List.find (function - Res_section _ -> true - | _ -> false + Res_section _ -> true + | _ -> false ) l with Res_section (_,t) -> t | _ -> assert false -(* eof $Id: odoc_search.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* eof $Id$ *) diff --git a/ocamldoc/odoc_search.mli b/ocamldoc/odoc_search.mli index 9b4f2f5e..d7ace583 100644 --- a/ocamldoc/odoc_search.mli +++ b/ocamldoc/odoc_search.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_search.mli 5973 2003-11-24 10:44:07Z starynke $ *) +(* $Id$ *) (** Research of elements through modules. *) @@ -29,7 +29,7 @@ type result_element = (** The type representing a research result.*) type result = result_element list -(** The type of modules which contain the predicates used during the research. +(** The type of modules which contain the predicates used during the research. Some functions return a couple of booleans ; the first indicates if we must go deeper in the analysed element, the second if the element satisfies the predicate. @@ -193,7 +193,7 @@ val attribute_exists : Odoc_module.t_module list -> Str.regexp -> bool in the given module list.*) val method_exists : Odoc_module.t_module list -> Str.regexp -> bool -(** Return the [text] of the section with the given complete name (regexp) +(** Return the [text] of the section with the given complete name (regexp) in the given module list. @raise Not_found if the section was not found.*) val find_section : Odoc_module.t_module list -> Str.regexp -> Odoc_types.text diff --git a/ocamldoc/odoc_see_lexer.mll b/ocamldoc/odoc_see_lexer.mll index 799678a4..b0570f78 100644 --- a/ocamldoc/odoc_see_lexer.mll +++ b/ocamldoc/odoc_see_lexer.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_see_lexer.mll 5973 2003-11-24 10:44:07Z starynke $ *) +(* $Id$ *) let print_DEBUG2 s = print_string s ; print_newline () @@ -21,52 +21,52 @@ open Odoc_parser let buf = Buffer.create 32 -} +} rule main = parse [' ' '\013' '\009' '\012'] + - { + { print_DEBUG2 "[' ' '\013' '\009' '\012'] +"; - main lexbuf + main lexbuf } - | [ '\010' ] - { + | [ '\010' ] + { print_DEBUG2 " [ '\010' ] "; - main lexbuf + main lexbuf } - | "<" - { + | "<" + { print_DEBUG2 "call url lexbuf" ; - url lexbuf - } + url lexbuf + } - | "\"" - { + | "\"" + { print_DEBUG2 "call doc lexbuf" ; doc lexbuf - } + } | '\'' { print_DEBUG2 "call file lexbuf" ; file lexbuf - } + } | eof - { + { print_DEBUG2 "EOF"; - EOF + EOF } | _ - { + { Buffer.reset buf ; - Buffer.add_string buf (Lexing.lexeme lexbuf); + Buffer.add_string buf (Lexing.lexeme lexbuf); desc lexbuf - } + } and url = parse | ([^'>'] | '\n')+">" @@ -76,7 +76,7 @@ and url = parse See_url (String.sub s 0 ((String.length s) -1)) } - + and doc = parse | ([^'"'] | '\n' | "\\'")* "\"" { @@ -95,8 +95,8 @@ and file = parse and desc = parse eof { Desc (Buffer.contents buf) } - | _ - { + | _ + { Buffer.add_string buf (Lexing.lexeme lexbuf); desc lexbuf } diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index a9b3f34f..67a0b9f6 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_sig.ml 8927 2008-07-23 08:55:36Z guesdon $ *) +(* $Id$ *) (** Analysis of interface files. *) @@ -865,6 +865,8 @@ module Analyser = "??" | Parsetree.Pmty_with (mt, _) -> f mt.Parsetree.pmty_desc + | Parsetree.Pmty_typeof _ -> (* TODO *) + "??" in let name = (f module_type.Parsetree.pmty_desc) in let full_name = Odoc_env.full_module_or_module_type_name env name in @@ -1093,7 +1095,10 @@ module Analyser = Module_type_with (k, s) ) - (** Analyse of a Parsetree.module_type and a Types.module_type.*) + | Parsetree.Pmty_typeof module_expr -> + assert false (* TODO *) + + (** analyse of a Parsetree.module_type and a Types.module_type.*) and analyse_module_kind env current_module_name module_type sig_module_type = match module_type.Parsetree.pmty_desc with Parsetree.Pmty_ident longident -> @@ -1156,6 +1161,8 @@ module Analyser = let k = analyse_module_type_kind env current_module_name module_type2 sig_module_type in Module_with (k, s) ) + | Parsetree.Pmty_typeof module_expr -> + assert false (* TODO *) (** Analyse of a Parsetree.class_type and a Types.class_type to return a couple (class parameters, class_kind).*) diff --git a/ocamldoc/odoc_sig.mli b/ocamldoc/odoc_sig.mli index d1518a81..65ee128f 100644 --- a/ocamldoc/odoc_sig.mli +++ b/ocamldoc/odoc_sig.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_sig.mli 6661 2004-11-03 09:31:19Z guesdon $ *) +(* $Id$ *) (** The module for analysing a signature and source code and creating modules, classes, ..., elements.*) @@ -134,7 +134,7 @@ module Analyser : (Odoc_types.info option * Odoc_module.module_element list) (** [name_comment_from_type_kind pos_end pos_limit type_kind]. - This function takes a [Parsetree.type_kind] and returns the list of + This function takes a [Parsetree.type_kind] and returns the list of (name, optional comment) for the various fields/constructors of the type, or an empty list for an abstract type. [pos_end] is last char of the complete type definition. diff --git a/ocamldoc/odoc_str.ml b/ocamldoc/odoc_str.ml index 6ca8cccb..b20cd8b4 100644 --- a/ocamldoc/odoc_str.ml +++ b/ocamldoc/odoc_str.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_str.ml 8927 2008-07-23 08:55:36Z guesdon $ *) +(* $Id$ *) (** The functions to get a string from different kinds of elements (types, modules, ...). *) @@ -32,7 +32,7 @@ let rec is_arrow_type t = | Types.Ttuple _ | Types.Tconstr _ | Types.Tvar | Types.Tunivar | Types.Tobject _ | Types.Tpoly _ - | Types.Tfield _ | Types.Tnil | Types.Tvariant _ -> false + | Types.Tfield _ | Types.Tnil | Types.Tvariant _ | Types.Tpackage _ -> false let raw_string_of_type_list sep type_list = let buf = Buffer.create 256 in @@ -44,7 +44,7 @@ let raw_string_of_type_list sep type_list = | Types.Tconstr _ -> false | Types.Tvar | Types.Tunivar | Types.Tobject _ | Types.Tpoly _ - | Types.Tfield _ | Types.Tnil | Types.Tvariant _ -> false + | Types.Tfield _ | Types.Tnil | Types.Tvariant _ | Types.Tpackage _ -> false in let print_one_type variance t = Printtyp.mark_loops t; @@ -68,9 +68,9 @@ let raw_string_of_type_list sep type_list = print_one_type variance ty; List.iter (fun (variance, t) -> - Format.fprintf fmt "@,%s" sep; - print_one_type variance t - ) + Format.fprintf fmt "@,%s" sep; + print_one_type variance t + ) tyl; Format.fprintf fmt "@]" end; @@ -82,9 +82,9 @@ let string_of_type_list ?par sep type_list = match par with | Some b -> b | None -> - match type_list with - [] | [_] -> false - | _ -> true + match type_list with + [] | [_] -> false + | _ -> true in Printf.sprintf "%s%s%s" (if par then "(" else "") @@ -101,8 +101,8 @@ let string_of_type_param_list t = (if par then "(" else "") (raw_string_of_type_list ", " (List.map - (fun (typ, co, cn) -> (string_of_variance t (co, cn), typ)) - t.Odoc_type.ty_parameters + (fun (typ, co, cn) -> (string_of_variance t (co, cn), typ)) + t.Odoc_type.ty_parameters ) ) (if par then ")" else "") @@ -117,8 +117,8 @@ let string_of_class_type_param_list l = (if par then "[" else "") (raw_string_of_type_list ", " (List.map - (fun typ -> ("", typ)) - l + (fun typ -> ("", typ)) + l ) ) (if par then "]" else "") @@ -127,23 +127,23 @@ let string_of_class_params c = let b = Buffer.create 256 in let rec iter = function Types.Tcty_fun (label, t, ctype) -> - let parent = is_arrow_type t in - Printf.bprintf b "%s%s%s%s -> " - ( - match label with - "" -> "" - | s -> s^":" - ) - (if parent then "(" else "") - (Odoc_print.string_of_type_expr - (if Odoc_misc.is_optional label then - Odoc_misc.remove_option t - else - t - ) - ) - (if parent then ")" else ""); - iter ctype + let parent = is_arrow_type t in + Printf.bprintf b "%s%s%s%s -> " + ( + match label with + "" -> "" + | s -> s^":" + ) + (if parent then "(" else "") + (Odoc_print.string_of_type_expr + (if Odoc_misc.is_optional label then + Odoc_misc.remove_option t + else + t + ) + ) + (if parent then ")" else ""); + iter ctype | Types.Tcty_signature _ | Types.Tcty_constr _ -> () in @@ -160,9 +160,9 @@ let string_of_type t = (String.concat "" (List.map (fun (p, co, cn) -> - (string_of_variance t (co, cn))^ - (Odoc_print.string_of_type_expr p)^" " - ) + (string_of_variance t (co, cn))^ + (Odoc_print.string_of_type_expr p)^" " + ) t.M.ty_parameters ) )^ @@ -274,4 +274,4 @@ let string_of_method m = None -> "" | Some i -> Odoc_misc.string_of_info i) -(* eof $Id: odoc_str.ml 8927 2008-07-23 08:55:36Z guesdon $ *) +(* eof $Id$ *) diff --git a/ocamldoc/odoc_str.mli b/ocamldoc/odoc_str.mli index b70c9817..5d68c6d2 100644 --- a/ocamldoc/odoc_str.mli +++ b/ocamldoc/odoc_str.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_str.mli 6612 2004-08-20 17:04:35Z doligez $ *) +(* $Id$ *) (** The functions to get a string from different kinds of elements (types, modules, ...). *) @@ -26,7 +26,7 @@ val string_of_type_list : ?par: bool -> string -> Types.type_expr list -> string for the given type. *) val string_of_type_param_list : Odoc_type.t_type -> string -(** This function returns a string to represent the given list of +(** This function returns a string to represent the given list of type parameters of a class or class type, with a given separator. *) val string_of_class_type_param_list : Types.type_expr list -> string diff --git a/ocamldoc/odoc_test.ml b/ocamldoc/odoc_test.ml index 49d98e2f..a9868f6e 100644 --- a/ocamldoc/odoc_test.ml +++ b/ocamldoc/odoc_test.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_test.ml 6127 2004-02-20 16:28:27Z guesdon $ *) +(* $Id$ *) (** Custom generator to perform test on ocamldoc. *) @@ -27,64 +27,64 @@ class string_gen = inherit Odoc_info.Scan.scanner val mutable test_kinds = [] - val mutable fmt = Format.str_formatter + val mutable fmt = Format.str_formatter method must_display_types = List.mem Types_display test_kinds method set_test_kinds_from_module m = test_kinds <- List.fold_left - (fun acc (s, _) -> - match s with - "test_types_display" -> Types_display :: acc - | _ -> acc - ) - [] - ( - match m.m_info with - None -> [] - | Some i -> i.i_custom - ) - method scan_type t = + (fun acc (s, _) -> + match s with + "test_types_display" -> Types_display :: acc + | _ -> acc + ) + [] + ( + match m.m_info with + None -> [] + | Some i -> i.i_custom + ) + method! scan_type t = match test_kinds with - [] -> () - | _ -> - p fmt "# type %s:\n" t.ty_name; - if self#must_display_types then - ( - p fmt "# manifest (Odoc_info.string_of_type_expr):\n<[%s]>\n" - (match t.ty_manifest with - None -> "None" - | Some e -> Odoc_info.string_of_type_expr e - ); - ); + [] -> () + | _ -> + p fmt "# type %s:\n" t.ty_name; + if self#must_display_types then + ( + p fmt "# manifest (Odoc_info.string_of_type_expr):\n<[%s]>\n" + (match t.ty_manifest with + None -> "None" + | Some e -> Odoc_info.string_of_type_expr e + ); + ); - method scan_module_pre m = + method! scan_module_pre m = p fmt "#\n# module %s:\n" m.m_name ; if self#must_display_types then - ( - p fmt "# Odoc_info.string_of_module_type:\n<[%s]>\n" - (Odoc_info.string_of_module_type m.m_type); - p fmt "# Odoc_info.string_of_module_type ~complete: true :\n<[%s]>\n" - (Odoc_info.string_of_module_type ~complete: true m.m_type); - ); + ( + p fmt "# Odoc_info.string_of_module_type:\n<[%s]>\n" + (Odoc_info.string_of_module_type m.m_type); + p fmt "# Odoc_info.string_of_module_type ~complete: true :\n<[%s]>\n" + (Odoc_info.string_of_module_type ~complete: true m.m_type); + ); true - method scan_module_type_pre m = + method! scan_module_type_pre m = p fmt "#\n# module type %s:\n" m.mt_name ; if self#must_display_types then - ( - p fmt "# Odoc_info.string_of_module_type:\n<[%s]>\n" - (match m.mt_type with - None -> "None" - | Some t -> Odoc_info.string_of_module_type t - ); - p fmt "# Odoc_info.string_of_module_type ~complete: true :\n<[%s]>\n" - (match m.mt_type with - None -> "None" - | Some t -> Odoc_info.string_of_module_type ~complete: true t - ); - ); + ( + p fmt "# Odoc_info.string_of_module_type:\n<[%s]>\n" + (match m.mt_type with + None -> "None" + | Some t -> Odoc_info.string_of_module_type t + ); + p fmt "# Odoc_info.string_of_module_type ~complete: true :\n<[%s]>\n" + (match m.mt_type with + None -> "None" + | Some t -> Odoc_info.string_of_module_type ~complete: true t + ); + ); true method generate (module_list: Odoc_info.Module.t_module list) = @@ -92,15 +92,15 @@ class string_gen = fmt <- Format.formatter_of_out_channel oc; ( try - List.iter - (fun m -> - self#set_test_kinds_from_module m; - self#scan_module_list [m]; - ) - module_list + List.iter + (fun m -> + self#set_test_kinds_from_module m; + self#scan_module_list [m]; + ) + module_list with - e -> - prerr_endline (Printexc.to_string e) + e -> + prerr_endline (Printexc.to_string e) ); Format.pp_print_flush fmt (); close_out oc @@ -108,5 +108,5 @@ class string_gen = let my_generator = new string_gen -let _ = Odoc_info.Args.set_doc_generator +let _ = Odoc_info.Args.set_doc_generator (Some (my_generator :> Odoc_info.Args.doc_generator)) diff --git a/ocamldoc/odoc_texi.ml b/ocamldoc/odoc_texi.ml index 414a86ab..3a2e5db6 100644 --- a/ocamldoc/odoc_texi.ml +++ b/ocamldoc/odoc_texi.ml @@ -8,7 +8,7 @@ (* under the terms of the Q Public License version 1.0. *) (***********************************************************************) -(* $Id: odoc_texi.ml 8927 2008-07-23 08:55:36Z guesdon $ *) +(* $Id$ *) (** Generation of Texinfo documentation. *) @@ -294,15 +294,19 @@ class text = | Block t -> self#texi_of_Block t | Title (n, _, t) -> self#texi_of_Title n t | Link (s, t) -> self#texi_of_Link s t - | Ref (name, kind) ->self#texi_of_Ref name kind + | Ref (name, kind, _) ->self#texi_of_Ref name kind | Superscript t -> self#texi_of_Superscript t | Subscript t -> self#texi_of_Subscript t | Odoc_info.Module_list _ -> "" | Odoc_info.Index_list -> "" | Odoc_info.Custom (s,t) -> self#texi_of_custom_text s t + | Odoc_info.Target (target, code) -> self#texi_of_Target ~target ~code method texi_of_custom_text s t = "" + method texi_of_Target ~target ~code = + if String.lowercase target = "texi" then code else "" + method texi_of_Verbatim s = s method texi_of_Raw s = self#escape s method texi_of_Code s = "@code{" ^ (self#escape s) ^ "}" @@ -470,7 +474,7 @@ class texi = Raw " " ; Raw s ; Raw ": " ] @ t @ [ Newline ] ) params_list) - method text_of_raised_exceptions = function + method! text_of_raised_exceptions = function | [] -> [] | (s, t) :: [] -> [ linebreak ; @@ -486,12 +490,12 @@ class texi = (fun (ex, desc) ->(Code ex) :: (Raw " ") :: desc ) l ) ; Newline ] - method text_of_return_opt = function + method! text_of_return_opt = function | None -> [] | Some t -> (Bold [Raw Odoc_messages.returns ]) :: Raw " " :: t @ [ Newline ] - method text_of_custom c_l = + method! text_of_custom c_l = List.flatten (List.rev (List.fold_left @@ -505,7 +509,7 @@ class texi = acc ) [] c_l)) - method text_of_info ?(block=false) = function + method! text_of_info ?(block=false) = function | None -> [] | Some info -> let t = @@ -555,7 +559,7 @@ class texi = (self#relative_idents m_name (Odoc_info.string_of_type_expr typ))) - method text_of_short_type_expr m_name typ = + method! text_of_short_type_expr m_name typ = [ Raw (self#normal_type m_name typ) ] (** Return Texinfo code for a value. *) @@ -716,7 +720,7 @@ class texi = then " = " ^ (resolve_alias_name m) else "" ) ] ] ; ( if is_alias_there m - then [ Ref (resolve_alias_name m, Some RK_module) ; + then [ Ref (resolve_alias_name m, Some RK_module, None) ; Newline ; ] else [] ) ; ( if is_alias m @@ -745,7 +749,7 @@ class texi = then " = " ^ (resolve_alias_name mt) else "" ) ] ] ; ( if is_alias_there mt - then [ Ref (resolve_alias_name mt, Some RK_module_type) ; + then [ Ref (resolve_alias_name mt, Some RK_module_type, None) ; Newline ; ] else [] ) ; ( if is_alias mt @@ -764,10 +768,10 @@ class texi = [ Raw im.im_name ] | Some (Mod { m_name = name }) -> [ Raw name ; Raw "\n " ; - Ref (name, Some RK_module) ] + Ref (name, Some RK_module, None) ] | Some (Modtype { mt_name = name }) -> [ Raw name ; Raw "\n " ; - Ref (name, Some RK_module_type) ] + Ref (name, Some RK_module_type, None) ] ) @ [ Newline ] @ (self#text_of_info im.im_info) @@ -782,7 +786,7 @@ class texi = let t = [ self#fixedblock [ Newline ; minus ; Raw "class " ; Raw (Name.simple c.cl_name) ] ; - Ref (c.cl_name, Some RK_class) ; Newline ; + Ref (c.cl_name, Some RK_class, None) ; Newline ; Newline ] @ (self#text_of_info c.cl_info) in self#texi_of_text t @@ -792,7 +796,7 @@ class texi = let t = [ self#fixedblock [ Newline ; minus ; Raw "class type " ; Raw (Name.simple ct.clt_name) ] ; - Ref (ct.clt_name, Some RK_class_type) ; Newline ; + Ref (ct.clt_name, Some RK_class_type, None) ; Newline ; Newline ] @ (self#text_of_info ct.clt_info) in self#texi_of_text t @@ -836,7 +840,7 @@ class texi = | Cl _ -> Some RK_class | Cltype _ -> Some RK_class_type in (Code inh.ic_name) :: - (Ref (inh.ic_name, kind)) :: + (Ref (inh.ic_name, kind, None)) :: ( match inh.ic_text with | None -> [] | Some t -> Newline :: t) diff --git a/ocamldoc/odoc_text.ml b/ocamldoc/odoc_text.ml index 234c2eec..b50a2dbd 100644 --- a/ocamldoc/odoc_text.ml +++ b/ocamldoc/odoc_text.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_text.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) exception Text_syntax of int * int * string (* line, char, string *) @@ -33,7 +33,7 @@ module Texter = let count s c = let count = ref 0 in for i = 0 to String.length s - 1 do - if s.[i] = c then incr count + if s.[i] = c then incr count done; !count @@ -42,13 +42,13 @@ module Texter = let len = String.length s in let b = Buffer.create (len + n) in for i = 0 to len - 1 do - if s.[i] = c && !remain > 0 then - ( - Printf.bprintf b "\\%c" c; - decr remain - ) - else - Buffer.add_char b s.[i] + if s.[i] = c && !remain > 0 then + ( + Printf.bprintf b "\\%c" c; + decr remain + ) + else + Buffer.add_char b s.[i] done; Buffer.contents b @@ -56,22 +56,22 @@ module Texter = let open_brackets = count s '[' in let close_brackets = count s ']' in if open_brackets > close_brackets then - escape_n s '[' (open_brackets - close_brackets) + escape_n s '[' (open_brackets - close_brackets) else - if close_brackets > open_brackets then - escape_n s ']' (close_brackets - open_brackets) - else - s + if close_brackets > open_brackets then + escape_n s ']' (close_brackets - open_brackets) + else + s let escape_raw s = let len = String.length s in let b = Buffer.create len in for i = 0 to len - 1 do - match s.[i] with - '[' | ']' | '{' | '}' -> - Printf.bprintf b "\\%c" s.[i] - | c -> - Buffer.add_char b c + match s.[i] with + '[' | ']' | '{' | '}' -> + Printf.bprintf b "\\%c" s.[i] + | c -> + Buffer.add_char b c done; Buffer.contents b @@ -82,8 +82,8 @@ module Texter = and p_list b l = List.iter - (fun t -> p b "{- " ; p_text b t ; p b "}\n") - l + (fun t -> p b "{- " ; p_text b t ; p b "}\n") + l and p_text_element b = function | Raw s -> p b "%s" (escape_raw s) @@ -101,49 +101,60 @@ module Texter = | Newline -> p b "\n" | Block t -> p_text b t | Title (n, l_opt, t) -> - p b "{%d%s " - n - (match l_opt with - None -> "" - | Some s -> ":"^s - ); - p_text b t ; - p b "}" + p b "{%d%s " + n + (match l_opt with + None -> "" + | Some s -> ":"^s + ); + p_text b t ; + p b "}" | Latex s -> p b "{%% %s%%}" s | Link (s,t) -> - p b "{{:%s}" s; - p_text b t ; - p b "}" - | Ref (s,None) -> - p b "{!%s}" s - | Ref (s, Some k) -> - ( - let sk = match k with - RK_module -> "module" - | RK_module_type -> "modtype" - | RK_class -> "class" - | RK_class_type -> "classtype" - | RK_value -> "val" - | RK_type -> "type" - | RK_exception -> "exception" - | RK_attribute -> "attribute" - | RK_method -> "method" - | RK_section _ -> "section" - in - p b "{!%s:%s}" sk s - ) + p b "{{:%s}" s; + p_text b t ; + p b "}" + | Ref (name, kind_opt, text_opt) -> + begin + p b "%s{!%s%s}" + (match text_opt with None -> "" | Some _ -> "{") + (match kind_opt with + None -> "" + | Some k -> + let s = + match k with + RK_module -> "module" + | RK_module_type -> "modtype" + | RK_class -> "class" + | RK_class_type -> "classtype" + | RK_value -> "val" + | RK_type -> "type" + | RK_exception -> "exception" + | RK_attribute -> "attribute" + | RK_method -> "method" + | RK_section _ -> "section" + in + s^":" + ) + name; + match text_opt with + None -> () + | Some t -> p_text b t; p b "}" + end | Superscript t -> p b "{^" ; p_text b t ; p b "}" | Subscript t -> p b "{_" ; p_text b t ; p b "}" | Module_list l -> - p b "{!modules:"; - List.iter (fun s -> p b " %s" s) l; - p b "}" - | Index_list -> - p b "{!indexlist}" - | Custom (s,t) -> - p b "{%s " s; - p_text b t; - p b "}" + p b "{!modules:"; + List.iter (fun s -> p b " %s" s) l; + p b "}" + | Index_list -> + p b "{!indexlist}" + | Custom (s,t) -> + p b "{%s " s; + p_text b t; + p b "}" + | Target (target, code) -> + p b "{%%%s: %s}" target (escape_raw code) let string_of_text s = let b = Buffer.create 256 in diff --git a/ocamldoc/odoc_text.mli b/ocamldoc/odoc_text.mli index cea7d50e..f4f8e911 100644 --- a/ocamldoc/odoc_text.mli +++ b/ocamldoc/odoc_text.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_text.mli 5974 2003-11-24 21:20:51Z guesdon $ *) +(* $Id$ *) (** A module with a function to parse strings to obtain a [Odoc_types.text] value. *) @@ -17,8 +17,8 @@ exception Text_syntax of int * int * string (* line, char, string *) (** Transformation of strings to text structures. *) -module Texter : - sig - val text_of_string : string -> Odoc_types.text +module Texter : + sig + val text_of_string : string -> Odoc_types.text val string_of_text : Odoc_types.text -> string end diff --git a/ocamldoc/odoc_text_lexer.mll b/ocamldoc/odoc_text_lexer.mll index 34a8dfe4..9108c5e6 100644 --- a/ocamldoc/odoc_text_lexer.mll +++ b/ocamldoc/odoc_text_lexer.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_text_lexer.mll 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) (** The lexer for string to build text structures. *) @@ -52,9 +52,9 @@ let open_brackets = ref 0 like a string when we're in verbatim mode.*) let verb_mode = ref false -(** this flag indicates if we're in latex mode or not, to handle any special expression - like a string when we're in latex mode.*) -let latex_mode = ref false +(** this flag indicates if we're in "target format" mode or not, to handle any special expression + like a string when we're in this mode.*) +let target_mode = ref false (** this flag indicates if we're in shortcut list mode or not, to handle end_shortcut_list correctly.*) let shortcut_list_mode = ref false @@ -68,7 +68,7 @@ let code_pre_mode = ref false let init () = open_brackets := 0; verb_mode := false; - latex_mode := false; + target_mode := false; shortcut_list_mode := false; ele_ref_mode := false ; code_pre_mode := false ; @@ -140,8 +140,9 @@ let begin_list = "{ul"blank_nl? | html_list let begin_enum = "{ol"blank_nl? | html_enum let begin_item = "{li"blank_nl | "{- " | html_item let begin_link = "{{:" +let begin_target = "{%"['a'-'z''A'-'Z''0'-'9''-''_']+":"blank_nl? let begin_latex = "{%"blank_nl -let end_latex = "%}" +let end_target = "%}" let begin_code = "[" | html_code let end_code = "]" | html_end_code let begin_code_pre = "{[" @@ -185,7 +186,7 @@ rule main = parse { print_DEBUG "end"; incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) then Char (Lexing.lexeme lexbuf) else @@ -199,7 +200,7 @@ rule main = parse { print_DEBUG "begin_title"; incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -228,7 +229,7 @@ rule main = parse | begin_bold { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -237,7 +238,7 @@ rule main = parse | begin_italic { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -246,7 +247,7 @@ rule main = parse | begin_link { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -255,7 +256,7 @@ rule main = parse | begin_emp { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -264,7 +265,7 @@ rule main = parse | begin_superscript { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -273,7 +274,7 @@ rule main = parse | begin_subscript { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -282,7 +283,7 @@ rule main = parse | begin_center { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -291,7 +292,7 @@ rule main = parse | begin_left { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -300,7 +301,7 @@ rule main = parse | begin_right { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -310,7 +311,7 @@ rule main = parse { print_DEBUG "LIST"; incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -319,7 +320,7 @@ rule main = parse | begin_enum { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else @@ -329,25 +330,43 @@ rule main = parse { print_DEBUG "ITEM"; incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else ITEM } +| begin_target + { + incr_cpts lexbuf ; + if !verb_mode or !target_mode or !code_pre_mode or + (!open_brackets >= 1) or !ele_ref_mode then + Char (Lexing.lexeme lexbuf) + else + ( + let s = Lexing.lexeme lexbuf in + let fmt = + let p1 = String.index s '%' in + let p2 = String.index s ':' in + String.sub s (p1 + 1) (p2 - p1 - 1) + in + target_mode := true; + Target fmt + ) + } | begin_latex { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else ( - latex_mode := true; + target_mode := true; LATEX ) } -| end_latex +| end_target { incr_cpts lexbuf ; if !verb_mode or (!open_brackets >= 1) or !code_pre_mode or @@ -355,8 +374,8 @@ rule main = parse Char (Lexing.lexeme lexbuf) else ( - latex_mode := false; - END_LATEX + target_mode := false; + END_TARGET ) } | begin_code end_code @@ -368,7 +387,7 @@ rule main = parse | begin_code { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !ele_ref_mode then + if !verb_mode or !target_mode or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else if !open_brackets <= 0 then @@ -385,7 +404,7 @@ rule main = parse | end_code { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !ele_ref_mode then + if !verb_mode or !target_mode or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else if !open_brackets > 1 then @@ -409,7 +428,7 @@ rule main = parse | begin_code_pre { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !ele_ref_mode then + if !verb_mode or !target_mode or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else ( @@ -420,29 +439,29 @@ rule main = parse | end_code_pre { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !ele_ref_mode then + if !verb_mode or !target_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - if !open_brackets >= 1 then - ( - lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - 1; + if !open_brackets >= 1 then + ( + lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - 1; lexbuf.Lexing.lex_curr_p <- - { lexbuf.Lexing.lex_curr_p with - pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 - } ; - decr char_number ; - if !open_brackets > 1 then - ( - decr open_brackets; + { lexbuf.Lexing.lex_curr_p with + pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 + } ; + decr char_number ; + if !open_brackets > 1 then + ( + decr open_brackets; Char "]" - ) - else - ( + ) + else + ( open_brackets := 0; END_CODE ) - ) - else + ) + else if !code_pre_mode then ( code_pre_mode := false; @@ -461,7 +480,7 @@ rule main = parse | begin_ele_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -479,7 +498,7 @@ rule main = parse | begin_val_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -496,7 +515,7 @@ rule main = parse | begin_typ_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -513,7 +532,7 @@ rule main = parse | begin_exc_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -530,7 +549,7 @@ rule main = parse | begin_mod_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -547,7 +566,7 @@ rule main = parse | begin_modt_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -564,7 +583,7 @@ rule main = parse | begin_cla_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -581,7 +600,7 @@ rule main = parse | begin_clt_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -598,7 +617,7 @@ rule main = parse | begin_att_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -615,7 +634,7 @@ rule main = parse | begin_met_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -632,7 +651,7 @@ rule main = parse | begin_sec_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -649,7 +668,7 @@ rule main = parse | begin_mod_list_ref { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else if not !ele_ref_mode then @@ -666,19 +685,19 @@ rule main = parse | index_list { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then + if !verb_mode or !target_mode or !code_pre_mode or !open_brackets >= 1 then Char (Lexing.lexeme lexbuf) else - if not !ele_ref_mode then + if not !ele_ref_mode then INDEX_LIST - else - Char (Lexing.lexeme lexbuf) + else + Char (Lexing.lexeme lexbuf) } | begin_verb { incr_cpts lexbuf ; - if !latex_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then + if !target_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else ( @@ -689,7 +708,7 @@ rule main = parse | end_verb { incr_cpts lexbuf ; - if !latex_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then + if !target_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else ( @@ -728,9 +747,9 @@ rule main = parse incr_cpts lexbuf ; lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - 1; lexbuf.Lexing.lex_curr_p <- - { lexbuf.Lexing.lex_curr_p with - pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 ; - } ; + { lexbuf.Lexing.lex_curr_p with + pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 ; + } ; decr line_number ; if !shortcut_list_mode then ( @@ -741,9 +760,9 @@ rule main = parse END_SHORTCUT_LIST ) else - if !latex_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode or !verb_mode then - Char (Lexing.lexeme lexbuf) - else + if !target_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode or !verb_mode then + Char (Lexing.lexeme lexbuf) + else BLANK_LINE } @@ -753,22 +772,22 @@ rule main = parse { print_DEBUG "begin_custom"; incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !target_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - let s = Lexing.lexeme lexbuf in - let tag = Odoc_misc.no_blanks s in + let s = Lexing.lexeme lexbuf in + let tag = Odoc_misc.no_blanks s in CUSTOM tag } | "{" { incr_cpts lexbuf ; - if !latex_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then + if !target_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - ERROR + LBRACE } | _ { diff --git a/ocamldoc/odoc_text_parser.mly b/ocamldoc/odoc_text_parser.mly index 4972f5b3..478cfa07 100644 --- a/ocamldoc/odoc_text_parser.mly +++ b/ocamldoc/odoc_text_parser.mly @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_text_parser.mly 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) open Odoc_types @@ -27,7 +27,6 @@ let remove_trailing_blanks s = let print_DEBUG s = print_string s; print_newline () %} -%token ERROR %token END %token Title %token BOLD @@ -48,7 +47,9 @@ let print_DEBUG s = print_string s; print_newline () %token VERB %token END_VERB %token LATEX -%token END_LATEX +%token Target +%token END_TARGET +%token LBRACE %token ELE_REF %token VAL_REF @@ -97,6 +98,20 @@ text_element_list: | text_element text_element_list { $1 :: $2 } ; +ele_ref_kind: + ELE_REF { None } +| VAL_REF { Some RK_value } +| TYP_REF { Some RK_type } +| EXC_REF { Some RK_exception } +| MOD_REF { Some RK_module } +| MODT_REF { Some RK_module_type } +| CLA_REF { Some RK_class } +| CLT_REF { Some RK_class_type } +| ATT_REF { Some RK_attribute } +| MET_REF { Some RK_method } +| SEC_REF { Some (RK_section [])} +; + text_element: Title text END { let n, l_opt = $1 in Title (n, l_opt, $2) } | BOLD text END { Bold $2 } @@ -112,61 +127,17 @@ text_element: | ENUM list END { Enum $2 } | CODE string END_CODE { Code $2 } | CODE_PRE string END_CODE_PRE { CodePre $2 } -| ELE_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, None) - } -| VAL_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_value) - } -| TYP_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_type) - } -| EXC_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_exception) - } -| MOD_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_module) - } -| MODT_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_module_type) - } -| CLA_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_class) - } -| CLT_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_class_type) - } -| ATT_REF string END { - let s2 = remove_beginning_blanks $2 in - let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_attribute) - } -| MET_REF string END { +| ele_ref_kind string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_method) + Ref (s3, $1, None) } -| SEC_REF string END { - let s2 = remove_beginning_blanks $2 in +| LBRACE ele_ref_kind string END text END { + let s2 = remove_beginning_blanks $3 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some (RK_section [])) - } + Ref (s3, $2, Some $5) + } + | MOD_LIST_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in @@ -175,7 +146,8 @@ text_element: } | INDEX_LIST { Index_list } | VERB string END_VERB { Verbatim $2 } -| LATEX string END_LATEX { Latex $2 } +| LATEX string END_TARGET { Latex $2 } +| Target string END_TARGET { Target ($1, $2) } | LINK string END text END { Link ($2, $4) } | BLANK_LINE { Newline } | BEGIN_SHORTCUT_LIST_ITEM shortcut_list END_SHORTCUT_LIST { List $2 } diff --git a/ocamldoc/odoc_to_text.ml b/ocamldoc/odoc_to_text.ml index b02b0edc..322ed441 100644 --- a/ocamldoc/odoc_to_text.ml +++ b/ocamldoc/odoc_to_text.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_to_text.ml 8927 2008-07-23 08:55:36Z guesdon $ *) +(* $Id$ *) (** Text generation. @@ -229,7 +229,7 @@ class virtual to_text = method normal_class_params m_name c = let s = Odoc_info.string_of_class_params c in self#relative_idents m_name - (Odoc_info.remove_ending_newline s) + (Odoc_info.remove_ending_newline s) (** @return [text] value to represent a [Types.type_expr].*) method text_of_type_expr module_name t = @@ -259,12 +259,12 @@ class virtual to_text = (** @return [text] value to represent parameters of a class (with arraows).*) method text_of_class_params module_name c = let t = Odoc_info.text_concat - [Newline] + [Newline] (List.map (fun s -> [Code s]) - (Str.split (Str.regexp "\n") + (Str.split (Str.regexp "\n") (self#normal_class_params module_name c)) - ) + ) in t @@ -280,10 +280,10 @@ class virtual to_text = let name = v.val_name in let s_name = Name.simple name in let s = - Format.fprintf Format.str_formatter "@[val %s :@ %s" + Format.fprintf Format.str_formatter "@[val %s :@ %s" s_name (self#normal_type (Name.father v.val_name) v.val_type); - Format.flush_str_formatter () + Format.flush_str_formatter () in [ CodePre s ] @ [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^(self#label ~no_:false s_name)^"`}\n")] @ @@ -294,12 +294,12 @@ class virtual to_text = let s_name = Name.simple a.att_value.val_name in let mod_name = Name.father a.att_value.val_name in let s = - Format.fprintf Format.str_formatter "@[val %s%s%s :@ %s" + Format.fprintf Format.str_formatter "@[val %s%s%s :@ %s" (if a.att_virtual then "virtual " else "") (if a.att_mutable then "mutable " else "") s_name - (self#normal_type mod_name a.att_value.val_type); - Format.flush_str_formatter () + (self#normal_type mod_name a.att_value.val_type); + Format.flush_str_formatter () in (CodePre s) :: [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^(self#label ~no_:false s_name)^"`}\n")] @ @@ -310,12 +310,12 @@ class virtual to_text = let s_name = Name.simple m.met_value.val_name in let mod_name = Name.father m.met_value.val_name in let s = - Format.fprintf Format.str_formatter "@[method %s%s%s :@ %s" + Format.fprintf Format.str_formatter "@[method %s%s%s :@ %s" (if m.met_private then "private " else "") (if m.met_virtual then "virtual " else "") s_name - (self#normal_type mod_name m.met_value.val_type); - Format.flush_str_formatter () + (self#normal_type mod_name m.met_value.val_type); + Format.flush_str_formatter () in (CodePre s) :: [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^(self#label ~no_:false s_name)^"`}\n")] @ @@ -332,7 +332,7 @@ class virtual to_text = Format.fprintf Format.str_formatter "@ of " ); let s = self#normal_type_list - ~par: false (Name.father e.ex_name) " * " e.ex_args + ~par: false (Name.father e.ex_name) " * " e.ex_args in let s2 = Format.fprintf Format.str_formatter "%s" s ; @@ -551,7 +551,7 @@ class virtual to_text = | Module_type_functor (p, k) -> let t1 = - [Code ("("^p.mp_name^" : ")] @ + [Code ("("^p.mp_name^" : ")] @ (self#text_of_module_type_kind p.mp_kind) @ [Code ") -> "] in diff --git a/ocamldoc/odoc_type.ml b/ocamldoc/odoc_type.ml index 9d92e51b..9d19dc67 100644 --- a/ocamldoc/odoc_type.ml +++ b/ocamldoc/odoc_type.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_type.ml 8883 2008-05-21 05:56:39Z guesdon $ *) +(* $Id$ *) (** Representation and manipulation of a type, but not class nor module type.*) @@ -39,7 +39,7 @@ type type_kind = | Type_variant of variant_constructor list (** constructors *) | Type_record of record_field list - (** fields *) + (** fields *) (** Representation of a type. *) type t_type = { @@ -53,4 +53,3 @@ type t_type = { mutable ty_loc : Odoc_types.location ; mutable ty_code : string option; } - diff --git a/ocamldoc/odoc_types.ml b/ocamldoc/odoc_types.ml index c469015e..db2778e0 100644 --- a/ocamldoc/odoc_types.ml +++ b/ocamldoc/odoc_types.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_types.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) type ref_kind = RK_module @@ -41,12 +41,13 @@ and text_element = | Title of int * string option * text | Latex of string | Link of string * text - | Ref of string * ref_kind option + | Ref of string * ref_kind option * text option | Superscript of text | Subscript of text | Module_list of string list | Index_list | Custom of string * text + | Target of string * string and text = text_element list diff --git a/ocamldoc/odoc_types.mli b/ocamldoc/odoc_types.mli index 3b9b2589..7050d42e 100644 --- a/ocamldoc/odoc_types.mli +++ b/ocamldoc/odoc_types.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_types.mli 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) (** Types for the information collected in comments. *) @@ -45,14 +45,16 @@ and text_element = (** Style number, optional label, and text. *) | Latex of string (** A string for latex. *) | Link of string * text (** A reference string and the link text. *) - | Ref of string * ref_kind option - (** A reference to an element. Complete name and kind. *) + | Ref of string * ref_kind option * text option + (** A reference to an element. Complete name and kind. An optional + text can be given to display this text instead of the element name.*) | Superscript of text (** Superscripts. *) | Subscript of text (** Subscripts. *) | Module_list of string list (** The table of the given modules with their abstract; *) | Index_list (** The links to the various indexes (values, types, ...) *) | Custom of string * text (** to extend \{foo syntax *) + | Target of string * string (** (target, code) : to specify code for a specific target format *) (** [text] is a list of text_elements. The order matters. *) and text = text_element list diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index c88c0d37..a210f085 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_value.ml 8927 2008-07-23 08:55:36Z guesdon $ *) +(* $Id$ *) (** Representation and manipulation of values, class attributes and class methods. *) @@ -75,7 +75,7 @@ let parameter_list_from_arrows typ = (l, t1) :: (iter t2) | Types.Tlink texp | Types.Tsubst texp -> - iter texp + iter texp | Types.Tpoly (texp, _) -> iter texp | Types.Tvar | Types.Ttuple _ @@ -84,6 +84,7 @@ let parameter_list_from_arrows typ = | Types.Tfield _ | Types.Tnil | Types.Tunivar + | Types.Tpackage _ | Types.Tvariant _ -> [] in @@ -141,5 +142,3 @@ let is_function v = false in f v.val_type - - diff --git a/ocamldoc/remove_DEBUG b/ocamldoc/remove_DEBUG index be5a4987..78b11e61 100755 --- a/ocamldoc/remove_DEBUG +++ b/ocamldoc/remove_DEBUG @@ -11,7 +11,7 @@ #(* *) #(***********************************************************************) -# $Id: remove_DEBUG 9312 2009-07-09 17:09:48Z doligez $ +# $Id$ # usage: remove_DEBUG # remove from every line that contains the string "DEBUG", diff --git a/ocamldoc/runocamldoc b/ocamldoc/runocamldoc index 5638297b..a71d705c 100644 --- a/ocamldoc/runocamldoc +++ b/ocamldoc/runocamldoc @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: runocamldoc 5029 2002-07-23 14:12:03Z doligez $ +# $Id$ case "$1" in true) shift diff --git a/otherlibs/Makefile b/otherlibs/Makefile index e769c161..c5db1981 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8489 2007-11-08 09:17:48Z frisch $ +# $Id$ # Common Makefile for otherlibs on the Unix ports diff --git a/otherlibs/Makefile.nt b/otherlibs/Makefile.nt index 97c50894..32aca21c 100644 --- a/otherlibs/Makefile.nt +++ b/otherlibs/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8489 2007-11-08 09:17:48Z frisch $ +# $Id$ # Common Makefile for otherlibs on the Win32/MinGW ports @@ -22,4 +22,3 @@ CFLAGS=-I$(ROOTDIR)/byterun $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) include ../Makefile.shared # Note .. is the current directory (this makefile is included from # a subdirectory) - diff --git a/otherlibs/Makefile.shared b/otherlibs/Makefile.shared index b235cc3d..7e6780b3 100644 --- a/otherlibs/Makefile.shared +++ b/otherlibs/Makefile.shared @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.shared 8916 2008-07-15 15:31:32Z frisch $ +# $Id$ # Common Makefile for otherlibs diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index eb76fc5f..11e339d3 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -27,6 +27,6 @@ mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/config.h \ ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/misc.h \ ../../byterun/mlvalues.h ../../byterun/sys.h ../../byterun/misc.h \ ../unix/unixsupport.h -bigarray.cmi: -bigarray.cmo: bigarray.cmi -bigarray.cmx: bigarray.cmi +bigarray.cmi: +bigarray.cmo: bigarray.cmi +bigarray.cmx: bigarray.cmi diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile index 81f5aef2..38914ff3 100644 --- a/otherlibs/bigarray/Makefile +++ b/otherlibs/bigarray/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8748 2008-01-04 09:52:27Z xleroy $ +# $Id$ LIBNAME=bigarray EXTRACFLAGS=-I../unix -DIN_OCAML_BIGARRAY -DCAML_NAME_SPACE diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt index 94ef9ddd..78f3fc6b 100644 --- a/otherlibs/bigarray/Makefile.nt +++ b/otherlibs/bigarray/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8754 2008-01-04 15:01:48Z xleroy $ +# $Id$ LIBNAME=bigarray EXTRACFLAGS=-I../win32unix -DIN_OCAML_BIGARRAY -DCAML_NAME_SPACE diff --git a/otherlibs/bigarray/bigarray.h b/otherlibs/bigarray/bigarray.h index 2078a4f1..407a5377 100644 --- a/otherlibs/bigarray/bigarray.h +++ b/otherlibs/bigarray/bigarray.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bigarray.h 9123 2008-11-09 09:03:51Z xleroy $ */ +/* $Id$ */ #ifndef CAML_BIGARRAY_H #define CAML_BIGARRAY_H diff --git a/otherlibs/bigarray/bigarray.ml b/otherlibs/bigarray/bigarray.ml index 201e69da..09ae8bd1 100644 --- a/otherlibs/bigarray/bigarray.ml +++ b/otherlibs/bigarray/bigarray.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: bigarray.ml 8911 2008-07-14 09:09:53Z xleroy $ *) +(* $Id$ *) (* Module [Bigarray]: large, multi-dimensional, numerical arrays *) diff --git a/otherlibs/bigarray/bigarray.mli b/otherlibs/bigarray/bigarray.mli index 0c6cb05a..a49923ae 100644 --- a/otherlibs/bigarray/bigarray.mli +++ b/otherlibs/bigarray/bigarray.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: bigarray.mli 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) (** Large, multi-dimensional, numerical arrays. diff --git a/otherlibs/bigarray/bigarray_stubs.c b/otherlibs/bigarray/bigarray_stubs.c index 9e4774ee..9de2def1 100644 --- a/otherlibs/bigarray/bigarray_stubs.c +++ b/otherlibs/bigarray/bigarray_stubs.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bigarray_stubs.c 9123 2008-11-09 09:03:51Z xleroy $ */ +/* $Id$ */ #include #include @@ -201,7 +201,7 @@ CAMLprim value caml_ba_create(value vkind, value vlayout, value vdim) caml_invalid_argument("Bigarray.create: bad number of dimensions"); for (i = 0; i < num_dims; i++) { dim[i] = Long_val(Field(vdim, i)); - if (dim[i] < 0) + if (dim[i] < 0) caml_invalid_argument("Bigarray.create: negative dimension"); } flags = Int_val(vkind) | Int_val(vlayout); @@ -697,7 +697,7 @@ static void caml_ba_serialize_longarray(void * data, caml_serialize_block_8(data, num_elts); } else { caml_serialize_int_1(0); - for (n = 0, p = data; n < num_elts; n++, p++) + for (n = 0, p = data; n < num_elts; n++, p++) caml_serialize_int_4((int32) *p); } #else @@ -765,7 +765,7 @@ static void caml_ba_deserialize_longarray(void * dest, intnat num_elts) caml_deserialize_block_8(dest, num_elts); } else { intnat * p, n; - for (n = 0, p = dest; n < num_elts; n++, p++) + for (n = 0, p = dest; n < num_elts; n++, p++) *p = caml_deserialize_sint_4(); } #else diff --git a/otherlibs/bigarray/mmap_unix.c b/otherlibs/bigarray/mmap_unix.c index cc8b4333..f75e6357 100644 --- a/otherlibs/bigarray/mmap_unix.c +++ b/otherlibs/bigarray/mmap_unix.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mmap_unix.c 8754 2008-01-04 15:01:48Z xleroy $ */ +/* $Id$ */ #include #include @@ -65,10 +65,17 @@ CAMLprim value caml_ba_map_file(value vfd, value vkind, value vlayout, caml_invalid_argument("Bigarray.create: negative dimension"); } /* Determine file size */ + caml_enter_blocking_section(); currpos = lseek(fd, 0, SEEK_CUR); - if (currpos == -1) caml_sys_error(NO_ARG); + if (currpos == -1) { + caml_leave_blocking_section(); + caml_sys_error(NO_ARG); + } file_size = lseek(fd, 0, SEEK_END); - if (file_size == -1) caml_sys_error(NO_ARG); + if (file_size == -1) { + caml_leave_blocking_section(); + caml_sys_error(NO_ARG); + } /* Determine array size in bytes (or size of array without the major dimension if that dimension wasn't specified) */ array_size = caml_ba_element_size[flags & CAML_BA_KIND_MASK]; @@ -77,20 +84,29 @@ CAMLprim value caml_ba_map_file(value vfd, value vkind, value vlayout, /* Check if the major dimension is unknown */ if (dim[major_dim] == -1) { /* Determine major dimension from file size */ - if (file_size < startpos) + if (file_size < startpos) { + caml_leave_blocking_section(); caml_failwith("Bigarray.mmap: file position exceeds file size"); + } data_size = file_size - startpos; dim[major_dim] = (uintnat) (data_size / array_size); array_size = dim[major_dim] * array_size; - if (array_size != data_size) + if (array_size != data_size) { + caml_leave_blocking_section(); caml_failwith("Bigarray.mmap: file size doesn't match array dimensions"); + } } else { /* Check that file is large enough, and grow it otherwise */ if (file_size < startpos + array_size) { - if (lseek(fd, startpos + array_size - 1, SEEK_SET) == -1) + if (lseek(fd, startpos + array_size - 1, SEEK_SET) == -1) { + caml_leave_blocking_section(); caml_sys_error(NO_ARG); + } c = 0; - if (write(fd, &c, 1) != 1) caml_sys_error(NO_ARG); + if (write(fd, &c, 1) != 1) { + caml_leave_blocking_section(); + caml_sys_error(NO_ARG); + } } } /* Restore original file position */ @@ -102,6 +118,7 @@ CAMLprim value caml_ba_map_file(value vfd, value vkind, value vlayout, shared = Bool_val(vshared) ? MAP_SHARED : MAP_PRIVATE; addr = mmap(NULL, array_size + delta, PROT_READ | PROT_WRITE, shared, fd, startpos - delta); + caml_leave_blocking_section(); if (addr == (void *) MAP_FAILED) caml_sys_error(NO_ARG); addr = (void *) ((uintnat) addr + delta); /* Build and return the Caml bigarray */ diff --git a/otherlibs/bigarray/mmap_win32.c b/otherlibs/bigarray/mmap_win32.c index b1a024cd..efb44fe5 100644 --- a/otherlibs/bigarray/mmap_win32.c +++ b/otherlibs/bigarray/mmap_win32.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mmap_win32.c 8773 2008-01-15 14:55:15Z frisch $ */ +/* $Id$ */ #include #include @@ -111,7 +111,7 @@ CAMLprim value caml_ba_map_file(value vfd, value vkind, value vlayout, delta = (uintnat) (startpos % sysinfo.dwPageSize); /* Map the mapping in memory */ li.QuadPart = startpos - delta; - addr = + addr = MapViewOfFile(fmap, mode, li.HighPart, li.LowPart, array_size + delta); if (addr == NULL) caml_ba_sys_error(); addr = (void *) ((uintnat) addr + delta); diff --git a/otherlibs/db/.depend b/otherlibs/db/.depend index 5d94dce5..ba0e54e5 100644 --- a/otherlibs/db/.depend +++ b/otherlibs/db/.depend @@ -1,2 +1,2 @@ -db.cmo: db.cmi -db.cmx: db.cmi +db.cmo: db.cmi +db.cmx: db.cmi diff --git a/otherlibs/dbm/.depend b/otherlibs/dbm/.depend index 2092fbac..4e5750fa 100644 --- a/otherlibs/dbm/.depend +++ b/otherlibs/dbm/.depend @@ -1,3 +1,3 @@ -dbm.cmi: -dbm.cmo: dbm.cmi -dbm.cmx: dbm.cmi +dbm.cmi: +dbm.cmo: dbm.cmi +dbm.cmx: dbm.cmi diff --git a/otherlibs/dbm/Makefile b/otherlibs/dbm/Makefile index dbfb1b1b..099327d6 100644 --- a/otherlibs/dbm/Makefile +++ b/otherlibs/dbm/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 9214 2009-03-31 11:33:25Z xleroy $ +# $Id$ # Makefile for the ndbm library diff --git a/otherlibs/dbm/cldbm.c b/otherlibs/dbm/cldbm.c index 9fa5be2b..0d6cb362 100644 --- a/otherlibs/dbm/cldbm.c +++ b/otherlibs/dbm/cldbm.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: cldbm.c 5670 2003-07-08 13:50:31Z xleroy $ */ +/* $Id$ */ #include #include @@ -65,7 +65,7 @@ value caml_dbm_open(value vfile, value vflags, value vmode) /* ML */ int mode = Int_val(vmode); DBM *db = dbm_open(file,flags,mode); - if (db == NULL) + if (db == NULL) raise_dbm("Can't open file"); else return (alloc_dbm(db)); @@ -97,7 +97,7 @@ value caml_dbm_fetch(value vdb, value vkey) /* ML */ value caml_dbm_insert(value vdb, value vkey, value vcontent) /* ML */ { datum key, content; - + key.dptr = String_val(vkey); key.dsize = string_length(vkey); content.dptr = String_val(vcontent); @@ -116,7 +116,7 @@ value caml_dbm_insert(value vdb, value vkey, value vcontent) /* ML */ value caml_dbm_replace(value vdb, value vkey, value vcontent) /* ML */ { datum key, content; - + key.dptr = String_val(vkey); key.dsize = string_length(vkey); content.dptr = String_val(vcontent); diff --git a/otherlibs/dbm/dbm.ml b/otherlibs/dbm/dbm.ml index 7ecc0c4f..f31d2993 100644 --- a/otherlibs/dbm/dbm.ml +++ b/otherlibs/dbm/dbm.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dbm.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) type t @@ -24,7 +24,7 @@ type dbm_flag = exception Dbm_error of string -external raw_opendbm : string -> open_flag list -> int -> t +external raw_opendbm : string -> open_flag list -> int -> t = "caml_dbm_open" let opendbm file flags mode = @@ -52,7 +52,7 @@ let iter f t = let rec walk = function None -> () | Some k -> - f k (find t k); + f k (find t k); walk (try Some(nextkey t) with Not_found -> None) in walk (try Some(firstkey t) with Not_found -> None) diff --git a/otherlibs/dbm/dbm.mli b/otherlibs/dbm/dbm.mli index 059c8588..f9924427 100644 --- a/otherlibs/dbm/dbm.mli +++ b/otherlibs/dbm/dbm.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dbm.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Interface to the NDBM database. *) @@ -19,7 +19,7 @@ type t (** The type of file descriptors opened on NDBM databases. *) -type open_flag = +type open_flag = Dbm_rdonly | Dbm_wronly | Dbm_rdwr @@ -77,4 +77,3 @@ val iter : (string -> string -> 'a) -> t -> unit (** [iter f db] applies [f] to each ([key], [data]) pair in the database [db]. [f] receives [key] as first argument and [data] as second argument. *) - diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index c7c06624..21771b59 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8868 2008-04-16 06:50:31Z frisch $ +# $Id$ # Makefile for the dynamic link library @@ -93,4 +93,4 @@ clean: partialclean depend: dynlink.cmo: dynlinkaux.cmi dynlink.cmi -extract_crc.cmo: dynlink.cmi +extract_crc.cmo: dynlink.cmi diff --git a/otherlibs/dynlink/Makefile.nt b/otherlibs/dynlink/Makefile.nt index 8dc4aee6..3d8b84b7 100644 --- a/otherlibs/dynlink/Makefile.nt +++ b/otherlibs/dynlink/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ # Makefile for the dynamic link library diff --git a/otherlibs/dynlink/dynlink.ml b/otherlibs/dynlink/dynlink.ml index e3406157..376104c1 100644 --- a/otherlibs/dynlink/dynlink.ml +++ b/otherlibs/dynlink/dynlink.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dynlink.ml 8873 2008-04-22 12:24:10Z frisch $ *) +(* $Id$ *) (* Dynamic loading of .cmo files *) @@ -197,10 +197,14 @@ let load_compunit ic file_name compunit = let loadfile file_name = init(); + if not (Sys.file_exists file_name) then raise(Error (File_not_found file_name)); let ic = open_in_bin file_name in try let buffer = String.create (String.length Config.cmo_magic_number) in - really_input ic buffer 0 (String.length Config.cmo_magic_number); + begin + try really_input ic buffer 0 (String.length Config.cmo_magic_number) + with End_of_file -> raise(Error(Not_a_bytecode_file file_name)) + end; if buffer = Config.cmo_magic_number then begin let compunit_pos = input_binary_int ic in (* Go to descriptor *) seek_in ic compunit_pos; @@ -210,7 +214,7 @@ let loadfile file_name = let toc_pos = input_binary_int ic in (* Go to table of contents *) seek_in ic toc_pos; let lib = (input_value ic : library) in - begin try + begin try Dll.open_dlls Dll.For_execution (List.map Dll.extract_dll_name lib.lib_dllibs) with Failure reason -> diff --git a/otherlibs/dynlink/dynlink.mli b/otherlibs/dynlink/dynlink.mli index c0285939..7cca68c5 100644 --- a/otherlibs/dynlink/dynlink.mli +++ b/otherlibs/dynlink/dynlink.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dynlink.mli 8873 2008-04-22 12:24:10Z frisch $ *) +(* $Id$ *) (** Dynamic loading of object files. *) @@ -23,9 +23,9 @@ val is_native: bool val loadfile : string -> unit (** In bytecode: load the given bytecode object file ([.cmo] file) or - bytecode library file ([.cma] file), and link it with the running + bytecode library file ([.cma] file), and link it with the running program. In native code: load the given OCaml plugin file (usually - [.cmxs]), and link it with the running + [.cmxs]), and link it with the running program. All toplevel expressions in the loaded compilation units are evaluated. No facilities are provided to diff --git a/otherlibs/dynlink/extract_crc.ml b/otherlibs/dynlink/extract_crc.ml index 3884239e..e7d9139b 100644 --- a/otherlibs/dynlink/extract_crc.ml +++ b/otherlibs/dynlink/extract_crc.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: extract_crc.ml 6195 2004-04-09 13:26:41Z xleroy $ *) +(* $Id$ *) (* Print the digests of unit interfaces *) @@ -51,5 +51,3 @@ let main () = print_string "\n]\n" let _ = main(); exit 0 - - diff --git a/otherlibs/dynlink/natdynlink.ml b/otherlibs/dynlink/natdynlink.ml index 4291bcc0..184093a3 100644 --- a/otherlibs/dynlink/natdynlink.ml +++ b/otherlibs/dynlink/natdynlink.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: natdynlink.ml 8993 2008-08-28 22:17:51Z frisch $ *) +(* $Id$ *) (* Dynamic loading of .cmx files *) @@ -112,8 +112,8 @@ let default_available_units () = (fun st (name,crc_intf,crc_impl,syms) -> rank := !rank + List.length syms; { - ifaces = StrMap.add name (crc_intf,exe) st.ifaces; - implems = StrMap.add name (crc_impl,exe,Check_inited !rank) st.implems; + ifaces = StrMap.add name (crc_intf,exe) st.ifaces; + implems = StrMap.add name (crc_impl,exe,Check_inited !rank) st.implems; } ) empty_state @@ -130,44 +130,44 @@ let add_check_ifaces allow_ext filename ui ifaces = if name = ui.name then StrMap.add name (crc,filename) ifaces else - try - let (old_crc,old_src) = StrMap.find name ifaces in - if old_crc <> crc - then raise(Error(Inconsistent_import(name))) - else ifaces - with Not_found -> - if allow_ext then StrMap.add name (crc,filename) ifaces - else raise (Error(Unavailable_unit name)) + try + let (old_crc,old_src) = StrMap.find name ifaces in + if old_crc <> crc + then raise(Error(Inconsistent_import(name))) + else ifaces + with Not_found -> + if allow_ext then StrMap.add name (crc,filename) ifaces + else raise (Error(Unavailable_unit name)) ) ifaces ui.imports_cmi let check_implems filename ui implems = List.iter (fun (name, crc) -> match name with - |"Out_of_memory" - |"Sys_error" - |"Failure" - |"Invalid_argument" - |"End_of_file" - |"Division_by_zero" - |"Not_found" - |"Match_failure" - |"Stack_overflow" - |"Sys_blocked_io" - |"Assert_failure" - |"Undefined_recursive_module" -> () - | _ -> + |"Out_of_memory" + |"Sys_error" + |"Failure" + |"Invalid_argument" + |"End_of_file" + |"Division_by_zero" + |"Not_found" + |"Match_failure" + |"Stack_overflow" + |"Sys_blocked_io" + |"Assert_failure" + |"Undefined_recursive_module" -> () + | _ -> try - let (old_crc,old_src,state) = StrMap.find name implems in - if crc <> cmx_not_found_crc && old_crc <> crc - then raise(Error(Inconsistent_implementation(name))) - else match state with - | Check_inited i -> - if ndl_globals_inited() < i - then raise(Error(Unavailable_unit name)) - | Loaded -> () + let (old_crc,old_src,state) = StrMap.find name implems in + if crc <> cmx_not_found_crc && old_crc <> crc + then raise(Error(Inconsistent_implementation(name))) + else match state with + | Check_inited i -> + if ndl_globals_inited() < i + then raise(Error(Unavailable_unit name)) + | Loaded -> () with Not_found -> - raise (Error(Unavailable_unit name)) + raise (Error(Unavailable_unit name)) ) ui.imports_cmx let loadunits filename handle units state = @@ -178,8 +178,8 @@ let loadunits filename handle units state = let new_implems = List.fold_left (fun accu ui -> - check_implems filename ui accu; - StrMap.add ui.name (ui.crc,filename,Loaded) accu) + check_implems filename ui accu; + StrMap.add ui.name (ui.crc,filename,Loaded) accu) state.implems units in let defines = List.flatten (List.map (fun ui -> ui.defines) units) in @@ -203,8 +203,8 @@ let allow_only names = let ifaces = List.fold_left (fun ifaces name -> - try StrMap.add name (StrMap.find name old) ifaces - with Not_found -> ifaces) + try StrMap.add name (StrMap.find name old) ifaces + with Not_found -> ifaces) StrMap.empty names in global_state := { !global_state with ifaces = ifaces }; allow_extension := false diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index d8905153..31398124 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -144,9 +144,9 @@ text.o: text.c libgraph.h \ ../../byterun/config.h ../../byterun/alloc.h \ ../../byterun/compatibility.h ../../byterun/misc.h \ ../../byterun/mlvalues.h -graphics.cmi: -graphicsX11.cmi: -graphics.cmo: graphics.cmi -graphics.cmx: graphics.cmi -graphicsX11.cmo: graphics.cmi graphicsX11.cmi -graphicsX11.cmx: graphics.cmx graphicsX11.cmi +graphics.cmi: +graphicsX11.cmi: +graphics.cmo: graphics.cmi +graphics.cmx: graphics.cmi +graphicsX11.cmo: graphics.cmi graphicsX11.cmi +graphicsX11.cmx: graphics.cmx graphicsX11.cmi diff --git a/otherlibs/graph/Makefile b/otherlibs/graph/Makefile index fac25018..2be98446 100644 --- a/otherlibs/graph/Makefile +++ b/otherlibs/graph/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8490 2007-11-08 09:23:06Z frisch $ +# $Id$ # Makefile for the portable graphics library diff --git a/otherlibs/graph/color.c b/otherlibs/graph/color.c index fa00f3e3..0dc29670 100644 --- a/otherlibs/graph/color.c +++ b/otherlibs/graph/color.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: color.c 6299 2004-05-17 17:10:00Z doligez $ */ +/* $Id$ */ #include "libgraph.h" #include @@ -70,23 +70,23 @@ void caml_gr_init_direct_rgb_to_pixel(void) { Visual *visual; int i; - + visual = DefaultVisual(caml_gr_display,caml_gr_screen); - + if ( visual->class == TrueColor || visual->class == DirectColor ){ caml_gr_red_mask = visual->red_mask; caml_gr_green_mask = visual->green_mask; caml_gr_blue_mask = visual->blue_mask; - + #ifdef QUICKCOLORDEBUG - fprintf(stderr, "visual %lx %lx %lx\n", - caml_gr_red_mask, - caml_gr_green_mask, + fprintf(stderr, "visual %lx %lx %lx\n", + caml_gr_red_mask, + caml_gr_green_mask, caml_gr_blue_mask); #endif - caml_gr_get_shifts(caml_gr_red_mask, &caml_gr_red_l, &caml_gr_red_r); + caml_gr_get_shifts(caml_gr_red_mask, &caml_gr_red_l, &caml_gr_red_r); #ifdef QUICKCOLORDEBUG fprintf(stderr, "red %d %d\n", caml_gr_red_l, caml_gr_red_r); #endif @@ -94,7 +94,7 @@ void caml_gr_init_direct_rgb_to_pixel(void) caml_gr_red_vals[i] = (((i << 8) + i) >> caml_gr_red_r) << caml_gr_red_l; } - caml_gr_get_shifts(caml_gr_green_mask, &caml_gr_green_l, &caml_gr_green_r); + caml_gr_get_shifts(caml_gr_green_mask, &caml_gr_green_l, &caml_gr_green_r); #ifdef QUICKCOLORDEBUG fprintf(stderr, "green %d %d\n", caml_gr_green_l, caml_gr_green_r); #endif @@ -102,16 +102,16 @@ void caml_gr_init_direct_rgb_to_pixel(void) caml_gr_green_vals[i] = (((i << 8) + i) >> caml_gr_green_r) << caml_gr_green_l; } - caml_gr_get_shifts(caml_gr_blue_mask, &caml_gr_blue_l, &caml_gr_blue_r); + caml_gr_get_shifts(caml_gr_blue_mask, &caml_gr_blue_l, &caml_gr_blue_r); #ifdef QUICKCOLORDEBUG fprintf(stderr, "blue %d %d\n", caml_gr_blue_l, caml_gr_blue_r); #endif for(i=0; i<256; i++){ caml_gr_blue_vals[i] = (((i << 8) + i) >> caml_gr_blue_r) << caml_gr_blue_l; } - - if( caml_gr_red_l < 0 || caml_gr_red_r < 0 || - caml_gr_green_l < 0 || caml_gr_green_r < 0 || + + if( caml_gr_red_l < 0 || caml_gr_red_r < 0 || + caml_gr_green_l < 0 || caml_gr_green_r < 0 || caml_gr_blue_l < 0 || caml_gr_blue_r < 0 ){ #ifdef QUICKCOLORDEBUG fprintf(stderr, "Damn, boost failed\n"); @@ -186,7 +186,7 @@ unsigned long caml_gr_pixel_rgb(int rgb) int caml_gr_rgb_pixel(long unsigned int pixel) { register int r,g,b; - + XColor color; int i; diff --git a/otherlibs/graph/draw.c b/otherlibs/graph/draw.c index c5c5578b..35a4ae17 100644 --- a/otherlibs/graph/draw.c +++ b/otherlibs/graph/draw.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: draw.c 6351 2004-05-30 14:11:41Z xleroy $ */ +/* $Id$ */ #include "libgraph.h" #include diff --git a/otherlibs/graph/dump_img.c b/otherlibs/graph/dump_img.c index 484901c8..8c82c21b 100644 --- a/otherlibs/graph/dump_img.c +++ b/otherlibs/graph/dump_img.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dump_img.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" #include "image.h" diff --git a/otherlibs/graph/events.c b/otherlibs/graph/events.c index 6e8a9ce4..d9563a39 100644 --- a/otherlibs/graph/events.c +++ b/otherlibs/graph/events.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: events.c 7019 2005-08-13 20:59:37Z doligez $ */ +/* $Id$ */ #include #include "libgraph.h" @@ -165,7 +165,7 @@ static value caml_gr_wait_event_poll(void) mouse_x = -1; mouse_y = -1; } - button = modifiers & (Button1Mask | Button2Mask | Button3Mask + button = modifiers & (Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask); /* Look inside event queue for pending KeyPress events */ key = 0; diff --git a/otherlibs/graph/fill.c b/otherlibs/graph/fill.c index 67777057..0430c14a 100644 --- a/otherlibs/graph/fill.c +++ b/otherlibs/graph/fill.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fill.c 6351 2004-05-30 14:11:41Z xleroy $ */ +/* $Id$ */ #include "libgraph.h" #include diff --git a/otherlibs/graph/graphics.ml b/otherlibs/graph/graphics.ml index 050638ad..96a24716 100644 --- a/otherlibs/graph/graphics.ml +++ b/otherlibs/graph/graphics.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: graphics.ml 7019 2005-08-13 20:59:37Z doligez $ *) +(* $Id$ *) exception Graphic_failure of string @@ -253,4 +253,3 @@ let curveto b c (x, y as d) = draw_poly_line (Array.of_list (List.map int_point points)); moveto x y;; - diff --git a/otherlibs/graph/graphics.mli b/otherlibs/graph/graphics.mli index e25e742f..23d61a39 100644 --- a/otherlibs/graph/graphics.mli +++ b/otherlibs/graph/graphics.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: graphics.mli 7019 2005-08-13 20:59:37Z doligez $ *) +(* $Id$ *) (** Machine-independent graphics primitives. *) @@ -193,12 +193,12 @@ external draw_string : string -> unit = "caml_gr_draw_string" external set_font : string -> unit = "caml_gr_set_font" (** Set the font used for drawing text. - The interpretation of the argument to [set_font] + The interpretation of the argument to [set_font] is implementation-dependent. *) val set_text_size : int -> unit (** Set the character size used for drawing text. - The interpretation of the argument to [set_text_size] + The interpretation of the argument to [set_text_size] is implementation-dependent. *) external text_size : string -> int * int = "caml_gr_text_size" @@ -281,7 +281,7 @@ type status = mouse_y : int; (** Y coordinate of the mouse *) button : bool; (** true if a mouse button is pressed *) keypressed : bool; (** true if a key has been pressed *) - key : char; (** the character for the key pressed *) + key : char; (** the character for the key pressed *) } (** To report events. *) @@ -375,5 +375,3 @@ external remember_mode : bool -> unit = "caml_gr_remember_mode" unaffected by drawings. This occurs independently of drawing onto the graphics window (see the function {!Graphics.display_mode} above). Default remember mode is on. *) - - diff --git a/otherlibs/graph/graphicsX11.ml b/otherlibs/graph/graphicsX11.ml index 8ef04cbf..85f5a436 100644 --- a/otherlibs/graph/graphicsX11.ml +++ b/otherlibs/graph/graphicsX11.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: graphicsX11.ml 6171 2004-03-24 15:02:06Z starynke $ *) +(* $Id$ *) (* Module [GraphicsX11]: additional graphics primitives for the X Windows system *) @@ -21,7 +21,7 @@ external window_id : unit -> window_id = "caml_gr_window_id" let subwindows = Hashtbl.create 13 -external open_subwindow : int -> int -> int -> int -> window_id +external open_subwindow : int -> int -> int -> int -> window_id = "caml_gr_open_subwindow" external close_subwindow : window_id -> unit = "caml_gr_close_subwindow" @@ -31,7 +31,7 @@ let open_subwindow ~x ~y ~width ~height = Hashtbl.add subwindows wid (); wid ;; - + let close_subwindow wid = if Hashtbl.mem subwindows wid then begin close_subwindow wid; @@ -39,4 +39,3 @@ let close_subwindow wid = end else raise (Graphics.Graphic_failure ("close_subwindow: no such subwindow: " ^ wid)) ;; - diff --git a/otherlibs/graph/graphicsX11.mli b/otherlibs/graph/graphicsX11.mli index 8f55d11a..11182537 100644 --- a/otherlibs/graph/graphicsX11.mli +++ b/otherlibs/graph/graphicsX11.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: graphicsX11.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Additional graphics primitives for the X Windows system. *) @@ -19,7 +19,7 @@ type window_id = string val window_id : unit -> window_id (** Return the unique identifier of the Caml graphics window. - The returned string is an unsigned 32 bits integer + The returned string is an unsigned 32 bits integer in decimal form. *) val open_subwindow : x:int -> y:int -> width:int -> height:int -> window_id @@ -28,4 +28,3 @@ val open_subwindow : x:int -> y:int -> width:int -> height:int -> window_id val close_subwindow : window_id -> unit (** Close the sub-window having the given identifier. *) - diff --git a/otherlibs/graph/image.c b/otherlibs/graph/image.c index 7bace1ee..501398b3 100644 --- a/otherlibs/graph/image.c +++ b/otherlibs/graph/image.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: image.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" #include "image.h" @@ -104,4 +104,4 @@ value caml_gr_draw_image(value im, value vx, value vy) return Val_unit; } -/* eof $Id: image.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* eof $Id$ */ diff --git a/otherlibs/graph/image.h b/otherlibs/graph/image.h index a373a2b6..539cf9f8 100644 --- a/otherlibs/graph/image.h +++ b/otherlibs/graph/image.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: image.h 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ struct grimage { int width, height; /* Dimensions of the image */ diff --git a/otherlibs/graph/libgraph.h b/otherlibs/graph/libgraph.h index ec13f1dc..d2df1c1a 100644 --- a/otherlibs/graph/libgraph.h +++ b/otherlibs/graph/libgraph.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: libgraph.h 6350 2004-05-30 10:25:08Z xleroy $ */ +/* $Id$ */ #include #include @@ -30,7 +30,7 @@ extern Colormap caml_gr_colormap; /* The color map */ extern struct canvas caml_gr_window; /* The graphics window */ extern struct canvas caml_gr_bstore; /* The pixmap used for backing store */ extern int caml_gr_white, caml_gr_black; /* Black and white pixels for X */ -extern int caml_gr_background; /* Background color for X +extern int caml_gr_background; /* Background color for X (used for CAML color -1) */ extern Bool caml_gr_display_modeflag; /* Display-mode flag */ extern Bool caml_gr_remember_modeflag; /* Remember-mode flag */ diff --git a/otherlibs/graph/make_img.c b/otherlibs/graph/make_img.c index 7a7f531f..325e6698 100644 --- a/otherlibs/graph/make_img.c +++ b/otherlibs/graph/make_img.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: make_img.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" #include "image.h" diff --git a/otherlibs/graph/open.c b/otherlibs/graph/open.c index 5039aa59..82a4c0fb 100644 --- a/otherlibs/graph/open.c +++ b/otherlibs/graph/open.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: open.c 7019 2005-08-13 20:59:37Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/graph/point_col.c b/otherlibs/graph/point_col.c index 0decdf7b..473dae7d 100644 --- a/otherlibs/graph/point_col.c +++ b/otherlibs/graph/point_col.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: point_col.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" @@ -28,5 +28,3 @@ value caml_gr_point_color(value vx, value vy) XDestroyImage(im); return Val_int(rgb); } - - diff --git a/otherlibs/graph/sound.c b/otherlibs/graph/sound.c index 1d9dc67a..dc75b7ed 100644 --- a/otherlibs/graph/sound.c +++ b/otherlibs/graph/sound.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sound.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" diff --git a/otherlibs/graph/subwindow.c b/otherlibs/graph/subwindow.c index a7c2bae9..642e28c4 100644 --- a/otherlibs/graph/subwindow.c +++ b/otherlibs/graph/subwindow.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: subwindow.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" diff --git a/otherlibs/graph/text.c b/otherlibs/graph/text.c index af63fe64..f4d980ae 100644 --- a/otherlibs/graph/text.c +++ b/otherlibs/graph/text.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: text.c 6171 2004-03-24 15:02:06Z starynke $ */ +/* $Id$ */ #include "libgraph.h" #include diff --git a/otherlibs/labltk/Makefile b/otherlibs/labltk/Makefile index 358de5b3..8c3b823c 100644 --- a/otherlibs/labltk/Makefile +++ b/otherlibs/labltk/Makefile @@ -1,6 +1,6 @@ # Top Makefile for mlTk -SUBDIRS=compiler support lib jpf frx tkanim examples_labltk \ +SUBDIRS=compiler support lib jpf frx examples_labltk \ examples_camltk browser SUBDIRS_GENERATED=camltk labltk @@ -15,7 +15,6 @@ all: cd lib; $(MAKE) cd jpf; $(MAKE) cd frx; $(MAKE) - cd tkanim; $(MAKE) cd browser; $(MAKE) allopt: @@ -27,7 +26,6 @@ allopt: cd lib; $(MAKE) opt cd jpf; $(MAKE) opt cd frx; $(MAKE) opt - cd tkanim; $(MAKE) opt byte: all opt: allopt @@ -52,7 +50,7 @@ examples_labltk: examples_camltk: cd examples_camltk; $(MAKE) all -install: +install: cd support; $(MAKE) install cd lib; $(MAKE) install cd labltk; $(MAKE) install @@ -60,7 +58,6 @@ install: cd compiler; $(MAKE) install cd jpf; $(MAKE) install cd frx; $(MAKE) install - cd tkanim; $(MAKE) install cd browser; $(MAKE) install installopt: @@ -70,9 +67,8 @@ installopt: cd camltk; $(MAKE) installopt cd jpf; $(MAKE) installopt cd frx; $(MAKE) installopt - cd tkanim; $(MAKE) installopt -partialclean clean: +partialclean clean: for d in $(SUBDIRS); do \ cd $$d; $(MAKE) -f Makefile clean; cd ..; \ done diff --git a/otherlibs/labltk/Makefile.nt b/otherlibs/labltk/Makefile.nt index 45d53919..765fabaf 100644 --- a/otherlibs/labltk/Makefile.nt +++ b/otherlibs/labltk/Makefile.nt @@ -40,7 +40,7 @@ examples_labltk: examples_camltk: cd examples_camltk; $(MAKE) all -install: +install: cd labltk ; $(MAKEREC) install cd camltk ; $(MAKEREC) install cd lib ; $(MAKEREC) install @@ -60,5 +60,5 @@ installopt: cd frx ; $(MAKEREC) installopt cd tkanim ; $(MAKEREC) installopt -partialclean clean: +partialclean clean: for d in $(SUBDIRS); do $(MAKEREC) -C $$d clean; done diff --git a/otherlibs/labltk/README b/otherlibs/labltk/README index 6f63b4a4..b556d2b3 100644 --- a/otherlibs/labltk/README +++ b/otherlibs/labltk/README @@ -15,17 +15,17 @@ mlTk = CamlTk + LablTk ====================== There existed two parallel Tcl/Tk interfaces for O'Caml, CamlTk and LablTk. -CamlTk uses classical features only, therefore it is easy to understand for +CamlTk uses classical features only, therefore it is easy to understand for the beginners of ML. It makes many conservative O'Caml gurus also happy. -LablTk, on the other hand, uses rather newer features of O'Caml, the labeled +LablTk, on the other hand, uses rather newer features of O'Caml, the labeled optional arguments and polymorphic variants. Its syntax has much more Tcl/Tk script flavor, but provides more powerful typing than CamlTk at the same time -(i.e. less run time type checking of widgets). -Until now, these two interfaces have been distributed and maintained -independently. +(i.e. less run time type checking of widgets). +Until now, these two interfaces have been distributed and maintained +independently. mlTk unifies these libraries into one. Since mlTk provides the both API's, -both CamlTk and LablTk users can compile their applications with mlTk, +both CamlTk and LablTk users can compile their applications with mlTk, just with little fixes. REQUIREMENTS @@ -48,51 +48,51 @@ INSTALLATION 1. Compile O'Caml (= make world). If you want, also make opt. -2. Untar this mlTk distribution in the otherlibs directory, just like +2. Untar this mlTk distribution in the otherlibs directory, just like the labltk source tree. 3. change directory to otherlibs/mltk, and make (and make opt) 4. To install the library, make install (and make installopt) -To compile mlTk, you need the O'Caml source tree, since mltk/camlbrowser +To compile mlTk, you need the O'Caml source tree, since mltk/camlbrowser requires some modules of O'Caml. If you are not interested in camlbrowser, you can compile mlTk without the O'Caml source tree, but you have to modify support/Makefile.common. - + Compile your CamlTk/LablTk applications with mlTk ================================================= * General -The names of the additional libraries libjpf and libfrx are changed +The names of the additional libraries libjpf and libfrx are changed to jpflib and frxlib respectively, to avoid the library name space confusion. * LablTk users -Just change the occurrences of labltk in your Makefiles to mltk +Just change the occurrences of labltk in your Makefiles to mltk (i.e. -I +labltk => -I +mltk, labltk.cma => mltk.cma, and so on) Since the API functions are 100% compatible, you need not to change -your .ml files. +your .ml files. * CamlTk users - Makefiles : apply the same modification explained above for LablTk users. - - open Camltk : The API modules and functions are stored in the modules + - open Camltk : The API modules and functions are stored in the modules Camltk. Therefore you need to replace the module name Tk to Camltk. - For example, open Tk => open Camltk. + For example, open Tk => open Camltk. open Camltk (* instead of open Tk *) - + let t = openTk ();; let b = Button.create t [];; - - - You may also need to open the Camltk module explicitly, when your - original module source contain no open Tk phrase. Widget and the other - Tcl/Tk related types are now under Camltk. (e.g. Widget.widget is now - Camltk.Widget.widget) Add open Camltk at the beginning of .mli files, + + - You may also need to open the Camltk module explicitly, when your + original module source contain no open Tk phrase. Widget and the other + Tcl/Tk related types are now under Camltk. (e.g. Widget.widget is now + Camltk.Widget.widget) Add open Camltk at the beginning of .mli files, if these types are used: open Camltk (* added for compiling under mlTk *) @@ -101,7 +101,7 @@ your .ml files. - Eta expansion to flush optional arguments at registering callbacks. Functions with the _displayof suffix are unified with their non-displayof - versions, using optional labeled arguments. For example, Bell.ring + versions, using optional labeled arguments. For example, Bell.ring had/have the following types: before: Bell.ring : unit -> unit @@ -121,9 +121,9 @@ a widget library written in the different API from you use, you need to do it. (It will be confusing, but easier than porting the library itself from one to the other API.) -For the users who mainly use LablTk API, CamlTk API is available -in the modules start with 'C'. For example, the source file of -the CamlTk button widget functions is CButton (and exported also as +For the users who mainly use LablTk API, CamlTk API is available +in the modules start with 'C'. For example, the source file of +the CamlTk button widget functions is CButton (and exported also as Camltk.Button). For the users who mainly use CamlTk API, LablTk API modules are exported @@ -144,9 +144,8 @@ type is different from the context type, a run-time exception is raised. let t = openTk ();; (* t is LablTk widget, toplevel widget *) (* CButton.create takes [any widget]; [t] must be coerced to the type. *) - let caml_b = CButton.create (coe t) [];; + let caml_b = CButton.create (coe t) [];; (* caml_b is [any widget], must be explicitly typed as [button widget], when it is used with LablTk API functions *) let b = Labltk.button caml_b in (* recover the type [button widget] *) - ... - + ... diff --git a/otherlibs/labltk/Widgets.src b/otherlibs/labltk/Widgets.src index e59c4354..abf015a2 100644 --- a/otherlibs/labltk/Widgets.src +++ b/otherlibs/labltk/Widgets.src @@ -3,14 +3,14 @@ type Widget external % cget will probably never be implemented with verifications function (string) cgets [widget; "cget"; string] -% another version with some hack is +% another version with some hack is type options_constrs external function (string) cget [widget; "cget"; options_constrs] -% constructors of type options_constrs are of the form C +% constructors of type options_constrs are of the form C % where is an option constructor (e.g. CBackground) %%%%% Some types for standard options of widgets -type Anchor { +type Anchor { NW ["nw"] N ["n"] NE ["ne"] W ["w"] Center ["center"] E ["e"] SW ["sw"] S ["s"] SE ["se"] @@ -44,18 +44,18 @@ variant type Image { ##endif -type Justification { +type Justification { Justify_Left ["left"] Justify_Center ["center"] Justify_Right ["right"] } -type Orientation { +type Orientation { Vertical ["vertical"] - Horizontal ["horizontal"] + Horizontal ["horizontal"] } -type Relief { +type Relief { Raised ["raised"] Sunken ["sunken"] Flat ["flat"] @@ -183,7 +183,7 @@ module Imagebitmap { %%%%% button(n) -type State { +type State { Normal ["normal"] Active ["active"] Disabled ["disabled"] @@ -222,7 +222,7 @@ widget button { option WrapLength % Widget specific options option Command ["-command"; function ()] - option Default ["-default"; State] + option Default ["-default"; State] option Height ["-height"; Units/int] option State ["-state"; State] option Width ["-width"; Units/int] @@ -258,7 +258,7 @@ type SearchSpec { Withtag ["withtag"; TagOrId] } -type ColorMode { +type ColorMode { Color ["color"] Gray ["gray"] Mono ["mono"] @@ -326,20 +326,20 @@ subtype option(image) { } % Line item configuration -type ArrowStyle { +type ArrowStyle { Arrow_None ["none"] Arrow_First ["first"] Arrow_Last ["last"] Arrow_Both ["both"] } -type CapStyle { +type CapStyle { Cap_Butt ["butt"] Cap_Projecting ["projecting"] Cap_Round ["round"] } -type JoinStyle { +type JoinStyle { Join_Bevel ["bevel"] Join_Miter ["miter"] Join_Round ["round"] @@ -379,7 +379,7 @@ subtype option(rectangle) { ##ifndef CAMLTK % Only for Labltk. CanvasTextState is unified as State in Camltk -type CanvasTextState { +type CanvasTextState { Normal ["normal"] Disabled ["disabled"] Hidden ["hidden"] @@ -545,7 +545,7 @@ widget canvas { %%%%% checkbutton(n) -widget checkbutton { +widget checkbutton { % Standard options option ActiveBackground option ActiveForeground @@ -628,7 +628,7 @@ module Dialog { ##ifndef CAMLTK % Only for Labltk. InputState is unified as State in Camltk -type InputState { +type InputState { Normal ["normal"] Disabled ["disabled"] } @@ -721,7 +721,7 @@ type slant { type fontMetrics { Ascent ["-ascent"] - Descent ["-descent"] + Descent ["-descent"] Linespace ["-linespace"] Fixed ["-fixed"] } @@ -738,25 +738,25 @@ subtype options(font) { %% Beware of the order of Compound ! Put it as the first option % Compound ["-compound"; [font list]] % Copy ["-copy"; string] -} +} module Font { - function (string) actual_family ["font"; "actual"; font; + function (string) actual_family ["font"; "actual"; font; ?displayof:["-displayof"; widget]; "-family"] - function (int) actual_size ["font"; "actual"; font; + function (int) actual_size ["font"; "actual"; font; ?displayof:["-displayof"; widget]; "-size"] - function (string) actual_weight ["font"; "actual"; font; + function (string) actual_weight ["font"; "actual"; font; ?displayof:["-displayof"; widget]; "-weight"] - function (string) actual_slant ["font"; "actual"; font; + function (string) actual_slant ["font"; "actual"; font; ?displayof:["-displayof"; widget]; "-slant"] - function (bool) actual_underline ["font"; "actual"; font; + function (bool) actual_underline ["font"; "actual"; font; ?displayof:["-displayof"; widget]; "-underline"] - function (bool) actual_overstrike ["font"; "actual"; font; + function (bool) actual_overstrike ["font"; "actual"; font; ?displayof:["-displayof"; widget]; "-overstrike"] @@ -767,22 +767,22 @@ module Font { ##endif function () delete ["font"; "delete"; font] function (string list) families ["font"; "families"; - ?displayof:["-displayof"; widget]] + ?displayof:["-displayof"; widget]] ##ifdef CAMLTK function (string list) families_displayof ["font"; "families"; "-displayof"; widget] ##endif function (int) measure ["font"; "measure"; font; string; - ?displayof:["-displayof"; widget]] + ?displayof:["-displayof"; widget]] ##ifdef CAMLTK function (int) measure_displayof ["font"; "measure"; font; "-displayof"; widget; string ] ##endif function (int) metrics ["font"; "metrics"; font; ?displayof:["-displayof"; widget]; - fontMetrics ] + fontMetrics ] ##ifdef CAMLTK - function (int) metrics_displayof ["font"; "metrics"; font; + function (int) metrics_displayof ["font"; "metrics"; font; "-displayof"; widget; fontMetrics ] ##endif @@ -800,7 +800,7 @@ type Colormap { % Visual classes are: directcolor, grayscale, greyscale, pseudocolor, % staticcolor, staticgray, staticgrey, truecolor type Visual { - ClassVisual (Clas) [[string; int]] + ClassVisual (Clas) [[string; int]] DefaultVisual ["default"] WidgetVisual (Widget) [widget] BestDepth (Bestdepth) [["best"; int]] @@ -825,7 +825,7 @@ widget frame { option Clas ["-class"; string] ##endif option Colormap ["-colormap"; Colormap] - option Container ["-container"; bool] + option Container ["-container"; bool] option Height option Visual ["-visual"; Visual] option Width @@ -862,7 +862,7 @@ module Grab { subtype option(rowcolumnconfigure) { Minsize ["-minsize"; Units/int] Weight ["-weight"; int] - Pad ["-pad"; Units/int] + Pad ["-pad"; Units/int] } subtype option(grid) { @@ -873,8 +873,8 @@ subtype option(grid) { IPadY ["-ipady"; Units/int] PadX PadY - Row ["-row"; int] - RowSpan ["-rowspan"; int] + Row ["-row"; int] + RowSpan ["-rowspan"; int] Sticky ["-sticky"; string] } @@ -885,7 +885,7 @@ module Grid { function (int,int,int,int) bbox ["grid"; "bbox"; widget] function (int,int,int,int) bbox_cell ["grid"; "bbox"; widget; column: int; row: int] function (int,int,int,int) bbox_span ["grid"; "bbox"; widget; column1: int; row1: int; column2: int; row2: int] - function () column_configure + function () column_configure ["grid"; "columnconfigure"; widget; int; option(rowcolumnconfigure) list] function () configure ["grid"; "configure"; widget list; option(grid) list] @@ -898,7 +898,7 @@ module Grid { function (int,int) location ["grid"; "location"; widget; x:Units/int; y:Units/int] function (bool) propagate_get ["grid"; "propagate"; widget] function () propagate_set ["grid"; "propagate"; widget; bool] - function () row_configure + function () row_configure ["grid"; "rowconfigure"; widget; int; option(rowcolumnconfigure) list] function (string) row_configure_get ["grid"; "rowconfigure"; widget; int] function (int,int) size ["grid"; "size"; widget] @@ -1056,7 +1056,7 @@ subtype option(menuentry) { ActiveBackground ActiveForeground Accelerator ["-accelerator"; string] - Background + Background Bitmap ColumnBreak ["-columnbreak"; bool] Command @@ -1093,7 +1093,7 @@ subtype option(menucascade) { Background Bitmap ColumnBreak Command Font Foreground HideMargin ##ifdef CAMLTK - ImageBitmap ImagePhoto + ImageBitmap ImagePhoto ##else Image ##endif @@ -1109,7 +1109,7 @@ subtype option(menuradio) { ##else Image SelectImage ##endif - IndicatorOn Label SelectColor + IndicatorOn Label SelectColor State UnderlinedChar Value Variable } @@ -1120,7 +1120,7 @@ subtype option(menucheck) { ##ifdef CAMLTK ImageBitmap SelectImageBitmap ImagePhoto SelectImagePhoto ##else - Image SelectImage + Image SelectImage ##endif IndicatorOn Label OffValue OnValue SelectColor @@ -1143,7 +1143,7 @@ type menuType { Menu_Menubar ["menubar"] Menu_Tearoff ["tearoff"] Menu_Normal ["normal"] -} +} % Separators and tearoffs don't have options @@ -1212,7 +1212,7 @@ type menubuttonDirection { Dir_Above ["above"] Dir_Below ["below"] Dir_Left ["left"] - Dir_Right ["right"] + Dir_Right ["right"] } widget menubutton { @@ -1246,7 +1246,7 @@ widget menubutton { option UnderlinedChar option WrapLength % Widget specific options - option Direction ["-direction"; menubuttonDirection ] + option Direction ["-direction"; menubuttonDirection ] option Height option IndicatorOn option Menu ["-menu"; widget(menu)] @@ -1330,14 +1330,14 @@ module Optionmenu { %%%%% pack(n) -type Side { +type Side { Side_Left ["left"] Side_Right ["right"] Side_Top ["top"] Side_Bottom ["bottom"] } -type FillMode { +type FillMode { Fill_None ["none"] Fill_X ["x"] Fill_Y ["y"] @@ -1415,7 +1415,7 @@ subtype photo(copy) { } subtype photo(put) { - ImgTo + ImgTo } subtype photo(read) { @@ -1464,8 +1464,8 @@ type BorderMode { } subtype option(place) { - In - X + In + X RelX ["-relx"; float] Y RelY ["-rely"; float] @@ -1699,15 +1699,15 @@ subtype icccm(selection_ownset) { } subtype icccm(selection_handle) { - Selection - ICCCMType + Selection + ICCCMType ICCCMFormat ["-format"; string] } module Selection { function () clear ["selection"; "clear"; icccm(selection_clear) list] function (string) get ["selection"; "get"; icccm(selection_get) list] - + % function () handle_set ["selection"; "handle"; icccm(selection_handle) list; widget; function(int,int)] external handle_set "builtin/selection_handle_set" unsafe function (widget) own_get ["selection"; "own"; icccm(selection_clear) list] @@ -1720,7 +1720,7 @@ module Selection { %%%%% send(n) type SendOption { SendDisplayOf ["-displayof"; widget] % DisplayOf is used for icccm ! - SendAsync ["-async"] + SendAsync ["-async"] } unsafe function () send ["send"; SendOption list; "--"; app: string; command: string list] @@ -1739,13 +1739,13 @@ type TabType { TabNumeric [Units/int; "numeric"] } -type WrapMode { +type WrapMode { WrapNone ["none"] WrapChar ["char"] WrapWord ["word"] } -type Comparison { +type Comparison { LT (Lt) ["<"] LE (Le) ["<="] EQ (Eq) ["=="] @@ -1802,7 +1802,7 @@ type text_dump { DumpMark ["-mark"] DumpTag ["-tag"] DumpText ["-text"] - DumpWindow ["-window"] + DumpWindow ["-window"] } widget text { @@ -1858,7 +1858,7 @@ widget text { % require result parser function (string list) dump [widget(text); "dump"; text_dump list; start: TextIndex; stop: TextIndex] function (string list) dump_char [widget(text); "dump"; text_dump list; index: TextIndex] - + function (string) get [widget(text); "get"; start: TextIndex; stop: TextIndex] function (string) get_char [widget(text); "get"; index: TextIndex] function () image_configure @@ -1874,7 +1874,7 @@ widget text { ##else function () insert [widget(text); "insert"; index: TextIndex; text: string; ?tags: [TextTag list]] ##endif - % Mark + % Mark function () mark_gravity_set [widget(text); "mark"; "gravity"; mark: TextMark; direction: MarkDirection] function (MarkDirection) mark_gravity_get [widget(text); "mark"; "gravity"; mark: TextMark] function (TextMark list) mark_names [widget(text); "mark"; "names"] @@ -1882,7 +1882,7 @@ widget text { function (TextMark) mark_previous [widget(text); "mark"; "previous"; index: TextIndex] function () mark_set [widget(text); "mark"; "set"; mark: TextMark; index: TextIndex] function () mark_unset [widget(text); "mark"; "unset"; marks: TextMark list] - % Scan + % Scan function () scan_mark [widget(text); "scan"; "mark"; x: int; y: int] function () scan_dragto [widget(text); "scan"; "dragto"; x: int; y: int] ##ifdef CAMLTK @@ -1963,7 +1963,7 @@ subtype option(texttag) { Spacing1 Spacing2 Spacing3 - Tabs + Tabs Underline ["-underline"; bool] Wrap ["-wrap"; WrapMode] } @@ -1980,9 +1980,9 @@ unsafe function () scaling_set ["tk"; "scaling"; ?displayof:["-displayof"; widge subtype option(chooseColor){ InitialColor ["-initialcolor"; Color] Parent ["-parent"; widget] - Title ["-title"; string] + Title ["-title"; string] } -function (Color) chooseColor ["tk_chooseColor"; option(chooseColor) list] +function (Color) chooseColor ["tk_chooseColor"; option(chooseColor) list] %%%%% tkwait(n) module Tkwait { @@ -2015,7 +2015,7 @@ widget toplevel { option Colormap option Container ["-container"; bool] option Height - option Menu + option Menu option Screen ["-screen"; string] option Use ["-use"; string] % must be hexadecimal "0x????" option Visual @@ -2095,7 +2095,7 @@ module Winfo { function (bool) viewable ["winfo"; "viewable"; widget] function (string) visual ["winfo"; "visual"; widget] function (int) visualid ["winfo"; "visualid"; widget] - % need special parser + % need special parser function (string) visualsavailable ["winfo"; "visualsavailable"; widget; ?includeids: [int list]] function (int) vrootheight ["winfo"; "vrootheight"; widget] function (int) vrootwidth ["winfo"; "vrootwidth"; widget] @@ -2128,7 +2128,7 @@ module Wm { function () client_set ["wm"; "client"; widget(toplevel); name: string] function (string) client_get ["wm"; "client"; widget(toplevel)] %%% WM_COLORMAP_WINDOWS - function () colormapwindows_set + function () colormapwindows_set ["wm"; "colormapwindows"; widget(toplevel); [windows: widget list]] unsafe function (widget list) colormapwindows_get ["wm"; "colormapwindows"; widget(toplevel)] @@ -2225,7 +2225,7 @@ type FilePattern external subtype option(getFile) { DefaultExtension ["-defaultextension"; string] - FileTypes ["-filetypes"; [FilePattern list]] + FileTypes ["-filetypes"; [FilePattern list]] InitialDir ["-initialdir"; string] InitialFile ["-initialfile"; string] Parent ["-parent"; widget] @@ -2247,7 +2247,7 @@ type MessageType { Ok ["ok"] OkCancel ["okcancel"] RetryCancel ["retrycancel"] - YesNo ["yesno"] + YesNo ["yesno"] YesNoCancel ["yesnocancel"] } subtype option(messageBox) { @@ -2255,12 +2255,12 @@ subtype option(messageBox) { MessageIcon ["-icon"; MessageIcon] Message ["-message"; string] Parent - Title + Title MessageType ["-type"; MessageType] } function (string) messageBox ["tk_messageBox"; option(messageBox) list] - + module Tkvars { function (string) library ["$tk_library"] function (string) patchLevel ["$tk_patchLevel"] @@ -2278,11 +2278,11 @@ module Pixmap { %%% encodings : require if you want write your application international module Encoding { - function (string) convertfrom ["encoding"; "convertfrom"; + function (string) convertfrom ["encoding"; "convertfrom"; ?encoding: [string]; string] function (string) convertto ["encoding"; "convertto"; - ?encoding: [string]; string] + ?encoding: [string]; string] function (string list) names ["encoding"; "names"] function () system_set ["encoding"; "system"; string] function (string) system_get ["encoding"; "system"] -} +} diff --git a/otherlibs/labltk/browser/.depend b/otherlibs/labltk/browser/.depend index 49120116..4438a1dd 100644 --- a/otherlibs/labltk/browser/.depend +++ b/otherlibs/labltk/browser/.depend @@ -1,66 +1,66 @@ editor.cmo: viewer.cmi typecheck.cmi shell.cmi setpath.cmi searchpos.cmi \ searchid.cmi mytypes.cmi lexical.cmi jg_toplevel.cmo jg_tk.cmo \ jg_text.cmi jg_message.cmi jg_menu.cmo jg_button.cmo jg_bind.cmi \ - fileselect.cmi editor.cmi + fileselect.cmi editor.cmi editor.cmx: viewer.cmx typecheck.cmx shell.cmx setpath.cmx searchpos.cmx \ searchid.cmx mytypes.cmi lexical.cmx jg_toplevel.cmx jg_tk.cmx \ jg_text.cmx jg_message.cmx jg_menu.cmx jg_button.cmx jg_bind.cmx \ - fileselect.cmx editor.cmi + fileselect.cmx editor.cmi fileselect.cmo: useunix.cmi setpath.cmi list2.cmo jg_toplevel.cmo jg_memo.cmi \ - jg_entry.cmo jg_box.cmo fileselect.cmi + jg_entry.cmo jg_box.cmo fileselect.cmi fileselect.cmx: useunix.cmx setpath.cmx list2.cmx jg_toplevel.cmx jg_memo.cmx \ - jg_entry.cmx jg_box.cmx fileselect.cmi -jg_bind.cmo: jg_bind.cmi -jg_bind.cmx: jg_bind.cmi -jg_box.cmo: jg_completion.cmi jg_bind.cmi -jg_box.cmx: jg_completion.cmx jg_bind.cmx -jg_completion.cmo: jg_completion.cmi -jg_completion.cmx: jg_completion.cmi -jg_config.cmo: jg_tk.cmo jg_config.cmi -jg_config.cmx: jg_tk.cmx jg_config.cmi -jg_entry.cmo: jg_bind.cmi -jg_entry.cmx: jg_bind.cmx -jg_memo.cmo: jg_memo.cmi -jg_memo.cmx: jg_memo.cmi + jg_entry.cmx jg_box.cmx fileselect.cmi +jg_bind.cmo: jg_bind.cmi +jg_bind.cmx: jg_bind.cmi +jg_box.cmo: jg_completion.cmi jg_bind.cmi +jg_box.cmx: jg_completion.cmx jg_bind.cmx +jg_completion.cmo: jg_completion.cmi +jg_completion.cmx: jg_completion.cmi +jg_config.cmo: jg_tk.cmo jg_config.cmi +jg_config.cmx: jg_tk.cmx jg_config.cmi +jg_entry.cmo: jg_bind.cmi +jg_entry.cmx: jg_bind.cmx +jg_memo.cmo: jg_memo.cmi +jg_memo.cmx: jg_memo.cmi jg_message.cmo: jg_toplevel.cmo jg_tk.cmo jg_text.cmi jg_bind.cmi \ - jg_message.cmi + jg_message.cmi jg_message.cmx: jg_toplevel.cmx jg_tk.cmx jg_text.cmx jg_bind.cmx \ - jg_message.cmi -jg_multibox.cmo: jg_completion.cmi jg_bind.cmi jg_multibox.cmi -jg_multibox.cmx: jg_completion.cmx jg_bind.cmx jg_multibox.cmi -jg_text.cmo: jg_toplevel.cmo jg_tk.cmo jg_button.cmo jg_bind.cmi jg_text.cmi -jg_text.cmx: jg_toplevel.cmx jg_tk.cmx jg_button.cmx jg_bind.cmx jg_text.cmi -lexical.cmo: jg_tk.cmo lexical.cmi -lexical.cmx: jg_tk.cmx lexical.cmi + jg_message.cmi +jg_multibox.cmo: jg_completion.cmi jg_bind.cmi jg_multibox.cmi +jg_multibox.cmx: jg_completion.cmx jg_bind.cmx jg_multibox.cmi +jg_text.cmo: jg_toplevel.cmo jg_tk.cmo jg_button.cmo jg_bind.cmi jg_text.cmi +jg_text.cmx: jg_toplevel.cmx jg_tk.cmx jg_button.cmx jg_bind.cmx jg_text.cmi +lexical.cmo: jg_tk.cmo lexical.cmi +lexical.cmx: jg_tk.cmx lexical.cmi main.cmo: viewer.cmi shell.cmi searchpos.cmi searchid.cmi jg_config.cmi \ - editor.cmi + editor.cmi main.cmx: viewer.cmx shell.cmx searchpos.cmx searchid.cmx jg_config.cmx \ - editor.cmx -searchid.cmo: list2.cmo searchid.cmi -searchid.cmx: list2.cmx searchid.cmi + editor.cmx +searchid.cmo: list2.cmo searchid.cmi +searchid.cmx: list2.cmx searchid.cmi searchpos.cmo: searchid.cmi lexical.cmi jg_tk.cmo jg_text.cmi jg_message.cmi \ - jg_memo.cmi jg_bind.cmi searchpos.cmi + jg_memo.cmi jg_bind.cmi searchpos.cmi searchpos.cmx: searchid.cmx lexical.cmx jg_tk.cmx jg_text.cmx jg_message.cmx \ - jg_memo.cmx jg_bind.cmx searchpos.cmi + jg_memo.cmx jg_bind.cmx searchpos.cmi setpath.cmo: useunix.cmi list2.cmo jg_toplevel.cmo jg_button.cmo jg_box.cmo \ - jg_bind.cmi setpath.cmi + jg_bind.cmi setpath.cmi setpath.cmx: useunix.cmx list2.cmx jg_toplevel.cmx jg_button.cmx jg_box.cmx \ - jg_bind.cmx setpath.cmi + jg_bind.cmx setpath.cmi shell.cmo: list2.cmo lexical.cmi jg_toplevel.cmo jg_tk.cmo jg_text.cmi \ - jg_message.cmi jg_menu.cmo jg_memo.cmi fileselect.cmi dummy.cmi shell.cmi + jg_message.cmi jg_menu.cmo jg_memo.cmi fileselect.cmi dummy.cmi shell.cmi shell.cmx: list2.cmx lexical.cmx jg_toplevel.cmx jg_tk.cmx jg_text.cmx \ - jg_message.cmx jg_menu.cmx jg_memo.cmx fileselect.cmx dummy.cmi shell.cmi -typecheck.cmo: mytypes.cmi jg_tk.cmo jg_text.cmi jg_message.cmi typecheck.cmi -typecheck.cmx: mytypes.cmi jg_tk.cmx jg_text.cmx jg_message.cmx typecheck.cmi -useunix.cmo: useunix.cmi -useunix.cmx: useunix.cmi + jg_message.cmx jg_menu.cmx jg_memo.cmx fileselect.cmx dummy.cmi shell.cmi +typecheck.cmo: mytypes.cmi jg_tk.cmo jg_text.cmi jg_message.cmi typecheck.cmi +typecheck.cmx: mytypes.cmi jg_tk.cmx jg_text.cmx jg_message.cmx typecheck.cmi +useunix.cmo: useunix.cmi +useunix.cmx: useunix.cmi viewer.cmo: useunix.cmi shell.cmi setpath.cmi searchpos.cmi searchid.cmi \ mytypes.cmi jg_toplevel.cmo jg_tk.cmo jg_text.cmi jg_multibox.cmi \ jg_message.cmi jg_menu.cmo jg_entry.cmo jg_completion.cmi jg_button.cmo \ - jg_box.cmo jg_bind.cmi help.cmo viewer.cmi + jg_box.cmo jg_bind.cmi help.cmo viewer.cmi viewer.cmx: useunix.cmx shell.cmx setpath.cmx searchpos.cmx searchid.cmx \ mytypes.cmi jg_toplevel.cmx jg_tk.cmx jg_text.cmx jg_multibox.cmx \ jg_message.cmx jg_menu.cmx jg_entry.cmx jg_completion.cmx jg_button.cmx \ - jg_box.cmx jg_bind.cmx help.cmx viewer.cmi -mytypes.cmi: shell.cmi -typecheck.cmi: mytypes.cmi + jg_box.cmx jg_bind.cmx help.cmx viewer.cmi +mytypes.cmi: shell.cmi +typecheck.cmi: mytypes.cmi diff --git a/otherlibs/labltk/browser/Makefile.nt b/otherlibs/labltk/browser/Makefile.nt index 7b59f4a4..405f47e7 100644 --- a/otherlibs/labltk/browser/Makefile.nt +++ b/otherlibs/labltk/browser/Makefile.nt @@ -1,3 +1,5 @@ +# $Id$ + OTHERSLIB=-I $(OTHERS)/win32unix -I $(OTHERS)/str -I $(OTHERS)/systhreads CCFLAGS=-I../../../byterun $(TK_DEFS) diff --git a/otherlibs/labltk/browser/Makefile.shared b/otherlibs/labltk/browser/Makefile.shared index e25a2a9d..484d3d8f 100644 --- a/otherlibs/labltk/browser/Makefile.shared +++ b/otherlibs/labltk/browser/Makefile.shared @@ -30,11 +30,10 @@ JG = jg_tk.cmo jg_config.cmo jg_bind.cmo jg_completion.cmo \ all: ocamlbrowser$(EXE) ocamlbrowser$(EXE): $(TOPDIR)/toplevel/toplevellib.cma jglib.cma $(OBJ) \ - ../support/lib$(LIBNAME).$(A) $(XTRAOBJ) + ../support/lib$(LIBNAME).$(A) $(CAMLC) -o ocamlbrowser$(EXE) $(INCLUDES) \ $(TOPDIR)/toplevel/toplevellib.cma \ - unix.cma str.cma $(XTRALIBS) $(LIBNAME).cma jglib.cma \ - $(OBJ) $(XTRAOBJ) + unix.cma str.cma $(OCAMLBR) $(LIBNAME).cma jglib.cma $(OBJ) ocamlbrowser.cma: jglib.cma $(OBJ) $(CAMLC) -a -o $@ -linkall jglib.cma $(OBJ) diff --git a/otherlibs/labltk/browser/dummyUnix.mli b/otherlibs/labltk/browser/dummyUnix.mli index 1f6df582..22724192 100644 --- a/otherlibs/labltk/browser/dummyUnix.mli +++ b/otherlibs/labltk/browser/dummyUnix.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: dummyUnix.mli 6041 2003-12-29 22:15:02Z doligez $ *) +(* $Id$ *) module Mutex : sig type t diff --git a/otherlibs/labltk/browser/dummyWin.mli b/otherlibs/labltk/browser/dummyWin.mli index d25f81d4..a4b75ee3 100644 --- a/otherlibs/labltk/browser/dummyWin.mli +++ b/otherlibs/labltk/browser/dummyWin.mli @@ -12,4 +12,4 @@ (* *) (*************************************************************************) -(* $Id: dummyWin.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) diff --git a/otherlibs/labltk/browser/editor.ml b/otherlibs/labltk/browser/editor.ml index f5d45030..617cdfa8 100644 --- a/otherlibs/labltk/browser/editor.ml +++ b/otherlibs/labltk/browser/editor.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: editor.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) open StdLabels open Tk diff --git a/otherlibs/labltk/browser/editor.mli b/otherlibs/labltk/browser/editor.mli index c284bb10..665ee813 100644 --- a/otherlibs/labltk/browser/editor.mli +++ b/otherlibs/labltk/browser/editor.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: editor.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Widget diff --git a/otherlibs/labltk/browser/fileselect.ml b/otherlibs/labltk/browser/fileselect.ml index 32e15071..22052b42 100644 --- a/otherlibs/labltk/browser/fileselect.ml +++ b/otherlibs/labltk/browser/fileselect.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: fileselect.ml 6757 2005-01-28 16:13:11Z doligez $ *) +(* $Id$ *) (* file selection box *) @@ -35,7 +35,7 @@ let caml_dir path = global_replace ~!"\\\\" "/" path else path -let parse_filter s = +let parse_filter s = let s = caml_dir s in (* replace // by / *) let s = global_replace ~!"/+" "/" s in @@ -49,7 +49,7 @@ let parse_filter s = ~!"\\([^/]\\|[^\\./][^/]\\|[^/][^\\./]\\|[^/][^/]+\\)/\\.\\.$" "" s in (* replace ^/hoge/../ by / *) let s = global_replace ~!"^\\(/\\.\\.\\)+/" "/" s in - if string_match ~!"^\\([^\\*?[]*[/:]\\)\\(.*\\)" s 0 then + if string_match ~!"^\\([^\\*?[]*[/:]\\)\\(.*\\)" s 0 then let dirs = matched_group 1 s and ptrn = matched_group 2 s in @@ -93,7 +93,7 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) let may_prefix name = if Filename.is_relative name then concat !current_dir name else name in - + let tl = Jg_toplevel.titled title in Focus.set tl; @@ -124,7 +124,7 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) current_pattern := pattern; let filter = if !load_in_path && usepath then pattern else dir ^ pattern in - let directories = get_directories_in_files ~path:dir + let directories = get_directories_in_files ~path:dir (get_files_in_directory dir) in let matched_files = (* get matched file by subshell call. *) if !load_in_path && usepath then @@ -140,7 +140,7 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) ~f:(fun acc dir -> List2.exclude dir acc) in Textvariable.set filter_var filter; - Textvariable.set selection_var (dir ^ deffile); + Textvariable.set selection_var (dir ^ deffile); Listbox.delete filter_listbox ~first:(`Num 0) ~last:`End; Listbox.insert filter_listbox ~index:`End ~texts:matched_files; Jg_box.recenter filter_listbox ~index:(`Num 0); @@ -154,7 +154,7 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) Jg_box.recenter directory_listbox ~index:(`Num 0) end in - + let selected_files = ref [] in (* used for synchronous mode *) let activate l = Grab.release tl; @@ -170,14 +170,14 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) else List.map l ~f:may_prefix in - if sync then + if sync then begin selected_files := l; Textvariable.set sync_var "1" end - else proc l + else proc l in - + (* entries *) let fl = Label.create frm ~text:"Filter" in let sl = Label.create frm ~text:"Selection" in @@ -205,14 +205,14 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) configure ~filter:(Textvariable.get filter_var) end and okb = Button.create cfrm ~text:"Ok" ~command: - begin fun () -> - let files = + begin fun () -> + let files = List.map (Listbox.curselection filter_listbox) ~f: begin fun x -> !current_dir ^ Listbox.get filter_listbox ~index:x end in - let files = if files = [] then [Textvariable.get selection_var] + let files = if files = [] then [Textvariable.get selection_var] else files in activate files end @@ -261,7 +261,7 @@ let f ~title ~action:proc ?(dir = Unix.getcwd ()) pack [dfr] ~side:`Right ~fill:`Both ~expand:true; pack [dfrl] ~side:`Top ~anchor:`W; pack [dfrf] ~side:`Top ~fill:`Both ~expand:true; - pack [filter_scrollbar] ~side:`Right ~fill:`Y; + pack [filter_scrollbar] ~side:`Right ~fill:`Y; pack [filter_listbox] ~side:`Left ~fill:`Both ~expand:true; (* selection *) diff --git a/otherlibs/labltk/browser/fileselect.mli b/otherlibs/labltk/browser/fileselect.mli index 00a52ac8..b723c626 100644 --- a/otherlibs/labltk/browser/fileselect.mli +++ b/otherlibs/labltk/browser/fileselect.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: fileselect.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) val f : title:string -> @@ -22,7 +22,7 @@ val f : ?file:string -> ?multi:bool -> ?sync:bool -> ?usepath:bool -> unit -> unit -(* action +(* action [] means canceled if multi select is false, then the list is null or a singleton *) diff --git a/otherlibs/labltk/browser/jg_bind.ml b/otherlibs/labltk/browser/jg_bind.ml index 0a0bbfac..2e3ec987 100644 --- a/otherlibs/labltk/browser/jg_bind.ml +++ b/otherlibs/labltk/browser/jg_bind.ml @@ -12,11 +12,11 @@ (* *) (*************************************************************************) -(* $Id: jg_bind.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Tk -let enter_focus w = +let enter_focus w = bind w ~events:[`Enter] ~action:(fun _ -> Focus.set w) let escape_destroy ?destroy:tl w = diff --git a/otherlibs/labltk/browser/jg_bind.mli b/otherlibs/labltk/browser/jg_bind.mli index a3a1907d..e09c2ba4 100644 --- a/otherlibs/labltk/browser/jg_bind.mli +++ b/otherlibs/labltk/browser/jg_bind.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_bind.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Widget diff --git a/otherlibs/labltk/browser/jg_box.ml b/otherlibs/labltk/browser/jg_box.ml index e62388eb..3675f4bf 100644 --- a/otherlibs/labltk/browser/jg_box.ml +++ b/otherlibs/labltk/browser/jg_box.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_box.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Tk @@ -39,7 +39,7 @@ let recenter lb ~index = class timed ?wait ?nocase get_texts = object val get_texts = get_texts inherit Jg_completion.timed [] ?wait ?nocase as super - method reset = + method! reset = texts <- get_texts (); super#reset end @@ -52,14 +52,14 @@ let add_completion ?action ?wait ?nocase ?(double=true) lb = Jg_bind.enter_focus lb; bind lb ~events:[`KeyPress] ~fields:[`Char] ~action: - begin fun ev -> + begin fun ev -> (* consider only keys producing characters. The callback is called even if you press Shift. *) if ev.ev_Char <> "" then recenter lb ~index:(`Num (comp#add ev.ev_Char)) end; - begin match action with + begin match action with Some action -> bind lb ~events:[`KeyPressDetail "Return"] ~action:(fun _ -> action `Active); diff --git a/otherlibs/labltk/browser/jg_button.ml b/otherlibs/labltk/browser/jg_button.ml index 0adff9a6..11abd68a 100644 --- a/otherlibs/labltk/browser/jg_button.ml +++ b/otherlibs/labltk/browser/jg_button.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_button.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Tk diff --git a/otherlibs/labltk/browser/jg_completion.ml b/otherlibs/labltk/browser/jg_completion.ml index bdf1ea82..c93b099b 100644 --- a/otherlibs/labltk/browser/jg_completion.ml +++ b/otherlibs/labltk/browser/jg_completion.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_completion.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) let lt_string ?(nocase=false) s1 s2 = if nocase then String.lowercase s1 < String.lowercase s2 else s1 < s2 @@ -41,13 +41,13 @@ class timed ?nocase ?wait texts = object (self) inherit completion texts ?nocase as super val wait = match wait with None -> 500 | Some n -> n val mutable timer = None - method add c = + method! add c = begin match timer with None -> self#reset | Some t -> Timer.remove t end; timer <- Some (Timer.add ~ms:wait ~callback:(fun () -> self#reset)); super#add c - method reset = + method! reset = timer <- None; super#reset end diff --git a/otherlibs/labltk/browser/jg_completion.mli b/otherlibs/labltk/browser/jg_completion.mli index 2cffc8b8..69c7a134 100644 --- a/otherlibs/labltk/browser/jg_completion.mli +++ b/otherlibs/labltk/browser/jg_completion.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_completion.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) val lt_string : ?nocase:bool -> string -> string -> bool diff --git a/otherlibs/labltk/browser/jg_config.ml b/otherlibs/labltk/browser/jg_config.ml index 4d456189..bce0e50e 100644 --- a/otherlibs/labltk/browser/jg_config.ml +++ b/otherlibs/labltk/browser/jg_config.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_config.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open StdLabels open Jg_tk diff --git a/otherlibs/labltk/browser/jg_config.mli b/otherlibs/labltk/browser/jg_config.mli index 3e583490..511e2b3a 100644 --- a/otherlibs/labltk/browser/jg_config.mli +++ b/otherlibs/labltk/browser/jg_config.mli @@ -12,6 +12,6 @@ (* *) (*************************************************************************) -(* $Id: jg_config.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) val init: unit -> unit diff --git a/otherlibs/labltk/browser/jg_entry.ml b/otherlibs/labltk/browser/jg_entry.ml index 58fa7f2e..c09a273e 100644 --- a/otherlibs/labltk/browser/jg_entry.ml +++ b/otherlibs/labltk/browser/jg_entry.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_entry.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Tk diff --git a/otherlibs/labltk/browser/jg_memo.ml b/otherlibs/labltk/browser/jg_memo.ml index abdfe075..e238929a 100644 --- a/otherlibs/labltk/browser/jg_memo.ml +++ b/otherlibs/labltk/browser/jg_memo.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_memo.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) type ('a, 'b) assoc_list = Nil @@ -31,5 +31,3 @@ let fast ~f = let data = f key in memo := Cons(key, data, !memo); data - - diff --git a/otherlibs/labltk/browser/jg_memo.mli b/otherlibs/labltk/browser/jg_memo.mli index 1b9396ee..5491dee3 100644 --- a/otherlibs/labltk/browser/jg_memo.mli +++ b/otherlibs/labltk/browser/jg_memo.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_memo.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) val fast : f:('a -> 'b) -> 'a -> 'b (* "fast" memoizer: uses a List.assq like function *) diff --git a/otherlibs/labltk/browser/jg_menu.ml b/otherlibs/labltk/browser/jg_menu.ml index b0ef967c..b399d10d 100644 --- a/otherlibs/labltk/browser/jg_menu.ml +++ b/otherlibs/labltk/browser/jg_menu.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_menu.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) open Tk diff --git a/otherlibs/labltk/browser/jg_message.ml b/otherlibs/labltk/browser/jg_message.ml index 8925216e..3c18f193 100644 --- a/otherlibs/labltk/browser/jg_message.ml +++ b/otherlibs/labltk/browser/jg_message.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_message.ml 5045 2002-07-26 00:04:05Z garrigue $ *) +(* $Id$ *) open StdLabels open Tk @@ -90,7 +90,7 @@ let ask ~title ?master ?(no=true) ?(cancel=true) text = and r = ref (`Cancel : [`Yes|`No|`Cancel]) in let accept = Button.create fw ~text:(if no || cancel then "Yes" else "Dismiss") - ~command:(fun () -> r := `Yes; destroy tl) + ~command:(fun () -> r := `Yes; destroy tl) and refuse = Button.create fw ~text:"No" ~command:(fun () -> r := `No; destroy tl) and cancelB = Button.create fw ~text:"Cancel" diff --git a/otherlibs/labltk/browser/jg_message.mli b/otherlibs/labltk/browser/jg_message.mli index 6cf581de..0a83a594 100644 --- a/otherlibs/labltk/browser/jg_message.mli +++ b/otherlibs/labltk/browser/jg_message.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_message.mli 5045 2002-07-26 00:04:05Z garrigue $ *) +(* $Id$ *) open Widget diff --git a/otherlibs/labltk/browser/jg_multibox.ml b/otherlibs/labltk/browser/jg_multibox.ml index 94b6334b..febec8e5 100644 --- a/otherlibs/labltk/browser/jg_multibox.ml +++ b/otherlibs/labltk/browser/jg_multibox.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_multibox.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open StdLabels @@ -58,7 +58,7 @@ let rec split l ~len = let (cars,r) = first l ~len in let cdrs = split r ~len in List.map2 cars cdrs ~f:(fun a l -> a::l) - + open Tk @@ -168,7 +168,7 @@ let add_scrollbar (box : c) = let add_completion ?action ?wait (box : c) = let comp = new Jg_completion.timed (box#texts) ?wait in box#bind_kbd ~events:[`KeyPress] - ~action:(fun ev ~index -> + ~action:(fun ev ~index -> (* consider only keys producing characters. The callback is called * even if you press Shift. *) if ev.ev_Char <> "" then diff --git a/otherlibs/labltk/browser/jg_multibox.mli b/otherlibs/labltk/browser/jg_multibox.mli index e122edcf..6dfe7d8f 100644 --- a/otherlibs/labltk/browser/jg_multibox.mli +++ b/otherlibs/labltk/browser/jg_multibox.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_multibox.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) class c : cols:int -> texts:string list -> diff --git a/otherlibs/labltk/browser/jg_text.ml b/otherlibs/labltk/browser/jg_text.ml index 84dae4d8..067b9dac 100644 --- a/otherlibs/labltk/browser/jg_text.ml +++ b/otherlibs/labltk/browser/jg_text.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_text.ml 5094 2002-08-09 10:34:44Z garrigue $ *) +(* $Id$ *) open StdLabels open Tk diff --git a/otherlibs/labltk/browser/jg_text.mli b/otherlibs/labltk/browser/jg_text.mli index a498eed6..e8646dd9 100644 --- a/otherlibs/labltk/browser/jg_text.mli +++ b/otherlibs/labltk/browser/jg_text.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_text.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Widget diff --git a/otherlibs/labltk/browser/jg_tk.ml b/otherlibs/labltk/browser/jg_tk.ml index 6441caeb..7fc77f09 100644 --- a/otherlibs/labltk/browser/jg_tk.ml +++ b/otherlibs/labltk/browser/jg_tk.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: jg_tk.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Tk diff --git a/otherlibs/labltk/browser/jg_toplevel.ml b/otherlibs/labltk/browser/jg_toplevel.ml index c26f76fc..64b6f54d 100644 --- a/otherlibs/labltk/browser/jg_toplevel.ml +++ b/otherlibs/labltk/browser/jg_toplevel.ml @@ -12,12 +12,12 @@ (* *) (*************************************************************************) -(* $Id: jg_toplevel.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Tk let titled ?iconname title = - let iconname = match iconname with None -> title | Some s -> s in + let iconname = match iconname with None -> title | Some s -> s in let tl = Toplevel.create Widget.default_toplevel in Wm.title_set tl title; Wm.iconname_set tl iconname; diff --git a/otherlibs/labltk/browser/lexical.ml b/otherlibs/labltk/browser/lexical.ml index 3d48ef45..72f1957e 100644 --- a/otherlibs/labltk/browser/lexical.ml +++ b/otherlibs/labltk/browser/lexical.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: lexical.ml 9293 2009-06-08 04:43:32Z garrigue $ *) +(* $Id$ *) open StdLabels open Tk diff --git a/otherlibs/labltk/browser/lexical.mli b/otherlibs/labltk/browser/lexical.mli index e2a02d2d..3be04d32 100644 --- a/otherlibs/labltk/browser/lexical.mli +++ b/otherlibs/labltk/browser/lexical.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: lexical.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Widget diff --git a/otherlibs/labltk/browser/list2.ml b/otherlibs/labltk/browser/list2.ml index 2dd4bb1a..87b88f49 100644 --- a/otherlibs/labltk/browser/list2.ml +++ b/otherlibs/labltk/browser/list2.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: list2.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open StdLabels diff --git a/otherlibs/labltk/browser/main.ml b/otherlibs/labltk/browser/main.ml index 1b7027c7..e55ce989 100644 --- a/otherlibs/labltk/browser/main.ml +++ b/otherlibs/labltk/browser/main.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: main.ml 7382 2006-04-16 23:28:22Z doligez $ *) +(* $Id$ *) open StdLabels module Unix = UnixLabels diff --git a/otherlibs/labltk/browser/mytypes.mli b/otherlibs/labltk/browser/mytypes.mli index d7eb8856..6db120ad 100644 --- a/otherlibs/labltk/browser/mytypes.mli +++ b/otherlibs/labltk/browser/mytypes.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: mytypes.mli 8232 2007-05-16 08:21:41Z doligez $ *) +(* $Id$ *) open Widget diff --git a/otherlibs/labltk/browser/searchid.ml b/otherlibs/labltk/browser/searchid.ml index c787fe00..28481439 100644 --- a/otherlibs/labltk/browser/searchid.ml +++ b/otherlibs/labltk/browser/searchid.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: searchid.ml 8907 2008-07-09 14:03:08Z mauny $ *) +(* $Id$ *) open StdLabels open Location @@ -85,7 +85,7 @@ let rec choose n ~card:l = if n = 1 then List.map l ~f:(fun x -> [x]) else if n = 0 then [[]] else if n > len then [] else - match l with [] -> [] + match l with [] -> [] | a :: l -> List.map (choose (n-1) ~card:l) ~f:(fun l -> a :: l) @ choose n ~card:l @@ -98,7 +98,7 @@ let rec all_args ty = match ty.desc with Tarrow(l, ty1, ty2, _) -> let (tl,ty) = all_args ty2 in ((l,ty1)::tl, ty) | _ -> ([], ty) - + let rec equal ~prefix t1 t2 = match (repr t1).desc, (repr t2).desc with Tvar, Tvar -> true @@ -313,7 +313,7 @@ let search_string_type text ~mode = let start_c = l.loc_start.Lexing.pos_cnum in let end_c = l.loc_end.Lexing.pos_cnum in raise (Error (start_c - 8, end_c - 8)) - + let longident_of_string text = let exploded = ref [] and l = ref 0 in for i = 0 to String.length text - 2 do @@ -414,7 +414,7 @@ let rec bound_variables pat = | Ppat_construct (_,Some pat,_) -> bound_variables pat | Ppat_variant (_,None) -> [] | Ppat_variant (_,Some pat) -> bound_variables pat - | Ppat_record l -> + | Ppat_record (l, _) -> List2.flat_map l ~f:(fun (_,pat) -> bound_variables pat) | Ppat_array l -> List2.flat_map l ~f:bound_variables diff --git a/otherlibs/labltk/browser/searchid.mli b/otherlibs/labltk/browser/searchid.mli index 07fefec8..980c141d 100644 --- a/otherlibs/labltk/browser/searchid.mli +++ b/otherlibs/labltk/browser/searchid.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: searchid.mli 5044 2002-07-25 22:51:47Z garrigue $ *) +(* $Id$ *) val start_env : Env.t ref val module_list : string list ref diff --git a/otherlibs/labltk/browser/searchpos.ml b/otherlibs/labltk/browser/searchpos.ml index 7700ad3e..8cae9959 100644 --- a/otherlibs/labltk/browser/searchpos.ml +++ b/otherlibs/labltk/browser/searchpos.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: searchpos.ml 8907 2008-07-09 14:03:08Z mauny $ *) +(* $Id$ *) open StdLabels open Support @@ -130,6 +130,8 @@ let rec search_pos_type t ~pos ~env = add_found_sig (`Type, lid) ~env ~loc:t.ptyp_loc | Ptyp_alias (t, _) | Ptyp_poly (_, t) -> search_pos_type ~pos ~env t + | Ptyp_package (_, stl) -> + List.iter stl ~f:(fun (_, ty) -> search_pos_type ty ~pos ~env) end let rec search_pos_class_type cl ~pos ~env = @@ -178,7 +180,7 @@ let search_pos_type_decl td ~pos ~env = search_pos_type t2 ~pos ~env end end - + let rec search_pos_signature l ~pos ~env = ignore ( List.fold_left l ~init:env ~f: @@ -203,7 +205,7 @@ let rec search_pos_signature l ~pos ~env = | Psig_exception (_, l) -> List.iter l ~f:(search_pos_type ~pos ~env); add_found_sig (`Type, Lident "exn") ~env ~loc:pt.psig_loc - | Psig_module (_, t) -> + | Psig_module (_, t) -> search_pos_module t ~pos ~env | Psig_recmodule decls -> List.iter decls ~f:(fun (_, t) -> search_pos_module t ~pos ~env) @@ -216,7 +218,7 @@ let rec search_pos_signature l ~pos ~env = | Psig_class_type l -> List.iter l ~f:(fun ci -> search_pos_class_type ci.pci_expr ~pos ~env) - (* The last cases should not happen in generated interfaces *) + (* The last cases should not happen in generated interfaces *) | Psig_open lid -> add_found_sig (`Module, lid) ~env ~loc:pt.psig_loc | Psig_include t -> search_pos_module t ~pos ~env end; @@ -235,9 +237,11 @@ and search_pos_module m ~pos ~env = search_pos_module m ~pos ~env; List.iter l ~f: begin function - _, Pwith_type t -> search_pos_type_decl t ~pos ~env + _, Pwith_type t -> search_pos_type_decl t ~pos ~env | _ -> () end + | Pmty_typeof md -> + () (* TODO? *) end end @@ -392,6 +396,7 @@ let rec view_signature ?title ?path ?(env = !start_env) ?(detach=false) sign = let l = match e with Syntaxerr.Unclosed(l,_,_,_) -> l + | Syntaxerr.Applicative_path l -> l | Syntaxerr.Other l -> l in Jg_text.tag_and_see tw ~start:(tpos l.loc_start.Lexing.pos_cnum) @@ -435,7 +440,7 @@ and view_signature_item sign ~path ~env = and view_module path ~env = match find_module path env with - Tmty_signature sign -> + Tmty_signature sign -> !view_defined_ref (Searchid.longident_of_path path) ~env | modtype -> let id = ident_of_path path ~default:"M" in @@ -704,7 +709,7 @@ and search_pos_class_expr ~pos cl = add_found_str (`Class (path, cl.cl_type)) ~env:!start_env ~loc:cl.cl_loc | Tclass_structure cls -> - search_pos_class_structure ~pos cls + search_pos_class_structure ~pos cls | Tclass_fun (pat, iel, cl, _) -> search_pos_pat pat ~pos ~env:pat.pat_env; List.iter iel ~f:(fun (_,exp) -> search_pos_expr exp ~pos); @@ -812,7 +817,9 @@ and search_pos_expr ~pos exp = | Texp_lazy exp -> search_pos_expr exp ~pos | Texp_object (cls, _, _) -> - search_pos_class_structure ~pos cls + search_pos_class_structure ~pos cls + | Texp_pack modexp -> + search_pos_module_expr modexp ~pos end; add_found_str (`Exp(`Expr, exp.exp_type)) ~env:exp.exp_env ~loc:exp.exp_loc end @@ -857,6 +864,7 @@ and search_pos_module_expr ~pos m = | Tmod_apply (a, b, _) -> search_pos_module_expr a ~pos; search_pos_module_expr b ~pos | Tmod_constraint (m, _, _) -> search_pos_module_expr m ~pos + | Tmod_unpack (e, _) -> search_pos_expr e ~pos end; add_found_str (`Module (Pident (Ident.create "M"), m.mod_type)) ~env:m.mod_env ~loc:m.mod_loc diff --git a/otherlibs/labltk/browser/searchpos.mli b/otherlibs/labltk/browser/searchpos.mli index 0beb0985..b2f89cd8 100644 --- a/otherlibs/labltk/browser/searchpos.mli +++ b/otherlibs/labltk/browser/searchpos.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: searchpos.mli 8232 2007-05-16 08:21:41Z doligez $ *) +(* $Id$ *) open Widget @@ -75,4 +75,3 @@ val parent_path : Path.t -> Path.t option val string_of_path : Path.t -> string val string_of_longident : Longident.t -> string val lines_to_chars : int -> text:string -> int - diff --git a/otherlibs/labltk/browser/setpath.ml b/otherlibs/labltk/browser/setpath.ml index b7000b85..1a41b573 100644 --- a/otherlibs/labltk/browser/setpath.ml +++ b/otherlibs/labltk/browser/setpath.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: setpath.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open StdLabels open Tk @@ -55,7 +55,7 @@ let add_to_path ~dirs ?(base="") box = if dirs = [] then [base] else List.map dirs ~f: begin function - "." -> base + "." -> base | ".." -> Filename.dirname base | x -> Filename.concat base x end @@ -129,7 +129,7 @@ let f ~dir = in bind dirbox ~events:[`KeyPressDetail "Insert"] ~action:add_paths; bind pathbox ~events:[`KeyPressDetail "Delete"] ~action:remove_paths; - + let dirlab = Label.create dirs ~text:"Directories" and pathlab = Label.create path ~text:"Load path" and addbutton = Button.create dirs ~text:"Add to path" ~command:add_paths diff --git a/otherlibs/labltk/browser/setpath.mli b/otherlibs/labltk/browser/setpath.mli index 2ad7ed8e..22bf5dc5 100644 --- a/otherlibs/labltk/browser/setpath.mli +++ b/otherlibs/labltk/browser/setpath.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: setpath.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Widget @@ -22,4 +22,4 @@ val exec_update_hooks : unit -> unit val set : dir:string -> unit val f : dir:string -> toplevel widget - (* edit the load path *) + (* edit the load path *) diff --git a/otherlibs/labltk/browser/shell.ml b/otherlibs/labltk/browser/shell.ml index 5b009b3f..be93ef5f 100644 --- a/otherlibs/labltk/browser/shell.ml +++ b/otherlibs/labltk/browser/shell.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: shell.ml 7327 2006-01-18 13:26:03Z garrigue $ *) +(* $Id$ *) open StdLabels module Unix = UnixLabels diff --git a/otherlibs/labltk/browser/shell.mli b/otherlibs/labltk/browser/shell.mli index a2c4c250..ac94f43d 100644 --- a/otherlibs/labltk/browser/shell.mli +++ b/otherlibs/labltk/browser/shell.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: shell.mli 5044 2002-07-25 22:51:47Z garrigue $ *) +(* $Id$ *) class ['a] history : unit -> diff --git a/otherlibs/labltk/browser/typecheck.ml b/otherlibs/labltk/browser/typecheck.ml index 4fa4a4a1..d5347ef5 100644 --- a/otherlibs/labltk/browser/typecheck.ml +++ b/otherlibs/labltk/browser/typecheck.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: typecheck.ml 9293 2009-06-08 04:43:32Z garrigue $ *) +(* $Id$ *) open StdLabels open Tk @@ -139,6 +139,7 @@ let f txt = Syntaxerr.report_error Format.std_formatter err; begin match err with Syntaxerr.Unclosed(l,_,_,_) -> l + | Syntaxerr.Applicative_path l -> l | Syntaxerr.Other l -> l end | Typecore.Error (l,err) -> diff --git a/otherlibs/labltk/browser/typecheck.mli b/otherlibs/labltk/browser/typecheck.mli index d7569189..d61fce62 100644 --- a/otherlibs/labltk/browser/typecheck.mli +++ b/otherlibs/labltk/browser/typecheck.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: typecheck.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Widget open Mytypes diff --git a/otherlibs/labltk/browser/useunix.ml b/otherlibs/labltk/browser/useunix.ml index 00ac1fb4..666f866f 100644 --- a/otherlibs/labltk/browser/useunix.ml +++ b/otherlibs/labltk/browser/useunix.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: useunix.ml 5094 2002-08-09 10:34:44Z garrigue $ *) +(* $Id$ *) open StdLabels open UnixLabels @@ -36,7 +36,7 @@ let get_files_in_directory dir = | Some x -> get_them (x::l) | None -> - closedir dirh; l + closedir dirh; l in List.sort ~cmp:compare (get_them []) @@ -63,7 +63,7 @@ let subshell ~cmd = with Some x -> it (x::l) | None -> List.rev l - in + in let answer = it [] in ignore (close_process_in rc); answer diff --git a/otherlibs/labltk/browser/useunix.mli b/otherlibs/labltk/browser/useunix.mli index c0059b80..2850c0d2 100644 --- a/otherlibs/labltk/browser/useunix.mli +++ b/otherlibs/labltk/browser/useunix.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: useunix.mli 5094 2002-08-09 10:34:44Z garrigue $ *) +(* $Id$ *) (* Unix utilities *) diff --git a/otherlibs/labltk/browser/viewer.ml b/otherlibs/labltk/browser/viewer.ml index 97511bcf..fef3cbe1 100644 --- a/otherlibs/labltk/browser/viewer.ml +++ b/otherlibs/labltk/browser/viewer.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: viewer.ml 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) open StdLabels open Tk @@ -30,7 +30,7 @@ open Searchid let list_modules ~path = List.fold_left path ~init:[] ~f: begin fun modules dir -> - let l = + let l = List.filter (Useunix.get_files_in_directory dir) ~f:(fun x -> Filename.check_suffix x ".cmi") in let l = List.map l ~f: @@ -489,7 +489,7 @@ object (self) (* Help menu *) helpmenu#add_command "Manual..." ~command:show_help; - pack [search_frame] ~fill:`X; + pack [search_frame] ~fill:`X; pack [boxes_frame] ~fill:`Both ~expand:true; pack [buttons] ~fill:`X ~side:`Bottom; pack [view] ~fill:`Both ~side:`Bottom ~expand:true; @@ -576,7 +576,7 @@ object (self) end; see_path path ~box:(self#get_box path) ~sign end - + method choose_symbol ~title ~env ?signature ?path l = let n = match path with None -> 1 diff --git a/otherlibs/labltk/browser/viewer.mli b/otherlibs/labltk/browser/viewer.mli index fdab185b..d8bec671 100644 --- a/otherlibs/labltk/browser/viewer.mli +++ b/otherlibs/labltk/browser/viewer.mli @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: viewer.mli 4990 2002-07-11 13:49:51Z garrigue $ *) +(* $Id$ *) (* Module viewer *) open Widget diff --git a/otherlibs/labltk/browser/winmain.c b/otherlibs/labltk/browser/winmain.c index 2eb32e67..dd9146fc 100644 --- a/otherlibs/labltk/browser/winmain.c +++ b/otherlibs/labltk/browser/winmain.c @@ -1,3 +1,5 @@ +/* $Id$ */ + #include #include #include diff --git a/otherlibs/labltk/builtin/LICENSE b/otherlibs/labltk/builtin/LICENSE index 3098bdf7..c006f51d 100644 --- a/otherlibs/labltk/builtin/LICENSE +++ b/otherlibs/labltk/builtin/LICENSE @@ -14,6 +14,6 @@ (* *) (*************************************************************************) -(* $Id: LICENSE 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) All the files in this directory are subject to the above copyright notice. \ No newline at end of file diff --git a/otherlibs/labltk/builtin/builtin_FilePattern.ml b/otherlibs/labltk/builtin/builtin_FilePattern.ml index f7dd1d60..ea77ff98 100644 --- a/otherlibs/labltk/builtin/builtin_FilePattern.ml +++ b/otherlibs/labltk/builtin/builtin_FilePattern.ml @@ -4,7 +4,7 @@ type filePattern = { typename : string; extensions : string list; mactypes : string list - } + } (* /type *) let cCAMLtoTKfilePattern fp = diff --git a/otherlibs/labltk/builtin/builtin_GetCursor.ml b/otherlibs/labltk/builtin/builtin_GetCursor.ml index 6c7034b1..4f7f6633 100644 --- a/otherlibs/labltk/builtin/builtin_GetCursor.ml +++ b/otherlibs/labltk/builtin/builtin_GetCursor.ml @@ -35,10 +35,10 @@ type color = [ (* type *) type cursor = - | XCursor of string + | XCursor of string | XCursorFg of string * color | XCursortFgBg of string * color * color - | CursorFileFg of string * color + | CursorFileFg of string * color | CursorMaskFile of string * string * color * color ;; (* /type *) @@ -58,4 +58,3 @@ type cursor = [ (* /type *) ##endif - diff --git a/otherlibs/labltk/builtin/builtin_bind.ml b/otherlibs/labltk/builtin/builtin_bind.ml index 35d0d3c1..752a4ba3 100644 --- a/otherlibs/labltk/builtin/builtin_bind.ml +++ b/otherlibs/labltk/builtin/builtin_bind.ml @@ -31,7 +31,7 @@ type xEvent = | Property | Reparent | Unmap - | Visibility + | Visibility | Virtual of string (* Virtual event. Must be without modifiers *) ;; (* /type *) @@ -54,7 +54,7 @@ type modifier = | Mod4 | Mod5 | Meta - | Alt + | Alt ;; (* /type *) @@ -95,7 +95,7 @@ type eventInfo = (* /type *) -(* To avoid collision with other constructors (Width, State), +(* To avoid collision with other constructors (Width, State), use Ev_ prefix *) (* type *) type eventField = @@ -110,7 +110,7 @@ type eventField = | Ev_OverrideRedirect | Ev_Place | Ev_State - | Ev_Time + | Ev_Time | Ev_Width | Ev_MouseX | Ev_MouseY @@ -128,7 +128,7 @@ type eventField = ;; (* /type *) -let filleventInfo ev v = function +let filleventInfo ev v = function | Ev_Above -> ev.ev_Above <- int_of_string v | Ev_ButtonNumber -> ev.ev_ButtonNumber <- int_of_string v | Ev_Count -> ev.ev_Count <- int_of_string v @@ -227,7 +227,7 @@ let rec writeeventField = function | Ev_Widget ->" %W" | Ev_RootX -> " %X" | Ev_RootY -> " %Y" - end + end ^ writeeventField rest ;; @@ -287,7 +287,7 @@ and modifier = [ | `Mod4 | `Mod5 | `Meta - | `Alt + | `Alt ] ;; (* /type *) @@ -328,7 +328,7 @@ type eventInfo = { (* /type *) -(* To avoid collision with other constructors (Width, State), +(* To avoid collision with other constructors (Width, State), use Ev_ prefix *) (* type *) type eventField = [ @@ -343,7 +343,7 @@ type eventField = [ | `OverrideRedirect | `Place | `State - | `Time + | `Time | `Width | `MouseX | `MouseY @@ -362,7 +362,7 @@ type eventField = [ ;; (* /type *) -let filleventInfo ev v : eventField -> unit = function +let filleventInfo ev v : eventField -> unit = function | `Above -> ev.ev_Above <- int_of_string v | `ButtonNumber -> ev.ev_ButtonNumber <- int_of_string v | `Count -> ev.ev_Count <- int_of_string v @@ -462,7 +462,7 @@ let rec writeeventField : eventField list -> string = function | `Widget -> " %W" | `RootX -> " %X" | `RootY -> " %Y" - end + end ^ writeeventField rest ;; diff --git a/otherlibs/labltk/builtin/builtin_bindtags.ml b/otherlibs/labltk/builtin/builtin_bindtags.ml index 4529fcdf..35b82b9d 100644 --- a/otherlibs/labltk/builtin/builtin_bindtags.ml +++ b/otherlibs/labltk/builtin/builtin_bindtags.ml @@ -18,4 +18,3 @@ type bindings = [ (* /type *) ##endif - diff --git a/otherlibs/labltk/builtin/builtin_font.ml b/otherlibs/labltk/builtin/builtin_font.ml index 3425391b..b865cda1 100644 --- a/otherlibs/labltk/builtin/builtin_font.ml +++ b/otherlibs/labltk/builtin/builtin_font.ml @@ -1,4 +1,3 @@ (* type *) type font = string (* /type *) - diff --git a/otherlibs/labltk/builtin/builtinf_GetPixel.ml b/otherlibs/labltk/builtin/builtinf_GetPixel.ml index 7e7c596b..45294d58 100644 --- a/otherlibs/labltk/builtin/builtinf_GetPixel.ml +++ b/otherlibs/labltk/builtin/builtinf_GetPixel.ml @@ -6,7 +6,7 @@ let pixels units = [|TkToken"winfo"; TkToken"pixels"; cCAMLtoTKwidget widget_any_table default_toplevel; - cCAMLtoTKunits units|] in + cCAMLtoTKunits units|] in int_of_string res ##else @@ -17,7 +17,7 @@ let pixels units = [|TkToken"winfo"; TkToken"pixels"; cCAMLtoTKwidget default_toplevel; - cCAMLtoTKunits units|] in + cCAMLtoTKunits units|] in int_of_string res ##endif diff --git a/otherlibs/labltk/builtin/builtinf_bind.ml b/otherlibs/labltk/builtin/builtinf_bind.ml index d78541e1..500fd6d3 100644 --- a/otherlibs/labltk/builtin/builtinf_bind.ml +++ b/otherlibs/labltk/builtin/builtinf_bind.ml @@ -10,7 +10,7 @@ type bindAction = (* FUNCTION - val bind: + val bind: widget -> (modifier list * xEvent) list -> bindAction -> unit /FUNCTION *) @@ -21,16 +21,16 @@ let bind widget eventsequence action = begin match action with BindRemove -> TkToken "" | BindSet (what, f) -> - let cbId = register_callback widget (wrapeventInfo f what) + let cbId = register_callback widget (wrapeventInfo f what) in TkToken ("camlcb " ^ cbId ^ (writeeventField what)) | BindSetBreakable (what, f) -> - let cbId = register_callback widget (wrapeventInfo f what) + let cbId = register_callback widget (wrapeventInfo f what) in TkToken ("camlcb " ^ cbId ^ (writeeventField what) ^ " ; if { $BreakBindingsSequence == 1 } then { break ;} ; set BreakBindingsSequence 0") | BindExtend (what, f) -> - let cbId = register_callback widget (wrapeventInfo f what) + let cbId = register_callback widget (wrapeventInfo f what) in TkToken ("+camlcb " ^ cbId ^ (writeeventField what)) end |] @@ -39,7 +39,7 @@ let bind widget eventsequence action = (* FUNCTION (* unsafe *) val bind_class : - string -> (modifier list * xEvent) list -> bindAction -> unit + string -> (modifier list * xEvent) list -> bindAction -> unit (* /unsafe *) /FUNCTION class arg is not constrained *) @@ -50,16 +50,16 @@ let bind_class clas eventsequence action = begin match action with BindRemove -> TkToken "" | BindSet (what, f) -> - let cbId = register_callback Widget.dummy + let cbId = register_callback Widget.dummy (wrapeventInfo f what) in TkToken ("camlcb " ^ cbId ^ (writeeventField what)) | BindSetBreakable (what, f) -> - let cbId = register_callback Widget.dummy + let cbId = register_callback Widget.dummy (wrapeventInfo f what) in TkToken ("camlcb " ^ cbId ^ (writeeventField what)^ " ; if { $BreakBindingsSequence == 1 } then { break ;} ; set BreakBindingsSequence 0" ) | BindExtend (what, f) -> - let cbId = register_callback Widget.dummy + let cbId = register_callback Widget.dummy (wrapeventInfo f what) in TkToken ("+camlcb " ^ cbId ^ (writeeventField what)) end |] @@ -67,8 +67,8 @@ let bind_class clas eventsequence action = (* FUNCTION (* unsafe *) - val bind_tag : - string -> (modifier list * xEvent) list -> bindAction -> unit + val bind_tag : + string -> (modifier list * xEvent) list -> bindAction -> unit (* /unsafe *) /FUNCTION *) @@ -87,7 +87,7 @@ let break = function () -> (* Legacy functions *) let tag_bind = bind_tag;; let class_bind = bind_class;; - + ##else let bind_class ~events ?(extend = false) ?(breakable = false) ?(fields = []) @@ -104,7 +104,7 @@ let bind_class ~events ?(extend = false) ?(breakable = false) ?(fields = []) let cb = if extend then "+camlcb " else "camlcb " in let cb = cb ^ cbId ^ writeeventField fields in let cb = - if breakable then + if breakable then cb ^ " ; if { $BreakBindingsSequence == 1 } then { break ;}" ^ " ; set BreakBindingsSequence 0" else cb in diff --git a/otherlibs/labltk/builtin/builtini_GetBitmap.ml b/otherlibs/labltk/builtin/builtini_GetBitmap.ml index 1afa0cd9..0c82a921 100644 --- a/otherlibs/labltk/builtin/builtini_GetBitmap.ml +++ b/otherlibs/labltk/builtin/builtini_GetBitmap.ml @@ -5,7 +5,7 @@ let cCAMLtoTKbitmap = function | Predefined s -> TkToken s ;; -let cTKtoCAMLbitmap s = +let cTKtoCAMLbitmap s = if s = "" then Predefined "" else if String.get s 0 = '@' then BitmapFile (String.sub s 1 (String.length s - 1)) @@ -19,7 +19,7 @@ let cCAMLtoTKbitmap : bitmap -> tkArgs = function | `Predefined s -> TkToken s ;; -let cTKtoCAMLbitmap s = +let cTKtoCAMLbitmap s = if String.get s 0 = '@' then `File (String.sub s ~pos:1 ~len:(String.length s - 1)) else `Predefined s diff --git a/otherlibs/labltk/builtin/builtini_GetCursor.ml b/otherlibs/labltk/builtin/builtini_GetCursor.ml index 8f4e3971..4bbab73b 100644 --- a/otherlibs/labltk/builtin/builtini_GetCursor.ml +++ b/otherlibs/labltk/builtin/builtini_GetCursor.ml @@ -15,7 +15,7 @@ let cTKtoCAMLcolor = function s -> NamedColor s let cCAMLtoTKcursor = function XCursor s -> TkToken s - | XCursorFg (s,fg) -> + | XCursorFg (s,fg) -> TkQuote(TkTokenList [TkToken s; cCAMLtoTKcolor fg]) | XCursortFgBg (s,fg,bg) -> TkQuote(TkTokenList [TkToken s; cCAMLtoTKcolor fg; cCAMLtoTKcolor bg]) @@ -42,7 +42,7 @@ let cTKtoCAMLcolor = function s -> `Color s let cCAMLtoTKcursor : cursor -> tkArgs = function | `Xcursor s -> TkToken s - | `Xcursorfg (s,fg) -> + | `Xcursorfg (s,fg) -> TkQuote(TkTokenList [TkToken s; cCAMLtoTKcolor fg]) | `Xcursorfgbg (s,fg,bg) -> TkQuote(TkTokenList [TkToken s; cCAMLtoTKcolor fg; cCAMLtoTKcolor bg]) diff --git a/otherlibs/labltk/builtin/builtini_GetPixel.ml b/otherlibs/labltk/builtin/builtini_GetPixel.ml index 12e7890f..a4709748 100644 --- a/otherlibs/labltk/builtin/builtini_GetPixel.ml +++ b/otherlibs/labltk/builtin/builtini_GetPixel.ml @@ -8,7 +8,7 @@ let cCAMLtoTKunits = function | Centimeters (foo) -> TkToken(Printf.sprintf "%gc" foo) ;; -let cTKtoCAMLunits str = +let cTKtoCAMLunits str = let len = String.length str in let num_part str = String.sub str 0 (len - 1) in match String.get str (pred len) with @@ -29,7 +29,7 @@ let cCAMLtoTKunits : units -> tkArgs = function | `Cm (foo) -> TkToken(Printf.sprintf "%gc" foo) ;; -let cTKtoCAMLunits str = +let cTKtoCAMLunits str = let len = String.length str in let num_part str = String.sub str ~pos:0 ~len:(len - 1) in match String.get str (pred len) with diff --git a/otherlibs/labltk/builtin/builtini_ScrollValue.ml b/otherlibs/labltk/builtin/builtini_ScrollValue.ml index 08498a00..7cdce1e0 100644 --- a/otherlibs/labltk/builtin/builtini_ScrollValue.ml +++ b/otherlibs/labltk/builtin/builtini_ScrollValue.ml @@ -11,13 +11,13 @@ let cCAMLtoTKscrollValue = function (* str l -> scrllv -> str l *) let cTKtoCAMLscrollValue = function - "scroll"::n::"pages"::l -> + "scroll"::n::("pages"|"page")::l -> ScrollPage (int_of_string n), l | "scroll"::n::"units"::l -> ScrollUnit (int_of_string n), l | "moveto"::f::l -> MoveTo (float_of_string f), l - | _ -> raise (Invalid_argument "TKtoCAMLscrollValue") + | l -> raise (Invalid_argument (String.concat " " ("TKtoCAMLscrollValue"::l))) ;; ##else @@ -33,13 +33,13 @@ let cCAMLtoTKscrollValue : scrollValue -> tkArgs = function (* str l -> scrllv -> str l *) let cTKtoCAMLscrollValue = function - | "scroll" :: n :: "pages" :: l -> + | "scroll" :: n :: ("pages"|"page") :: l -> `Page (int_of_string n), l | "scroll" :: n :: "units" :: l -> `Unit (int_of_string n), l | "moveto" :: f :: l -> `Moveto (float_of_string f), l - | _ -> raise (Invalid_argument "TKtoCAMLscrollValue") + | l -> raise (Invalid_argument (String.concat " " ("TKtoCAMLscrollValue"::l))) ;; ##endif diff --git a/otherlibs/labltk/builtin/builtini_bind.ml b/otherlibs/labltk/builtin/builtini_bind.ml index 13109cb0..e7f9a0bb 100644 --- a/otherlibs/labltk/builtin/builtini_bind.ml +++ b/otherlibs/labltk/builtin/builtini_bind.ml @@ -26,7 +26,7 @@ let cCAMLtoTKxEvent = function | Property -> "Property" | Reparent -> "Reparent" | Unmap -> "Unmap" - | Visibility -> "Visibility" + | Visibility -> "Visibility" | Virtual s -> "<"^s^">" ;; @@ -55,14 +55,14 @@ exception IllegalVirtualEvent (* type event = modifier list * xEvent *) let cCAMLtoTKevent (ml, xe) = match xe with - | Virtual s -> + | Virtual s -> if ml = [] then "<<"^s^">>" else raise IllegalVirtualEvent | _ -> - "<" ^ (String.concat " " (List.map cCAMLtoTKmodifier ml)) + "<" ^ (String.concat " " (List.map cCAMLtoTKmodifier ml)) ^ (cCAMLtoTKxEvent xe) ^ ">" ;; - + (* type eventSequence == (modifier list * xEvent) list *) let cCAMLtoTKeventSequence l = TkToken(List.fold_left (^) "" (List.map cCAMLtoTKevent l)) @@ -120,7 +120,7 @@ let cCAMLtoTKevent (ev : event) = | `Reparent -> "Reparent" | `Unmap -> "Unmap" | `Visibility -> "Visibility" - | `Virtual s -> + | `Virtual s -> if !modified then raise IllegalVirtualEvent else "<"^s^">" | `Modified(ml, ev) -> modified := true; @@ -129,7 +129,7 @@ let cCAMLtoTKevent (ev : event) = in "<" ^ convert ev ^ ">" ;; -let cCAMLtoTKeventSequence (l : event list) = +let cCAMLtoTKeventSequence (l : event list) = TkToken(String.concat ~sep:"" (List.map ~f:cCAMLtoTKevent l)) ;; diff --git a/otherlibs/labltk/builtin/builtini_font.ml b/otherlibs/labltk/builtin/builtini_font.ml index 521b24d6..27a17501 100644 --- a/otherlibs/labltk/builtin/builtini_font.ml +++ b/otherlibs/labltk/builtin/builtini_font.ml @@ -1,3 +1,2 @@ let cCAMLtoTKfont (s : font) = TkToken s let cTKtoCAMLfont (s : font) = s - diff --git a/otherlibs/labltk/builtin/builtini_index.ml b/otherlibs/labltk/builtin/builtini_index.ml index 7718cab9..3baa448f 100644 --- a/otherlibs/labltk/builtin/builtini_index.ml +++ b/otherlibs/labltk/builtin/builtini_index.ml @@ -21,7 +21,7 @@ | CEmbedded ;; -let index_any_table = +let index_any_table = [CNumber; CActiveElement; CEnd; CLast; CNoIndex; CInsert; CSelFirst; CSelLast; CAt; CAtXY; CAnchorPoint; CPattern; CLineChar; CMark; CTagFirst; CTagLast; CEmbedded] @@ -30,10 +30,10 @@ let index_any_table = let index_canvas_table = [CNumber; CEnd; CInsert; CSelFirst; CSelLast; CAtXY] ;; -let index_entry_table = +let index_entry_table = [CNumber; CAnchorPoint; CEnd; CInsert; CSelFirst; CSelLast; CAt] ;; -let index_listbox_table = +let index_listbox_table = [CNumber; CActiveElement; CAnchorPoint; CEnd; CAtXY] ;; let index_menu_table = @@ -53,14 +53,14 @@ let cCAMLtoTKindex table = function | SelFirst -> chk_sub "SelFirst" table CSelFirst; TkToken "sel.first" | SelLast -> chk_sub "SelLast" table CSelLast; TkToken "sel.last" | At n -> chk_sub "At" table CAt; TkToken ("@"^string_of_int n) - | AtXY (x,y) -> chk_sub "AtXY" table CAtXY; + | AtXY (x,y) -> chk_sub "AtXY" table CAtXY; TkToken ("@"^string_of_int x^","^string_of_int y) | AnchorPoint -> chk_sub "AnchorPoint" table CAnchorPoint; TkToken "anchor" | Pattern s -> chk_sub "Pattern" table CPattern; TkToken s | LineChar (l,c) -> chk_sub "LineChar" table CLineChar; TkToken (string_of_int l^"."^string_of_int c) | Mark s -> chk_sub "Mark" table CMark; TkToken s - | TagFirst t -> chk_sub "TagFirst" table CTagFirst; + | TagFirst t -> chk_sub "TagFirst" table CTagFirst; TkToken (t^".first") | TagLast t -> chk_sub "TagLast" table CTagLast; TkToken (t^".last") @@ -70,9 +70,9 @@ let cCAMLtoTKindex table = function let char_index c s = let rec find i = - if i >= String.length s + if i >= String.length s then raise Not_found - else if String.get s i = c then i + else if String.get s i = c then i else find (i+1) in find 0 ;; @@ -82,7 +82,7 @@ let char_index c s = let cTKtoCAMLindex s = try let p = char_index '.' s in - LineChar(int_of_string (String.sub s 0 p), + LineChar(int_of_string (String.sub s 0 p), int_of_string (String.sub s (p+1) (String.length s - p - 1))) with Not_found -> @@ -121,11 +121,11 @@ let cCAMLtoTKtext_index = (cCAMLtoTKindex : text_index -> tkArgs);; (* Assume returned values are only numerical and l.c *) -let cTKtoCAMLtext_index s = +let cTKtoCAMLtext_index s = try let p = String.index s '.' in - `Linechar (int_of_string (String.sub s ~pos:0 ~len:p), - int_of_string (String.sub s ~pos:(p + 1) + `Linechar (int_of_string (String.sub s ~pos:0 ~len:p), + int_of_string (String.sub s ~pos:(p + 1) ~len:(String.length s - p - 1))) with Not_found -> diff --git a/otherlibs/labltk/builtin/builtini_text.ml b/otherlibs/labltk/builtin/builtini_text.ml index 966c28a3..4db49c05 100644 --- a/otherlibs/labltk/builtin/builtini_text.ml +++ b/otherlibs/labltk/builtin/builtini_text.ml @@ -8,11 +8,11 @@ let cTKtoCAMLtextTag x = x;; (* TextModifiers are never returned by Tk *) let ppTextModifier = function - CharOffset n -> + CharOffset n -> if n > 0 then "+" ^ (string_of_int n) ^ "chars" else if n = 0 then "" else (string_of_int n) ^ "chars" - | LineOffset n -> + | LineOffset n -> if n > 0 then "+" ^ (string_of_int n) ^ "lines" else if n = 0 then "" else (string_of_int n) ^ "lines" @@ -24,13 +24,13 @@ let ppTextModifier = function let ppTextIndex = function | TextIndexNone -> "" - | TextIndex (base, ml) -> + | TextIndex (base, ml) -> match cCAMLtoTKindex index_text_table base with | TkToken ppbase -> List.fold_left (^) ppbase (List.map ppTextModifier ml) | _ -> assert false ;; -let cCAMLtoTKtextIndex i = +let cCAMLtoTKtextIndex i = TkToken (ppTextIndex i) ;; @@ -39,11 +39,11 @@ let cCAMLtoTKtextIndex i = (* TextModifiers are never returned by Tk *) let cCAMLtoTKtextIndex (i : textIndex) = let ppTextModifier = function - | `Char n -> + | `Char n -> if n > 0 then "+" ^ (string_of_int n) ^ "chars" else if n = 0 then "" else (string_of_int n) ^ "chars" - | `Line n -> + | `Line n -> if n > 0 then "+" ^ (string_of_int n) ^ "lines" else if n = 0 then "" else (string_of_int n) ^ "lines" diff --git a/otherlibs/labltk/builtin/canvas_bind.ml b/otherlibs/labltk/builtin/canvas_bind.ml index 1b46fae0..9256a74c 100644 --- a/otherlibs/labltk/builtin/canvas_bind.ml +++ b/otherlibs/labltk/builtin/canvas_bind.ml @@ -1,7 +1,7 @@ ##ifdef CAMLTK let bind widget tag eventsequence action = - tkCommand [| + tkCommand [| cCAMLtoTKwidget widget_canvas_table widget; TkToken "bind"; cCAMLtoTKtagOrId tag; @@ -19,7 +19,7 @@ let bind widget tag eventsequence action = | BindExtend (what, f) -> let cbId = register_callback widget (wrapeventInfo f what) in TkToken ("+camlcb " ^ cbId ^ (writeeventField what)) - end + end |] ;; @@ -40,7 +40,7 @@ let bind ~events let cb = if extend then "+camlcb " else "camlcb " in let cb = cb ^ cbId ^ writeeventField fields in let cb = - if breakable then + if breakable then cb ^ " ; if { $BreakBindingsSequence == 1 } then { break ;}" ^ " ; set BreakBindingsSequence 0" else cb in diff --git a/otherlibs/labltk/builtin/canvas_bind.mli b/otherlibs/labltk/builtin/canvas_bind.mli index 39ce93e7..0c6c5837 100644 --- a/otherlibs/labltk/builtin/canvas_bind.mli +++ b/otherlibs/labltk/builtin/canvas_bind.mli @@ -1,7 +1,7 @@ ##ifdef CAMLTK -val bind : widget -> tagOrId -> - (modifier list * xEvent) list -> bindAction -> unit +val bind : widget -> tagOrId -> + (modifier list * xEvent) list -> bindAction -> unit ##else @@ -11,6 +11,6 @@ val bind : ?breakable: bool -> ?fields: eventField list -> ?action: (eventInfo -> unit) -> - canvas widget -> tagOrId -> unit + canvas widget -> tagOrId -> unit ##endif diff --git a/otherlibs/labltk/builtin/dialog.mli b/otherlibs/labltk/builtin/dialog.mli index debb6ce2..532045cb 100644 --- a/otherlibs/labltk/builtin/dialog.mli +++ b/otherlibs/labltk/builtin/dialog.mli @@ -1,24 +1,24 @@ ##ifdef CAMLTK -val create : ?name: string -> - widget -> string -> string -> bitmap -> int -> string list -> int - (* [create ~name parent title message bitmap default button_names] +val create : ?name: string -> + widget -> string -> string -> bitmap -> int -> string list -> int + (* [create ~name parent title message bitmap default button_names] cf. tk_dialog *) val create_named : - widget -> string -> string -> string -> bitmap -> int -> string list -> int - (* [create_named parent name title message bitmap default button_names] + widget -> string -> string -> string -> bitmap -> int -> string list -> int + (* [create_named parent name title message bitmap default button_names] cf. tk_dialog *) ##else -val create : +val create : parent: 'a widget -> title: string -> message: string -> buttons: string list -> - ?name: string -> ?bitmap: bitmap -> ?default: int -> unit ->int - (* [create title message bitmap default button_names parent] + ?name: string -> ?bitmap: bitmap -> ?default: int -> unit ->int + (* [create title message bitmap default button_names parent] cf. tk_dialog *) ##endif diff --git a/otherlibs/labltk/builtin/image.ml b/otherlibs/labltk/builtin/image.ml index ac4c7238..a1fd2eab 100644 --- a/otherlibs/labltk/builtin/image.ml +++ b/otherlibs/labltk/builtin/image.ml @@ -8,12 +8,12 @@ let cTKtoCAMLimage s = | _ -> raise (TkError ("unknown image type \"" ^ res ^ "\"")) ;; -let names () = +let names () = let res = tkEval [|TkToken "image"; TkToken "names"|] in let names = splitlist res in List.map cTKtoCAMLimage names ;; - + ##else let cTKtoCAMLimage s = @@ -24,10 +24,10 @@ let cTKtoCAMLimage s = | _ -> raise (TkError ("unknown image type \"" ^ res ^ "\"")) ;; -let names () = +let names () = let res = tkEval [|TkToken "image"; TkToken "names"|] in let names = splitlist res in List.map cTKtoCAMLimage names ;; - + ##endif diff --git a/otherlibs/labltk/builtin/optionmenu.ml b/otherlibs/labltk/builtin/optionmenu.ml index c0a760ab..5a17e3ff 100644 --- a/otherlibs/labltk/builtin/optionmenu.ml +++ b/otherlibs/labltk/builtin/optionmenu.ml @@ -6,7 +6,7 @@ open Protocol;; let create ?name parent variable values = let w = Widget.new_atom "menubutton" ~parent ?name in let mw = Widget.new_atom "menu" ~parent:w ~name:"menu" in - let res = + let res = tkEval [|TkToken "tk_optionMenu"; TkToken (Widget.name w); cCAMLtoTKtextVariable variable; @@ -20,7 +20,7 @@ let create ?name parent variable values = let create_named parent name variable values = let w = Widget.new_atom "menubutton" ~parent ~name in let mw = Widget.new_atom "menu" ~parent:w ~name: "menu" in - let res = + let res = tkEval [|TkToken "tk_optionMenu"; TkToken (Widget.name w); cCAMLtoTKtextVariable variable; @@ -38,9 +38,9 @@ open Protocol;; let create ~parent ~variable ?name values = let w = Widget.new_atom "menubutton" ~parent ?name in - let mw = Widget.new_atom "menu" ~parent:w ~name:"menu" in + let mw = Widget.new_atom "menu" ~parent:w ~name:"menu" in (* assumes .menu naming *) - let res = + let res = tkEval [|TkToken "tk_optionMenu"; TkToken (Widget.name w); cCAMLtoTKtextVariable variable; diff --git a/otherlibs/labltk/builtin/optionmenu.mli b/otherlibs/labltk/builtin/optionmenu.mli index 0c6b5c9e..c5879579 100644 --- a/otherlibs/labltk/builtin/optionmenu.mli +++ b/otherlibs/labltk/builtin/optionmenu.mli @@ -1,21 +1,21 @@ ##ifdef CAMLTK (* Support for tk_optionMenu *) -val create: ?name: string -> +val create: ?name: string -> widget -> textVariable -> string list -> widget * widget -(** [create ?name parent var options] creates a multi-option menubutton and - its associated menu. The option is also stored in the variable. +(** [create ?name parent var options] creates a multi-option menubutton and + its associated menu. The option is also stored in the variable. Both widgets (menubutton and menu) are returned. *) ##else (* Support for tk_optionMenu *) -val create: - parent:'a widget -> +val create: + parent:'a widget -> variable:textVariable -> ?name: string -> string list -> menubutton widget * menu widget -(** [create ~parent ~var ~name options] creates a multi-option menubutton - and its associated menu. The option is also stored in the variable. +(** [create ~parent ~var ~name options] creates a multi-option menubutton + and its associated menu. The option is also stored in the variable. Both widgets (menubutton and menu) are returned *) ##endif diff --git a/otherlibs/labltk/builtin/selection_handle_set.ml b/otherlibs/labltk/builtin/selection_handle_set.ml index fe19489a..2dfc5763 100644 --- a/otherlibs/labltk/builtin/selection_handle_set.ml +++ b/otherlibs/labltk/builtin/selection_handle_set.ml @@ -5,8 +5,8 @@ let handle_set opts w cmd = tkCommand [| TkToken"selection"; TkToken"handle"; - TkTokenList - (List.map + TkTokenList + (List.map (function x -> cCAMLtoTKicccm w icccm_selection_handle_table x) opts); cCAMLtoTKwidget widget_any_table w; diff --git a/otherlibs/labltk/builtin/selection_handle_set.mli b/otherlibs/labltk/builtin/selection_handle_set.mli index 66ae6b73..3778e274 100644 --- a/otherlibs/labltk/builtin/selection_handle_set.mli +++ b/otherlibs/labltk/builtin/selection_handle_set.mli @@ -6,7 +6,7 @@ val handle_set : icccm list -> widget -> (int -> int -> unit) -> unit ##else val handle_set : - command: (pos:int -> len:int -> string) -> + command: (pos:int -> len:int -> string) -> ?format: string -> ?selection:string -> ?typ: string -> 'a widget -> unit (** tk invocation: selection handle *) diff --git a/otherlibs/labltk/builtin/selection_own_set.ml b/otherlibs/labltk/builtin/selection_own_set.ml index 253cdb5b..9a4b1f16 100644 --- a/otherlibs/labltk/builtin/selection_own_set.ml +++ b/otherlibs/labltk/builtin/selection_own_set.ml @@ -5,8 +5,8 @@ let own_set v1 v2 = tkCommand [| TkToken"selection"; TkToken"own"; - TkTokenList - (List.map + TkTokenList + (List.map (function x -> cCAMLtoTKicccm v2 icccm_selection_ownset_table x) v1); cCAMLtoTKwidget widget_any_table v2 @@ -22,7 +22,7 @@ let own_set ?command = TkToken"selection"; TkToken"own"; TkTokenList opts; - cCAMLtoTKwidget w + cCAMLtoTKwidget w |]) ;; diff --git a/otherlibs/labltk/builtin/selection_own_set.mli b/otherlibs/labltk/builtin/selection_own_set.mli index 95b3de36..868a8248 100644 --- a/otherlibs/labltk/builtin/selection_own_set.mli +++ b/otherlibs/labltk/builtin/selection_own_set.mli @@ -1,12 +1,12 @@ ##ifdef CAMLTK -val own_set : icccm list -> widget -> unit +val own_set : icccm list -> widget -> unit (** tk invocation: selection own *) ##else val own_set : - ?command:(unit->unit) -> ?selection:string -> 'a widget -> unit + ?command:(unit->unit) -> ?selection:string -> 'a widget -> unit (** tk invocation: selection own *) ##endif diff --git a/otherlibs/labltk/builtin/text_tag_bind.ml b/otherlibs/labltk/builtin/text_tag_bind.ml index 7a1bab3a..72e9f046 100644 --- a/otherlibs/labltk/builtin/text_tag_bind.ml +++ b/otherlibs/labltk/builtin/text_tag_bind.ml @@ -2,7 +2,7 @@ let tag_bind widget tag eventsequence action = check_class widget widget_text_table; - tkCommand [| + tkCommand [| cCAMLtoTKwidget widget_text_table widget; TkToken "tag"; TkToken "bind"; @@ -29,7 +29,7 @@ let tag_bind widget tag eventsequence action = let tag_bind ~tag ~events ?(extend = false) ?(breakable = false) ?(fields = []) ?action widget = - tkCommand [| + tkCommand [| cCAMLtoTKwidget widget; TkToken "tag"; TkToken "bind"; @@ -43,7 +43,7 @@ let tag_bind ~tag ~events ?(extend = false) ?(breakable = false) let cb = if extend then "+camlcb " else "camlcb " in let cb = cb ^ cbId ^ writeeventField fields in let cb = - if breakable then + if breakable then cb ^ " ; if { $BreakBindingsSequence == 1 } then { break ;}" ^ " ; set BreakBindingsSequence 0" else cb in diff --git a/otherlibs/labltk/builtin/text_tag_bind.mli b/otherlibs/labltk/builtin/text_tag_bind.mli index 1f334a79..6778e4ff 100644 --- a/otherlibs/labltk/builtin/text_tag_bind.mli +++ b/otherlibs/labltk/builtin/text_tag_bind.mli @@ -1,13 +1,13 @@ ##ifdef CAMLTK -val tag_bind: - widget -> textTag -> (modifier list * xEvent) list -> bindAction -> unit +val tag_bind: + widget -> textTag -> (modifier list * xEvent) list -> bindAction -> unit ##else val tag_bind : tag: string -> events: event list -> ?extend: bool -> ?breakable: bool -> ?fields: eventField list -> - ?action: (eventInfo -> unit) -> text widget -> unit + ?action: (eventInfo -> unit) -> text widget -> unit ##endif diff --git a/otherlibs/labltk/camltk/Makefile.gen b/otherlibs/labltk/camltk/Makefile.gen index bedc9c59..f25e1f76 100644 --- a/otherlibs/labltk/camltk/Makefile.gen +++ b/otherlibs/labltk/camltk/Makefile.gen @@ -9,9 +9,9 @@ _tkgen.ml: ../Widgets.src ../compiler/tkcompiler$(EXE) cTk.ml camltk.ml .depend: _tkgen.ml ../builtin/report.ml ../compiler/pp$(EXE) #../builtin/builtin_*.ml (echo '##define CAMLTK'; \ - echo 'include Camltkwrap'; \ + echo 'include Camltkwrap'; \ echo 'open Widget'; \ - echo 'open Protocol'; \ + echo 'open Protocol'; \ echo 'open Textvariable'; \ echo ; \ cat ../builtin/report.ml; \ diff --git a/otherlibs/labltk/compiler/.depend b/otherlibs/labltk/compiler/.depend index d33149e8..91ee4304 100644 --- a/otherlibs/labltk/compiler/.depend +++ b/otherlibs/labltk/compiler/.depend @@ -1,28 +1,28 @@ -pplex.cmi: ppyac.cmi -ppyac.cmi: code.cmi -compile.cmo: code.cmi flags.cmo ppexec.cmo ppparse.cmo tables.cmo -compile.cmx: code.cmi flags.cmx ppexec.cmx ppparse.cmx tables.cmx -intf.cmo: code.cmi compile.cmo flags.cmo ppexec.cmo ppparse.cmo tables.cmo -intf.cmx: code.cmi compile.cmx flags.cmx ppexec.cmx ppparse.cmx tables.cmx -lexer.cmo: parser.cmi -lexer.cmx: parser.cmx +pplex.cmi: ppyac.cmi +ppyac.cmi: code.cmi +compile.cmo: code.cmi flags.cmo ppexec.cmo ppparse.cmo tables.cmo +compile.cmx: code.cmi flags.cmx ppexec.cmx ppparse.cmx tables.cmx +intf.cmo: code.cmi compile.cmo flags.cmo ppexec.cmo ppparse.cmo tables.cmo +intf.cmx: code.cmi compile.cmx flags.cmx ppexec.cmx ppparse.cmx tables.cmx +lexer.cmo: parser.cmi +lexer.cmx: parser.cmx maincompile.cmo: code.cmi compile.cmo flags.cmo intf.cmo lexer.cmo parser.cmi \ - ppexec.cmo ppparse.cmo printer.cmo tables.cmo tsort.cmo + ppexec.cmo ppparse.cmo printer.cmo tables.cmo tsort.cmo maincompile.cmx: code.cmi compile.cmx flags.cmx intf.cmx lexer.cmx parser.cmx \ - ppexec.cmx ppparse.cmx printer.cmx tables.cmx tsort.cmx -parser.cmo: flags.cmo tables.cmo parser.cmi -parser.cmx: flags.cmx tables.cmx parser.cmi -pp.cmo: ppexec.cmo ppparse.cmo -pp.cmx: ppexec.cmx ppparse.cmx -ppexec.cmo: code.cmi -ppexec.cmx: code.cmi -pplex.cmo: ppyac.cmi pplex.cmi -pplex.cmx: ppyac.cmx pplex.cmi -ppparse.cmo: pplex.cmi ppyac.cmi -ppparse.cmx: pplex.cmx ppyac.cmx -ppyac.cmo: code.cmi ppyac.cmi -ppyac.cmx: code.cmi ppyac.cmi -printer.cmo: tables.cmo -printer.cmx: tables.cmx -tables.cmo: tsort.cmo -tables.cmx: tsort.cmx + ppexec.cmx ppparse.cmx printer.cmx tables.cmx tsort.cmx +parser.cmo: flags.cmo tables.cmo parser.cmi +parser.cmx: flags.cmx tables.cmx parser.cmi +pp.cmo: ppexec.cmo ppparse.cmo +pp.cmx: ppexec.cmx ppparse.cmx +ppexec.cmo: code.cmi +ppexec.cmx: code.cmi +pplex.cmo: ppyac.cmi pplex.cmi +pplex.cmx: ppyac.cmx pplex.cmi +ppparse.cmo: pplex.cmi ppyac.cmi +ppparse.cmx: pplex.cmx ppyac.cmx +ppyac.cmo: code.cmi ppyac.cmi +ppyac.cmx: code.cmi ppyac.cmi +printer.cmo: tables.cmo +printer.cmx: tables.cmx +tables.cmo: tsort.cmo +tables.cmx: tsort.cmx diff --git a/otherlibs/labltk/compiler/Makefile b/otherlibs/labltk/compiler/Makefile index a2b84533..b7db380f 100644 --- a/otherlibs/labltk/compiler/Makefile +++ b/otherlibs/labltk/compiler/Makefile @@ -31,11 +31,11 @@ ppyac.ml ppyac.mli: ppyac.mly copyright.ml: copyright (echo "let copyright=\"\\"; \ - cat copyright; \ + sed -e 's/$$/\\n\\/' copyright; \ echo "\""; \ - echo "let write ~w = w copyright;;") > copyright.ml + echo "let write ~w = w copyright;;") > copyright.ml -clean : +clean : rm -f *.cm* parser.ml parser.mli lexer.ml copyright.ml rm -f pplex.ml ppyac.ml ppyac.mli ppyac.output rm -f tkcompiler$(EXE) pp$(EXE) parser.output @@ -44,7 +44,7 @@ scratch : rm -f *.cm* parser.ml parser.mli lexer.ml tkcompiler$(EXE) rm -f *.cm* pplex.ml ppyac.ml ppyac.mli pp$(EXE) -install: +install: cp tkcompiler$(EXE) $(INSTALLDIR) cp pp$(EXE) $(INSTALLDIR) @@ -52,10 +52,10 @@ install: .SUFFIXES : .mli .ml .cmi .cmo .mlp .mli.cmi: - $(CAMLCOMP) -g $(COMPFLAGS) -I ../support $< + $(CAMLCOMP) $(COMPFLAGS) -I ../support $< .ml.cmo: - $(CAMLCOMP) -g $(COMPFLAGS) -I ../support $< + $(CAMLCOMP) $(COMPFLAGS) -I ../support $< depend: parser.ml parser.mli lexer.ml pplex.ml ppyac.ml ppyac.mli $(CAMLDEP) *.mli *.ml > .depend diff --git a/otherlibs/labltk/compiler/compile.ml b/otherlibs/labltk/compiler/compile.ml index d3b19446..fd74bc17 100644 --- a/otherlibs/labltk/compiler/compile.ml +++ b/otherlibs/labltk/compiler/compile.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: compile.ml 6757 2005-01-28 16:13:11Z doligez $ *) +(* $Id$ *) open StdLabels open Tables @@ -37,14 +37,14 @@ let camltk_labelstring l = if l.[0] = '?' then l ^ ":" else "" let labelstring l = - if !Flags.camltk then camltk_labelstring l - else labltk_labelstring l + if !Flags.camltk then camltk_labelstring l + else labltk_labelstring l let labltk_typelabel l = if l = "" then l else l ^ ":" let camltk_typelabel l = - if l = "" then l + if l = "" then l else if l.[0] = '?' then l ^ ":" else "" let typelabel l = @@ -58,7 +58,7 @@ let nicknames = let small = String.lowercase -let gettklabel fc = +let gettklabel fc = match fc.template with ListArg( StringArg s :: _ ) -> let s = small s in @@ -85,15 +85,15 @@ let rec types_of_template = function StringArg _ -> [] | TypeArg (l, t) -> [l, t] | ListArg l -> List.flatten (List.map ~f:types_of_template l) - | OptionalArgs (l, tl, _) -> - begin + | OptionalArgs (l, tl, _) -> + begin match List.flatten (List.map ~f:types_of_template tl) with ["", t] -> ["?" ^ l, t] | [_, _] -> raise (Failure "0 label required") | _ -> raise (Failure "0 or more than 1 args in for optionals") end -(* +(* * Pretty print a type * used to write ML type definitions *) @@ -111,9 +111,9 @@ let ppMLtype ?(any=false) ?(return=false) ?(def=false) ?(counter=ref 0) = if !Flags.camltk then "(* " ^ sub ^ " *) " ^ sup ^ " list" else begin if return then - sub ^ "_" ^ sup ^ " list" + sub ^ "_" ^ sup ^ " list" else begin - try + try let typdef = Hashtbl.find types_table sup in let fcl = List.assoc sub typdef.subtypes in let tklabels = List.map ~f:gettklabel fcl in @@ -122,13 +122,13 @@ let ppMLtype ?(any=false) ?(return=false) ?(def=false) ?(counter=ref 0) = "?" ^ begin let p = gettklabel fc in if count ~item:p tklabels > 1 then small fc.var_name else p end - ^ ":" ^ + ^ ":" ^ let l = types_of_template fc.template in match l with [] -> "unit" | [lt] -> ppMLtype (labeloff lt ~at:"ppMLtype") | l -> - "(" ^ String.concat ~sep:"*" + "(" ^ String.concat ~sep:"*" (List.map l ~f:(fun lt -> ppMLtype (labeloff lt ~at:"ppMLtype"))) ^ ")" @@ -141,20 +141,20 @@ let ppMLtype ?(any=false) ?(return=false) ?(def=false) ?(counter=ref 0) = | List ty -> (ppMLtype ty) ^ " list" | Product tyl -> "(" ^ String.concat ~sep:" * " (List.map ~f:ppMLtype tyl) ^ ")" - | Record tyl -> + | Record tyl -> String.concat ~sep:" * " (List.map tyl ~f:(fun (l, t) -> typelabel l ^ ppMLtype t)) - | Subtype ("widget", sub) -> + | Subtype ("widget", sub) -> if !Flags.camltk then "(* " ^ sub ^" *) widget" else sub ^ " widget" - | UserDefined "widget" -> + | UserDefined "widget" -> if !Flags.camltk then "widget" else begin - if any then "any widget" else - let c = String.make 1 (Char.chr(Char.code 'a' + !counter)) in + if any then "any widget" else + let c = String.make 1 (Char.chr(Char.code 'a' + !counter)) in incr counter; "'" ^ c ^ " widget" end - | UserDefined s -> + | UserDefined s -> if !Flags.camltk then s else begin (* a bit dirty hack for ImageBitmap and ImagePhoto *) @@ -163,11 +163,11 @@ let ppMLtype ?(any=false) ?(return=false) ?(def=false) ?(counter=ref 0) = if typdef.variant then if return then try "[>" ^ - String.concat ~sep:"|" + String.concat ~sep:"|" (List.map typdef.constructors ~f: begin fun c -> - "`" ^ c.var_name ^ + "`" ^ c.var_name ^ (match types_of_template c.template with [] -> "" | l -> " of " ^ ppMLtype (Product (List.map l @@ -181,17 +181,17 @@ let ppMLtype ?(any=false) ?(return=false) ?(def=false) ?(counter=ref 0) = else s with Not_found -> s end - | Subtype (s, s') -> + | Subtype (s, s') -> if !Flags.camltk then "(* " ^ s' ^ " *) " ^ s else s' ^ "_" ^ s - | Function (Product tyl) -> + | Function (Product tyl) -> raise (Failure "Function (Product tyl) ? ppMLtype") - | Function (Record tyl) -> - "(" ^ String.concat ~sep:" -> " + | Function (Record tyl) -> + "(" ^ String.concat ~sep:" -> " (List.map tyl ~f:(fun (l, t) -> typelabel l ^ ppMLtype t)) ^ " -> unit)" | Function ty -> "(" ^ (ppMLtype ty) ^ " -> unit)" - | As (t, s) -> + | As (t, s) -> if !Flags.camltk then ppMLtype t else s in @@ -242,7 +242,7 @@ let write_variant ~w {var_name = varname; template = t} = w varname; begin match types_of_template t with [] -> () - | l -> + | l -> w " of "; w (ppMLtype ~any:true ~def:true (Product (List.map l ~f:(labeloff ~at:"write_variant")))) @@ -258,7 +258,7 @@ let write_variants ~w = function write_variant ~w x end -(* Definition of a type *) +(* Definition of a type *) let labltk_write_type ~intf:w ~impl:w' name ~def:typdef = (* Only needed if no subtypes, otherwise use optionals *) if typdef.subtypes = [] then begin @@ -271,13 +271,13 @@ let labltk_write_type ~intf:w ~impl:w' name ~def:typdef = (* CamlTk: List of constructors, for runtime subtyping *) let write_constructor_set ~w ~sep = function | [] -> fatal_error "empty type" - | x::l -> + | x::l -> w ("C" ^ x.ml_name); List.iter l ~f: (function x -> w sep; w ("C" ^ x.ml_name)) -(* CamlTk: Definition of a type *) +(* CamlTk: Definition of a type *) let camltk_write_type ~intf:w ~impl:w' name ~def:typdef = (* Put markers for extraction *) w "(* type *)\n"; @@ -296,12 +296,12 @@ let camltk_write_type ~intf:w ~impl:w' name ~def:typdef = w ("(* no doc *) type "^name^"_constrs =\n") end; w " | "; - write_constructor_set ~w:w ~sep: "\n | " + write_constructor_set ~w:w ~sep: "\n | " (sort_components typdef.constructors); w "\n\n"; (* The set of all constructors *) w' ("let "^name^"_any_table = ["); - write_constructor_set ~w:w' ~sep:"; " + write_constructor_set ~w:w' ~sep:"; " (sort_components typdef.constructors); w' ("]\n\n"); (* The subset of constructors for each subtype *) @@ -312,7 +312,7 @@ let camltk_write_type ~intf:w ~impl:w' name ~def:typdef = typdef.subtypes end -let write_type ~intf:w ~impl:w' name ~def:typdef = +let write_type ~intf:w ~impl:w' name ~def:typdef = (if !Flags.camltk then camltk_write_type else labltk_write_type) ~intf:w ~impl:w' name ~def:typdef @@ -323,9 +323,9 @@ let write_type ~intf:w ~impl:w' name ~def:typdef = let rec converterTKtoCAML ~arg = function | Int -> "int_of_string " ^ arg | Float -> "float_of_string " ^ arg - | Bool -> "(match " ^ arg ^ " with - | \"1\" -> true - | \"0\" -> false + | Bool -> "(match " ^ arg ^ " with\n\ + | \"1\" -> true\n\ + | \"0\" -> false\n\ | s -> Pervasives.raise (Invalid_argument (\"cTKtoCAMLbool\" ^ s)))" | Char -> "String.get " ^ arg ^ " 0" | String -> arg @@ -333,8 +333,8 @@ let rec converterTKtoCAML ~arg = function | Subtype ("widget", s') when not !Flags.camltk -> String.concat ~sep:" " ["(Obj.magic (cTKtoCAMLwidget "; arg; ") :"; s'; "widget)"] - | Subtype (s, s') -> - if !Flags.camltk then + | Subtype (s, s') -> + if !Flags.camltk then "cTKtoCAML" ^ s ^ " " ^ arg else "cTKtoCAML" ^ s' ^ "_" ^ s ^ " " ^ arg @@ -359,12 +359,12 @@ let rec converterTKtoCAML ~arg = function (* Wrappers *) (*******************************) let varnames ~prefix n = - let rec var i = + let rec var i = if i > n then [] else (prefix ^ string_of_int i) :: var (succ i) in var 1 -(* +(* * generate wrapper source for callbacks * transform a function ... -> unit in a function : unit -> unit * using primitives arg_ ... from the protocol @@ -384,7 +384,7 @@ let rec wrapper_code ~name ty = (* variables for each component of the product *) let vnames = varnames ~prefix:"a" (List.length tyl) in (* getting the arguments *) - let readarg = + let readarg = List.map2 vnames tyl ~f: begin fun v (l, ty) -> match type_parser_arity ty with @@ -398,8 +398,8 @@ let rec wrapper_code ~name ty = " in\n " end in String.concat ~sep:"" readarg ^ name ^ " " ^ - String.concat ~sep:" " - (List.map2 ~f:(fun v (l, _) -> + String.concat ~sep:" " + (List.map2 ~f:(fun v (l, _) -> if !Flags.camltk then v else labelstring l ^ v) vnames tyl) @@ -410,7 +410,7 @@ let rec wrapper_code ~name ty = name ^ "(" ^ converterTKtoCAML ~arg:"(List.hd args)" ty ^ ")" | ty -> begin match type_parser_arity ty with - OneToken -> + OneToken -> name ^ "(" ^ converterTKtoCAML ~arg:"(List.hd args)" ty ^ ")" | MultipleToken -> "let (v, _) = " ^ converterTKtoCAML ~arg:"args" ty ^ @@ -435,8 +435,8 @@ type parser_pieces = mutable stringpar : string list (* idem *) } -type mini_parser = - NoParser +type mini_parser = + NoParser | ParserPieces of parser_pieces let can_generate_parser constructors = @@ -446,9 +446,9 @@ let can_generate_parser constructors = let vname = if !Flags.camltk then c.ml_name else c.var_name in match c.template with ListArg [StringArg s] -> - pp.zeroary <- (s, vname) :: + pp.zeroary <- (s, vname) :: pp.zeroary; true - | ListArg [TypeArg(_, Int)] | ListArg[TypeArg(_, Float)] -> + | ListArg [TypeArg(_, Int)] | ListArg[TypeArg(_, Float)] -> if pp.intpar <> [] then false else (pp.intpar <- [vname]; true) | ListArg [TypeArg(_, String)] -> @@ -466,8 +466,8 @@ let labltk_write_TKtoCAML ~w name ~def:typdef = if typdef.parser_arity = MultipleToken then prerr_string ("You must write cTKtoCAML" ^ name ^ " : string list ->" ^ name ^ " * string list\n") - else - let write ~consts ~name = + else + let write ~consts ~name = match can_generate_parser consts with NoParser -> prerr_string @@ -482,7 +482,7 @@ let labltk_write_TKtoCAML ~w name ~def:typdef = end; w (" match n with\n"); List.iter pp.zeroary ~f: - begin fun (tk, ml) -> + begin fun (tk, ml) -> w " | \""; w tk; w "\" -> `"; w ml; w "\n" end; let final = if pp.stringpar <> [] then @@ -505,8 +505,8 @@ let camltk_write_TKtoCAML ~w name ~def:typdef = if typdef.parser_arity = MultipleToken then prerr_string ("You must write cTKtoCAML" ^ name ^ " : string list ->" ^ name ^ " * string list\n") - else - let write ~consts ~name = + else + let write ~consts ~name = match can_generate_parser consts with NoParser -> prerr_string @@ -521,7 +521,7 @@ let camltk_write_TKtoCAML ~w name ~def:typdef = end; w (" match n with\n"); List.iter pp.zeroary ~f: - begin fun (tk, ml) -> + begin fun (tk, ml) -> w " | \""; w tk; w "\" -> "; w ml; w "\n" end; let final = if pp.stringpar <> [] then @@ -558,39 +558,39 @@ let rec converterCAMLtoTK ~context_widget argname ty = | Char -> "TkToken (Char.escaped " ^ argname ^ ")" | String -> "TkToken " ^ argname | As (ty, _) -> converterCAMLtoTK ~context_widget argname ty - | UserDefined s -> + | UserDefined s -> let name = "cCAMLtoTK" ^ s ^ " " in let args = argname in - let args = + let args = if !Flags.camltk then begin if is_subtyped s then (* unconstraint subtype *) s ^ "_any_table " ^ args else args end else args in - let args = + let args = if requires_widget_context s then context_widget ^ " " ^ args else args in name ^ args | Subtype ("widget", s') -> - if !Flags.camltk then + if !Flags.camltk then let name = "cCAMLtoTKwidget " in let args = "widget_"^s'^"_table "^argname in - let args = + let args = if requires_widget_context "widget" then context_widget^" "^args else args in name^args - else begin + else begin let name = "cCAMLtoTKwidget " in let args = "(" ^ argname ^ " : " ^ s' ^ " widget)" in name ^ args end | Subtype (s, s') -> - let name = + let name = if !Flags.camltk then "cCAMLtoTK" ^ s ^ " " - else "cCAMLtoTK" ^ s' ^ "_" ^ s ^ " " + else "cCAMLtoTK" ^ s' ^ "_" ^ s ^ " " in let args = if !Flags.camltk then begin @@ -600,7 +600,7 @@ let rec converterCAMLtoTK ~context_widget argname ty = else argname end in - let args = + let args = if requires_widget_context s then context_widget ^ " " ^ args else args in name ^ args @@ -614,19 +614,19 @@ let rec converterCAMLtoTK ~context_widget argname ty = ["]"]) | List ty -> (* Just added for Imagephoto.put *) String.concat ~sep:" " - [(if !Flags.camltk then - "TkQuote (TkTokenList (List.map (fun y -> " - else - "TkQuote (TkTokenList (List.map ~f:(fun y -> "); - converterCAMLtoTK ~context_widget "y" ty; - ")"; - argname; - "))"] + [(if !Flags.camltk then + "TkQuote (TkTokenList (List.map (fun y -> " + else + "TkQuote (TkTokenList (List.map ~f:(fun y -> "); + converterCAMLtoTK ~context_widget "y" ty; + ")"; + argname; + "))"] | Function _ -> fatal_error "unexpected function type in converterCAMLtoTK" | Unit -> fatal_error "unexpected unit type in converterCAMLtoTK" | Record _ -> fatal_error "unexpected product type in converterCAMLtoTK" -(* +(* * Produce a list of arguments from a template * The idea here is to avoid allocation as much as possible * @@ -638,7 +638,7 @@ let code_of_template ~context_widget ?func:(funtemplate=false) template = let variables2 = ref [] in let varcnter = ref 0 in let optionvar = ref None in - let newvar1 l = + let newvar1 l = match !optionvar with Some v -> optionvar := None; v | None -> @@ -652,7 +652,7 @@ let code_of_template ~context_widget ?func:(funtemplate=false) template = incr varcnter; let v = "v" ^ (string_of_int !varcnter) in variables2 := (l, v) :: !variables2; v in - let newvar = ref newvar1 in + let newvar = ref newvar1 in let rec coderec = function StringArg s -> "TkToken \"" ^ s ^ "\"" | TypeArg (_, List (Subtype (sup, sub))) when not !Flags.camltk -> @@ -663,13 +663,13 @@ let code_of_template ~context_widget ?func:(funtemplate=false) template = catch_opts := (sub ^ "_" ^ sup, lbl); newvar := newvar2; "TkTokenList opts" - with Not_found -> + with Not_found -> raise (Failure (Printf.sprintf "type %s(%s) not found" sup sub)); end | TypeArg (l, List ty) -> - (if !Flags.camltk then + (if !Flags.camltk then "TkTokenList (List.map (function x -> " - else + else "TkTokenList (List.map ~f:(function x -> ") ^ converterCAMLtoTK ~context_widget "x" ty ^ ") " ^ !newvar l ^ ")" @@ -680,18 +680,18 @@ let code_of_template ~context_widget ?func:(funtemplate=false) template = | TypeArg (l, ty) -> converterCAMLtoTK ~context_widget (!newvar l) ty | ListArg l -> "TkQuote (TkTokenList [" - ^ String.concat ~sep:";\n " (List.map ~f:coderec l) ^ "])" - | OptionalArgs (l, tl, d) -> + ^ String.concat ~sep:";\n " (List.map ~f:coderec l) ^ "])" + | OptionalArgs (l, tl, d) -> let nv = !newvar ("?" ^ l) in optionvar := Some nv; (* Store *) - let argstr = String.concat ~sep:"; " (List.map ~f:coderec tl) in + let argstr = String.concat ~sep:"; " (List.map ~f:coderec tl) in let defstr = String.concat ~sep:"; " (List.map ~f:coderec d) in "TkTokenList (match " ^ nv ^ " with\n" ^ " | Some " ^ nv ^ " -> [" ^ argstr ^ "]\n" ^ " | None -> [" ^ defstr ^ "])" in - let code = - if funtemplate then + let code = + if funtemplate then match template with ListArg l -> "[|" ^ String.concat ~sep:";\n " (List.map ~f:coderec l) ^ "|]" @@ -721,7 +721,7 @@ let labltk_write_clause ~w ~context_widget comp = code_of_template ~context_widget comp.template in (* no subtype I think ... *) - if co <> "" then raise (Failure "write_clause subtype ?"); + if co <> "" then raise (Failure "write_clause subtype ?"); begin match variables with | [] -> warrow() | [x] -> w " "; w (labeloff x ~at:"write_clause"); warrow() @@ -734,19 +734,19 @@ let labltk_write_clause ~w ~context_widget comp = w code let camltk_write_clause ~w ~context_widget ~subtype comp = - let warrow () = + let warrow () = w " -> "; - if subtype then + if subtype then w ("chk_sub \""^comp.ml_name^"\" table C" ^ comp.ml_name ^ "; ") in - w comp.ml_name; (* we use ml_name, not var_name, specialized for labltk *) + w comp.ml_name; (* we use ml_name, not var_name, specialized for labltk *) let code, variables, variables2, (co, _) = code_of_template ~context_widget comp.template in (* no subtype I think ... *) - if co <> "" then raise (Failure "write_clause subtype ?"); + if co <> "" then raise (Failure "write_clause subtype ?"); begin match variables with | [] -> warrow() | [x] -> w " "; w (labeloff x ~at:"write_clause"); warrow() @@ -767,7 +767,7 @@ let write_CAMLtoTK ~w ~def:typdef ?safetype:(st = true) name = let write_one name constrs = let subtype = typdef.subtypes <> [] in w ("let cCAMLtoTK" ^ name); - let context_widget = + let context_widget = if typdef.requires_widget_context then begin w " w"; "w" end @@ -784,7 +784,7 @@ let write_CAMLtoTK ~w ~def:typdef ?safetype:(st = true) name = ~f:(fun c -> w "\n | "; write_clause ~w ~context_widget ~subtype c); w "\n\n\n" in - + let constrs = typdef.constructors in if !Flags.camltk then write_one name constrs else begin @@ -813,7 +813,7 @@ let rec write_result_parsing ~w = function w (" List.map " ^ converterTKtoCAML ~arg:"(splitlist res)" ty) else w (" List.map ~f: " ^ converterTKtoCAML ~arg:"(splitlist res)" ty) - | Product tyl -> raise (Failure "Product -> record was done. ???") + | Product tyl -> raise (Failure "Product -> record was done. ???") | Record tyl -> (* of course all the labels are "" *) let rnames = varnames ~prefix:"r" (List.length tyl) in w " let l = splitlist res in"; @@ -822,7 +822,7 @@ let rec write_result_parsing ~w = function w ("\n else "); List.iter2 rnames tyl ~f: begin fun r (l, ty) -> - if l <> "" then raise (Failure "lables in return type!!!"); + if l <> "" then raise (Failure "lables in return type!!!"); w (" let " ^ r ^ ", l = "); begin match type_parser_arity ty with OneToken -> @@ -852,7 +852,7 @@ let labltk_write_function ~w def = let code, variables, variables2, (co, lbl) = code_of_template ~func:true ~context_widget def.template in (* Arguments *) - let uv, lv, ov = + let uv, lv, ov = let rec replace_args ~u ~l ~o = function [] -> u, l, o | ("", x) :: ls -> @@ -901,7 +901,7 @@ let camltk_write_function ~w def = let code, variables, variables2, (co, lbl) = code_of_template ~func:true ~context_widget def.template in (* Arguments *) - let uv, ov = + let uv, ov = let rec replace_args ~u ~o = function [] -> u, o | ("", x) :: ls -> @@ -943,20 +943,20 @@ let camltk_write_function ~w def = (* Arguments *) begin match variables with [] -> w " () =\n" - | l -> + | l -> let has_normal_argument = ref false in - List.iter (fun (l,x) -> + List.iter (fun (l,x) -> w " "; - if l <> "" then + if l <> "" then if l.[0] = '?' then w (l ^ ":") else has_normal_argument := true else has_normal_argument := true; - w x) l; + w x) l; if not !has_normal_argument then w " ()"; w " =\n" end; begin match def.result with | Unit | As (Unit, _) -> w "tkCommand "; w code - | ty -> + | ty -> w "let res = tkEval "; w code ; w " in \n"; write_result_parsing ~w ty end; @@ -1028,10 +1028,10 @@ let write_external ~w def = let code_list = Ppparse.parse_channel ic in close_in ic; List.iter (Ppexec.exec (fun _ -> ()) w) - (if !Flags.camltk then + (if !Flags.camltk then Code.Define "CAMLTK" :: code_list else code_list ); with - | Ppparse.Error s -> + | Ppparse.Error s -> close_in ic; raise (Compiler_Error (Printf.sprintf "Preprocess error: %s" s)) with @@ -1046,7 +1046,7 @@ let write_catch_optionals ~w clas ~def:typdef = begin fun (subclass, classdefs) -> w ("let " ^ subclass ^ "_" ^ clas ^ "_optionals f = fun\n"); let tklabels = List.map ~f:gettklabel classdefs in - let l = + let l = List.map classdefs ~f: begin fun fc -> (* diff --git a/otherlibs/labltk/compiler/intf.ml b/otherlibs/labltk/compiler/intf.ml index f1baae32..59608b38 100644 --- a/otherlibs/labltk/compiler/intf.ml +++ b/otherlibs/labltk/compiler/intf.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: intf.ml 5029 2002-07-23 14:12:03Z doligez $ *) +(* $Id$ *) open StdLabels @@ -26,7 +26,7 @@ open Compile let labltk_write_create_p ~w wname = w "val create :\n ?name:string ->\n"; begin - try + try let option = Hashtbl.find types_table "options" in let classdefs = List.assoc wname option.subtypes in let tklabels = List.map ~f:gettklabel classdefs in @@ -37,7 +37,7 @@ let labltk_write_create_p ~w wname = end, fc.template end in - w (String.concat ~sep:" ->\n" + w (String.concat ~sep:" ->\n" (List.map l ~f: begin fun (s, t) -> " ?" ^ s ^ ":" @@ -58,7 +58,7 @@ let camltk_write_create_p ~w wname = w "val create : ?name: string -> widget -> options list -> widget \n"; w "(** [create ?name parent options] creates a new widget with\n"; w " parent [parent] and new patch component [name] if specified.\n"; - w " Options are restricted to the widget class subset, and checked\n"; + w " Options are restricted to the widget class subset, and checked\n"; w " dynamically. *)\n\n" ;; @@ -77,7 +77,7 @@ let labltk_write_function_type ~w def = let tys = types_of_template def.template in let rec replace_args ~u ~l ~o = function [] -> u, l, o - | (_, List(Subtype _) as x)::ls -> + | (_, List(Subtype _) as x)::ls -> replace_args ~u ~l ~o:(x::o) ls | ("", _ as x)::ls -> replace_args ~u:(x::u) ~l ~o ls @@ -144,7 +144,7 @@ let camltk_write_function_type ~w def = let have_normal_arg = ref false in List.iter tys ~f: begin fun (l, t) -> - if l <> "" then + if l <> "" then if l.[0] = '?' then w (l^":") else begin have_normal_arg := true; @@ -161,7 +161,7 @@ let camltk_write_function_type ~w def = else w "\n(* /unsafe *)\n" *) -let write_function_type ~w def = +let write_function_type ~w def = if !Flags.camltk then camltk_write_function_type ~w def else labltk_write_function_type ~w def @@ -176,12 +176,12 @@ let write_external_type ~w def = close_in ic; if not def.safe then w "(* unsafe *)\n"; List.iter (Ppexec.exec (fun _ -> ()) w) - (if !Flags.camltk then + (if !Flags.camltk then Code.Define "CAMLTK" :: code_list else code_list ); if def.safe then w "\n\n" else w "\n(* /unsafe *)\n\n" with - | Ppparse.Error s -> + | Ppparse.Error s -> close_in ic; raise (Compiler_Error (Printf.sprintf "Preprocess error: %s" s)) with diff --git a/otherlibs/labltk/compiler/lexer.mll b/otherlibs/labltk/compiler/lexer.mll index bc28c1d4..f51f0c01 100644 --- a/otherlibs/labltk/compiler/lexer.mll +++ b/otherlibs/labltk/compiler/lexer.mll @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mll 5029 2002-07-23 14:12:03Z doligez $ *) +(* $Id$ *) { open StdLabels @@ -40,7 +40,7 @@ let _ = List.iter "string", TYSTRING; "list", LIST; "as", AS; - "variant", VARIANT; + "variant", VARIANT; "widget", WIDGET; "option", OPTION; "type", TYPE; @@ -127,12 +127,12 @@ rule main = parse | "?" {QUESTION} | "/" {SLASH} | "%" { comment lexbuf; main lexbuf } - | "##line" { line lexbuf; main lexbuf } + | "##line" { line lexbuf; main lexbuf } | eof { EOF } | _ { raise (Lexical_error("illegal character")) } - + and string = parse '"' { () } @@ -160,7 +160,7 @@ and comment = parse | _ { comment lexbuf } and linenum = parse - | ['0'-'9']+ { + | ['0'-'9']+ { let next_line = int_of_string (Lexing.lexeme lexbuf) in current_line := next_line - 1 } diff --git a/otherlibs/labltk/compiler/maincompile.ml b/otherlibs/labltk/compiler/maincompile.ml index 817e4b64..d8c72a31 100644 --- a/otherlibs/labltk/compiler/maincompile.ml +++ b/otherlibs/labltk/compiler/maincompile.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: maincompile.ml 6757 2005-01-28 16:13:11Z doligez $ *) +(* $Id$ *) open StdLabels open Support @@ -24,7 +24,7 @@ open Compile open Intf let flag_verbose = ref false -let verbose_string s = +let verbose_string s = if !flag_verbose then prerr_string s let verbose_endline s = if !flag_verbose then prerr_endline s @@ -33,7 +33,7 @@ let input_name = ref "Widgets.src" let output_dir = ref "" let destfile f = Filename.concat !output_dir f -let usage () = +let usage () = prerr_string "Usage: tkcompiler input.src\n"; flush stderr; exit 1 @@ -53,15 +53,15 @@ let parse_file filename = let code_list = Ppparse.parse_channel ic in close_in ic; let buf = Buffer.create 50000 in - List.iter (Ppexec.exec + List.iter (Ppexec.exec (fun l -> Buffer.add_string buf (Printf.sprintf "##line %d\n" l)) (Buffer.add_string buf)) - (if !Flags.camltk then Code.Define "CAMLTK" :: code_list + (if !Flags.camltk then Code.Define "CAMLTK" :: code_list else code_list); Lexing.from_string (Buffer.contents buf) with - | Ppparse.Error s -> + | Ppparse.Error s -> close_in ic; raise (Compiler_Error (Printf.sprintf "Preprocess error: %s" s)) in @@ -110,9 +110,9 @@ let uniq_clauses = function let check_constr constr1 constr2 = if constr1.template <> constr2.template then begin - let code1, vars11, vars12, opts1 = + let code1, vars11, vars12, opts1 = code_of_template ~context_widget:"dummy" constr1.template in - let code2, vars12, vars22, opts2 = + let code2, vars12, vars22, opts2 = code_of_template ~context_widget:"dummy" constr2.template in let err = Printf.sprintf @@ -141,14 +141,14 @@ let option_hack oc = let hack = { parser_arity = OneToken; constructors = begin - let constrs = + let constrs = List.map typdef.constructors ~f: - begin fun c -> + begin fun c -> { component = Constructor; - ml_name = (if !Flags.camltk then "C" ^ c.ml_name + ml_name = (if !Flags.camltk then "C" ^ c.ml_name else c.ml_name); var_name = c.var_name; (* as variants *) - template = + template = begin match c.template with ListArg (x :: _) -> x | _ -> fatal_error "bogus hack" @@ -159,20 +159,20 @@ let option_hack oc = if !Flags.camltk then constrs else uniq_clauses constrs (* JPF ?? *) end; subtypes = []; - requires_widget_context = false; + requires_widget_context = false; variant = false } in write_CAMLtoTK ~w:(output_string oc) ~def:hack ~safetype:false "options_constrs" -let realname name = +let realname name = (* module name fix for camltk *) if !Flags.camltk then "c" ^ String.capitalize name else name ;; (* analize the parsed Widget.src and output source files *) -let compile () = +let compile () = verbose_endline "Creating _tkgen.ml ..."; let oc = open_out_bin (destfile "_tkgen.ml") in let oc' = open_out_bin (destfile "_tkigen.ml") in @@ -197,7 +197,7 @@ let compile () = if not !Flags.camltk then (* only for LablTk *) write_catch_optionals ~w:(output_string oc') typname ~def:typdef; verbose_endline "." - with Not_found -> + with Not_found -> if not (List.mem_assoc typname !types_external) then begin verbose_string "Type "; @@ -224,8 +224,8 @@ let compile () = let write_module wname wdef = verbose_endline (" "^wname); let modname = realname wname in - let oc = open_out_bin (destfile (modname ^ ".ml")) - and oc' = open_out_bin (destfile (modname ^ ".mli")) in + let oc = open_out_bin (destfile (modname ^ ".ml")) + and oc' = open_out_bin (destfile (modname ^ ".mli")) in Copyright.write ~w:(output_string oc); Copyright.write ~w:(output_string oc'); begin match wdef.module_type with @@ -260,11 +260,11 @@ let compile () = end | Family -> () end; - List.iter ~f:(write_function ~w:(output_string oc)) + List.iter ~f:(write_function ~w:(output_string oc)) (sort_components wdef.commands); List.iter ~f:(write_function_type ~w:(output_string oc')) (sort_components wdef.commands); - List.iter ~f:(write_external ~w:(output_string oc)) + List.iter ~f:(write_external ~w:(output_string oc)) (sort_components wdef.externals); List.iter ~f:(write_external_type ~w:(output_string oc')) (sort_components wdef.externals); @@ -276,15 +276,15 @@ let compile () = if !Flags.camltk then begin let oc = open_out_bin (destfile "camltk.ml") in Copyright.write ~w:(output_string oc); - output_string oc -"(** This module Camltk provides the module name spaces of the CamlTk API. - - The users of the CamlTk API should open this module first to access - the types, functions and modules of the CamlTk API easier. - For the documentation of each sub modules such as [Button] and [Toplevel], - refer to its defintion file, [cButton.mli], [cToplevel.mli], etc. - *) - + output_string oc +"(** This module Camltk provides the module name spaces of the CamlTk API.\n\ +\n\ + The users of the CamlTk API should open this module first to access\n\ + the types, functions and modules of the CamlTk API easier.\n\ + For the documentation of each sub modules such as [Button] and [Toplevel],\n\ + refer to its defintion file, [cButton.mli], [cToplevel.mli], etc.\n\ + *)\n\ +\n\ "; output_string oc "include CTk\n"; output_string oc "module Tk = CTk\n"; @@ -297,17 +297,17 @@ let compile () = end else begin let oc = open_out_bin (destfile "labltk.ml") in Copyright.write ~w:(output_string oc); - output_string oc -"(** This module Labltk provides the module name spaces of the LablTk API, - useful to call LablTk functions inside CamlTk programs. 100% LablTk users - do not need to use this. *) - + output_string oc +"(** This module Labltk provides the module name spaces of the LablTk API,\n\ + useful to call LablTk functions inside CamlTk programs. 100% LablTk users\n\ + do not need to use this. *)\n\ +\n\ "; - output_string oc "module Widget = Widget;; -module Protocol = Protocol;; -module Textvariable = Textvariable;; -module Fileevent = Fileevent;; -module Timer = Timer;; + output_string oc "module Widget = Widget;;\n\ +module Protocol = Protocol;;\n\ +module Textvariable = Textvariable;;\n\ +module Fileevent = Fileevent;;\n\ +module Timer = Timer;;\n\ "; Hashtbl.iter (fun name _ -> let cname = realname name in @@ -319,9 +319,9 @@ module Timer = Timer;; Hashtbl.iter (fun name def -> match def.module_type with | Widget -> - output_string oc (Printf.sprintf + output_string oc (Printf.sprintf "let %s (w : any widget) =\n" name); - output_string oc (Printf.sprintf + output_string oc (Printf.sprintf " Rawwidget.check_class w widget_%s_table;\n" name); output_string oc (Printf.sprintf " (Obj.magic w : %s widget);;\n\n" name); diff --git a/otherlibs/labltk/compiler/parser.mly b/otherlibs/labltk/compiler/parser.mly index 72cca469..15ced65f 100644 --- a/otherlibs/labltk/compiler/parser.mly +++ b/otherlibs/labltk/compiler/parser.mly @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: parser.mly 5464 2003-03-27 15:04:44Z furuse $ */ +/* $Id$ */ %{ @@ -31,7 +31,7 @@ open Tables %token RPAREN /* ")" */ %token COMMA /* "," */ %token SEMICOLON /* ";" */ -%token COLON /* ":" */ +%token COLON /* ":" */ %token QUESTION /* "?" */ %token LBRACKET /* "[" */ %token RBRACKET /* "]" */ @@ -86,11 +86,11 @@ Type0 : /* Camltk/Labltk types */ Type0_5: | Type0 SLASH Type0 { if !Flags.camltk then $1 else $3 } - | Type0 { $1 } + | Type0 { $1 } ; /* with subtypes */ -Type1 : +Type1 : Type0_5 { $1 } | TypeName LPAREN IDENT RPAREN @@ -141,8 +141,8 @@ FType : LPAREN RPAREN { Unit } | LPAREN Type2 RPAREN - { $2 } - | LPAREN Type_record RPAREN + { $2 } + | LPAREN Type_record RPAREN { Record $2 } ; @@ -168,7 +168,7 @@ Arg: | Type {TypeArg ("", $1) } | IDENT COLON Type - {TypeArg ($1, $3)} + {TypeArg ($1, $3)} | QUESTION IDENT COLON LBRACKET SimpleArgList RBRACKET DefaultList {OptionalArgs ( $2, $5, $7 )} | QUESTION WIDGET COLON LBRACKET SimpleArgList RBRACKET DefaultList @@ -212,14 +212,14 @@ Template : /* Constructors for type declarations */ Constructor : IDENT Template - {{ component = Constructor; + {{ component = Constructor; ml_name = $1; var_name = getvarname $1 $2; template = $2; result = Unit; safe = true }} | IDENT LPAREN IDENT RPAREN Template - {{ component = Constructor; + {{ component = Constructor; ml_name = $1; var_name = $3; template = $5; @@ -290,7 +290,7 @@ WidgetComponents : { $1 :: $2 } ; -ModuleComponents : +ModuleComponents : /* */ { [] } | Command ModuleComponents @@ -319,7 +319,7 @@ entry : { enter_subtype "options" $2 $5 $8 } | SUBTYPE ParserArity TypeName LPAREN IDENT RPAREN LBRACE AbbrevConstructors RBRACE { enter_subtype $3 $2 $5 $8 } -| Command +| Command { enter_function $1 } | WIDGET IDENT LBRACE WidgetComponents RBRACE { enter_widget $2 $4 } diff --git a/otherlibs/labltk/compiler/ppexec.ml b/otherlibs/labltk/compiler/ppexec.ml index 99468820..71118b96 100644 --- a/otherlibs/labltk/compiler/ppexec.ml +++ b/otherlibs/labltk/compiler/ppexec.ml @@ -32,9 +32,9 @@ let rec nop = function ;; let rec exec lp f = function - | Line line -> - if !debug then - prerr_endline (Printf.sprintf "%03d: %s" !linenum + | Line line -> + if !debug then + prerr_endline (Printf.sprintf "%03d: %s" !linenum (String.sub line 0 ((String.length line) - 1))); f line; incr linenum | Ifdef (sw, k, c1, c2o) -> @@ -48,13 +48,13 @@ let rec exec lp f = function end else begin List.iter nop c1; match c2o with - | Some c2 -> + | Some c2 -> lp !linenum; List.iter (exec lp f) c2 | None -> () end | Define k -> defined := k :: !defined - | Undef k -> + | Undef k -> defined := List.fold_right (fun k' s -> if k = k' then s else k' :: s) [] !defined ;; diff --git a/otherlibs/labltk/compiler/pplex.mll b/otherlibs/labltk/compiler/pplex.mll index 61ca9f4b..313d1f2d 100644 --- a/otherlibs/labltk/compiler/pplex.mll +++ b/otherlibs/labltk/compiler/pplex.mll @@ -18,10 +18,10 @@ open Ppyac exception Error of string let linenum = ref 1 -} +} let blank = [' ' '\013' '\009' '\012'] -let identchar = +let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9'] let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222'] @@ -29,10 +29,10 @@ let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222'] rule token = parse blank + { token lexbuf } | "##" [' ' '\t']* { directive lexbuf } -| ("#")? [^ '#' '\n']* '\n'? { +| ("#")? [^ '#' '\n']* '\n'? { begin let str = Lexing.lexeme lexbuf in - if String.length str <> 0 && str.[String.length str - 1] = '\n' then + if String.length str <> 0 && str.[String.length str - 1] = '\n' then begin incr linenum end; @@ -51,6 +51,6 @@ and directive = parse | _ { raise (Error (Printf.sprintf "unknown directive at line %d" !linenum))} and ident = parse -| lowercase identchar* | uppercase identchar* +| lowercase identchar* | uppercase identchar* { Lexing.lexeme lexbuf } | _ { raise (Error (Printf.sprintf "illegal identifier at line %d" !linenum)) } diff --git a/otherlibs/labltk/compiler/ppparse.ml b/otherlibs/labltk/compiler/ppparse.ml index 3d1ee2af..630d675d 100644 --- a/otherlibs/labltk/compiler/ppparse.ml +++ b/otherlibs/labltk/compiler/ppparse.ml @@ -19,18 +19,18 @@ exception Error of string let parse_channel ic = let lexbuf = Lexing.from_channel ic in try - Ppyac.code_list Pplex.token lexbuf + Ppyac.code_list Pplex.token lexbuf with | Pplex.Error s -> - let loc_start = Lexing.lexeme_start lexbuf + let loc_start = Lexing.lexeme_start lexbuf and loc_end = Lexing.lexeme_end lexbuf in - raise (Error (Printf.sprintf "parse error at char %d, %d: %s" + raise (Error (Printf.sprintf "parse error at char %d, %d: %s" loc_start loc_end s)) | Parsing.Parse_error -> - let loc_start = Lexing.lexeme_start lexbuf + let loc_start = Lexing.lexeme_start lexbuf and loc_end = Lexing.lexeme_end lexbuf in - raise (Error (Printf.sprintf "parse error at char %d, %d" + raise (Error (Printf.sprintf "parse error at char %d, %d" loc_start loc_end)) ;; diff --git a/otherlibs/labltk/compiler/printer.ml b/otherlibs/labltk/compiler/printer.ml index 60362d17..be70612a 100644 --- a/otherlibs/labltk/compiler/printer.ml +++ b/otherlibs/labltk/compiler/printer.ml @@ -121,7 +121,7 @@ let rec print_component_type = function (* Full definition of a component *) let rec print_fullcomponent = function {component = c; ml_name = s; var_name = s0; template = t; result = m; - safe = b; + safe = b; } -> printf "@[<1>{"; printf "@[<1>component =@ "; print_component_type c; printf ";@]@ "; printf "@[<1>ml_name =@ "; print_quoted_string s; @@ -137,7 +137,7 @@ let rec print_component = function printf "@[<1>(%s@ " "Abbrev"; print_quoted_string s; printf ")@]";; (* A type definition *) -(* +(* requires_widget_context: the converter of the type MUST be passed an additional argument of type Widget. *) @@ -146,7 +146,7 @@ let rec print_parser_arity = function let rec print_type_def = function {parser_arity = p; constructors = l_f; subtypes = l_t_s_l_f; - requires_widget_context = b; variant = b0; + requires_widget_context = b; variant = b0; } -> printf "@[<1>{"; printf "@[<1>parser_arity =@ "; print_parser_arity p; printf ";@]@ "; printf "@[<1>constructors =@ "; diff --git a/otherlibs/labltk/compiler/tables.ml b/otherlibs/labltk/compiler/tables.ml index 2ccd0fd1..0663dfaa 100644 --- a/otherlibs/labltk/compiler/tables.ml +++ b/otherlibs/labltk/compiler/tables.ml @@ -14,14 +14,14 @@ (* *) (***********************************************************************) -(* $Id: tables.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open StdLabels open Support (* Internal compiler errors *) -exception Compiler_Error of string +exception Compiler_Error of string let fatal_error s = raise (Compiler_Error s) @@ -68,12 +68,12 @@ let sort_components = (* components are given either in full or abbreviated *) -type component = +type component = Full of fullcomponent | Abbrev of string (* A type definition *) -(* +(* requires_widget_context: the converter of the type MUST be passed an additional argument of type Widget. *) @@ -117,7 +117,7 @@ let module_table = (Hashtbl.create 37 : (string, module_def) Hashtbl.t) (* variant name *) -let rec getvarname ml_name temp = +let rec getvarname ml_name temp = let offhypben s = let s = String.copy s in if (try String.sub s ~pos:0 ~len:1 with _ -> "") = "-" then @@ -125,7 +125,7 @@ let rec getvarname ml_name temp = else s and makecapital s = begin - try + try let cd = s.[0] in if cd >= 'a' && cd <= 'z' then s.[0] <- Char.chr (Char.code cd + (Char.code 'A' - Char.code 'a')) @@ -137,24 +137,24 @@ let rec getvarname ml_name temp = let head = makecapital (offhypben begin match temp with StringArg s -> s - | TypeArg (s,t) -> s + | TypeArg (s,t) -> s | ListArg (h::_) -> getvarname ml_name h | OptionalArgs (s,_,_) -> s | ListArg [] -> "" end) in - let varname = if head = "" then ml_name - else if head.[0] >= 'A' && head.[0] <= 'Z' then head + let varname = if head = "" then ml_name + else if head.[0] >= 'A' && head.[0] <= 'Z' then head else ml_name in varname (***** Some utilities on the various tables *****) (* Enter a new empty type *) -let new_type typname arity = +let new_type typname arity = Tsort.add_element types_order typname; let typdef = {parser_arity = arity; - constructors = []; - subtypes = []; + constructors = []; + subtypes = []; requires_widget_context = false; variant = false} in Hashtbl.add types_table typname typdef; @@ -165,23 +165,23 @@ let new_type typname arity = (* Widget is builtin and implicitly subtyped *) let is_subtyped s = s = "widget" || - try + try let typdef = Hashtbl.find types_table s in typdef.subtypes <> [] with Not_found -> false -let requires_widget_context s = - try +let requires_widget_context s = + try (Hashtbl.find types_table s).requires_widget_context with Not_found -> false -let declared_type_parser_arity s = - try +let declared_type_parser_arity s = + try (Hashtbl.find types_table s).parser_arity with - Not_found -> + Not_found -> try List.assoc s !types_external with Not_found -> @@ -225,8 +225,8 @@ let rec enter_template_types = function StringArg _ -> () | TypeArg (l,t) -> enter_argtype t | ListArg l -> List.iter ~f:enter_template_types l - | OptionalArgs (_,tl,_) -> List.iter ~f:enter_template_types tl - + | OptionalArgs (_,tl,_) -> List.iter ~f:enter_template_types tl + (* Find type dependancies on s *) let rec add_dependancies s = function @@ -253,7 +253,7 @@ let rec has_callback = function | OptionalArgs (_,tl,_) -> List.exists ~f:has_callback tl (*** Returned types ***) -let really_add ty = +let really_add ty = if List.mem ty !types_returned then () else types_returned := ty :: !types_returned @@ -266,7 +266,7 @@ let rec add_return_type = function | String -> () | List ty -> add_return_type ty | Product tyl -> List.iter ~f:add_return_type tyl - | Record tyl -> List.iter tyl ~f:(fun (l,t) -> add_return_type t) + | Record tyl -> List.iter tyl ~f:(fun (l,t) -> add_return_type t) | UserDefined s -> really_add s | Subtype (s,_) -> really_add s | Function _ -> fatal_error "unexpected return type (function)" (* whoah *) @@ -287,9 +287,9 @@ exception Invalid_implicit_constructor of string let rec check_duplicate_constr allowed c = function [] -> false (* not defined *) - | c'::rest -> + | c'::rest -> if c.ml_name = c'.ml_name then (* defined *) - if allowed then + if allowed then if c.template = c'.template then true (* same arg *) else raise (Duplicate_Definition ("constructor",c.ml_name)) else raise (Duplicate_Definition ("constructor", c.ml_name)) @@ -306,16 +306,16 @@ let enter_type typname ?(variant = false) arity constructors = if Hashtbl.mem types_table typname then raise (Duplicate_Definition ("type", typname)) else let typdef = new_type typname arity in - if variant then typdef.variant <- true; + if variant then typdef.variant <- true; List.iter constructors ~f: begin fun c -> if not (check_duplicate_constr false c typdef.constructors) - then begin + then begin typdef.constructors <- c :: typdef.constructors; add_template_dependancies typname c.template end; (* Callbacks require widget context *) - typdef.requires_widget_context <- + typdef.requires_widget_context <- typdef.requires_widget_context || has_callback c.template end @@ -323,17 +323,17 @@ let enter_type typname ?(variant = false) arity constructors = (* Enter a subtype *) let enter_subtype typ arity subtyp constructors = (* Retrieve the type if already defined, else add a new one *) - let typdef = + let typdef = try Hashtbl.find types_table typ with Not_found -> new_type typ arity in if List.mem_assoc subtyp typdef.subtypes then raise (Duplicate_Definition ("subtype", typ ^" "^subtyp)) else begin - let real_constructors = + let real_constructors = List.map constructors ~f: begin function - Full c -> + Full c -> if not (check_duplicate_constr true c typdef.constructors) then begin add_template_dependancies typ c.template; @@ -359,10 +359,10 @@ let enter_subtype typ arity subtyp constructors = let retrieve_option optname = let optiontyp = try Hashtbl.find types_table "options" - with + with Not_found -> raise (Invalid_implicit_constructor optname) in find_constructor optname optiontyp.constructors - + (* Sort components by type *) let rec add_sort l obj = match l with @@ -370,7 +370,7 @@ let rec add_sort l obj = | (s',l)::rest -> if obj.component = s' then (s',obj::l)::rest - else + else (s',l)::(add_sort rest obj) let separate_components = List.fold_left ~f:add_sort ~init:[] @@ -380,24 +380,24 @@ let enter_widget name components = raise (Duplicate_Definition ("widget/module", name)) else let sorted_components = separate_components components in List.iter sorted_components ~f: - begin function + begin function Constructor, l -> - enter_subtype "options" MultipleToken + enter_subtype "options" MultipleToken name (List.map ~f:(fun c -> Full c) l) - | Command, l -> + | Command, l -> List.iter ~f:enter_component_types l | External, _ -> () end; - let commands = + let commands = try List.assoc Command sorted_components - with Not_found -> [] - and externals = + with Not_found -> [] + and externals = try List.assoc External sorted_components with Not_found -> [] in - Hashtbl.add module_table name + Hashtbl.add module_table name {module_type = Widget; commands = commands; externals = externals} - + (******************** Functions ********************) let enter_function comp = @@ -406,22 +406,22 @@ let enter_function comp = (******************** Modules ********************) -let enter_module name components = +let enter_module name components = if Hashtbl.mem module_table name then raise (Duplicate_Definition ("widget/module", name)) else let sorted_components = separate_components components in List.iter sorted_components ~f: - begin function + begin function Constructor, l -> fatal_error "unexpected Constructor" | Command, l -> List.iter ~f:enter_component_types l | External, _ -> () end; - let commands = + let commands = try List.assoc Command sorted_components - with Not_found -> [] - and externals = + with Not_found -> [] + and externals = try List.assoc External sorted_components with Not_found -> [] in - Hashtbl.add module_table name + Hashtbl.add module_table name {module_type = Family; commands = commands; externals = externals} diff --git a/otherlibs/labltk/compiler/tsort.ml b/otherlibs/labltk/compiler/tsort.ml index e8074ae8..6496eaae 100644 --- a/otherlibs/labltk/compiler/tsort.ml +++ b/otherlibs/labltk/compiler/tsort.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: tsort.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open StdLabels @@ -35,7 +35,7 @@ exception Cyclic let find_entry order node = let rec search_entry = - function + function [] -> raise Not_found | x::l -> if x.node = node then x else search_entry l in @@ -48,7 +48,7 @@ let find_entry order node = order := entry::!order; entry -let create () = ref [] +let create () = ref [] (* Inverted args because Sort.list builds list in reverse order *) let add_relation order (succ,pred) = @@ -62,28 +62,26 @@ let add_element order e = ignore (find_entry order e) let sort order = - let q = Queue.create () + let q = Queue.create () and result = ref [] in List.iter !order ~f:(function {pred_count = n} as node -> if n = 0 then Queue.add node q); - begin try + begin try while true do let t = Queue.take q in result := t.node :: !result; List.iter t.successors ~f: - begin fun s -> + begin fun s -> let n = s.pred_count - 1 in s.pred_count <- n; if n = 0 then Queue.add s q end done with - Queue.Empty -> + Queue.Empty -> List.iter !order ~f:(fun node -> if node.pred_count <> 0 then raise Cyclic) end; !result - - diff --git a/otherlibs/labltk/examples_camltk/Makefile b/otherlibs/labltk/examples_camltk/Makefile index 42613054..52de5cd0 100644 --- a/otherlibs/labltk/examples_camltk/Makefile +++ b/otherlibs/labltk/examples_camltk/Makefile @@ -8,10 +8,10 @@ all: addition$(EXE) helloworld$(EXE) winskel$(EXE) fileinput$(EXE) \ eyes$(EXE) tetris$(EXE) mytext$(EXE) fileopen$(EXE) addition$(EXE): addition.cmo - $(CAMLC) $(COMPFLAGS) -o $@ $(LIBNAME).cma addition.cmo + $(CAMLC) $(COMPFLAGS) -o $@ $(LIBNAME).cma addition.cmo helloworld$(EXE): helloworld.cmo - $(CAMLC) $(COMPFLAGS) -o $@ $(LIBNAME).cma helloworld.cmo + $(CAMLC) $(COMPFLAGS) -o $@ $(LIBNAME).cma helloworld.cmo winskel$(EXE): winskel.cmo $(CAMLC) $(COMPFLAGS) -o $@ $(LIBNAME).cma winskel.cmo @@ -33,13 +33,13 @@ mytext$(EXE): mytext.cmo # graph$(EXE): graphics.cmo graphics_test.cmo # $(CAMLC) -o $@ graphics.cmo graphics_test.cmo -# +# # graphics_test.cmo: graphics.cmo fileopen$(EXE): fileopen.cmo $(CAMLC) $(COMPFLAGS) -o $@ $(LIBNAME).cma fileopen.cmo -clean : +clean : rm -f *.cm? $(EXECS) addition eyes fileinput fileopen helloworld jptest mytext tetris winskel .SUFFIXES : diff --git a/otherlibs/labltk/examples_camltk/Makefile.nt b/otherlibs/labltk/examples_camltk/Makefile.nt index d07471bc..bc6589ca 100644 --- a/otherlibs/labltk/examples_camltk/Makefile.nt +++ b/otherlibs/labltk/examples_camltk/Makefile.nt @@ -11,11 +11,11 @@ all: addition.exe helloworld.exe winskel.exe socketinput.exe addition.exe: addition.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ addition.cmo + -o $@ addition.cmo helloworld.exe: helloworld.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ helloworld.cmo + -o $@ helloworld.cmo winskel.exe: winskel.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ @@ -25,7 +25,7 @@ socketinput.exe: socketinput.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) unix.cma \ -o $@ socketinput.cmo -clean : +clean : rm -f *.cm? *.exe .SUFFIXES : diff --git a/otherlibs/labltk/examples_camltk/eyes.ml b/otherlibs/labltk/examples_camltk/eyes.ml index 5666c69c..c9314623 100644 --- a/otherlibs/labltk/examples_camltk/eyes.ml +++ b/otherlibs/labltk/examples_camltk/eyes.ml @@ -25,7 +25,7 @@ let _ = pack [fw] []; let c = Canvas.create fw [Width (Pixels 200); Height (Pixels 200)] in let create_eye cx cy wx wy ewx ewy bnd = - let o2 = + let _o2 = Canvas.create_oval c (Pixels (cx - wx)) (Pixels (cy - wy)) (Pixels (cx + wx)) (Pixels (cy + wy)) @@ -42,9 +42,9 @@ let _ = (BindExtend ([Ev_MouseX; Ev_MouseY], (fun e -> let nx, ny = - let xdiff = e.ev_MouseX - cx + let xdiff = e.ev_MouseX - cx and ydiff = e.ev_MouseY - cy in - let diff = sqrt ((float xdiff /. (float wx *. bnd)) ** 2.0 +. + let diff = sqrt ((float xdiff /. (float wx *. bnd)) ** 2.0 +. (float ydiff /. (float wy *. bnd)) ** 2.0) in if diff > 1.0 then truncate ((float xdiff) *. (1.0 /. diff)) + cx, @@ -61,7 +61,3 @@ let _ = pack [c] [] let _ = Printexc.print mainLoop () - - - - diff --git a/otherlibs/labltk/examples_camltk/helloworld.ml b/otherlibs/labltk/examples_camltk/helloworld.ml index b32b515a..bb99d9dd 100644 --- a/otherlibs/labltk/examples_camltk/helloworld.ml +++ b/otherlibs/labltk/examples_camltk/helloworld.ml @@ -19,16 +19,16 @@ let top = opentk ();; (* Initialisation of the interface *) (* top is now the toplevel widget *) (* Widget initialisation *) -let b = Button.create top - [Text "foobar"; - Command (function () -> - print_string "foobar"; +let b = Button.create top + [Text "foobar"; + Command (function () -> + print_string "foobar"; print_newline(); flush stdout)];; (* b exists but is not yet visible *) -let q = Button.create top - [Text "quit"; +let q = Button.create top + [Text "quit"; Command closeTk];; (* q exists but is not yet visible *) diff --git a/otherlibs/labltk/examples_camltk/mytext.ml b/otherlibs/labltk/examples_camltk/mytext.ml index 0695d931..d4c0d00b 100644 --- a/otherlibs/labltk/examples_camltk/mytext.ml +++ b/otherlibs/labltk/examples_camltk/mytext.ml @@ -28,15 +28,15 @@ let scrollbar = Scrollbar.create f [] (* kill buffer *) let buffer = ref "" -(* Note: for the text widgets, the insertion cursor is +(* Note: for the text widgets, the insertion cursor is not TextIndex(Insert, []), - but TextIndex(Mark "insert", []) -*) + but TextIndex(Mark "insert", []) +*) let insertMark = TextIndex(Mark "insert", []) let eol_insertMark = TextIndex(Mark "insert", [LineEnd]) let kill () = - buffer := + buffer := Text.get text insertMark eol_insertMark; prerr_endline ("Killed: " ^ !buffer); Text.delete text insertMark eol_insertMark @@ -60,4 +60,3 @@ let _ = mainLoop () ;; - diff --git a/otherlibs/labltk/examples_camltk/socketinput.ml b/otherlibs/labltk/examples_camltk/socketinput.ml index d23b8fd5..492fdc92 100644 --- a/otherlibs/labltk/examples_camltk/socketinput.ml +++ b/otherlibs/labltk/examples_camltk/socketinput.ml @@ -40,4 +40,3 @@ let _ = bind entry0_w [([], KeyPressDetail "Return")] (BindSet ([], send)); pack [text0_w; entry0_w; button0_w][Side Side_Top; Fill Fill_X; Expand true]; mainLoop () - diff --git a/otherlibs/labltk/examples_camltk/tetris.ml b/otherlibs/labltk/examples_camltk/tetris.ml index 79d9e3f1..83534347 100644 --- a/otherlibs/labltk/examples_camltk/tetris.ml +++ b/otherlibs/labltk/examples_camltk/tetris.ml @@ -21,7 +21,7 @@ open Camltk exception Done -type cell = {mutable color : int; +type cell = {mutable color : int; tag : tagOrId * tagOrId * tagOrId} type falling_block = { @@ -50,7 +50,7 @@ let colors = [| let baseurl = "images/" -let backgrounds = +let backgrounds = List.map (fun s -> baseurl ^ s) [ "dojoji.back.gif"; "Lambda2back.gif"; @@ -105,7 +105,7 @@ let blocks = [ [ [|"0000"; "0111"; "0100"; - "0000" |]; + "0000" |]; [|"0000"; "0110"; @@ -125,7 +125,7 @@ let blocks = [ [ [|"0000"; "0100"; "0111"; - "0000" |]; + "0000" |]; [|"0000"; "0110"; @@ -215,7 +215,6 @@ let init fw = let scorev = Textvariable.create () and linev = Textvariable.create () and levv = Textvariable.create () - and namev = Textvariable.create () in let f = Frame.create fw [BorderWidth (Pixels 2)] in let c = Canvas.create f [Width (Pixels (block_size * 10)); @@ -223,7 +222,7 @@ let init fw = BorderWidth (Pixels cell_border); Relief Sunken; Background Black] - and r = Frame.create f [] + and r = Frame.create f [] and r' = Frame.create f [] in let nl = Label.create r [Text "Next"; Font "variable"] in @@ -231,13 +230,13 @@ let init fw = Height (Pixels (block_size * 4)); BorderWidth (Pixels cell_border); Relief Sunken; - Background Black] in + Background Black] in let scl = Label.create r [Text "Score"; Font "variable"] in let sc = Label.create r [TextVariable scorev; Font "variable"] in let lnl = Label.create r [Text "Lines"; Font "variable"] in let ln = Label.create r [TextVariable linev; Font "variable"] in let levl = Label.create r [Text "Level"; Font "variable"] in - let lev = Label.create r [TextVariable levv; Font "Variable"] in + let lev = Label.create r [TextVariable levv; Font "Variable"] in let newg = Button.create r [Text "New Game"; Font "variable"] in let exitg = Button.create r [Text "Quit"; Font "variable"] in @@ -248,15 +247,15 @@ let init fw = let cells_src = Array.create 20 (Array.create 10 ()) in let cells = Array.map (Array.map (fun () -> - {tag= + {tag= (let t1, t2, t3 = - Canvas.create_rectangle c + Canvas.create_rectangle c (Pixels (-block_size - 8)) (Pixels (-block_size - 8)) (Pixels (-9)) (Pixels (-9)) [], - Canvas.create_rectangle c + Canvas.create_rectangle c (Pixels (-block_size - 10)) (Pixels (-block_size - 10)) (Pixels (-11)) (Pixels (-11)) [], - Canvas.create_rectangle c + Canvas.create_rectangle c (Pixels (-block_size - 12)) (Pixels (-block_size - 12)) (Pixels (-13)) (Pixels (-13)) [] in @@ -267,17 +266,17 @@ let init fw = color= 0})) cells_src in let nexts_src = Array.create 4 (Array.create 4 ()) in - let nexts = + let nexts = Array.map (Array.map (fun () -> - {tag= + {tag= (let t1, t2, t3 = - Canvas.create_rectangle nc + Canvas.create_rectangle nc (Pixels (-block_size - 8)) (Pixels (-block_size - 8)) (Pixels (-9)) (Pixels (-9)) [], - Canvas.create_rectangle nc + Canvas.create_rectangle nc (Pixels (-block_size - 10)) (Pixels (-block_size - 10)) (Pixels (-11)) (Pixels (-11)) [], - Canvas.create_rectangle nc + Canvas.create_rectangle nc (Pixels (-block_size - 12)) (Pixels (-block_size - 12)) (Pixels (-13)) (Pixels (-13)) [] in @@ -290,14 +289,14 @@ let init fw = in [f; c; r; nl; nc; scl; sc; levl; lev; lnl; ln], newg, exitg, (c, cells), (nc, nexts), scorev, linev, levv, game_over - + let cell_get (c, cf) x y = (Array.get (Array.get cf y) x).color let cell_set (c, cf) x y col = let cur = Array.get (Array.get cf y) x in - let t1,t2,t3 = cur.tag in - if cur.color = col then () + let t1,t2,t3 = cur.tag in + if cur.color = col then () else if cur.color <> 0 && col = 0 then begin @@ -314,7 +313,7 @@ let cell_set (c, cf) x y col = else begin Canvas.configure_rectangle c t2 - [FillColor (Array.get colors (col - 1)); + [FillColor (Array.get colors (col - 1)); Outline (Array.get colors (col - 1))]; Canvas.configure_rectangle c t1 [FillColor Black; @@ -333,7 +332,7 @@ let cell_set (c, cf) x y col = Canvas.move c t3 (Pixels (block_size * (x+1)+10+ cell_border*2)) (Pixels (block_size * (y+1)+10+ cell_border*2)) - end + end end; cur.color <- col @@ -344,18 +343,18 @@ let draw_block field col d x y = for ix = 0 to 3 do if xd land !base <> 0 then begin - try cell_set field (ix + x) (iy + y) col with _ -> () - end + try cell_set field (ix + x) (iy + y) col with _ -> () + end else begin (* cell_set field (ix + x) (iy + y) 0 *) () end; - base := !base lsl 1 + base := !base lsl 1 done - done + done let timer_ref = (ref None : Timer.t option ref) -(* I know, this should be timer ref, but I'm not sure what should be +(* I know, this should be timer ref, but I'm not sure what should be the initial value ... *) let remove_timer () = @@ -366,13 +365,13 @@ let remove_timer () = let do_after milli f = timer_ref := Some (Timer.add milli f) -let copy_block c = +let copy_block c = { pattern= !c.pattern; bcolor= !c.bcolor; x= !c.x; y= !c.y; d= !c.d; - alive= !c.alive } + alive= !c.alive } let _ = let top = opentk () in @@ -380,7 +379,7 @@ let _ = and fw = Frame.create top [] in let set_message s = Label.configure lb [Text s] in - pack [lb; fw] [Side Side_Top]; + pack [lb; fw] [Side Side_Top]; let score = ref 0 in let line = ref 0 in let level = ref 0 in @@ -388,7 +387,7 @@ let _ = let blocks = List.map (List.map decode_block) blocks in let field = Array.create 26 0 in let widgets, newg, exitg, cell_field, next_field, - scorev, linev, levv, game_over = + scorev, linev, levv, game_over = init fw in let canvas = fst cell_field in @@ -406,11 +405,11 @@ let _ = for j = 0 to 3 do cell_set next_field j i 0 done - done + done in let draw_falling_block fb = - draw_block cell_field fb.bcolor + draw_block cell_field fb.bcolor (List.nth fb.pattern fb.d) (fb.x - 3) (fb.y - 3) and erase_falling_block fb = @@ -430,21 +429,21 @@ let _ = and clear fb = let l = ref 0 in for i = 0 to 3 do - if i + fb.y >= 3 && i + fb.y <= 22 then + if i + fb.y >= 3 && i + fb.y <= 22 then if field.(i + fb.y) = line_full then begin incr l; field.(i + fb.y) <- line_empty; for j = 0 to 9 do - cell_set cell_field j (i + fb.y - 3) 0 + cell_set cell_field j (i + fb.y - 3) 0 done - end + end done; !l and fall_lines () = let eye = ref 22 (* bottom *) - and cur = ref 22 (* bottom *) + and cur = ref 22 (* bottom *) in try while !eye >= 3 do @@ -457,7 +456,7 @@ let _ = cell_set cell_field j (!cur-3) (cell_get cell_field j (!eye-3)) done; decr eye; - decr cur + decr cur done with Done -> (); for i = 3 to !cur do @@ -474,14 +473,14 @@ let _ = in let draw_next () = - draw_block next_field (!next+1) (List.hd (List.nth blocks !next)) 0 0 + draw_block next_field (!next+1) (List.hd (List.nth blocks !next)) 0 0 and erase_next () = - draw_block next_field 0 (List.hd (List.nth blocks !next)) 0 0 + draw_block next_field 0 (List.hd (List.nth blocks !next)) 0 0 in let set_nextblock () = - current := + current := { pattern= (List.nth blocks !next); bcolor= !next+1; x=6; y= 1; d= 0; alive= true}; @@ -494,11 +493,11 @@ let _ = try for i=0 to 3 do let cur = field.(i + fb.y) in - if cur land ((List.nth fb.pattern fb.d).(i) lsl fb.x) <> 0 + if cur land ((List.nth fb.pattern fb.d).(i) lsl fb.x) <> 0 then raise Done done; false - with + with Done -> true in @@ -520,27 +519,27 @@ let _ = m.x <- m.x + 1; if sub m then () else - begin + begin m.x <- m.x - 2; ignore (sub m) - end + end end else () in let image_load = - let i = Canvas.create_image canvas - (Pixels (block_size * 5 + block_size / 2)) + let i = Canvas.create_image canvas + (Pixels (block_size * 5 + block_size / 2)) (Pixels (block_size * 10 + block_size / 2)) [Anchor Center] in Canvas.lower_bot canvas i; let img = Imagephoto.create [] in fun file -> - try + try Imagephoto.configure img [File file]; Canvas.configure_image canvas i [ImagePhoto img] with - _ -> + _ -> begin Printf.eprintf "%s : No such image...\n" file; flush stderr @@ -551,14 +550,14 @@ let _ = let pline = !line in if l <> 0 then begin - line := !line + l; + line := !line + l; score := !score + l * l; set_message (Printf.sprintf "%d pts" (1 lsl ((l - 1) * 2))) - end; + end; Textvariable.set linev (string_of_int !line); - Textvariable.set scorev (string_of_int !score); + Textvariable.set scorev (string_of_int !score); - if !line /10 <> pline /10 then + if !line /10 <> pline /10 then (* update the background every 10 lines. *) begin let num_image = List.length backgrounds - 1 in @@ -567,16 +566,16 @@ let _ = let file = List.nth backgrounds n in image_load file; (* Future work: We should gain level after an image is put... *) - incr level; - Textvariable.set levv (string_of_int !level) + incr level; + Textvariable.set levv (string_of_int !level) end in - let rec newblock () = + let rec newblock () = set_message "TETRIS"; set_nextblock (); draw_falling_block !current; - if death_check !current then + if death_check !current then begin !current.alive <- false; set_message "GAME OVER"; @@ -617,7 +616,7 @@ let _ = let bind_game w = bind w [([], KeyPress)] (BindSet ([Ev_KeySymString], - fun e -> + fun e -> match e.ev_KeySymString with | "h" -> let m = copy_block current in @@ -645,7 +644,7 @@ let _ = begin let m = copy_block current and n = copy_block current in - while + while m.y <- m.y + 1; if death_check m then false else begin n.y <- m.y; true end @@ -655,7 +654,7 @@ let _ = current := n; remove_timer (); loop () - end + end | _ -> () )) in @@ -669,7 +668,7 @@ let _ = score := 0; line := 0; level := 1; - add_score 0; + add_score 0; init_field (); next := Random.int 7; set_message "Welcome to TETRIS"; diff --git a/otherlibs/labltk/examples_camltk/text.ml b/otherlibs/labltk/examples_camltk/text.ml index 0001ae75..35273377 100644 --- a/otherlibs/labltk/examples_camltk/text.ml +++ b/otherlibs/labltk/examples_camltk/text.ml @@ -28,7 +28,7 @@ let scrollbar = Scrollbar.create f [] let buffer = ref "" let kill () = - buffer := + buffer := Text.get text (TextIndex (Insert, [])) (TextIndex (Insert, [LineEnd])); Text.delete text (TextIndex (Insert, [])) @@ -36,7 +36,7 @@ let kill () = ;; let yank () = - Text.insert text (TextIndex (Insert, [])) !buffer [] + Text.insert text (TextIndex (Insert, [])) !buffer [] let _ = bind text [[Control], KeyPressDetail "y"] (BindSet ([], fun _ -> yank () )) @@ -52,4 +52,3 @@ let _ = pack [f][]; mainLoop () ;; - diff --git a/otherlibs/labltk/examples_camltk/winskel.ml b/otherlibs/labltk/examples_camltk/winskel.ml index 2ca1da17..cf68178a 100644 --- a/otherlibs/labltk/examples_camltk/winskel.ml +++ b/otherlibs/labltk/examples_camltk/winskel.ml @@ -18,8 +18,8 @@ open Camltk let main () = let top = opentk() in - let mbar = Frame.create top [Relief Raised; BorderWidth (Pixels 2)] - and dummy = + let mbar = Frame.create top [Relief Raised; BorderWidth (Pixels 2)] + and dummy = Frame.create top [Width (Centimeters 10.); Height (Centimeters 5.)] in pack [mbar; dummy] [Side Side_Top; Fill Fill_X]; let file = Menubutton.create mbar [Text "File"; UnderlinedChar 0] @@ -32,8 +32,8 @@ let main () = pack [help] [Side Side_Right]; (* same code as chap16-14 *) let m = Menu.create text [] in - let bold = Textvariable.create() - and italic = Textvariable.create() + let bold = Textvariable.create() + and italic = Textvariable.create() and underline = Textvariable.create() in Menu.add_checkbutton m [Label "Bold"; Variable bold]; Menu.add_checkbutton m [Label "Italic"; Variable italic]; @@ -46,13 +46,13 @@ let main () = Menu.add_radiobutton m [Label "Courier"; Variable font; Value "courier"]; Menu.add_separator m; Menu.add_command m [Label "Insert Bullet"; - Command (function () -> - print_string "Insert Bullet\n"; - flush stdout)]; + Command (function () -> + print_string "Insert Bullet\n"; + flush stdout)]; Menu.add_command m [Label "Margins and Tags..."; - Command (function () -> - print_string "margins\n"; - flush stdout)]; + Command (function () -> + print_string "margins\n"; + flush stdout)]; Menubutton.configure text [Menu m]; mainLoop() diff --git a/otherlibs/labltk/examples_labltk/Makefile.nt b/otherlibs/labltk/examples_labltk/Makefile.nt index 261bf754..bd10e09d 100644 --- a/otherlibs/labltk/examples_labltk/Makefile.nt +++ b/otherlibs/labltk/examples_labltk/Makefile.nt @@ -5,39 +5,39 @@ COMPFLAGS= -I ../lib -I ../labltk -I ../support LINKFLAGS= -I ../lib -I ../labltk -I ../support # Use pieces of Makefile.config -TKLINKOPT=$(LIBNAME).cma $(TKLIBS) +TKLINKOPT=$(LIBNAME).cma $(TKLIBS) all: hello.exe demo.exe eyes.exe calc.exe clock.exe tetris.exe lang.exe hello.exe: hello.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ hello.cmo + -o $@ hello.cmo demo.exe: demo.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ demo.cmo + -o $@ demo.cmo eyes.exe: eyes.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ eyes.cmo + -o $@ eyes.cmo calc.exe: calc.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ calc.cmo + -o $@ calc.cmo clock.exe: clock.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) unix.cma \ - -o $@ clock.cmo + -o $@ clock.cmo tetris.exe: tetris.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ tetris.cmo + -o $@ tetris.cmo lang.exe: lang.cmo $(CAMLC) -custom $(LINKFLAGS) $(TKLINKOPT) \ - -o $@ lang.cmo + -o $@ lang.cmo -clean : +clean : rm -f *.cm? *.exe .SUFFIXES : diff --git a/otherlibs/labltk/examples_labltk/README b/otherlibs/labltk/examples_labltk/README index 88eaccda..ec0f20de 100644 --- a/otherlibs/labltk/examples_labltk/README +++ b/otherlibs/labltk/examples_labltk/README @@ -1,4 +1,4 @@ -$Id: README 4745 2002-04-26 12:16:26Z furuse $ +$Id$ Some examples for LablTk. They are written in classic mode, except testris.ml which uses label diff --git a/otherlibs/labltk/examples_labltk/calc.ml b/otherlibs/labltk/examples_labltk/calc.ml index b334f67b..088bf192 100644 --- a/otherlibs/labltk/examples_labltk/calc.ml +++ b/otherlibs/labltk/examples_labltk/calc.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: calc.ml 5175 2002-10-11 19:01:19Z doligez $ *) +(* $Id$ *) (* A simple calculator demonstrating OO programming with O'Labl and LablTk. diff --git a/otherlibs/labltk/examples_labltk/clock.ml b/otherlibs/labltk/examples_labltk/clock.ml index 9e5227b9..57a59b82 100644 --- a/otherlibs/labltk/examples_labltk/clock.ml +++ b/otherlibs/labltk/examples_labltk/clock.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: clock.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Clock/V, a simple clock. Reverts every time you push the right button. diff --git a/otherlibs/labltk/examples_labltk/demo.ml b/otherlibs/labltk/examples_labltk/demo.ml index 6c9daed8..bd36f3f3 100644 --- a/otherlibs/labltk/examples_labltk/demo.ml +++ b/otherlibs/labltk/examples_labltk/demo.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: demo.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Some CamlTk4 Demonstration by JPF *) @@ -26,7 +26,7 @@ open Tk let _ = (* Initialize Tk *) -let top = openTk () in +let top = openTk () in (* Title setting *) Wm.title_set top "LablTk demo"; @@ -35,7 +35,7 @@ let base = Frame.create top in pack [base]; (* Menu bar *) -let bar = Frame.create ~borderwidth:2 ~relief:`Raised base in +let bar = Frame.create ~borderwidth:2 ~relief:`Raised base in pack ~fill:`X [bar]; (* Menu and Menubutton *) @@ -43,24 +43,24 @@ pack ~fill:`X [bar]; let men = Menu.create meb in Menu.add_command ~label:"Quit" ~command:(fun () -> closeTk (); exit 0) men; Menubutton.configure ~menu:men meb; - + (* Frames *) let base2 = Frame.create base in let left = Frame.create base2 in let right = Frame.create base2 in pack [base2]; pack ~side:`Left [left; right]; - + (* Widgets on left and right *) - + (* Button *) let but = Button.create ~text:"Welcome to LablTk" left in - + (* Canvas *) let can = Canvas.create ~width:100 ~height:100 ~borderwidth:1 ~relief:`Sunken left in - let oval = Canvas.create_oval ~x1: 10 ~y1: 10 + let oval = Canvas.create_oval ~x1: 10 ~y1: 10 ~x2: 90 ~y2: 90 ~fill: `Red can @@ -68,22 +68,22 @@ pack ~fill:`X [bar]; (* Check button *) let che = Checkbutton.create ~text:"Check" left in - + (* Entry *) - let ent = Entry.create ~width:10 left in - + let ent = Entry.create ~width:10 left in + (* Label *) let lab = Label.create ~text:"Welcome to LablTk" left in - + (* Listbox *) let lis = Listbox.create left in Listbox.insert lis ~index:`End ~texts:["This"; "is"; "Listbox"]; - + (* Message *) let mes = Message.create ~text: "Hello this is a message widget with very long text, but ..." left in - + (* Radio buttons *) let tv = Textvariable.create () in Textvariable.set tv "One"; @@ -91,32 +91,32 @@ pack ~fill:`X [bar]; let rads = List.map ~f:(fun t -> Radiobutton.create ~text:t ~value:t ~variable:tv radf) ["One"; "Two"; "Three"] in - + (* Scale *) let sca = Scale.create ~label:"Scale" ~length:100 ~showvalue:true right in - + (* Text and scrollbar *) - let texf = Frame.create right in - + let texf = Frame.create right in + (* Text *) let tex = Text.create ~width:20 ~height:8 texf in Text.insert ~index:(`End,[]) ~text:"This is a text widget." tex; - + (* Scrollbar *) let scr = Scrollbar.create texf in - + (* Text and Scrollbar widget link *) let scroll_link sb tx = Text.configure ~yscrollcommand:(Scrollbar.set sb) tx; Scrollbar.configure ~command:(Text.yview tx) sb in scroll_link scr tex; - + pack ~side:`Right ~fill:`Y [scr]; pack ~side:`Left ~fill:`Both ~expand:true [tex]; - + (* Pack them *) pack ~side:`Left [meb]; - pack [coe but; coe can; coe che; coe ent; coe lab; coe lis; coe mes]; + pack [coe but; coe can; coe che; coe ent; coe lab; coe lis; coe mes]; pack [coe radf; coe sca; coe texf]; pack rads; @@ -125,7 +125,7 @@ pack ~fill:`X [bar]; Wm.title_set top2 "LablTk demo control"; let defcol = `Color "#dfdfdf" in let selcol = `Color "#ffdfdf" in - let buttons = + let buttons = List.map ~f:(fun (w, t, c, a) -> let b = Button.create ~text:t ~command:c top2 in bind ~events:[`Enter] ~action:(fun _ -> a selcol) b; @@ -163,5 +163,4 @@ pack ~fill:`X [bar]; pack ~fill:`X buttons; (* Main Loop *) -Printexc.print mainLoop () - +Printexc.print mainLoop () diff --git a/otherlibs/labltk/examples_labltk/eyes.ml b/otherlibs/labltk/examples_labltk/eyes.ml index c33f6264..81f6aa4a 100644 --- a/otherlibs/labltk/examples_labltk/eyes.ml +++ b/otherlibs/labltk/examples_labltk/eyes.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: eyes.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open Tk @@ -26,12 +26,12 @@ let _ = let create_eye cx cy wx wy ewx ewy bnd = let o2 = Canvas.create_oval ~x1:(cx - wx) ~y1:(cy - wy) - ~x2:(cx + wx) ~y2:(cy + wy) + ~x2:(cx + wx) ~y2:(cy + wy) ~outline: `Black ~width: 7 ~fill: `White c and o = Canvas.create_oval - ~x1:(cx - ewx) ~y1:(cy - ewy) + ~x1:(cx - ewx) ~y1:(cy - ewy) ~x2:(cx + ewx) ~y2:(cy + ewy) ~fill:`Black c in @@ -40,14 +40,14 @@ let _ = bind ~events:[`Motion] ~extend:true ~fields:[`MouseX; `MouseY] ~action:(fun e -> let nx, ny = - let xdiff = e.ev_MouseX - cx + let xdiff = e.ev_MouseX - cx and ydiff = e.ev_MouseY - cy in - let diff = sqrt ((float xdiff /. (float wx *. bnd)) ** 2.0 +. + let diff = sqrt ((float xdiff /. (float wx *. bnd)) ** 2.0 +. (float ydiff /. (float wy *. bnd)) ** 2.0) in if diff > 1.0 then truncate ((float xdiff) *. (1.0 /. diff)) + cx, truncate ((float ydiff) *. (1.0 /. diff)) + cy - else + else e.ev_MouseX, e.ev_MouseY in Canvas.move c o ~x: (nx - !curx) ~y: (ny - !cury); @@ -57,9 +57,6 @@ let _ = in create_eye 60 100 30 40 5 6 0.6; create_eye 140 100 30 40 5 6 0.6; - pack [c] + pack [c] let _ = Printexc.print mainLoop () - - - diff --git a/otherlibs/labltk/examples_labltk/hello.ml b/otherlibs/labltk/examples_labltk/hello.ml index 4bb4f3a4..3f39d546 100644 --- a/otherlibs/labltk/examples_labltk/hello.ml +++ b/otherlibs/labltk/examples_labltk/hello.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: hello.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* LablTk4 Demonstration by JPF *) @@ -22,7 +22,7 @@ open Tk (* initialization of Tk --- the result is a toplevel widget *) -let top = openTk () +let top = openTk () (* create a button on top *) (* Button.create : use of create function defined in button.ml *) @@ -30,7 +30,7 @@ let top = openTk () let b = Button.create ~text: "Hello, LablTk!" top (* Lack of toplevel expressions in lsl, you must use dummy let exp. *) -let _ = pack [coe b] +let _ = pack [coe b] (* Last, you must call mainLoop *) (* You can write just let _ = mainLoop () *) diff --git a/otherlibs/labltk/examples_labltk/lang.ml b/otherlibs/labltk/examples_labltk/lang.ml index e92377ec..cde36399 100644 --- a/otherlibs/labltk/examples_labltk/lang.ml +++ b/otherlibs/labltk/examples_labltk/lang.ml @@ -17,14 +17,14 @@ (* language encoding using UTF-8 *) open Tk -let top = opentk () +let top = opentk () (* declare Tk that we use utf-8 to communicate *) (* problem: Text display is highly dependent on your font installation and configulation. The fonts with no-scale setting are selected only if the point sizes are exactly same??? *) -let _ = +let _ = Encoding.system_set "utf-8"; let l = Label.create top ~text: "???" in pack [l]; @@ -33,7 +33,7 @@ let _ = let create_hello lang hello = let b = Button.create t ~text: lang ~command: (fun () -> - Label.configure l ~text: hello) + Label.configure l ~text: hello) in Text.window_create t ~index: (`End,[]) ~window: b in diff --git a/otherlibs/labltk/examples_labltk/taquin.ml b/otherlibs/labltk/examples_labltk/taquin.ml index 2b2fd6a1..28099351 100644 --- a/otherlibs/labltk/examples_labltk/taquin.ml +++ b/otherlibs/labltk/examples_labltk/taquin.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: taquin.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open Tk;; @@ -67,7 +67,7 @@ let remplir_taquin c nx ny tx ty pi if x = !trou_x && (y = !trou_y - 1 || y = !trou_y + 1) || y = !trou_y && (x = !trou_x - 1 || x = !trou_x + 1) then déplacer x y in - Canvas.bind ~events:[`ButtonPress] + Canvas.bind ~events:[`ButtonPress] ~fields:[`MouseX; `MouseY] ~action:jouer c (`Tag "pièce");; let rec permutation = function @@ -112,7 +112,7 @@ let give_help parent lines () = let ok_button = Button.create ~text:"Ok" ~command:quit_help help_frame in pack ~side:`Bottom [help_txtw]; - pack ~side:`Bottom [ok_button ]; + pack ~side:`Bottom [ok_button ]; pack [help_frame];; let taquin nom_fichier nx ny = @@ -136,8 +136,8 @@ let taquin nom_fichier nx ny = let help = Button.create ~text:"Help" ~command:(give_help fp help_lines) fp in pack ~side:`Left ~fill:`X [quit] ; - pack ~side:`Left ~fill:`X [help] ; + pack ~side:`Left ~fill:`X [help] ; mainLoop ();; - + if !Sys.interactive then () else begin taquin "Lambda2.back.gif" 4 4; exit 0 end;; diff --git a/otherlibs/labltk/examples_labltk/tetris.ml b/otherlibs/labltk/examples_labltk/tetris.ml index 641909c0..4f401e59 100644 --- a/otherlibs/labltk/examples_labltk/tetris.ml +++ b/otherlibs/labltk/examples_labltk/tetris.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: tetris.ml 6385 2004-06-12 03:20:00Z garrigue $ *) +(* $Id$ *) (* A Tetris game for LablTk *) (* written by Jun P. Furuse *) @@ -104,7 +104,7 @@ let blocks = [ [ [|"0000"; "0111"; "0100"; - "0000" |]; + "0000" |]; [|"0000"; "0110"; @@ -124,7 +124,7 @@ let blocks = [ [ [|"0000"; "0100"; "0111"; - "0000" |]; + "0000" |]; [|"0000"; "0110"; @@ -245,11 +245,11 @@ class cell t1 t2 t3 ~canvas ~x ~y = object Canvas.move canvas t3 ~x: (block_size * (x+1)+10+ cell_border*2) ~y: (block_size * (y+1)+10+ cell_border*2) - end + end end; color <- col end - + let cell_get (c, cf) x y = cf.(y).(x) #get let cell_set (c, cf) ~x ~y ~color = @@ -290,7 +290,7 @@ let init fw = let lnl = Label.create r ~text: "Lines" ~font: "variable" in let ln = Label.create r ~textvariable: linev ~font: "variable" in let levl = Label.create r ~text: "Level" ~font: "variable" in - let lev = Label.create r ~textvariable: levv ~font: "variable" in + let lev = Label.create r ~textvariable: levv ~font: "variable" in let newg = Button.create r ~text: "New Game" ~font: "variable" in pack [f]; @@ -305,11 +305,11 @@ let init fw = (Array.map ~f: begin fun (x,y) -> let t1 = - Canvas.create_rectangle c + Canvas.create_rectangle c ~x1:(-block_size - 8) ~y1:(-block_size - 8) ~x2:(-9) ~y2:(-9) and t2 = - Canvas.create_rectangle c + Canvas.create_rectangle c ~x1:(-block_size - 10) ~y1:(-block_size - 10) ~x2:(-11) ~y2:(-11) and t3 = @@ -329,15 +329,15 @@ let init fw = (Array.map ~f: begin fun (x,y) -> let t1 = - Canvas.create_rectangle nc + Canvas.create_rectangle nc ~x1:(-block_size - 8) ~y1:(-block_size - 8) ~x2:(-9) ~y2:(-9) and t2 = - Canvas.create_rectangle nc + Canvas.create_rectangle nc ~x1:(-block_size - 10) ~y1:(-block_size - 10) ~x2:(-11) ~y2:(-11) and t3 = - Canvas.create_rectangle nc + Canvas.create_rectangle nc ~x1:(-block_size - 12) ~y1:(-block_size - 12) ~x2:(-13) ~y2:(-13) in @@ -350,10 +350,10 @@ let init fw = let game_over () = () in (* What a mess ! *) - [ coe f; coe c; coe r; coe nl; coe nc; coe scl; coe sc; coe levl; coe lev; + [ coe f; coe c; coe r; coe nl; coe nc; coe scl; coe sc; coe levl; coe lev; coe lnl; coe ln ], newg, (c, cells), (nc, nexts), scorev, linev, levv, game_over - + let draw_block field ~color ~block ~x ~y = for iy = 0 to 3 do @@ -367,7 +367,7 @@ let draw_block field ~color ~block ~x ~y = done let timer_ref = (ref None : Timer.t option ref) -(* I know, this should be timer ref, but I'm not sure what should be +(* I know, this should be timer ref, but I'm not sure what should be the initial value ... *) let remove_timer () = @@ -378,13 +378,13 @@ let remove_timer () = let do_after ~ms ~callback = timer_ref := Some (Timer.add ~ms ~callback) -let copy_block c = +let copy_block c = { pattern= !c.pattern; bcolor= !c.bcolor; x= !c.x; y= !c.y; d= !c.d; - alive= !c.alive } + alive= !c.alive } let _ = let top = openTk () in @@ -392,7 +392,7 @@ let _ = and fw = Frame.create top in let set_message s = Label.configure lb ~text:s in - pack [coe lb; coe fw] ~side: `Top; + pack [coe lb; coe fw] ~side: `Top; let score = ref 0 in let line = ref 0 in let level = ref 0 in @@ -402,7 +402,7 @@ let _ = let widgets, button, cell_field, next_field, scorev, linev, levv, game_over = init fw in let canvas = fst cell_field in - + let init_field () = for i = 0 to 25 do field.(i) <- line_empty @@ -417,19 +417,19 @@ let _ = for j = 0 to 3 do cell_set next_field ~x:j ~y:i ~color:0 done - done + done in - + let draw_falling_block fb = - draw_block cell_field ~color: fb.bcolor - ~block: (List.nth fb.pattern fb.d) - ~x: (fb.x - 3) + draw_block cell_field ~color: fb.bcolor + ~block: (List.nth fb.pattern fb.d) + ~x: (fb.x - 3) ~y: (fb.y - 3) - + and erase_falling_block fb = - draw_block cell_field ~color: 0 - ~block: (List.nth fb.pattern fb.d) - ~x: (fb.x - 3) + draw_block cell_field ~color: 0 + ~block: (List.nth fb.pattern fb.d) + ~x: (fb.x - 3) ~y: (fb.y - 3) in @@ -446,21 +446,21 @@ let _ = and clear fb = let l = ref 0 in for i = 0 to 3 do - if i + fb.y >= 3 && i + fb.y <= 22 then + if i + fb.y >= 3 && i + fb.y <= 22 then if field.(i + fb.y) = line_full then begin incr l; field.(i + fb.y) <- line_empty; for j = 0 to 9 do - cell_set cell_field ~x:j ~y:(i + fb.y - 3) ~color:0 + cell_set cell_field ~x:j ~y:(i + fb.y - 3) ~color:0 done - end + end done; !l - + and fall_lines () = let eye = ref 22 (* bottom *) - and cur = ref 22 (* bottom *) + and cur = ref 22 (* bottom *) in try while !eye >= 3 do @@ -470,11 +470,11 @@ let _ = done; field.(!cur) <- field.(!eye); for j = 0 to 9 do - cell_set cell_field ~x:j ~y:(!cur-3) + cell_set cell_field ~x:j ~y:(!cur-3) ~color:(cell_get cell_field j (!eye-3)) done; decr eye; - decr cur + decr cur done with Done -> (); for i = 3 to !cur do @@ -489,20 +489,20 @@ let _ = and current = ref { pattern= [[|0;0;0;0|]]; bcolor=0; x=0; y=0; d=0; alive= false} in - + let draw_next () = - draw_block next_field ~color: (!next+1) - ~block: (List.hd (List.nth blocks !next)) - ~x: 0 ~y: 0 - + draw_block next_field ~color: (!next+1) + ~block: (List.hd (List.nth blocks !next)) + ~x: 0 ~y: 0 + and erase_next () = - draw_block next_field ~color: 0 - ~block: (List.hd (List.nth blocks !next)) - ~x: 0 ~y: 0 + draw_block next_field ~color: 0 + ~block: (List.hd (List.nth blocks !next)) + ~x: 0 ~y: 0 in let set_nextblock () = - current := + current := { pattern= (List.nth blocks !next); bcolor= !next+1; x=6; y= 1; d= 0; alive= true}; @@ -510,22 +510,22 @@ let _ = next := Random.int 7; draw_next () in - + let death_check fb = try for i=0 to 3 do let cur = field.(i + fb.y) in - if cur land ((List.nth fb.pattern fb.d).(i) lsl fb.x) <> 0 + if cur land ((List.nth fb.pattern fb.d).(i) lsl fb.x) <> 0 then raise Done done; false - with + with Done -> true in - + let try_to_move m = if !current.alive then - let sub m = + let sub m = if death_check m then false else begin @@ -536,32 +536,32 @@ let _ = end in if sub m then true - else + else begin m.x <- m.x + 1; if sub m then true else - begin + begin m.x <- m.x - 2; sub m - end + end end - else false + else false in let image_load = - let i = Canvas.create_image canvas + let i = Canvas.create_image canvas ~x: (block_size * 5 + block_size / 2) ~y: (block_size * 10 + block_size / 2) ~anchor: `Center in Canvas.lower canvas i; let img = Imagephoto.create () in fun file -> - try + try Imagephoto.configure img ~file: file; - Canvas.configure_image canvas i ~image: img + Canvas.configure_image canvas i ~image: img with - _ -> + _ -> begin Printf.eprintf "%s : No such image...\n" file; flush stderr @@ -572,14 +572,14 @@ let _ = let pline = !line in if l <> 0 then begin - line := !line + l; + line := !line + l; score := !score + l * l; set_message (Printf.sprintf "%d pts" (1 lsl ((l - 1) * 2))) - end; + end; Textvariable.set linev (string_of_int !line); - Textvariable.set scorev (string_of_int !score); + Textvariable.set scorev (string_of_int !score); - if !line /10 <> pline /10 then + if !line /10 <> pline /10 then (* update the background every 10 lines. *) begin let num_image = List.length backgrounds - 1 in @@ -587,16 +587,16 @@ let _ = let n = if n > num_image then num_image else n in let file = List.nth backgrounds n in image_load file; - incr level; - Textvariable.set levv (string_of_int !level) + incr level; + Textvariable.set levv (string_of_int !level) end in - let rec newblock () = + let rec newblock () = set_message "TETRIS"; set_nextblock (); draw_falling_block !current; - if death_check !current then + if death_check !current then begin !current.alive <- false; set_message "GAME OVER"; @@ -608,7 +608,7 @@ let _ = if !time < 60 - !level * 3 then time := 60 - !level * 3; do_after ~ms:stop_a_bit ~callback:loop end - + and loop () = let m = copy_block current in m.y <- m.y + 1; @@ -641,7 +641,7 @@ let _ = let bind_game w = bind w ~events:[`KeyPress] ~fields:[`KeySymString] ~action: - begin fun e -> + begin fun e -> match e.ev_KeySymString with | "h"|"Left" -> let m = copy_block current in @@ -669,7 +669,7 @@ let _ = begin let m = copy_block current and n = copy_block current in - while + while m.y <- m.y + 1; if death_check m then false else begin n.y <- m.y; true end @@ -679,8 +679,8 @@ let _ = current := n; remove_timer (); loop () - end - | _ -> () + end + | _ -> () end in @@ -693,9 +693,9 @@ let _ = score := 0; line := 0; level := 1; - add_score 0; + add_score 0; init_field (); - next := Random.int 7; + next := Random.int 7; set_message "Welcome to TETRIS"; set_nextblock (); draw_falling_block !current; @@ -703,7 +703,7 @@ let _ = in (* As an applet, it was required... *) (* List.iter f: bind_game widgets; *) - bind_game top; + bind_game top; Button.configure button ~command: game_init; game_init () diff --git a/otherlibs/labltk/frx/.depend b/otherlibs/labltk/frx/.depend index d815ab0e..9b27a76b 100644 --- a/otherlibs/labltk/frx/.depend +++ b/otherlibs/labltk/frx/.depend @@ -1,38 +1,38 @@ -frx_after.cmo: frx_after.cmi -frx_after.cmx: frx_after.cmi -frx_color.cmo: frx_color.cmi -frx_color.cmx: frx_color.cmi -frx_ctext.cmo: frx_fit.cmi frx_text.cmi frx_ctext.cmi -frx_ctext.cmx: frx_fit.cmx frx_text.cmx frx_ctext.cmi -frx_dialog.cmo: frx_dialog.cmi -frx_dialog.cmx: frx_dialog.cmi -frx_entry.cmo: frx_entry.cmi -frx_entry.cmx: frx_entry.cmi -frx_fillbox.cmo: frx_fillbox.cmi -frx_fillbox.cmx: frx_fillbox.cmi -frx_fit.cmo: frx_after.cmi frx_fit.cmi -frx_fit.cmx: frx_after.cmx frx_fit.cmi -frx_focus.cmo: frx_focus.cmi -frx_focus.cmx: frx_focus.cmi -frx_font.cmo: frx_misc.cmi frx_font.cmi -frx_font.cmx: frx_misc.cmx frx_font.cmi -frx_lbutton.cmo: frx_lbutton.cmi -frx_lbutton.cmx: frx_lbutton.cmi -frx_listbox.cmo: frx_listbox.cmi -frx_listbox.cmx: frx_listbox.cmi -frx_mem.cmo: frx_mem.cmi -frx_mem.cmx: frx_mem.cmi -frx_misc.cmo: frx_misc.cmi -frx_misc.cmx: frx_misc.cmi -frx_req.cmo: frx_entry.cmi frx_listbox.cmi frx_widget.cmi frx_req.cmi -frx_req.cmx: frx_entry.cmx frx_listbox.cmx frx_widget.cmx frx_req.cmi -frx_rpc.cmo: frx_rpc.cmi -frx_rpc.cmx: frx_rpc.cmi -frx_selection.cmo: frx_selection.cmi -frx_selection.cmx: frx_selection.cmi -frx_synth.cmo: frx_synth.cmi -frx_synth.cmx: frx_synth.cmi -frx_text.cmo: frx_misc.cmi frx_text.cmi -frx_text.cmx: frx_misc.cmx frx_text.cmi -frx_widget.cmo: frx_widget.cmi -frx_widget.cmx: frx_widget.cmi +frx_after.cmo: frx_after.cmi +frx_after.cmx: frx_after.cmi +frx_color.cmo: frx_color.cmi +frx_color.cmx: frx_color.cmi +frx_ctext.cmo: frx_fit.cmi frx_text.cmi frx_ctext.cmi +frx_ctext.cmx: frx_fit.cmx frx_text.cmx frx_ctext.cmi +frx_dialog.cmo: frx_dialog.cmi +frx_dialog.cmx: frx_dialog.cmi +frx_entry.cmo: frx_entry.cmi +frx_entry.cmx: frx_entry.cmi +frx_fillbox.cmo: frx_fillbox.cmi +frx_fillbox.cmx: frx_fillbox.cmi +frx_fit.cmo: frx_after.cmi frx_fit.cmi +frx_fit.cmx: frx_after.cmx frx_fit.cmi +frx_focus.cmo: frx_focus.cmi +frx_focus.cmx: frx_focus.cmi +frx_font.cmo: frx_misc.cmi frx_font.cmi +frx_font.cmx: frx_misc.cmx frx_font.cmi +frx_lbutton.cmo: frx_lbutton.cmi +frx_lbutton.cmx: frx_lbutton.cmi +frx_listbox.cmo: frx_listbox.cmi +frx_listbox.cmx: frx_listbox.cmi +frx_mem.cmo: frx_mem.cmi +frx_mem.cmx: frx_mem.cmi +frx_misc.cmo: frx_misc.cmi +frx_misc.cmx: frx_misc.cmi +frx_req.cmo: frx_entry.cmi frx_listbox.cmi frx_widget.cmi frx_req.cmi +frx_req.cmx: frx_entry.cmx frx_listbox.cmx frx_widget.cmx frx_req.cmi +frx_rpc.cmo: frx_rpc.cmi +frx_rpc.cmx: frx_rpc.cmi +frx_selection.cmo: frx_selection.cmi +frx_selection.cmx: frx_selection.cmi +frx_synth.cmo: frx_synth.cmi +frx_synth.cmx: frx_synth.cmi +frx_text.cmo: frx_misc.cmi frx_text.cmi +frx_text.cmx: frx_misc.cmx frx_text.cmi +frx_widget.cmo: frx_widget.cmi +frx_widget.cmx: frx_widget.cmi diff --git a/otherlibs/labltk/frx/Makefile b/otherlibs/labltk/frx/Makefile index 0f9c9e3f..192034cf 100644 --- a/otherlibs/labltk/frx/Makefile +++ b/otherlibs/labltk/frx/Makefile @@ -45,7 +45,7 @@ $(OBJSX): ../lib/$(LIBNAME).cmxa $(CAMLOPT) -c $(COMPFLAGS) $< -depend: +depend: $(CAMLDEP) *.mli *.ml > .depend include .depend diff --git a/otherlibs/labltk/frx/frx_color.ml b/otherlibs/labltk/frx/frx_color.ml index 4df3eb6b..140e1387 100644 --- a/otherlibs/labltk/frx/frx_color.ml +++ b/otherlibs/labltk/frx/frx_color.ml @@ -25,7 +25,7 @@ let check s = if StringSet.mem s !available_colors then true else begin try - let f = Frame.create_named Widget.default_toplevel "frxcolorcheck" + let f = Frame.create_named Widget.default_toplevel "frxcolorcheck" [Background (NamedColor s)] in available_colors := StringSet.add s !available_colors; destroy f; diff --git a/otherlibs/labltk/frx/frx_ctext.ml b/otherlibs/labltk/frx/frx_ctext.ml index 0d4fd836..7d3cbb15 100644 --- a/otherlibs/labltk/frx/frx_ctext.ml +++ b/otherlibs/labltk/frx/frx_ctext.ml @@ -23,12 +23,12 @@ let create top opts navigation = let rf = Frame.create f [] in let c = Canvas.create lf [BorderWidth (Pixels 0)] and xscroll = Scrollbar.create lf [Orient Horizontal] - and yscroll = Scrollbar.create rf [Orient Vertical] + and yscroll = Scrollbar.create rf [Orient Vertical] and secret = Frame.create_named rf "secret" [] in let t = Text.create c (BorderWidth(Pixels 0) :: opts) in if navigation then Frx_text.navigation_keys t; - + (* Make the text widget an embedded canvas object *) ignore (Canvas.create_window c (Pixels 0) (Pixels 0) @@ -50,7 +50,7 @@ let create top opts navigation = YScrollCommand (fun first last -> scroll first last; let x,y,w,h = Canvas.bbox c [Tag "main"] in - Canvas.configure c + Canvas.configure c [ScrollRegion (Pixels x, Pixels y, Pixels w, Pixels h)]) ]; diff --git a/otherlibs/labltk/frx/frx_ctext.mli b/otherlibs/labltk/frx/frx_ctext.mli index 157c0cad..e539f5a8 100644 --- a/otherlibs/labltk/frx/frx_ctext.mli +++ b/otherlibs/labltk/frx/frx_ctext.mli @@ -21,5 +21,3 @@ val create : with "pixel scrolling". Based on a trick learned from Steve Ball. Returns (frame widget, text widget). *) - - diff --git a/otherlibs/labltk/frx/frx_dialog.ml b/otherlibs/labltk/frx/frx_dialog.ml index 0b65b419..12289de6 100644 --- a/otherlibs/labltk/frx/frx_dialog.ml +++ b/otherlibs/labltk/frx/frx_dialog.ml @@ -18,7 +18,7 @@ open Protocol let rec mapi f n l = match l with - [] -> [] + [] -> [] | x::l -> let v = f n x in v::(mapi f (succ n) l) (* Same as tk_dialog, but not sharing the tkwait variable *) @@ -29,7 +29,7 @@ let f w name title mesg bitmap def buttons = Wm.iconname_set t "Dialog"; Wm.protocol_set t "WM_DELETE_WINDOW" (function () -> ()); (* Wm.transient_set t (Winfo.toplevel w); *) - let ftop = + let ftop = Frame.create_named t "top" [Relief Raised; BorderWidth (Pixels 1)] and fbot = Frame.create_named t "bot" [Relief Raised; BorderWidth (Pixels 1)] @@ -38,37 +38,37 @@ let f w name title mesg bitmap def buttons = pack [fbot][Side Side_Bottom; Fill Fill_Both]; let l = - Label.create_named ftop "msg" + Label.create_named ftop "msg" [Justify Justify_Left; Text mesg; WrapLength (Pixels 600)] in pack [l][Side Side_Right; Expand true; Fill Fill_Both; PadX (Millimeters 3.0); PadY (Millimeters 3.0)]; begin match bitmap with Predefined "" -> () | _ -> - let b = + let b = Label.create_named ftop "bitmap" [Bitmap bitmap] in pack [b][Side Side_Left; PadX (Millimeters 3.0); PadY (Millimeters 3.0)] end; - + let waitv = Textvariable.create_temporary t in - + let buttons = mapi (fun i bname -> - let b = Button.create t - [Text bname; + let b = Button.create t + [Text bname; Command (fun () -> Textvariable.set waitv (string_of_int i))] in if i = def then begin - let f = Frame.create_named fbot "default" + let f = Frame.create_named fbot "default" [Relief Sunken; BorderWidth (Pixels 1)] in raise_window_above b f; - pack [f][Side Side_Left; Expand true; + pack [f][Side Side_Left; Expand true; PadX (Millimeters 3.0); PadY (Millimeters 2.0)]; pack [b][In f; PadX (Millimeters 2.0); PadY (Millimeters 2.0)]; bind t [[], KeyPressDetail "Return"] (BindSet ([], (fun _ -> Button.flash b; Button.invoke b))) end else - pack [b][In fbot; Side Side_Left; Expand true; + pack [b][In fbot; Side Side_Left; Expand true; PadX (Millimeters 3.0); PadY (Millimeters 2.0)]; b ) @@ -86,7 +86,7 @@ let f w name title mesg bitmap def buttons = let oldfocus = try Some (Focus.get()) with _ -> None and oldgrab = Grab.current ~displayof: t () and grabstatus = ref None in - begin match oldgrab with + begin match oldgrab with [] -> () | x::l -> grabstatus := Some(Grab.status x) end; @@ -104,7 +104,7 @@ let f w name title mesg bitmap def buttons = destroy t; begin match oldgrab with [] -> () - | x::l -> + | x::l -> try match !grabstatus with Some(GrabGlobal) -> Grab.set_global x diff --git a/otherlibs/labltk/frx/frx_dialog.mli b/otherlibs/labltk/frx/frx_dialog.mli index 2124150c..cd256acb 100644 --- a/otherlibs/labltk/frx/frx_dialog.mli +++ b/otherlibs/labltk/frx/frx_dialog.mli @@ -17,6 +17,6 @@ open Camltk val f : Widget.widget -> string -> string -> string -> Camltk.bitmap -> int -> string list -> int - (* same as Dialog.create_named, but with a local variable for - synchronisation. Makes it possible to have several dialogs + (* same as Dialog.create_named, but with a local variable for + synchronisation. Makes it possible to have several dialogs simultaneously *) diff --git a/otherlibs/labltk/frx/frx_entry.ml b/otherlibs/labltk/frx/frx_entry.ml index 6af349c7..ec842218 100644 --- a/otherlibs/labltk/frx/frx_entry.ml +++ b/otherlibs/labltk/frx/frx_entry.ml @@ -15,7 +15,7 @@ (***********************************************************************) open Camltk -let version = "$Id: frx_entry.ml 4745 2002-04-26 12:16:26Z furuse $" +let version = "$Id$" (* * Tk 4.0 has emacs bindings for entry widgets @@ -25,7 +25,7 @@ let new_label_entry parent txt action = let f = Frame.create parent [] in let m = Label.create f [Text txt] and e = Entry.create f [Relief Sunken; TextWidth 0] in - Camltk.bind e [[], KeyPressDetail "Return"] + Camltk.bind e [[], KeyPressDetail "Return"] (BindSet ([], fun _ -> action(Entry.get e))); pack [m][Side Side_Left]; pack [e][Side Side_Right; Fill Fill_X; Expand true]; @@ -38,5 +38,3 @@ let new_labelm_entry parent txt memo = pack [m][Side Side_Left]; pack [e][Side Side_Right; Fill Fill_X; Expand true]; f,e - - diff --git a/otherlibs/labltk/frx/frx_fileinput.ml b/otherlibs/labltk/frx/frx_fileinput.ml index 83cbffaa..de136867 100644 --- a/otherlibs/labltk/frx/frx_fileinput.ml +++ b/otherlibs/labltk/frx/frx_fileinput.ml @@ -15,7 +15,7 @@ (***********************************************************************) open Camltk -let version = "$Id: frx_fileinput.ml 4745 2002-04-26 12:16:26Z furuse $" +let version = "$Id$" (* * Simple spooling for fileinput callbacks @@ -37,4 +37,3 @@ let add fd f = end let remove fd = - diff --git a/otherlibs/labltk/frx/frx_fillbox.ml b/otherlibs/labltk/frx/frx_fillbox.ml index d9e47418..611b55a5 100644 --- a/otherlibs/labltk/frx/frx_fillbox.ml +++ b/otherlibs/labltk/frx/frx_fillbox.ml @@ -31,8 +31,8 @@ let new_vertical parent w h = [FillColor okcolor; Outline okcolor] in c, (function - 0 -> Canvas.configure_rectangle c i [FillColor okcolor; - Outline okcolor]; + 0 -> Canvas.configure_rectangle c i [FillColor okcolor; + Outline okcolor]; Canvas.coords_set c i [Pixels 0; Pixels 0; Pixels w; Pixels 0] | -1 -> Canvas.configure_rectangle c i [FillColor kocolor; @@ -52,8 +52,8 @@ let new_horizontal parent w h = [FillColor okcolor; Outline okcolor] in c, (function - 0 -> Canvas.configure_rectangle c i [FillColor okcolor; - Outline okcolor]; + 0 -> Canvas.configure_rectangle c i [FillColor okcolor; + Outline okcolor]; Canvas.coords_set c i [Pixels 0; Pixels 0; Pixels 0; Pixels h] | -1 -> Canvas.configure_rectangle c i [FillColor kocolor; diff --git a/otherlibs/labltk/frx/frx_fit.ml b/otherlibs/labltk/frx/frx_fit.ml index 2011699a..c03d6997 100644 --- a/otherlibs/labltk/frx/frx_fit.ml +++ b/otherlibs/labltk/frx/frx_fit.ml @@ -23,26 +23,26 @@ let vert wid = and last_last = ref 0.0 in let rec resize () = pending_resize := false; - if !debug then + if !debug then (Printf.eprintf "%s Resize %d\n" (Widget.name wid) !newsize; flush stderr); Text.configure wid [TextHeight !newsize]; () - and check () = - let first, last = Text.yview_get wid in + and check () = + let first, last = Text.yview_get wid in check1 first last and check1 first last = let curheight = int_of_string (cget wid CHeight) in if !debug then begin - Printf.eprintf "%s C %d %f %f\n" + Printf.eprintf "%s C %d %f %f\n" (Widget.name wid) curheight first last; flush stderr end; if first = 0.0 && last = 1.0 then () (* Don't attempt anything if widget is not visible *) else if not (Winfo.viewable wid) then begin - if !debug then + if !debug then (Printf.eprintf "%s C notviewable\n" (Widget.name wid); flush stderr); (* Try again later *) @@ -51,7 +51,7 @@ let vert wid = check())) end else begin - let delta = + let delta = if last = 0.0 then 1 else if last = !last_last then (* it didn't change since our last resize ! *) diff --git a/otherlibs/labltk/frx/frx_focus.ml b/otherlibs/labltk/frx/frx_focus.ml index f33b9e6d..ce855e20 100644 --- a/otherlibs/labltk/frx/frx_focus.ml +++ b/otherlibs/labltk/frx/frx_focus.ml @@ -20,7 +20,7 @@ open Camltk (* ? use bind tag ? how about the global reference then *) let auto w = let old_focus = ref w in - bind w [[],Enter] + bind w [[],Enter] (BindSet([], fun _ -> old_focus := Focus.get (); Focus.set w)); - bind w [[],Leave] + bind w [[],Leave] (BindSet([], fun _ -> Focus.set !old_focus)) diff --git a/otherlibs/labltk/frx/frx_font.ml b/otherlibs/labltk/frx/frx_font.ml index 7e28523a..3b739a65 100644 --- a/otherlibs/labltk/frx/frx_font.ml +++ b/otherlibs/labltk/frx/frx_font.ml @@ -16,9 +16,9 @@ open Camltk open Widget -let version = "$Id: frx_font.ml 5029 2002-07-23 14:12:03Z doligez $" +let version = "$Id$" -(* +(* * Finding fonts. Inspired by code in Ical by Sanjay Ghemawat. * Possibly bogus because some families use "i" for italic where others * use "o". @@ -30,7 +30,7 @@ module StringSet = Set.Make(struct type t = string let compare = compare end) let available_fonts = ref (StringSet.empty) -let get_canvas = +let get_canvas = Frx_misc.autodef (fun () -> Canvas.create Widget.default_toplevel []) @@ -41,11 +41,10 @@ let find fmly wght slant pxlsz = else let c = get_canvas() in try - let tag = Canvas.create_text c (Pixels 0) (Pixels 0) + let tag = Canvas.create_text c (Pixels 0) (Pixels 0) [Text "foo"; Font fontspec] in Canvas.delete c [tag]; available_fonts := StringSet.add fontspec !available_fonts; fontspec with _ -> raise (Invalid_argument fontspec) - diff --git a/otherlibs/labltk/frx/frx_font.mli b/otherlibs/labltk/frx/frx_font.mli index c0b7e680..8dd99973 100644 --- a/otherlibs/labltk/frx/frx_font.mli +++ b/otherlibs/labltk/frx/frx_font.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) val find : string -> string -> string -> int -> string - (* [find family weight slant pxlsz] returns the X11 full name of + (* [find family weight slant pxlsz] returns the X11 full name of the font required font, if available. Raises Invalid_argument fullname otherwise. *) diff --git a/otherlibs/labltk/frx/frx_lbutton.ml b/otherlibs/labltk/frx/frx_lbutton.ml index b9447616..c4d51f7b 100644 --- a/otherlibs/labltk/frx/frx_lbutton.ml +++ b/otherlibs/labltk/frx/frx_lbutton.ml @@ -18,7 +18,7 @@ open Camltk open Widget -let version = "$Id: frx_lbutton.ml 4745 2002-04-26 12:16:26Z furuse $" +let version = "$Id$" (* * Simulate a button with a bitmap AND a label diff --git a/otherlibs/labltk/frx/frx_lbutton.mli b/otherlibs/labltk/frx/frx_lbutton.mli index d79431f3..60c26a5b 100644 --- a/otherlibs/labltk/frx/frx_lbutton.mli +++ b/otherlibs/labltk/frx/frx_lbutton.mli @@ -21,4 +21,3 @@ val version : string val create : Widget -> option list -> Widget and configure : Widget -> option list -> unit - diff --git a/otherlibs/labltk/frx/frx_listbox.ml b/otherlibs/labltk/frx/frx_listbox.ml index bc1c6bde..17d6a3f9 100644 --- a/otherlibs/labltk/frx/frx_listbox.ml +++ b/otherlibs/labltk/frx/frx_listbox.ml @@ -15,22 +15,22 @@ (***********************************************************************) open Camltk -let version = "$Id: frx_listbox.ml 5029 2002-07-23 14:12:03Z doligez $" +let version = "$Id$" -(* +(* * Link a scrollbar and a listbox *) let scroll_link sb lb = - Listbox.configure lb + Listbox.configure lb [YScrollCommand (Scrollbar.set sb)]; - Scrollbar.configure sb + Scrollbar.configure sb [ScrollCommand (Listbox.yview lb)] -(* - * Completion for listboxes, Macintosh style. +(* + * Completion for listboxes, Macintosh style. * As long as you type fast enough, the listbox is repositioned to the * first entry "greater" than the typed prefix. - * assumes: + * assumes: * sorted list (otherwise it's stupid) * fixed size, because we don't recompute size at each callback invocation *) @@ -69,9 +69,9 @@ let add_completion lb action = recenter() in - bind lb [[], KeyPress] - (BindSet([Ev_Char; Ev_Time], - (function ev -> + bind lb [[], KeyPress] + (BindSet([Ev_Char; Ev_Time], + (function ev -> (* consider only keys producing characters. The callback is called * even if you press Shift. *) @@ -84,7 +84,7 @@ let add_completion lb action = let new_scrollable_listbox top options = let f = Frame.create top [] in - let lb = Listbox.create f options + let lb = Listbox.create f options and sb = Scrollbar.create f [] in scroll_link sb lb; pack [lb] [Side Side_Left; Fill Fill_Both; Expand true]; diff --git a/otherlibs/labltk/frx/frx_mem.ml b/otherlibs/labltk/frx/frx_mem.ml index 4bab8686..37af2083 100644 --- a/otherlibs/labltk/frx/frx_mem.ml +++ b/otherlibs/labltk/frx/frx_mem.ml @@ -24,7 +24,7 @@ let wordsize = (* officially approved *) if 1 lsl 31 = 0 then 4 else 8 -let init () = +let init () = let top = Toplevel.create Widget.default_toplevel [Class "CamlGC"] in let name = Camltk.appname_get () in Wm.title_set top (name ^ " Memory Gauge"); diff --git a/otherlibs/labltk/frx/frx_misc.ml b/otherlibs/labltk/frx/frx_misc.ml index d2be0092..75c8a3e4 100644 --- a/otherlibs/labltk/frx/frx_misc.ml +++ b/otherlibs/labltk/frx/frx_misc.ml @@ -31,12 +31,12 @@ let create_photo options = let hasopt = ref None in (* Check options *) List.iter (function - Data s -> + Data s -> begin match !hasopt with None -> hasopt := Some (Data s) | Some _ -> raise (Protocol.TkError "two data sources in options") end - | File f -> + | File f -> begin match !hasopt with None -> hasopt := Some (File f) | Some _ -> raise (Protocol.TkError "two data sources in options") @@ -51,8 +51,8 @@ let create_photo options = let oc = open_out_bin tmpfile in output_string oc s; close_out oc; - let newopts = - List.map (function + let newopts = + List.map (function | Data s -> File tmpfile | o -> o) options in diff --git a/otherlibs/labltk/frx/frx_req.ml b/otherlibs/labltk/frx/frx_req.ml index 29dce64c..ab7308fa 100644 --- a/otherlibs/labltk/frx/frx_req.ml +++ b/otherlibs/labltk/frx/frx_req.ml @@ -16,14 +16,14 @@ open Camltk (* - * Some standard requesters (in Amiga techspeak) or dialog boxes (in Apple + * Some standard requesters (in Amiga techspeak) or dialog boxes (in Apple * jargon). *) -let version = "$Id: frx_req.ml 5029 2002-07-23 14:12:03Z doligez $" +let version = "$Id$" (* - * Simple requester + * Simple requester * an entry field, unrestricted, with emacs-like bindings * Note: grabs focus, thus always unique at one given moment, and we * shouldn't have to worry about toplevel widget name. @@ -51,7 +51,7 @@ let open_simple title action notaction memory = let f = Frame.create t [] in let bok = Button.create f [Text "Ok"; Command activate] in let bcancel = Button.create f - [Text "Cancel"; + [Text "Cancel"; Command (fun () -> notaction(); Grab.release t; destroy t)] in bind e [[], KeyPressDetail "Escape"] @@ -76,7 +76,7 @@ let open_simple_synchronous title memory = Entry.create t [Relief Sunken; TextVariable memory; TextWidth len] in let waiting = Textvariable.create_temporary t in - + let activate _ = Grab.release t; (* because of wm *) destroy t; (* so action can call open_simple *) @@ -86,10 +86,10 @@ let open_simple_synchronous title memory = let f = Frame.create t [] in let bok = Button.create f [Text "Ok"; Command activate] in - let bcancel = + let bcancel = Button.create f - [Text "Cancel"; - Command (fun () -> + [Text "Cancel"; + Command (fun () -> Grab.release t; destroy t; Textvariable.set waiting "0")] in bind e [[], KeyPressDetail "Escape"] @@ -118,7 +118,7 @@ let open_list title elements action notaction = Wm.title_set t title; let tit = Label.create t [Text title] in - let fls = Frame.create t [Relief Sunken; BorderWidth (Pixels 2)] in + let fls = Frame.create t [Relief Sunken; BorderWidth (Pixels 2)] in let lb = Listbox.create fls [SelectMode Extended] in let sb = Scrollbar.create fls [] in Frx_listbox.scroll_link sb lb; @@ -135,12 +135,12 @@ let open_list title elements action notaction = bind lb [[Double], ButtonPressDetail 1] (BindSetBreakable ([], activate)); - Frx_listbox.add_completion lb activate; + Frx_listbox.add_completion lb activate; let f = Frame.create t [] in let bok = Button.create f [Text "Ok"; Command activate] in - let bcancel = Button.create f - [Text "Cancel"; + let bcancel = Button.create f + [Text "Cancel"; Command (fun () -> notaction(); Grab.release t; destroy t)] in pack [bok; bcancel] [Side Side_Left; Fill Fill_X; Expand true]; @@ -167,8 +167,8 @@ let open_passwd title = and fp,ep = Frx_entry.new_label_entry t "Password" (fun s -> ()) in let fb = Frame.create t [] in - let bok = Button.create fb - [Text "Ok"; Command (fun _ -> + let bok = Button.create fb + [Text "Ok"; Command (fun _ -> username := Entry.get eu; password := Entry.get ep; Grab.release t; (* because of wm *) @@ -183,8 +183,8 @@ let open_passwd title = bind eu [[], KeyPressDetail "Return"] (BindSetBreakable ([], (fun _ -> Focus.set ep; break()))); bind ep [[], KeyPressDetail "Return"] - (BindSetBreakable ([], (fun _ -> Button.flash bok; - Button.invoke bok; + (BindSetBreakable ([], (fun _ -> Button.flash bok; + Button.invoke bok; break()))); pack [bok] [Side Side_Left; Expand true]; diff --git a/otherlibs/labltk/frx/frx_req.mli b/otherlibs/labltk/frx/frx_req.mli index 815b2845..41de7df3 100644 --- a/otherlibs/labltk/frx/frx_req.mli +++ b/otherlibs/labltk/frx/frx_req.mli @@ -25,7 +25,7 @@ val open_simple : val open_simple_synchronous : string -> Textvariable.textVariable -> bool (* [open_simple_synchronous title memory] - A synchronous dialog with a message and an entry field (with + A synchronous dialog with a message and an entry field (with memory between invocations). Returns true if the user clicks Ok or false if the user clicks Cancel. *) diff --git a/otherlibs/labltk/frx/frx_synth.ml b/otherlibs/labltk/frx/frx_synth.ml index d7acf06f..76b83b64 100644 --- a/otherlibs/labltk/frx/frx_synth.ml +++ b/otherlibs/labltk/frx/frx_synth.ml @@ -22,18 +22,18 @@ open Protocol let events = Hashtbl.create 37 (* Notes: - * "cascading" events (on the same event) are not supported + * "cascading" events (on the same event) are not supported * Only one binding active at a time for each event on each widget. *) (* Get the callback table associated with . Initializes if required *) let get_event name = - try Hashtbl.find events name + try Hashtbl.find events name with Not_found -> let h = Hashtbl.create 37 in Hashtbl.add events name h; - (* Initialize the callback invocation mechanism, based on + (* Initialize the callback invocation mechanism, based on variable trace *) let var = "camltk_events(" ^ name ^")" in @@ -44,9 +44,9 @@ let get_event name = begin match Textvariable.get tkvar with "all" -> (* Invoke all callbacks *) Hashtbl.iter - (fun p f -> - try - f (cTKtoCAMLwidget p) + (fun p f -> + try + f (cTKtoCAMLwidget p) with _ -> ()) h | p -> (* Invoke callback for p *) @@ -56,14 +56,14 @@ let get_event name = f w with _ -> () - end; + end; set ()(* reactivate the callback *) ) in set(); - h + h (* Remove binding for event on widget *) -let remove w name = +let remove w name = Hashtbl.remove (get_event name) (Widget.name w) (* Adds as callback for widget on event *) @@ -77,7 +77,7 @@ let broadcast name = (* Sends event to widget *) let send name w = - Textvariable.set (Textvariable.coerce ("camltk_events(" ^ name ^")")) + Textvariable.set (Textvariable.coerce ("camltk_events(" ^ name ^")")) (Widget.name w) (* Remove all callbacks associated to widget *) diff --git a/otherlibs/labltk/frx/frx_text.ml b/otherlibs/labltk/frx/frx_text.ml index 11b4335c..18d9961f 100644 --- a/otherlibs/labltk/frx/frx_text.ml +++ b/otherlibs/labltk/frx/frx_text.ml @@ -15,10 +15,10 @@ (***********************************************************************) open Camltk -let version = "$Id: frx_text.ml 5029 2002-07-23 14:12:03Z doligez $" +let version = "$Id$" -(* - * convert an integer to an absolute index +(* + * convert an integer to an absolute index *) let abs_index n = TextIndex (LineChar(0,0), [CharOffset n]) @@ -35,8 +35,8 @@ let textEnd = let textBegin = TextIndex (LineChar(0,0), []) -(* - * Link a scrollbar and a text widget +(* + * Link a scrollbar and a text widget *) let scroll_link sb tx = Text.configure tx [YScrollCommand (Scrollbar.set sb)]; @@ -64,7 +64,7 @@ let navigation_keys tx = let new_scrollable_text top options navigation = let f = Frame.create top [] in - let tx = Text.create f options + let tx = Text.create f options and sb = Scrollbar.create f [] in scroll_link sb tx; (* IN THIS ORDER -- RESIZING *) @@ -85,11 +85,11 @@ let topsearch t = Wm.title_set top "Text search"; let f = Frame.create_named top "fpattern" [] in let m = Label.create_named f "search" [Text "Search pattern"] - and e = Entry.create_named f "pattern" + and e = Entry.create_named f "pattern" [Relief Sunken; TextVariable (patternv()) ] in let hgroup = Frame.create top [] and bgroup = Frame.create top [] in - let fdir = Frame.create hgroup [] + let fdir = Frame.create hgroup [] and fmisc = Frame.create hgroup [] in let direction = Textvariable.create_temporary fdir and exactv = Textvariable.create_temporary fdir @@ -101,11 +101,11 @@ let topsearch t = and exact = Checkbutton.create_named fmisc "exact" [Text "Exact match"; Variable exactv] and case = Checkbutton.create_named fmisc "case" - [Text "Fold Case"; Variable (casev())] + [Text "Fold Case"; Variable (casev())] and searchb = Button.create_named bgroup "search" [Text "Search"] and contb = Button.create_named bgroup "continue" [Text "Continue"] and dismissb = Button.create_named bgroup "dismiss" - [Text "Dismiss"; + [Text "Dismiss"; Command (fun () -> Text.tag_delete t ["search"]; destroy top)] in Radiobutton.invoke forw; @@ -131,24 +131,24 @@ let topsearch t = try let forward = Textvariable.get direction = "f" in let i = Text.search t !opts (Entry.get e) - (if cont then !current_index + (if cont then !current_index else if forward then textBegin else TextIndex(End, [CharOffset (-1)])) (* does not work with end *) - (if forward then textEnd + (if forward then textEnd else textBegin) in let found = TextIndex (i, []) in - current_index := + current_index := TextIndex(i, [CharOffset (if forward then 1 else (-1))]); Text.tag_delete t ["search"]; Text.tag_add t "search" found (TextIndex (i, [WordEnd])); - Text.tag_configure t "search" + Text.tag_configure t "search" [Relief Raised; BorderWidth (Pixels 1); Background Red]; Text.see t found with Invalid_argument _ -> Bell.ring() in - - bind e [[], KeyPressDetail "Return"] + + bind e [[], KeyPressDetail "Return"] (BindSet ([], fun _ -> search false ())); Button.configure searchb [Command (search false)]; Button.configure contb [Command (search true)]; @@ -163,10 +163,10 @@ let addsearch tx = | _ -> () (* We use Mod1 instead of Meta or Alt *) -let init () = +let init () = List.iter (function ev -> - tag_bind "TEXT_RO" ev - (BindSetBreakable ([Ev_Widget], + tag_bind "TEXT_RO" ev + (BindSetBreakable ([Ev_Widget], (fun ei -> page_up ei.ev_Widget; break())))) [ [[], KeyPressDetail "BackSpace"]; @@ -176,8 +176,8 @@ let init () = [[Mod1], KeyPressDetail "v"] ]; List.iter (function ev -> - tag_bind "TEXT_RO" ev - (BindSetBreakable ([Ev_Widget], + tag_bind "TEXT_RO" ev + (BindSetBreakable ([Ev_Widget], (fun ei -> page_down ei.ev_Widget; break())))) [ [[], KeyPressDetail "space"]; @@ -185,16 +185,16 @@ let init () = [[Control], KeyPressDetail "v"] ]; List.iter (function ev -> - tag_bind "TEXT_RO" ev - (BindSetBreakable ([Ev_Widget], + tag_bind "TEXT_RO" ev + (BindSetBreakable ([Ev_Widget], (fun ei -> line_up ei.ev_Widget; break())))) [ [[], KeyPressDetail "Up"]; [[Mod1], KeyPressDetail "z"] ]; List.iter (function ev -> - tag_bind "TEXT_RO" ev - (BindSetBreakable ([Ev_Widget], + tag_bind "TEXT_RO" ev + (BindSetBreakable ([Ev_Widget], (fun ei -> line_down ei.ev_Widget; break())))) [ [[], KeyPressDetail "Down"]; @@ -202,8 +202,8 @@ let init () = ]; List.iter (function ev -> - tag_bind "TEXT_RO" ev - (BindSetBreakable ([Ev_Widget], + tag_bind "TEXT_RO" ev + (BindSetBreakable ([Ev_Widget], (fun ei -> top ei.ev_Widget; break())))) [ [[], KeyPressDetail "Home"]; @@ -211,8 +211,8 @@ let init () = ]; List.iter (function ev -> - tag_bind "TEXT_RO" ev - (BindSetBreakable ([Ev_Widget], + tag_bind "TEXT_RO" ev + (BindSetBreakable ([Ev_Widget], (fun ei -> bottom ei.ev_Widget; break())))) [ [[], KeyPressDetail "End"]; @@ -226,4 +226,3 @@ let init () = [ [[Control], KeyPressDetail "s"] ] - diff --git a/otherlibs/labltk/frx/frx_widget.ml b/otherlibs/labltk/frx/frx_widget.ml index cb61fff3..a81c768f 100644 --- a/otherlibs/labltk/frx/frx_widget.ml +++ b/otherlibs/labltk/frx/frx_widget.ml @@ -16,9 +16,8 @@ open Camltk open Widget -let version = "$Id: frx_widget.ml 4745 2002-04-26 12:16:26Z furuse $" +let version = "$Id$" (* Make a window (toplevel widget) resizeable *) let resizeable t = update_idletasks(); (* wait until layout is computed *) Wm.minsize_set t (Winfo.width t) (Winfo.height t) - diff --git a/otherlibs/labltk/jpf/Makefile b/otherlibs/labltk/jpf/Makefile index 0d33f414..a79b3d56 100644 --- a/otherlibs/labltk/jpf/Makefile +++ b/otherlibs/labltk/jpf/Makefile @@ -35,7 +35,7 @@ $(OBJSX): ../lib/$(LIBNAME).cmxa ### Tests -balloontest: balloontest.cmo +balloontest: balloontest.cmo $(CAMLC) -o balloontest -I ../support -I ../lib \ -custom $(LIBNAME).cma jpflib.cma balloontest.cmo @@ -59,7 +59,7 @@ balloontest.cmx : balloon.cmx jpflib.cmxa .ml.cmx: $(CAMLOPT) -c $(COMPFLAGS) $< -depend: +depend: mv Makefile Makefile.bak (sed -n -e '1,/^### DO NOT DELETE THIS LINE/p' Makefile.bak; \ $(CAMLDEP) *.mli *.ml) > Makefile @@ -67,11 +67,11 @@ depend: ### EVERYTHING THAT GOES BEYOND THIS COMMENT IS GENERATED ### DO NOT DELETE THIS LINE -balloon.cmo: balloon.cmi -balloon.cmx: balloon.cmi -fileselect.cmo: fileselect.cmi -fileselect.cmx: fileselect.cmi -jpf_font.cmo: shell.cmi jpf_font.cmi -jpf_font.cmx: shell.cmx jpf_font.cmi -shell.cmo: shell.cmi -shell.cmx: shell.cmi +balloon.cmo: balloon.cmi +balloon.cmx: balloon.cmi +fileselect.cmo: fileselect.cmi +fileselect.cmx: fileselect.cmi +jpf_font.cmo: shell.cmi jpf_font.cmi +jpf_font.cmx: shell.cmx jpf_font.cmi +shell.cmo: shell.cmi +shell.cmx: shell.cmi diff --git a/otherlibs/labltk/jpf/balloon.ml b/otherlibs/labltk/jpf/balloon.ml index 288e0194..739a8d9e 100644 --- a/otherlibs/labltk/jpf/balloon.ml +++ b/otherlibs/labltk/jpf/balloon.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: balloon.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open StdLabels @@ -33,37 +33,37 @@ let debug = ref false let topw = ref default_toplevel and popupw = ref (Obj.magic dummy : message widget) -let configure_cursor w cursor = +let configure_cursor w cursor = (* DDDDDDDDDIIIIIIIRRRRRRRRTTTTTTTTYYYYYYY *) - Protocol.tkCommand [| TkToken (name w); + Protocol.tkCommand [| TkToken (name w); TkToken "configure"; TkToken "-cursor"; TkToken cursor |] -let put ~on: w ~ms: millisec mesg = +let put ~on: w ~ms: millisec mesg = let t = ref None in let cursor = ref "" in - let reset () = + let reset () = begin match !t with Some t -> Timer.remove t | _ -> () end; (* if there is a popup label, unmap it *) - if Winfo.exists !topw && Wm.state !topw <> "withdrawn" then + if Winfo.exists !topw && Wm.state !topw <> "withdrawn" then begin Wm.withdraw !topw; if Winfo.exists w then configure_cursor w !cursor end and set ev = if !flag then - t := Some (Timer.add ~ms: millisec ~callback: (fun () -> + t := Some (Timer.add ~ms: millisec ~callback: (fun () -> t := None; if !debug then prerr_endline ("Balloon: " ^ Widget.name w); update_idletasks(); - Message.configure !popupw ~text: mesg; + Message.configure !popupw ~text: mesg; raise_window !topw; Wm.geometry_set !topw (* 9 & 8 are some kind of magic... *) ("+"^(string_of_int (ev.ev_RootX + 9))^ diff --git a/otherlibs/labltk/jpf/balloon.mli b/otherlibs/labltk/jpf/balloon.mli index 42a1d107..633796ce 100644 --- a/otherlibs/labltk/jpf/balloon.mli +++ b/otherlibs/labltk/jpf/balloon.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: balloon.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* easy balloon help facility *) open Widget diff --git a/otherlibs/labltk/jpf/balloontest.ml b/otherlibs/labltk/jpf/balloontest.ml index 4f04e894..60e3aded 100644 --- a/otherlibs/labltk/jpf/balloontest.ml +++ b/otherlibs/labltk/jpf/balloontest.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: balloontest.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open Tk open Widget @@ -29,4 +29,3 @@ let _ = pack [b]; Balloon.put ~on: b ~ms: 1000 "Balloon"; Printexc.catch mainLoop () - diff --git a/otherlibs/labltk/jpf/fileselect.ml b/otherlibs/labltk/jpf/fileselect.ml index f03064db..3d42ac2d 100644 --- a/otherlibs/labltk/jpf/fileselect.ml +++ b/otherlibs/labltk/jpf/fileselect.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: fileselect.ml 6757 2005-01-28 16:13:11Z doligez $ *) +(* $Id$ *) (* file selection box *) @@ -43,7 +43,7 @@ let scroll_link sb lb = Scrollbar.configure sb ~command: (Listbox.yview lb) (* focus when enter binding *) -let bind_enter_focus w = +let bind_enter_focus w = bind w ~events:[`Enter] ~action:(fun _ -> Focus.set w);; let myentry_create p ~variable = @@ -52,13 +52,13 @@ let myentry_create p ~variable = (************************************************************* Subshell call *) -let subshell cmd = +let subshell cmd = let r,w = pipe () in match fork () with - 0 -> close r; dup2 ~src:w ~dst:stdout; + 0 -> close r; dup2 ~src:w ~dst:stdout; execv ~prog:"/bin/sh" ~args:[| "/bin/sh"; "-c"; cmd |] - | id -> - close w; + | id -> + close w; let rc = in_channel_of_descr r in let rec it l = match @@ -66,7 +66,7 @@ let subshell cmd = with Some x -> it (x::l) | None -> List.rev l - in + in let answer = it [] in close_in rc; (* because of finalize_channel *) let _ = waitpid ~mode:[] id in answer @@ -76,36 +76,36 @@ let subshell cmd = (* find directory name which doesn't contain "?*[" *) let dirget = regexp "^\\([^\\*?[]*/\\)\\(.*\\)" -let parse_filter src = +let parse_filter src = (* replace // by / *) let s = global_replace (regexp "/+") "/" src in (* replace /./ by / *) let s = global_replace (regexp "/\\./") "/" s in (* replace ????/../ by "" *) let s = global_replace - (regexp "\\([^/]\\|[^\\./][^/]\\|[^/][^\\./]\\|[^/][^/]+\\)/\\.\\./") + (regexp "\\([^/]\\|[^\\./][^/]\\|[^/][^\\./]\\|[^/][^/]+\\)/\\.\\./") "" s in (* replace ????/..$ by "" *) let s = global_replace - (regexp "\\([^/]\\|[^\\./][^/]\\|[^/][^\\./]\\|[^/][^/]+\\)/\\.\\.$") + (regexp "\\([^/]\\|[^\\./][^/]\\|[^/][^\\./]\\|[^/][^/]+\\)/\\.\\.$") "" s in (* replace ^/../../ by / *) let s = global_replace (regexp "^\\(/\\.\\.\\)+/") "/" s in - if string_match dirget s 0 then + if string_match dirget s 0 then let dirs = matched_group 1 s and ptrn = matched_group 2 s in dirs, ptrn else "", s - + let ls dir pattern = subshell ("cd " ^ dir ^ ";/bin/ls -ad " ^ pattern ^" 2>/dev/null") (*************************************************************** File System *) -let get_files_in_directory dir = +let get_files_in_directory dir = let dirh = opendir dir in let rec get_them l = match @@ -117,12 +117,12 @@ let get_files_in_directory dir = get_them (x::l) in List.sort ~cmp:compare (get_them []) - + let rec get_directories_in_files path = List.filter ~f:(fun x -> try (stat (path ^ x)).st_kind = S_DIR with _ -> false) -let remove_directories path = +let remove_directories path = List.filter ~f:(fun x -> try (stat (path ^ x)).st_kind <> S_DIR with _ -> false) @@ -184,11 +184,11 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = let current_pattern = ref "" and current_dir = ref "" in - + (* init_completions *) let filter_init_completion = ref (fun _ -> ()) and directory_init_completion = ref (fun _ -> ()) in - + let tl = Toplevel.create default_toplevel in Focus.set tl; Wm.title_set tl title; @@ -206,7 +206,7 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = let dflf = Frame.create dfl in let directory_listbox = Listbox.create dflf ~relief: `Sunken and directory_scrollbar = Scrollbar.create dflf in - scroll_link directory_scrollbar directory_listbox; + scroll_link directory_scrollbar directory_listbox; let dfr = Frame.create df in let dfrl = Label.create dfr ~text: "Files" in let dfrf = Frame.create dfr in @@ -227,7 +227,7 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = (* Printf.eprintf "CURDIR %s\n" curdir; *) let filter = if string_match (regexp "^/.*") filter 0 then filter - else + else if filter = "" then !global_dir ^ "/*" else !global_dir ^ "/" ^ filter in (* Printf.eprintf "FILTER %s\n" filter; *) @@ -241,13 +241,13 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = (* Printf.eprintf "FILTER : %s\n\n" filter; *) (* flush Pervasives.stderr; *) try - let directories = get_directories_in_files dirname + let directories = get_directories_in_files dirname (get_files_in_directory dirname) in (* get matched file by subshell call. *) - let matched_files = remove_directories dirname (ls dirname patternname) + let matched_files = remove_directories dirname (ls dirname patternname) in Textvariable.set filter_var filter; - Textvariable.set selection_var (dirname ^ deffile); + Textvariable.set selection_var (dirname ^ deffile); Listbox.delete directory_listbox ~first:(`Num 0) ~last:`End; Listbox.insert directory_listbox ~index:`End ~texts:directories; Listbox.delete filter_listbox ~first:(`Num 0) ~last:`End; @@ -255,35 +255,35 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = !directory_init_completion directory_listbox; !filter_init_completion filter_listbox with - Unix_error (ENOENT,_,_) -> + Unix_error (ENOENT,_,_) -> (* Directory is not found (maybe) *) Bell.ring () in - + let selected_files = ref [] in (* used for synchronous mode *) let activate l () = Grab.release tl; destroy tl; - if sync then + if sync then begin selected_files := l; Textvariable.set sync_var "1" end - else + else begin - proc l; + proc l; break () - end + end in - + (* and buttons *) let okb = Button.create cfrm ~text: "OK" ~command: - begin fun () -> - let files = - List.map (Listbox.curselection filter_listbox) + begin fun () -> + let files = + List.map (Listbox.curselection filter_listbox) ~f:(fun x -> !current_dir ^ (Listbox.get filter_listbox ~index:x)) in - let files = if files = [] then [Textvariable.get selection_var] + let files = if files = [] then [Textvariable.get selection_var] else files in activate files () end @@ -295,18 +295,18 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = (* binding *) bind selection_entry ~events:[`KeyPressDetail "Return"] ~breakable:true - ~action:(fun _ -> activate [Textvariable.get selection_var] ()); + ~action:(fun _ -> activate [Textvariable.get selection_var] ()); bind filter_entry ~events:[`KeyPressDetail "Return"] ~action:(fun _ -> configure (Textvariable.get filter_var)); - - let action _ = - let files = + + let action _ = + let files = List.map (Listbox.curselection filter_listbox) - ~f:(fun x -> !current_dir ^ (Listbox.get filter_listbox ~index:x)) + ~f:(fun x -> !current_dir ^ (Listbox.get filter_listbox ~index:x)) in - activate files () + activate files () in - bind filter_listbox ~events:[`Modified([`Double], `ButtonPressDetail 1)] + bind filter_listbox ~events:[`Modified([`Double], `ButtonPressDetail 1)] ~breakable:true ~action; if multi then Listbox.configure filter_listbox ~selectmode: `Multiple; filter_init_completion := add_completion filter_listbox action; @@ -317,7 +317,7 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = [x] -> Listbox.get directory_listbox ~index:x | _ -> (* you must choose at least one directory. *) Bell.ring (); raise Not_selected) - (Listbox.curselection directory_listbox)) ^ "/" ^ !current_pattern) + (Listbox.curselection directory_listbox)) ^ "/" ^ !current_pattern) with _ -> () in bind directory_listbox ~events:[`Modified([`Double], `ButtonPressDetail 1)] ~breakable:true ~action; @@ -334,13 +334,13 @@ let f ~title ~action:proc ~filter:deffilter ~file:deffile ~multi ~sync = pack [dfl] ~side: `Left; pack [dfll] ~side: `Top ~anchor: `W; pack [dflf] ~side: `Top; - pack [coe directory_listbox; coe directory_scrollbar] + pack [coe directory_listbox; coe directory_scrollbar] ~side: `Left ~fill: `Y; (* files *) pack [dfr] ~side: `Right; pack [dfrl] ~side: `Top ~anchor: `W; pack [dfrf] ~side: `Top; - pack [coe filter_listbox; coe filter_scrollbar] ~side: `Left ~fill: `Y; + pack [coe filter_listbox; coe filter_scrollbar] ~side: `Left ~fill: `Y; (* selection *) pack [sl] ~side: `Top ~anchor: `W; pack [selection_entry] ~side: `Top ~fill: `X; diff --git a/otherlibs/labltk/jpf/fileselect.mli b/otherlibs/labltk/jpf/fileselect.mli index fe8f5945..4412a418 100644 --- a/otherlibs/labltk/jpf/fileselect.mli +++ b/otherlibs/labltk/jpf/fileselect.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: fileselect.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* This file selecter works only under the OS with the full unix support. For the portability, Tk.getOpenFile and Tk.getSaveFile are recommended. *) @@ -26,12 +26,12 @@ val f : action:(string list -> unit) -> filter:string -> file:string -> multi:bool -> sync:bool -> unit -(* action +(* action [] means canceled if multi select is false, then the list is null or a singleton *) -(* multi select +(* multi select if true then more than one file are selectable *) -(* sync it +(* sync it if true then in synchronous mode *) diff --git a/otherlibs/labltk/jpf/jpf_font.ml b/otherlibs/labltk/jpf/jpf_font.ml index c9c3d052..24b87b7c 100644 --- a/otherlibs/labltk/jpf/jpf_font.ml +++ b/otherlibs/labltk/jpf/jpf_font.ml @@ -16,7 +16,7 @@ (* find font information *) let debug = ref false -let log s = +let log s = if !debug then try prerr_endline s with _ -> () type ('s, 'i) xlfd = { @@ -35,7 +35,7 @@ type ('s, 'i) xlfd = { mutable averageWidth: 'i; mutable registry: 's; mutable encoding: 's - } + } let copy xlfd = {xlfd with foundry= xlfd.foundry} @@ -78,8 +78,8 @@ let parse_xlfd xlfd_string = let len = String.length str in let rec split beg cur = if cur >= len then [String.sub str beg (len - beg)] - else if char_sep (String.get str cur) - then + else if char_sep (String.get str cur) + then let nextw = succ cur in (String.sub str beg (cur - beg)) ::(split nextw nextw) @@ -104,7 +104,7 @@ let parse_xlfd xlfd_string = averageWidth= int_of_string averageWidth; registry= registry; encoding= encoding; - } + } | _ -> raise (Parse_Xlfd_Failure xlfd_string) type valid_xlfd = (string, int) xlfd @@ -128,7 +128,7 @@ let empty_pattern = averageWidth= None; registry= None; encoding= None; - } + } let string_of_pattern = let pat f = function @@ -148,10 +148,10 @@ let list_fonts dispname pattern = None -> "" | Some x -> "-display " ^ x in - let result = List.map parse_xlfd - (Shell.subshell ("xlsfonts "^dispopt^" -fn "^string_of_pattern pattern)) + let result = List.map parse_xlfd + (Shell.subshell ("xlsfonts "^dispopt^" -fn "^string_of_pattern pattern)) in - if result = [] then raise Not_found + if result = [] then raise Not_found else result let available_pixel_size_aux dispname pattern = @@ -162,15 +162,15 @@ let available_pixel_size_aux dispname pattern = pattern.pixelSize <- None; let xlfds = list_fonts dispname pattern in let pxszs = Hashtbl.create 107 in - List.iter (fun xlfd -> + List.iter (fun xlfd -> Hashtbl.add pxszs xlfd.pixelSize xlfd) xlfds; pxszs let extract_size_font_hash tbl = let keys = ref [] in - Hashtbl.iter (fun k _ -> + Hashtbl.iter (fun k _ -> if not (List.mem k !keys) then keys := k :: !keys) tbl; - Sort.list (fun (k1,_) (k2,_) -> k1 < k2) + Sort.list (fun (k1,_) (k2,_) -> k1 < k2) (List.map (fun k -> k, Hashtbl.find_all tbl k) !keys) let available_pixel_size dispname pattern = @@ -179,8 +179,8 @@ let available_pixel_size dispname pattern = let nearest_pixel_size dispname vector_ok pattern = (* find the font with the nearest pixel size *) - log ("\n*** "^string_of_pattern pattern); - let pxlsz = + log ("\n*** "^string_of_pattern pattern); + let pxlsz = match pattern.pixelSize with None -> raise (Failure "invalid pixelSize pattern") | Some x -> x @@ -198,16 +198,16 @@ let nearest_pixel_size dispname vector_ok pattern = end else Hashtbl.add newtbl s xlfd else if not (is_vector_font xlfd) && s <> 0 then Hashtbl.add newtbl s xlfd) tbl; - + let size_font_table = extract_size_font_hash newtbl in let diff = ref 10000 in let min = ref None in List.iter (fun (s,xlfds) -> let d = abs(s - pxlsz) in - if d < !diff then begin - min := Some (s,xlfds); - diff := d + if d < !diff then begin + min := Some (s,xlfds); + diff := d end) size_font_table; (* if it contains more than one font, just return the first *) match !min with diff --git a/otherlibs/labltk/jpf/jpf_font.mli b/otherlibs/labltk/jpf/jpf_font.mli index cd1e2122..03f705f5 100644 --- a/otherlibs/labltk/jpf/jpf_font.mli +++ b/otherlibs/labltk/jpf/jpf_font.mli @@ -40,14 +40,14 @@ val empty_pattern : pattern val copy : ('a, 'b) xlfd -> ('a, 'b) xlfd -val string_of_valid_xlfd : valid_xlfd -> string +val string_of_valid_xlfd : valid_xlfd -> string val string_of_pattern : pattern -> string val is_vector_font : valid_xlfd -> bool val list_fonts : string option -> pattern -> valid_xlfd list -val available_pixel_size : +val available_pixel_size : string option -> pattern -> (int * valid_xlfd list) list val nearest_pixel_size : diff --git a/otherlibs/labltk/jpf/shell.ml b/otherlibs/labltk/jpf/shell.ml index 03e69e45..8b00a8f2 100644 --- a/otherlibs/labltk/jpf/shell.ml +++ b/otherlibs/labltk/jpf/shell.ml @@ -17,20 +17,19 @@ open Unix (************************************************************* Subshell call *) -let subshell cmd = +let subshell cmd = let r,w = pipe () in match fork () with - 0 -> close r; dup2 w stdout; + 0 -> close r; dup2 w stdout; close stderr; execv "/bin/sh" [| "/bin/sh"; "-c"; cmd |] - | id -> - close w; + | id -> + close w; let rc = in_channel_of_descr r in - let rec it () = try + let rec it () = try let x = input_line rc in x:: it () with _ -> [] - in + in let answer = it() in close_in rc; (* because of finalize_channel *) let _ = waitpid [] id in answer - diff --git a/otherlibs/labltk/jpf/shell.mli b/otherlibs/labltk/jpf/shell.mli index be93f5f1..c3fec3a2 100644 --- a/otherlibs/labltk/jpf/shell.mli +++ b/otherlibs/labltk/jpf/shell.mli @@ -14,4 +14,3 @@ (* *) (***********************************************************************) val subshell : string -> string list - diff --git a/otherlibs/labltk/labltk/Makefile.gen b/otherlibs/labltk/labltk/Makefile.gen index d73bb345..592ea446 100644 --- a/otherlibs/labltk/labltk/Makefile.gen +++ b/otherlibs/labltk/labltk/Makefile.gen @@ -12,8 +12,8 @@ _tkgen.ml: ../Widgets.src ../compiler/tkcompiler$(EXE) tk.ml labltk.ml .depend: _tkgen.ml ../builtin/report.ml ../compiler/pp$(EXE) #../builtin/builtin_*.ml (echo 'open StdLabels'; \ echo 'open Widget'; \ - echo 'open Protocol'; \ - echo 'open Support'; \ + echo 'open Protocol'; \ + echo 'open Support'; \ echo 'open Textvariable'; \ cat ../builtin/report.ml; \ cat ../builtin/builtin_*.ml; \ diff --git a/otherlibs/labltk/lib/Makefile b/otherlibs/labltk/lib/Makefile index 5aec48c4..91f477fc 100644 --- a/otherlibs/labltk/lib/Makefile +++ b/otherlibs/labltk/lib/Makefile @@ -4,7 +4,7 @@ all: $(LIBNAME).cma $(LIBNAME)top$(EXE) $(LIBNAME) opt: $(LIBNAME).cmxa -clean: +clean: rm -f $(LIBNAME)top$(EXE) $(LIBNAME) *.cm* *.$(A) superclean: @@ -21,8 +21,8 @@ CAMLTKOBJS=cTk.cmo $(CWIDGETOBJS) labltk.cmo camltk.cmo SUPPORT=../support/support.cmo ../support/rawwidget.cmo \ ../support/widget.cmo ../support/protocol.cmo \ - ../support/textvariable.cmo ../support/timer.cmo \ - ../support/fileevent.cmo ../support/camltkwrap.cmo + ../support/textvariable.cmo ../support/timer.cmo \ + ../support/fileevent.cmo ../support/camltkwrap.cmo TKOBJS=$(SUPPORT) $(LABLTKOBJS) $(CAMLTKOBJS) @@ -33,16 +33,16 @@ $(LIBNAME).cma: $(SUPPORT) ../Widgets.src cd ../labltk; $(MAKE) cd ../camltk; $(MAKE) $(MKLIB) -ocamlc '$(CAMLCB)' -o $(LIBNAME) \ - -I ../labltk -I ../camltk $(TKOBJS) \ - -ccopt "\"$(TK_LINK)\"" + -I ../labltk -I ../camltk $(TKOBJS) \ + -ccopt "\"$(TK_LINK)\"" $(LIBNAME).cmxa: $(SUPPORT:.cmo=.cmx) ../Widgets.src $(MAKE) superclean cd ../labltk; $(MAKE) opt cd ../camltk; $(MAKE) opt $(MKLIB) -ocamlopt '$(CAMLOPTB)' -o $(LIBNAME) -oc $(LIBNAME) \ - -I ../labltk -I ../camltk $(TKOBJS:.cmo=.cmx) \ - -ccopt "\"$(TK_LINK)\"" + -I ../labltk -I ../camltk $(TKOBJS:.cmo=.cmx) \ + -ccopt "\"$(TK_LINK)\"" $(LIBNAME)top$(EXE) : $(TOPDEPS) $(LIBNAME).cma ../support/lib$(LIBNAME).$(A) $(CAMLC) -verbose -linkall -o $(LIBNAME)top$(EXE) -I ../support \ diff --git a/otherlibs/labltk/support/.depend b/otherlibs/labltk/support/.depend index 069735be..a7fc006a 100644 --- a/otherlibs/labltk/support/.depend +++ b/otherlibs/labltk/support/.depend @@ -1,27 +1,27 @@ -camltkwrap.cmi: widget.cmi timer.cmi textvariable.cmi protocol.cmi -protocol.cmi: widget.cmi -textvariable.cmi: widget.cmi protocol.cmi -tkthread.cmi: widget.cmi -widget.cmi: rawwidget.cmi +camltkwrap.cmi: widget.cmi timer.cmi textvariable.cmi protocol.cmi +protocol.cmi: widget.cmi +textvariable.cmi: widget.cmi protocol.cmi +tkthread.cmi: widget.cmi +widget.cmi: rawwidget.cmi camltkwrap.cmo: timer.cmi textvariable.cmi rawwidget.cmi protocol.cmi \ - fileevent.cmi camltkwrap.cmi + fileevent.cmi camltkwrap.cmi camltkwrap.cmx: timer.cmx textvariable.cmx rawwidget.cmx protocol.cmx \ - fileevent.cmx camltkwrap.cmi -fileevent.cmo: support.cmi protocol.cmi fileevent.cmi -fileevent.cmx: support.cmx protocol.cmx fileevent.cmi -protocol.cmo: widget.cmi support.cmi protocol.cmi -protocol.cmx: widget.cmx support.cmx protocol.cmi -rawwidget.cmo: support.cmi rawwidget.cmi -rawwidget.cmx: support.cmx rawwidget.cmi -slave.cmo: widget.cmi -slave.cmx: widget.cmx -support.cmo: support.cmi -support.cmx: support.cmi -textvariable.cmo: widget.cmi support.cmi protocol.cmi textvariable.cmi -textvariable.cmx: widget.cmx support.cmx protocol.cmx textvariable.cmi -timer.cmo: support.cmi protocol.cmi timer.cmi -timer.cmx: support.cmx protocol.cmx timer.cmi -tkthread.cmo: widget.cmi timer.cmi protocol.cmi tkthread.cmi -tkthread.cmx: widget.cmx timer.cmx protocol.cmx tkthread.cmi -widget.cmo: rawwidget.cmi widget.cmi -widget.cmx: rawwidget.cmx widget.cmi + fileevent.cmx camltkwrap.cmi +fileevent.cmo: support.cmi protocol.cmi fileevent.cmi +fileevent.cmx: support.cmx protocol.cmx fileevent.cmi +protocol.cmo: widget.cmi support.cmi protocol.cmi +protocol.cmx: widget.cmx support.cmx protocol.cmi +rawwidget.cmo: support.cmi rawwidget.cmi +rawwidget.cmx: support.cmx rawwidget.cmi +slave.cmo: widget.cmi +slave.cmx: widget.cmx +support.cmo: support.cmi +support.cmx: support.cmi +textvariable.cmo: widget.cmi support.cmi protocol.cmi textvariable.cmi +textvariable.cmx: widget.cmx support.cmx protocol.cmx textvariable.cmi +timer.cmo: support.cmi protocol.cmi timer.cmi +timer.cmx: support.cmx protocol.cmx timer.cmi +tkthread.cmo: widget.cmi timer.cmi protocol.cmi tkthread.cmi +tkthread.cmx: widget.cmx timer.cmx protocol.cmx tkthread.cmi +widget.cmo: rawwidget.cmi widget.cmi +widget.cmx: rawwidget.cmx widget.cmi diff --git a/otherlibs/labltk/support/camltk.h b/otherlibs/labltk/support/camltk.h index e14b6f61..5be206fa 100644 --- a/otherlibs/labltk/support/camltk.h +++ b/otherlibs/labltk/support/camltk.h @@ -14,7 +14,7 @@ /* */ /*************************************************************************/ -/* $Id: camltk.h 9036 2008-09-26 07:35:24Z garrigue $ */ +/* $Id$ */ #if defined(_WIN32) && defined(CAML_DLL) && defined(IN_CAMLTKSUPPORT) #define CAMLTKextern CAMLexport @@ -27,6 +27,11 @@ #define CONST84 #endif +/* if Tcl_GetStringResult is not defined, we use interp->result */ +#ifndef Tcl_GetStringResult +# define Tcl_GetStringResult(interp) (interp->result) +#endif + /* cltkMisc.c */ /* copy a Caml string to the C heap. Must be deallocated with stat_free */ extern char *string_to_c(value s); @@ -58,4 +63,3 @@ extern int cltk_slave_mode; #define RCNAME ".camltkrc" #define CAMLCB "camlcb" - diff --git a/otherlibs/labltk/support/camltkwrap.ml b/otherlibs/labltk/support/camltkwrap.ml index 5afe864d..5b49b19f 100644 --- a/otherlibs/labltk/support/camltkwrap.ml +++ b/otherlibs/labltk/support/camltkwrap.ml @@ -23,12 +23,12 @@ end module Protocol = struct open Widget include Protocol - + let opentk () = coe (opentk ()) let opentk_with_args args = coe (opentk_with_args args) let openTk ?display ?clas () = coe (openTk ?display ?clas ()) - let cCAMLtoTKwidget table w = + let cCAMLtoTKwidget table w = Widget.check_class w table; (* we need run time type check of widgets *) TkToken (Widget.name w) @@ -71,7 +71,7 @@ module Timer = struct let remove = remove end -(* +(* Not compiled in support -module Tkwait = Tkwait +module Tkwait = Tkwait *) diff --git a/otherlibs/labltk/support/camltkwrap.mli b/otherlibs/labltk/support/camltkwrap.mli index 9c9321c2..1af566d2 100644 --- a/otherlibs/labltk/support/camltkwrap.mli +++ b/otherlibs/labltk/support/camltkwrap.mli @@ -16,13 +16,13 @@ module Widget : sig type widget = Widget.any Widget.widget (* widget is an abstract type *) - + val default_toplevel : widget (* [default_toplevel] is "." in Tk, the toplevel widget that is always existing during a Tk session. Destroying [default_toplevel] ends the main loop *) - + val atom : parent: widget -> name: string -> widget (* [atom parent name] returns the widget [parent.name]. The widget is not created. Only its name is returned. In a given parent, there may @@ -31,35 +31,35 @@ module Widget : sig with a known name. It doesn't add the widget to the internal tables of CamlTk. *) - + val name : widget -> string (* [name w] returns the name (tk "path") of a widget *) - + (*--*) (* The following functions are used internally. There is normally no need for them in users programs *) - + val known_class : widget -> string (* [known_class w] returns the class of a widget (e.g. toplevel, frame), as known by the CamlTk interface. Not equivalent to "winfo w" in Tk. *) - + val dummy : widget (* [dummy] is a widget used as context when we don't have any. It is *not* a real widget. *) - + val new_atom : parent: widget -> ?name: string -> string -> widget (* incompatible with the classic camltk *) val get_atom : string -> widget (* [get_atom path] returns the widget with Tk path [path] *) - + val remove : widget -> unit (* [remove w] removes widget from the internal tables *) - + (* Subtypes tables *) val widget_any_table : string list val widget_button_table : string list @@ -77,95 +77,95 @@ module Widget : sig val widget_scrollbar_table : string list val widget_text_table : string list val widget_toplevel_table : string list - + val chk_sub : string -> 'a list -> 'a -> unit val check_class : widget -> string list -> unit (* Widget subtyping *) - + exception IllegalWidgetType of string (* Raised when widget command applied illegally*) (* this function is not used, but introduced for the compatibility with labltk. useless for camltk users *) - val coe : 'a Widget.widget -> Widget.any Widget.widget + val coe : 'a Widget.widget -> Widget.any Widget.widget end module Protocol : sig open Widget - + (* Lower level interface *) exception TkError of string (* Raised by the communication functions *) - - val debug : bool ref + + val debug : bool ref (* When set to true, displays approximation of intermediate Tcl code *) - + type tkArgs = TkToken of string | TkTokenList of tkArgs list (* to be expanded *) | TkQuote of tkArgs (* mapped to Tcl list *) - - + + (* Misc *) external splitlist : string -> string list = "camltk_splitlist" - + val add_destroy_hook : (widget -> unit) -> unit - - + + (* Opening, closing, and mainloop *) val default_display : unit -> string - + val opentk : unit -> widget (* The basic initialization function. [opentk ()] parses automatically the command line options and use the tk related options in them - such as "-display localhost:0" to initialize Tk applications. + such as "-display localhost:0" to initialize Tk applications. Consult wish manpage about the supported options. *) - + val keywords : (string * Arg.spec * string) list (* Command line parsing specification for Arg.parse, which contains the standard Tcl/Tk command line options such as "-display" and "-name". These Tk command line options are used by opentk *) - + val opentk_with_args : string list -> widget - (* [opentk_with_args argv] invokes [opentk] with the tk related - command line options given by [argv] to the executable program. *) - + (* [opentk_with_args argv] invokes [opentk] with the tk related + command line options given by [argv] to the executable program. *) + val openTk : ?display:string -> ?clas:string -> unit -> widget (* [openTk ~display:display ~clas:clas ()] is equivalent to [opentk ["-display"; display; "-name"; clas]] *) - + (* Legacy opentk functions *) val openTkClass: string -> widget (* [openTkClass class] is equivalent to [opentk ["-name"; class]] *) val openTkDisplayClass: string -> string -> widget - (* [openTkDisplayClass disp class] is equivalent to + (* [openTkDisplayClass disp class] is equivalent to [opentk ["-display"; disp; "-name"; class]] *) - + val closeTk : unit -> unit - val finalizeTk : unit -> unit - (* Finalize tcl/tk before exiting. This function will be automatically + val finalizeTk : unit -> unit + (* Finalize tcl/tk before exiting. This function will be automatically called when you call [Pervasives.exit ()] *) - + val mainLoop : unit -> unit - - + + (* Direct evaluation of tcl code *) val tkEval : tkArgs array -> string - + val tkCommand : tkArgs array -> unit - + (* Returning a value from a Tcl callback *) val tkreturn: string -> unit - - + + (* Callbacks: this is private *) - + type cbid = Protocol.cbid - + type callback_buffer = string list (* Buffer for reading callback arguments *) - + val callback_naming_table : (cbid, callback_buffer -> unit) Hashtbl.t (* CAMLTK val callback_memo_table : (widget, cbid) Hashtbl.t *) val callback_memo_table : (widget, cbid) Hashtbl.t @@ -181,12 +181,12 @@ module Protocol : sig (* Clean up callbacks associated to widget. Must be used only when the Destroy event is bind by the user and masks the default Destroy event binding *) - + val cTKtoCAMLwidget : string -> widget val cCAMLtoTKwidget : string list -> widget -> tkArgs - + val register : string -> callback:(callback_buffer -> unit) -> unit - + (*-*) val prerr_cbid : cbid -> unit end @@ -194,12 +194,12 @@ end module Textvariable : sig open Widget open Protocol - + type textVariable = Textvariable.textVariable (* TextVariable is an abstract type *) - + val create : ?on: widget -> unit -> textVariable - (* Allocation of a textVariable with lifetime associated to widget + (* Allocation of a textVariable with lifetime associated to widget if a widget is specified *) val create_temporary : widget -> textVariable (* for backward compatibility @@ -211,22 +211,22 @@ module Textvariable : sig (* Reading the val of a textVariable *) val name : textVariable -> string (* Its tcl name *) - + val cCAMLtoTKtextVariable : textVariable -> tkArgs (* Internal conversion function *) - + val handle : textVariable -> (unit -> unit) -> unit (* Callbacks on variable modifications *) - + val coerce : string -> textVariable - + (*-*) val free : textVariable -> unit end module Fileevent : sig open Unix - + val add_fileinput : file_descr -> (unit -> unit) -> unit val remove_fileinput: file_descr -> unit val add_fileoutput : file_descr -> (unit -> unit) -> unit @@ -236,16 +236,16 @@ end module Timer : sig type t = Timer.t - + val add : int -> (unit -> unit) -> t val set : int -> (unit -> unit) -> unit val remove : t -> unit end -(* +(* Tkwait exists, but is not used in support module Tkwait : sig - val internal_tracevis : string -> string -> unit - val internal_tracedestroy : string -> string -> unit + val internal_tracevis : string -> Protocol.cbid -> unit + val internal_tracedestroy : string -> Protocol.cbid -> unit end *) diff --git a/otherlibs/labltk/support/cltkCaml.c b/otherlibs/labltk/support/cltkCaml.c index 2f5fe100..c9bcc80d 100644 --- a/otherlibs/labltk/support/cltkCaml.c +++ b/otherlibs/labltk/support/cltkCaml.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkCaml.c 9036 2008-09-26 07:35:24Z garrigue $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/labltk/support/cltkDMain.c b/otherlibs/labltk/support/cltkDMain.c index 7561ec77..3d9a4c2d 100644 --- a/otherlibs/labltk/support/cltkDMain.c +++ b/otherlibs/labltk/support/cltkDMain.c @@ -14,7 +14,7 @@ /* */ /*************************************************************************/ -/* $Id: cltkDMain.c 8899 2008-07-01 09:55:52Z weis $ */ +/* $Id$ */ #include #include @@ -223,7 +223,7 @@ int Caml_Init(interp) if (0 == access(f,R_OK)) if (TCL_OK != Tcl_EvalFile(cltclinterp,f)) { stat_free(f); - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); }; stat_free(f); } diff --git a/otherlibs/labltk/support/cltkEval.c b/otherlibs/labltk/support/cltkEval.c index 08bbd1be..cdd16a91 100644 --- a/otherlibs/labltk/support/cltkEval.c +++ b/otherlibs/labltk/support/cltkEval.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkEval.c 8899 2008-07-01 09:55:52Z weis $ */ +/* $Id$ */ #include #include @@ -75,9 +75,9 @@ CAMLprim value camltk_tcl_eval(value str) switch (code) { case TCL_OK: - return tcl_string_to_caml(cltclinterp->result); + return tcl_string_to_caml(Tcl_GetStringResult(cltclinterp)); case TCL_ERROR: - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); default: /* TCL_BREAK, TCL_CONTINUE, TCL_RETURN */ tk_error("bad tcl result"); } @@ -234,9 +234,9 @@ CAMLprim value camltk_tcl_direct_eval(value v) switch (result) { case TCL_OK: - return tcl_string_to_caml (cltclinterp->result); + return tcl_string_to_caml (Tcl_GetStringResult(cltclinterp)); case TCL_ERROR: - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); default: /* TCL_BREAK, TCL_CONTINUE, TCL_RETURN */ tk_error("bad tcl result"); } diff --git a/otherlibs/labltk/support/cltkEvent.c b/otherlibs/labltk/support/cltkEvent.c index 5b875af5..ad9b4d9e 100644 --- a/otherlibs/labltk/support/cltkEvent.c +++ b/otherlibs/labltk/support/cltkEvent.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkEvent.c 4745 2002-04-26 12:16:26Z furuse $ */ +/* $Id$ */ #include #include @@ -52,4 +52,3 @@ CAMLprim value camltk_dooneevent(value flags) ret = Tk_DoOneEvent(convert_flag_list(flags, event_flag_table)); return Val_int(ret); } - diff --git a/otherlibs/labltk/support/cltkFile.c b/otherlibs/labltk/support/cltkFile.c index ff159ad8..4fbf9868 100644 --- a/otherlibs/labltk/support/cltkFile.c +++ b/otherlibs/labltk/support/cltkFile.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkFile.c 4745 2002-04-26 12:16:26Z furuse $ */ +/* $Id$ */ #ifdef __CYGWIN__ #define _WIN32 @@ -62,14 +62,14 @@ static Tcl_File tcl_filehandle(value fd) CAMLprim value camltk_add_file_input(value fd, value cbid) { CheckInit(); - Tcl_CreateFileHandler(tcl_filehandle(fd), TCL_READABLE, + Tcl_CreateFileHandler(tcl_filehandle(fd), TCL_READABLE, FileProc, (ClientData)(Long_val(cbid))); return Val_unit; } /* We have to free the Tcl handle when we are finished using it (Tcl * asks us to, and moreover it is probably dangerous to keep the same - * handle over two allocations of the same fd by the kernel). + * handle over two allocations of the same fd by the kernel). * But we don't know when we are finished with the fd, so we free it * in rem_file (it doesn't close the fd anyway). For fds for which we * repeatedly add/rem, this will cause some overhead. @@ -87,7 +87,7 @@ CAMLprim value camltk_rem_file_input(value fd, value cbid) CAMLprim value camltk_add_file_output(value fd, value cbid) { CheckInit(); - Tcl_CreateFileHandler(tcl_filehandle(fd), TCL_WRITABLE, + Tcl_CreateFileHandler(tcl_filehandle(fd), TCL_WRITABLE, FileProc, (ClientData) (Long_val(cbid))); return Val_unit; } diff --git a/otherlibs/labltk/support/cltkMain.c b/otherlibs/labltk/support/cltkMain.c index 1d948a3f..eb4617a4 100644 --- a/otherlibs/labltk/support/cltkMain.c +++ b/otherlibs/labltk/support/cltkMain.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkMain.c 8899 2008-07-01 09:55:52Z weis $ */ +/* $Id$ */ #include #include @@ -95,7 +95,7 @@ CAMLprim value camltk_opentk(value argv) } if (Tcl_Init(cltclinterp) != TCL_OK) - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); Tcl_SetVar(cltclinterp, "argv0", String_val (argv0), TCL_GLOBAL_ONLY); { /* Sets argv */ @@ -132,13 +132,13 @@ CAMLprim value camltk_opentk(value argv) } } if (Tk_Init(cltclinterp) != TCL_OK) - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); /* Retrieve the main window */ cltk_mainWindow = Tk_MainWindow(cltclinterp); if (NULL == cltk_mainWindow) - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); Tk_GeometryRequest(cltk_mainWindow,200,200); } @@ -165,7 +165,7 @@ CAMLprim value camltk_opentk(value argv) if (0 == access(f,R_OK)) if (TCL_OK != Tcl_EvalFile(cltclinterp,f)) { stat_free(f); - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); }; stat_free(f); } diff --git a/otherlibs/labltk/support/cltkMisc.c b/otherlibs/labltk/support/cltkMisc.c index 8d77fb00..b19713cd 100644 --- a/otherlibs/labltk/support/cltkMisc.c +++ b/otherlibs/labltk/support/cltkMisc.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkMisc.c 5029 2002-07-23 14:12:03Z doligez $ */ +/* $Id$ */ #include #include @@ -33,7 +33,7 @@ CAMLprim value camltk_splitlist (value v) CheckInit(); - utf = caml_string_to_tcl(v); + utf = caml_string_to_tcl(v); /* argv is allocated by Tcl, to be freed by us */ result = Tcl_SplitList(cltclinterp,utf,&argc,&argv); switch(result) { @@ -47,7 +47,7 @@ CAMLprim value camltk_splitlist (value v) case TCL_ERROR: default: stat_free( utf ); - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); } } @@ -60,5 +60,3 @@ char *string_to_c(value s) res[l] = '\0'; return res; } - - diff --git a/otherlibs/labltk/support/cltkTimer.c b/otherlibs/labltk/support/cltkTimer.c index 2d31a1ac..e0635e85 100644 --- a/otherlibs/labltk/support/cltkTimer.c +++ b/otherlibs/labltk/support/cltkTimer.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkTimer.c 4745 2002-04-26 12:16:26Z furuse $ */ +/* $Id$ */ #include #include @@ -32,8 +32,8 @@ void TimerProc (ClientData clientdata) CAMLprim value camltk_add_timer(value milli, value cbid) { CheckInit(); - /* look at tkEvent.c , Tk_Token is an int */ - return (Val_int(Tcl_CreateTimerHandler(Int_val(milli), TimerProc, + /* look at tkEvent.c , Tk_Token is an int */ + return (Val_int(Tcl_CreateTimerHandler(Int_val(milli), TimerProc, (ClientData) (Int_val(cbid))))); } @@ -42,4 +42,3 @@ CAMLprim value camltk_rem_timer(value token) Tcl_DeleteTimerHandler((Tcl_TimerToken) Int_val(token)); return Val_unit; } - diff --git a/otherlibs/labltk/support/cltkUtf.c b/otherlibs/labltk/support/cltkUtf.c index 5654c7e5..fd01bd15 100644 --- a/otherlibs/labltk/support/cltkUtf.c +++ b/otherlibs/labltk/support/cltkUtf.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkUtf.c 4745 2002-04-26 12:16:26Z furuse $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/labltk/support/cltkVar.c b/otherlibs/labltk/support/cltkVar.c index d9bbf3cc..0411a94c 100644 --- a/otherlibs/labltk/support/cltkVar.c +++ b/otherlibs/labltk/support/cltkVar.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkVar.c 5029 2002-07-23 14:12:03Z doligez $ */ +/* $Id$ */ /* Alternative to tkwait variable */ #include @@ -38,7 +38,7 @@ CAMLprim value camltk_getvar(value var) stat_free(stable_var); if (s == NULL) - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); else return(tcl_string_to_caml(s)); } @@ -47,7 +47,7 @@ CAMLprim value camltk_setvar(value var, value contents) { char *s; char *stable_var = NULL; - char *utf_contents; + char *utf_contents; CheckInit(); /* SetVar makes a copy of the contents. */ @@ -58,13 +58,13 @@ CAMLprim value camltk_setvar(value var, value contents) s = Tcl_SetVar(cltclinterp,stable_var, utf_contents, TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG); stat_free(stable_var); - if( s == utf_contents ){ + if( s == utf_contents ){ tk_error("camltk_setvar: Tcl_SetVar returned strange result. Call the author of mlTk!"); } stat_free(utf_contents); if (s == NULL) - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); else return(Val_unit); } @@ -104,7 +104,7 @@ CAMLprim value camltk_trace_var(value var, value cbid) (ClientData) (Long_val(cbid))) != TCL_OK) { stat_free(cvar); - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); }; stat_free(cvar); return Val_unit; diff --git a/otherlibs/labltk/support/cltkWait.c b/otherlibs/labltk/support/cltkWait.c index eb819b12..4c126b5d 100644 --- a/otherlibs/labltk/support/cltkWait.c +++ b/otherlibs/labltk/support/cltkWait.c @@ -14,7 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkWait.c 5029 2002-07-23 14:12:03Z doligez $ */ +/* $Id$ */ #include #include @@ -23,13 +23,13 @@ #include #include "camltk.h" -/* The following are replacements for +/* The following are replacements for tkwait visibility tkwait window in the case where we use threads (tkwait internally calls an event loop, and thus prevents thread scheduling from taking place). - Instead, one should set up a callback, wait for a signal, and signal + Instead, one should set up a callback, wait for a signal, and signal from inside the callback */ @@ -45,7 +45,7 @@ struct WinCBData { }; static void WaitVisibilityProc(clientData, eventPtr) - ClientData clientData; + ClientData clientData; XEvent *eventPtr; /* Information about event (not used). */ { struct WinCBData *vis = clientData; @@ -66,7 +66,7 @@ CAMLprim value camltk_wait_vis(value win, value cbid) vis->win = Tk_NameToWindow(cltclinterp, String_val(win), cltk_mainWindow); if (vis -> win == NULL) { stat_free((char *)vis); - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); }; vis->cbid = Int_val(cbid); Tk_CreateEventHandler(vis->win, VisibilityChangeMask, @@ -93,7 +93,7 @@ CAMLprim value camltk_wait_des(value win, value cbid) vis->win = Tk_NameToWindow(cltclinterp, String_val(win), cltk_mainWindow); if (vis -> win == NULL) { stat_free((char *)vis); - tk_error(cltclinterp->result); + tk_error(Tcl_GetStringResult(cltclinterp)); }; vis->cbid = Int_val(cbid); Tk_CreateEventHandler(vis->win, StructureNotifyMask, diff --git a/otherlibs/labltk/support/fileevent.ml b/otherlibs/labltk/support/fileevent.ml index 6cbac085..846a7519 100644 --- a/otherlibs/labltk/support/fileevent.ml +++ b/otherlibs/labltk/support/fileevent.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: fileevent.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open Unix open Support @@ -48,7 +48,7 @@ let remove_fileinput ~fd = clear_callback id; Hashtbl.remove fd_table (fd, 'r'); if !Protocol.debug then begin - prerr_string "clear "; + prerr_string "clear "; Protocol.prerr_cbid id; prerr_endline " for fileinput" end; @@ -71,11 +71,10 @@ let remove_fileoutput ~fd = clear_callback id; Hashtbl.remove fd_table (fd, 'w'); if !Protocol.debug then begin - prerr_string "clear "; + prerr_string "clear "; Protocol.prerr_cbid id; prerr_endline " for fileoutput" end; rem_file_output fd id with Not_found -> () - diff --git a/otherlibs/labltk/support/fileevent.mli b/otherlibs/labltk/support/fileevent.mli index fa3e8be2..34760f0c 100644 --- a/otherlibs/labltk/support/fileevent.mli +++ b/otherlibs/labltk/support/fileevent.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: fileevent.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) open Unix diff --git a/otherlibs/labltk/support/protocol.ml b/otherlibs/labltk/support/protocol.ml index 636bfefe..26b97c0b 100644 --- a/otherlibs/labltk/support/protocol.ml +++ b/otherlibs/labltk/support/protocol.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: protocol.ml 7283 2005-12-21 05:29:08Z garrigue $ *) +(* $Id$ *) open Support open Widget @@ -45,7 +45,7 @@ external callback_init : unit -> unit = "camltk_init" external finalizeTk : unit -> unit = "camltk_finalize" - (* Finalize tcl/tk before exiting. This function will be automatically + (* Finalize tcl/tk before exiting. This function will be automatically called when you call [Pervasives.exit ()] (This is installed at [install_cleanup ()] *) @@ -66,13 +66,13 @@ let cltclinterp = ref Nativeint.zero let () = Callback.register "cltclinterp" cltclinterp (* Debugging support *) -let debug = +let debug = ref (try ignore (Sys.getenv "CAMLTKDEBUG"); true with Not_found -> false) (* This is approximative, since we don't quote what needs to be quoted *) let dump_args args = - let rec print_arg = function + let rec print_arg = function TkToken s -> prerr_string s; prerr_string " " | TkTokenList l -> List.iter print_arg l | TkQuote a -> prerr_string "{"; print_arg a; prerr_string "} " @@ -85,7 +85,7 @@ let dump_args args = * debugging support should not affect performances... *) -let tkEval args = +let tkEval args = if !debug then dump_args args; let res = tcl_direct_eval args in if !debug then begin @@ -101,7 +101,7 @@ let tkCommand args = ignore (tkEval args) *) (* LablTk only *) -let cCAMLtoTKwidget w = +let cCAMLtoTKwidget w = (* Widget.check_class w table; (* with subtyping, it is redundant *) *) TkToken (Widget.name w) @@ -109,8 +109,8 @@ let cTKtoCAMLwidget = function "" -> raise (Invalid_argument "cTKtoCAMLwidget") | s -> Widget.get_atom s -let callback_naming_table = - (Hashtbl.create 401 : (int, callback_buffer -> unit) Hashtbl.t) +let callback_naming_table = + (Hashtbl.create 401 : (int, callback_buffer -> unit) Hashtbl.t) let callback_memo_table = (Hashtbl.create 401 : (any widget, int) Hashtbl.t) @@ -126,7 +126,7 @@ let string_of_cbid = string_of_int let register_callback w ~callback:f = let id = new_function_id () in Hashtbl.add callback_naming_table id f; - if (forget_type w) <> (forget_type Widget.dummy) then + if (forget_type w) <> (forget_type Widget.dummy) then Hashtbl.add callback_memo_table (forget_type w) id; (string_of_cbid id) @@ -148,7 +148,7 @@ let remove_callbacks w = * that hooks can be set up at load time (i.e. before openTk) *) let destroy_hooks = ref [] -let add_destroy_hook f = +let add_destroy_hook f = destroy_hooks := f :: !destroy_hooks let _ = @@ -156,7 +156,7 @@ let _ = let install_cleanup () = let call_destroy_hooks = function - [wname] -> + [wname] -> let w = cTKtoCAMLwidget wname in List.iter (fun f -> f w) !destroy_hooks | _ -> raise (TkError "bad cleanup callback") in @@ -199,16 +199,16 @@ let camltk_argv = ref [] (* options for Arg.parse *) let keywords = [ - "-display", Arg.String (fun s -> + "-display", Arg.String (fun s -> camltk_argv := "-display" :: s :: !camltk_argv), " : X server to contact (CamlTk)"; - "-colormap", Arg.String (fun s -> + "-colormap", Arg.String (fun s -> camltk_argv := "-colormap" :: s :: !camltk_argv), " : colormap to use (CamlTk)"; - "-geometry", Arg.String (fun s -> + "-geometry", Arg.String (fun s -> camltk_argv := "-geometry" :: s :: !camltk_argv), " : size and position (CamlTk)"; - "-name", Arg.String (fun s -> + "-name", Arg.String (fun s -> camltk_argv := "-name" :: s :: !camltk_argv), " : application class (CamlTk)"; "-sync", Arg.Unit (fun () -> @@ -223,8 +223,8 @@ let keywords = [ "-visual", Arg.String (fun s -> camltk_argv := "-visual" :: s :: !camltk_argv), " : visual to use (CamlTk)" ] - -let opentk_with_args argv (* = [argv1;..;argvn] *) = + +let opentk_with_args argv (* = [argv1;..;argvn] *) = (* argv must be command line for wish *) let argv0 = Sys.argv.(0) in let rec find_display = function @@ -241,7 +241,7 @@ let opentk_with_args argv (* = [argv1;..;argvn] *) = | [] -> "" in default_display_name := find_display argv; - opentk_low (argv0 :: argv); + opentk_low (argv0 :: argv); install_cleanup(); Widget.default_toplevel @@ -256,7 +256,7 @@ let openTk ?(display = "") ?(clas = "LablTk") () = match display with | "" -> [] | _ -> ["-display"; display] - in + in opentk_with_args (dispopt @ ["-name"; clas]) (* Destroy all widgets, thus cleaning up table and exiting the loop *) @@ -264,13 +264,12 @@ let closeTk () = tcl_command "destroy ." let mainLoop = - tk_mainloop + tk_mainloop -(* [register tclname f] makes [f] available from Tcl with +(* [register tclname f] makes [f] available from Tcl with name [tclname] *) let register tclname ~callback = let s = register_callback Widget.default_toplevel ~callback in tcl_command (Printf.sprintf "proc %s {args} {eval {camlcb %s} $args}" tclname s) - diff --git a/otherlibs/labltk/support/protocol.mli b/otherlibs/labltk/support/protocol.mli index 02c3636a..9b5ae393 100644 --- a/otherlibs/labltk/support/protocol.mli +++ b/otherlibs/labltk/support/protocol.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: protocol.mli 7283 2005-12-21 05:29:08Z garrigue $ *) +(* $Id$ *) open Widget @@ -22,7 +22,7 @@ open Widget exception TkError of string (* Raised by the communication functions *) -val debug : bool ref +val debug : bool ref (* When set to true, displays approximation of intermediate Tcl code *) type tkArgs = @@ -48,11 +48,11 @@ val keywords : (string * Arg.spec * string) list (* Command line parsing specification for Arg.parse, which contains the standard Tcl/Tk command line options such as "-display" and "-name". Add [keywords] to a [Arg.parse] call, then call [opentk]. - Then [opentk] can make use of these command line options + Then [opentk] can make use of these command line options to initiate applications. *) val opentk_with_args : string list -> toplevel widget - (* [opentk_with_args] is a lower level interface to initiate Tcl/Tk + (* [opentk_with_args] is a lower level interface to initiate Tcl/Tk applications. [opentk_with_args argv] initializes Tcl/Tk with the command line options given by [argv] *) @@ -64,12 +64,12 @@ val openTk : ?display:string -> ?clas:string -> unit -> toplevel widget val openTkClass: string -> toplevel widget (* [openTkClass class] is equivalent to [opentk ["-name"; class]] *) val openTkDisplayClass: string -> string -> toplevel widget - (* [openTkDisplayClass disp class] is equivalent to + (* [openTkDisplayClass disp class] is equivalent to [opentk ["-display"; disp; "-name"; class]] *) val closeTk : unit -> unit -val finalizeTk : unit -> unit - (* Finalize tcl/tk before exiting. This function will be automatically +val finalizeTk : unit -> unit + (* Finalize tcl/tk before exiting. This function will be automatically called when you call [Pervasives.exit ()] *) val mainLoop : unit -> unit diff --git a/otherlibs/labltk/support/rawwidget.ml b/otherlibs/labltk/support/rawwidget.ml index 3e220be7..99b1dce1 100644 --- a/otherlibs/labltk/support/rawwidget.ml +++ b/otherlibs/labltk/support/rawwidget.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: rawwidget.ml 5029 2002-07-23 14:12:03Z doligez $ *) +(* $Id$ *) open Support @@ -75,7 +75,7 @@ let default_toplevel = (* Dummy widget to which global callbacks are associated *) (* also passed around by camltotkoption when no widget in context *) -let dummy = +let dummy = Untyped "dummy" let remove w = @@ -126,16 +126,16 @@ and widget_text_table = [ "text" ] and widget_toplevel_table = [ "toplevel" ] let new_suffix clas n = - try + try (List.assoc clas naming_scheme) ^ (string_of_int n) with Not_found -> "w" ^ (string_of_int n) - + (* The function called by generic creation *) let counter = ref 0 let new_atom ~parent ?name:nom clas = let parentpath = name parent in - let path = + let path = match nom with None -> incr counter; diff --git a/otherlibs/labltk/support/rawwidget.mli b/otherlibs/labltk/support/rawwidget.mli index d698d118..4eda7311 100644 --- a/otherlibs/labltk/support/rawwidget.mli +++ b/otherlibs/labltk/support/rawwidget.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: rawwidget.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Support for widget manipulations *) @@ -74,7 +74,7 @@ val dummy : raw_any raw_widget (* [dummy] is a widget used as context when we don't have any. It is *not* a real widget. *) - + val new_atom : parent:'a raw_widget -> ?name: string -> string -> 'b raw_widget val get_atom : string -> raw_any raw_widget diff --git a/otherlibs/labltk/support/slave.ml b/otherlibs/labltk/support/slave.ml index 5e078842..51eae853 100644 --- a/otherlibs/labltk/support/slave.ml +++ b/otherlibs/labltk/support/slave.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: slave.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* The code run on initialisation, in addition to normal Tk code * NOTE: camltk has not fully been initialised yet @@ -27,7 +27,7 @@ open Printf let dynload args = List.iter Dynlink.loadfile args -(* Default modules include everything from +(* Default modules include everything from let default_modules = [] *) diff --git a/otherlibs/labltk/support/support.ml b/otherlibs/labltk/support/support.ml index 66d65e51..fa650e8a 100644 --- a/otherlibs/labltk/support/support.ml +++ b/otherlibs/labltk/support/support.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: support.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Parsing results of Tcl *) (* List.split a string according to char_sep predicate *) @@ -25,11 +25,11 @@ let split_str ~pred:char_sep str = else if char_sep str.[cur] then skip_sep (succ cur) else cur in let rec split beg cur = - if cur >= len then + if cur >= len then if beg = cur then [] else [String.sub str beg (len - beg)] - else if char_sep str.[cur] - then + else if char_sep str.[cur] + then let nextw = skip_sep cur in (String.sub str beg (cur - beg)) ::(split nextw nextw) diff --git a/otherlibs/labltk/support/support.mli b/otherlibs/labltk/support/support.mli index 351e5fc2..95a2255c 100644 --- a/otherlibs/labltk/support/support.mli +++ b/otherlibs/labltk/support/support.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: support.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) val split_str : pred:(char -> bool) -> string -> string list val may : ('a -> 'b) -> 'a option -> 'b option diff --git a/otherlibs/labltk/support/textvariable.ml b/otherlibs/labltk/support/textvariable.ml index e6d49bab..ad9033d4 100644 --- a/otherlibs/labltk/support/textvariable.ml +++ b/otherlibs/labltk/support/textvariable.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: textvariable.ml 5029 2002-07-23 14:12:03Z doligez $ *) +(* $Id$ *) open Support open Protocol @@ -32,12 +32,12 @@ type textVariable = string (* List of handles *) let handles = Hashtbl.create 401 -let add_handle var cbid = +let add_handle var cbid = try let r = Hashtbl.find handles var in r := cbid :: !r with - Not_found -> + Not_found -> Hashtbl.add handles var (ref [cbid]) let exceptq x = @@ -92,10 +92,10 @@ let memo = Hashtbl.create 101 (* Added a variable v referenced by widget w *) let add w v = let w = Widget.forget_type w in - let r = - try Hashtbl.find memo w + let r = + try Hashtbl.find memo w with - Not_found -> + Not_found -> let r = ref StringSet.empty in Hashtbl.add memo w r; r in @@ -111,7 +111,7 @@ let freew w = try let r = Hashtbl.find memo w in StringSet.iter free !r; - Hashtbl.remove memo w + Hashtbl.remove memo w with Not_found -> () @@ -119,10 +119,10 @@ let _ = add_destroy_hook freew (* Allocate a new variable *) let counter = ref 0 -let getv () = - let v = +let getv () = + let v = if StringSet.is_empty !freelist then begin - incr counter; + incr counter; "camlv("^ string_of_int !counter ^")" end else @@ -149,4 +149,3 @@ let cCAMLtoTKtextVariable s = TkToken s let name s = s let coerce s = s - diff --git a/otherlibs/labltk/support/textvariable.mli b/otherlibs/labltk/support/textvariable.mli index c3a5adaf..dfa511a2 100644 --- a/otherlibs/labltk/support/textvariable.mli +++ b/otherlibs/labltk/support/textvariable.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: textvariable.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Support for Tk -textvariable option *) open Widget @@ -24,7 +24,7 @@ type textVariable (* TextVariable is an abstract type *) val create : ?on: 'a widget -> unit -> textVariable - (* Allocation of a textVariable with lifetime associated to widget + (* Allocation of a textVariable with lifetime associated to widget if a widget is specified *) val set : textVariable -> string -> unit (* Setting the val of a textVariable *) diff --git a/otherlibs/labltk/support/timer.ml b/otherlibs/labltk/support/timer.ml index face27c0..a6ef8c29 100644 --- a/otherlibs/labltk/support/timer.ml +++ b/otherlibs/labltk/support/timer.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: timer.ml 5128 2002-09-12 10:12:26Z furuse $ *) +(* $Id$ *) (* Timers *) open Support @@ -55,4 +55,3 @@ let set ~ms ~callback = ignore (add ~ms ~callback);; let remove (tkTimer, id) = internal_rem_timer tkTimer; clear_callback id - diff --git a/otherlibs/labltk/support/timer.mli b/otherlibs/labltk/support/timer.mli index bf65f657..a45e1c9d 100644 --- a/otherlibs/labltk/support/timer.mli +++ b/otherlibs/labltk/support/timer.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: timer.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) type t diff --git a/otherlibs/labltk/support/tkthread.ml b/otherlibs/labltk/support/tkthread.ml index 6bcadfd0..ecdf6146 100644 --- a/otherlibs/labltk/support/tkthread.ml +++ b/otherlibs/labltk/support/tkthread.ml @@ -12,7 +12,7 @@ (* *) (***********************************************************************) -(* $Id: tkthread.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) let jobs : (unit -> unit) Queue.t = Queue.create () let m = Mutex.create () diff --git a/otherlibs/labltk/support/tkthread.mli b/otherlibs/labltk/support/tkthread.mli index 2ee96ec9..4f20e614 100644 --- a/otherlibs/labltk/support/tkthread.mli +++ b/otherlibs/labltk/support/tkthread.mli @@ -12,12 +12,12 @@ (* *) (***********************************************************************) -(* $Id: tkthread.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Helper functions for using LablTk with threads. To use, add tkthread.cmo or tkthread.cmx to your command line *) -(** Start the main loop in a new GUI thread. Do not use recursively. *) +(** Start the main loop in a new GUI thread. Do not use recursively. *) val start : unit -> Thread.t (** The actual function executed in the GUI thread *) val thread_main : unit -> unit diff --git a/otherlibs/labltk/support/tkwait.ml b/otherlibs/labltk/support/tkwait.ml index 3bf095b5..97a0b0eb 100644 --- a/otherlibs/labltk/support/tkwait.ml +++ b/otherlibs/labltk/support/tkwait.ml @@ -14,9 +14,12 @@ (* *) (***********************************************************************) -(* $Id: tkwait.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) -external internal_tracevis : string -> string -> unit +external internal_tracevis : string -> Protocol.cbid -> unit = "camltk_wait_vis" -external internal_tracedestroy : string -> string -> unit +;; + +external internal_tracedestroy : string -> Protocol.cbid -> unit = "camltk_wait_des" +;; diff --git a/otherlibs/labltk/support/widget.ml b/otherlibs/labltk/support/widget.ml index 581c879e..65e0d26a 100644 --- a/otherlibs/labltk/support/widget.ml +++ b/otherlibs/labltk/support/widget.ml @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: widget.ml 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Hack to permit having the different data type with the same name [widget] for CamlTk and LablTk. *) diff --git a/otherlibs/labltk/support/widget.mli b/otherlibs/labltk/support/widget.mli index 14b3bdc9..f9c83278 100644 --- a/otherlibs/labltk/support/widget.mli +++ b/otherlibs/labltk/support/widget.mli @@ -14,7 +14,7 @@ (* *) (***********************************************************************) -(* $Id: widget.mli 4745 2002-04-26 12:16:26Z furuse $ *) +(* $Id$ *) (* Support for widget manipulations *) @@ -74,7 +74,7 @@ val dummy : any widget (* [dummy] is a widget used as context when we don't have any. It is *not* a real widget. *) - + val new_atom : parent:'a widget -> ?name: string -> string -> 'b widget val get_atom : string -> any widget diff --git a/otherlibs/labltk/tkanim/.cvsignore b/otherlibs/labltk/tkanim/.cvsignore deleted file mode 100644 index 38784098..00000000 --- a/otherlibs/labltk/tkanim/.cvsignore +++ /dev/null @@ -1,4 +0,0 @@ -gifanimtest -gifanimtest-static -*.so -*.a diff --git a/otherlibs/labltk/tkanim/.depend b/otherlibs/labltk/tkanim/.depend deleted file mode 100644 index 60093477..00000000 --- a/otherlibs/labltk/tkanim/.depend +++ /dev/null @@ -1,2 +0,0 @@ -tkanim.cmo: tkanim.cmi -tkanim.cmx: tkanim.cmi diff --git a/otherlibs/labltk/tkanim/Makefile b/otherlibs/labltk/tkanim/Makefile deleted file mode 100644 index c2974388..00000000 --- a/otherlibs/labltk/tkanim/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -# tkAnimGIF.c used the function Tk_ImageObjCmd, which is not available -# in a plain Tk installation. Should we disable this subdirectory ? - -include ../support/Makefile.common - -COMPFLAGS=-I ../support -I ../camltk -I ../../unix -I ../../win32unix -CCFLAGS=-I../../../byterun -I../support $(TK_DEFS) $(SHAREDCCCOMPOPTS) - -all: tkanim.cma libtkanim.$(A) -opt: tkanim.cmxa libtkanim.$(A) -example: gifanimtest$(EXE) - -OBJS=tkanim.cmo -COBJS= cltkaniminit.$(O) tkAnimGIF.$(O) - -tkanim.cma: $(OBJS) - $(MKLIB) -ocamlc '$(CAMLCB)' -o tkanim $(OBJS) - -tkanim.cmxa: $(OBJS:.cmo=.cmx) - $(MKLIB) -ocamlopt '$(CAMLOPTB)' -o tkanim $(OBJS:.cmo=.cmx) - -libtkanim.$(A): $(COBJS) - $(MKLIB) -o tkanim $(COBJS) - -gifanimtest-static$(EXE): all gifanimtest.cmo - $(CAMLC) -custom -o $@ -I ../lib -I ../support -I ../../win32unix -I ../../unix -dllpath ../support -dllpath . unix.cma -ccopt -L. $(LIBNAME).cma tkanim.cma gifanimtest.cmo - -# dynamic loading -gifanimtest$(EXE): all gifanimtest.cmo - $(CAMLC) -o $@ -I ../lib -I ../support -I ../../win32unix -I ../../unix -dllpath ../support -dllpath . unix.cma $(LIBNAME).cma tkanim.cma gifanimtest.cmo - -#animwish: $(TKANIM_LIB) tkAppInit.o -# $(CC) -o $@ tkAppInit.o $(TK_LINK) $(X11_LINK) \ -# -L. -ltkanim $(LIBS) - -$(OBJS) $(OBJS:.cmo=.cmi): ../lib/$(LIBNAME).cma - -$(OBJS:.cmo=.cmx): ../lib/$(LIBNAME).cmxa - -clean: - rm -f *.cm* *.$(O) *.$(A) dlltkanim$(EXT_DLL) gifanimtest$(EXE) gifanimtest-static$(EXE) - -.SUFFIXES : -.SUFFIXES : .mli .ml .cmi .cmo .mlp .cmx .c .$(O) - -.mli.cmi: - $(CAMLCOMP) $(COMPFLAGS) $< - -.ml.cmo: - $(CAMLCOMP) $(COMPFLAGS) $< - -.ml.cmx: - $(CAMLOPT) -c $(COMPFLAGS) $< - -.c.$(O): - $(BYTECC) $(BYTECCCOMPOPTS) $(CCFLAGS) -c $< - - -install: - cp tkanim.cma *.cmi *.mli libtkanim.$(A) $(INSTALLDIR) - if [ -f dlltkanim$(EXT_DLL) ]; then \ - cp dlltkanim$(EXT_DLL) $(STUBLIBDIR)/; \ - fi - -installopt: - cp tkanim.cmxa tkanim.$(A) $(INSTALLDIR) - -depend: tkanim.ml - $(CAMLDEP) *.mli *.ml > .depend - -include .depend diff --git a/otherlibs/labltk/tkanim/Makefile.nt b/otherlibs/labltk/tkanim/Makefile.nt deleted file mode 100644 index 2b0b5ab5..00000000 --- a/otherlibs/labltk/tkanim/Makefile.nt +++ /dev/null @@ -1 +0,0 @@ -include Makefile diff --git a/otherlibs/labltk/tkanim/README b/otherlibs/labltk/tkanim/README deleted file mode 100644 index 175401f3..00000000 --- a/otherlibs/labltk/tkanim/README +++ /dev/null @@ -1,5 +0,0 @@ -This ML code is an interface for Tkanim Tcl/Tk extension. Unfortunately -it is still test implementation. Look example directory for an example. - -The codes under this directory are mainly written by Jun Furuse -(Jun.Furuse@inria.fr). diff --git a/otherlibs/labltk/tkanim/cltkaniminit.c b/otherlibs/labltk/tkanim/cltkaniminit.c deleted file mode 100644 index a45bedcb..00000000 --- a/otherlibs/labltk/tkanim/cltkaniminit.c +++ /dev/null @@ -1,28 +0,0 @@ -/***********************************************************************/ -/* */ -/* MLTk, Tcl/Tk interface of Objective Caml */ -/* */ -/* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis */ -/* projet Cristal, INRIA Rocquencourt */ -/* Jacques Garrigue, Kyoto University RIMS */ -/* */ -/* Copyright 2002 Institut National de Recherche en Informatique et */ -/* en Automatique and Kyoto University. 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 found in the Objective Caml source tree. */ -/* */ -/***********************************************************************/ -#include -#include -#include "camltk.h" - -extern int Tkanim_Init(Tcl_Interp *); - -CAMLprim value tkanim_init (rien) /* ML */ - value rien; -{ - if (Tkanim_Init(cltclinterp) != TCL_OK) - tk_error ("Can't initialize TkAnim"); - return Val_unit; -} diff --git a/otherlibs/labltk/tkanim/gifanimtest.ml b/otherlibs/labltk/tkanim/gifanimtest.ml deleted file mode 100644 index 5b799854..00000000 --- a/otherlibs/labltk/tkanim/gifanimtest.ml +++ /dev/null @@ -1,71 +0,0 @@ -(***********************************************************************) -(* *) -(* MLTk, Tcl/Tk interface of Objective Caml *) -(* *) -(* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis *) -(* projet Cristal, INRIA Rocquencourt *) -(* Jacques Garrigue, Kyoto University RIMS *) -(* *) -(* Copyright 2002 Institut National de Recherche en Informatique et *) -(* en Automatique and Kyoto University. 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 found in the Objective Caml source tree. *) -(* *) -(***********************************************************************) -open Camltk -open Widget -open Tkanim -open Tk - -let main () = - let file = ref "" in - Arg.parse [] (fun s -> file := s) - "usage: gifanimtest file (animated gif)\n\ - \tbutton 1 toggles the animation,\n\ - \tbutton 2 displays the next frame,\n\ - \tbutton 3 quits."; - let t = openTk () in - - (* First of all, you must initialize the extension. *) - Tkanim.init (); - - prerr_endline !file; - - (* Then load the animated gif. *) - let anim = Tkanim.create !file in - prerr_endline "load done"; - - (* Check it is really animated or not. *) - match anim with - | Still x -> - (* Use whatever you want in CamlTk with this ImagePhoto. *) - prerr_endline "Sorry, it is not an animated GIF." - - | Animated x -> - (* OK, let's animate it. *) - let l = Label.create t [] in - pack [l] []; - - (* animate returns an interface function. *) - let f = animate l x in - - (* Button1 toggles the animation *) - bind l [[], ButtonPressDetail 1] (BindSet ([], (fun _ -> - f false))); - - (* Button2 displays the next frame. *) - bind l [[], ButtonPressDetail 2] (BindSet ([], (fun _ -> - f true))); - - (* Button3 quits. *) - bind l [[], ButtonPressDetail 3] (BindSet ([], (fun _ -> - closeTk ()))); - - (* start the animation *) - f false; - - (* Go to the main loop. *) - mainLoop () - -let _ = Printexc.print main () diff --git a/otherlibs/labltk/tkanim/libtkanim.clib b/otherlibs/labltk/tkanim/libtkanim.clib deleted file mode 100644 index 0db9d169..00000000 --- a/otherlibs/labltk/tkanim/libtkanim.clib +++ /dev/null @@ -1 +0,0 @@ -cltkaniminit.o tkAnimGIF.o diff --git a/otherlibs/labltk/tkanim/mmm.anim.gif b/otherlibs/labltk/tkanim/mmm.anim.gif deleted file mode 100644 index 2cddf81958f292b6081d8a771a1a68790a09e5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18501 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 -#include - -/* - * The format record for the Animated GIF file format: - */ - -static int FileMatchGIF _ANSI_ARGS_((FILE *f, char *fileName, - char *formatString, int *widthPtr, int *heightPtr)); -static int FileReadGIF _ANSI_ARGS_((Tcl_Interp *interp, - FILE *f, char *fileName, char *formatString)); - -#define INTERLACE 0x40 -#define LOCALCOLORMAP 0x80 -#define BitSet(byte, bit) (((byte) & (bit)) == (bit)) -#define MAXCOLORMAPSIZE 256 -#define CM_RED 0 -#define CM_GREEN 1 -#define CM_BLUE 2 -#define MAX_LWZ_BITS 12 -#define LM_to_uint(a,b) (((b)<<8)|(a)) -#define ReadOK(file,buffer,len) (fread(buffer, len, 1, file) != 0) - -/* - * Prototypes for local procedures defined in this file: - */ - -static int DoExtension _ANSI_ARGS_((FILE *fd, int label, - int *transparent, int *delay, int *loop)); -static int GetCode _ANSI_ARGS_((FILE *fd, int code_size, - int flag)); -static int GetDataBlock _ANSI_ARGS_((FILE *fd, - unsigned char *buf)); -static int LWZReadByte _ANSI_ARGS_((FILE *fd, int flag, - int input_code_size)); -static int ReadColorMap _ANSI_ARGS_((FILE *fd, int number, - unsigned char buffer[3][MAXCOLORMAPSIZE])); -static int ReadGIFHeader _ANSI_ARGS_((FILE *f, int *widthPtr, - int *heightPtr)); -static int ReadImage _ANSI_ARGS_((Tcl_Interp *interp, - char *imagePtr, FILE *fd, int len, int height, - unsigned char cmap[3][MAXCOLORMAPSIZE], - int interlace, int transparent)); - -static int -FileMatchGIF(f, fileName, formatString, widthPtr, heightPtr) - FILE *f; /* The image file, open for reading. */ - char *fileName; /* The name of the image file. */ - char *formatString; /* User-specified format string, or NULL. */ - int *widthPtr, *heightPtr; /* The dimensions of the image are - * returned here if the file is a valid - * raw GIF file. */ -{ - return ReadGIFHeader(f, widthPtr, heightPtr); -} - -static int -FileReadGIF(interp, f, fileName, formatString) - Tcl_Interp *interp; /* Interpreter to use for reporting errors. */ - FILE *f; /* The image file, open for reading. */ - char *fileName; /* The name of the image file. */ - char *formatString; /* User-specified format string, or NULL. */ -{ - int logicalWidth, logicalHeight; - int nBytes; - Tk_PhotoImageBlock block; - unsigned char buf[100]; - int bitPixel; - unsigned int colorResolution; - unsigned int background; - unsigned int aspectRatio; - unsigned char localColorMap[3][MAXCOLORMAPSIZE]; - unsigned char colorMap[3][MAXCOLORMAPSIZE]; - int useGlobalColormap; - int transparent = -1; - int delay = 0; - Tk_Window winPtr; - int imageLeftPos, imageTopPos, imageWidth, imageHeight; - Tk_PhotoHandle photoHandle; - - char widthbuf[32], heightbuf[32]; - Tcl_DString resultbuf; - - char newresbuf[640]; - char *imageName; - char *resultptr; - int loop = -1; - - if((winPtr = Tk_MainWindow(interp)) == NULL){ - return TCL_ERROR; - } - -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\t\tHeader check..."); -#endif - if (!ReadGIFHeader(f, &logicalWidth, &logicalHeight)) { - Tcl_AppendResult(interp, "couldn't read GIF header from file \"", - fileName, "\"", NULL); - return TCL_ERROR; - } -#ifdef TKANIM_DEBUG - fprintf(stderr, "done "); -#endif - if ((logicalWidth <= 0) || (logicalHeight <= 0)) { - Tcl_AppendResult(interp, "GIF image file \"", fileName, - "\" has dimension(s) <= 0", (char *) NULL); - return TCL_ERROR; - } - - if (fread(buf, 1, 3, f) != 3) { - return TCL_OK; - } - bitPixel = 2<<(buf[0]&0x07); - colorResolution = (((buf[0]&0x70)>>3)+1); - background = buf[1]; - aspectRatio = buf[2]; - - if (BitSet(buf[0], LOCALCOLORMAP)) { /* Global Colormap */ - if (!ReadColorMap(f, bitPixel, colorMap)) { - Tcl_AppendResult(interp, "error reading color map", - (char *) NULL); - return TCL_ERROR; - } - } - -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\t\tReading frames "); - prevpos = ftell(f); -#endif - sprintf( widthbuf, "%d ", logicalWidth); - sprintf( heightbuf, "%d ", logicalHeight); - - Tcl_DStringInit(&resultbuf); - Tcl_DStringAppend(&resultbuf, widthbuf, -1); - Tcl_DStringAppend(&resultbuf, " ", -1); - Tcl_DStringAppend(&resultbuf, heightbuf, -1); - Tcl_DStringAppend(&resultbuf, " ", -1); - Tcl_DStringAppend(&resultbuf, "{", -1); - - while (1) { - if (fread(buf, 1, 1, f) != 1) { - /* - * Premature end of image. We should really notify - * the user, but for now just show garbage. - */ -#ifdef TKANIM_DEBUG - fprintf(stderr, "Premature end of image"); -#endif - - break; - } - - if (buf[0] == ';') { - /* - * GIF terminator. - */ -#ifdef TKANIM_DEBUG - fprintf(stderr, ";"); - prevpos = ftell(f); -#endif - - break; - } - - if (buf[0] == '!') { - /* - * This is a GIF extension. - */ -#ifdef TKANIM_DEBUG - fprintf(stderr, "!"); - prevpos = ftell(f); -#endif - - if (fread(buf, 1, 1, f) != 1) { - Tcl_AppendResult( interp, - "error reading extension function code in GIF image", NULL ); -/* - interp->result = - "error reading extension function code in GIF image"; -*/ - goto error; - } - if (DoExtension(f, buf[0], &transparent, &delay, &loop) < 0) { - Tcl_AppendResult( interp, - "error reading extension in GIF image", NULL ); -/* - interp->result = "error reading extension in GIF image"; -*/ goto error; - } - continue; - } - - if (buf[0] == '\0') { - /* - * Not a valid start character; ignore it. - */ -#ifdef TKANIM_DEBUG - fprintf(stderr, "0", buf[0]); - prevpos = ftell(f); -#endif - continue; - } - - if (buf[0] != ',') { - /* - * Not a valid start character; ignore it. - */ -#ifdef TKANIM_DEBUG - fprintf(stderr, "?(%c)", buf[0]); - prevpos = ftell(f); -#endif - continue; - } - - if (fread(buf, 1, 9, f) != 9) { - Tcl_AppendResult( interp, - "couldn't read left/top/width/height in GIF image", NULL ); -/* - interp->result = "couldn't read left/top/width/height in GIF image"; -*/ - goto error; - } - - useGlobalColormap = ! BitSet(buf[8], LOCALCOLORMAP); - - bitPixel = 1<<((buf[8]&0x07)+1); - - imageLeftPos= LM_to_uint(buf[0], buf[1]); - imageTopPos= LM_to_uint(buf[2], buf[3]); - imageWidth= LM_to_uint(buf[4], buf[5]); - imageHeight= LM_to_uint(buf[6], buf[7]); - - block.width = imageWidth; - block.height = imageHeight; - block.pixelSize = 3; - block.pitch = 3 * imageWidth; - block.offset[0] = 0; - block.offset[1] = 1; - block.offset[2] = 2; - block.offset[3] = 3; - nBytes = imageHeight * block.pitch; - block.pixelPtr = (unsigned char *) ckalloc((unsigned) nBytes); - - sprintf(widthbuf, "%d", imageWidth); - sprintf(heightbuf, "%d", imageHeight); - - /* save result */ - - { -#if (TK_MAJOR_VERSION >= 8 && TK_MINOR_VERSION >= 1) - Tcl_Obj *argv[7]; - int i; - - argv[0] = Tcl_NewStringObj("image", -1); - argv[1] = Tcl_NewStringObj("create", -1); - argv[2] = Tcl_NewStringObj("photo", -1); - argv[3] = Tcl_NewStringObj("-width", -1); - argv[4] = Tcl_NewStringObj(widthbuf, -1); - argv[5] = Tcl_NewStringObj("-height", -1); - argv[6] = Tcl_NewStringObj(heightbuf, -1); - - for(i=0; i<7; i++){ Tcl_IncrRefCount(argv[i]); } - - if( Tk_ImageObjCmd((ClientData) winPtr, interp, - /* "image create photo -width - -height " */ - 7, argv) == TCL_ERROR ){ - return TCL_ERROR; - } - - for(i=0; i<7; i++){ Tcl_DecrRefCount(argv[i]); } - -#else - char *argv[7] = {"image", "create", "photo", "-width", NULL, - "-height", NULL}; - argv[4] = widthbuf; - argv[6] = heightbuf; -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\t\timage creation (%s %s %s %s %s %s %s)", - argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]); -#endif - if( Tk_ImageCmd((ClientData) winPtr, interp, - /* "image create photo -width - -height " */ - 7, argv) == TCL_ERROR ){ - return TCL_ERROR; - } -#endif - -#ifdef TKANIM_DEBUG - fprintf(stderr, " done "); -#endif - } - - imageName = interp->result; -#if (TK_MAJOR_VERSION < 8) - photoHandle = Tk_FindPhoto(interp->result); -#else - photoHandle = Tk_FindPhoto(interp, interp->result); -#endif - if (!useGlobalColormap) { - if (!ReadColorMap(f, bitPixel, localColorMap)) { - Tcl_AppendResult(interp, "error reading color map", - (char *) NULL); - goto error; - } - if (ReadImage(interp, (char *) block.pixelPtr, f, imageWidth, - imageHeight, localColorMap, BitSet(buf[8], INTERLACE), - transparent) != TCL_OK) { - goto error; - } - } else { - if (ReadImage(interp, (char *) block.pixelPtr, f, imageWidth, - imageHeight, colorMap, BitSet(buf[8], INTERLACE), - transparent) != TCL_OK) { - goto error; - } - } - Tk_PhotoPutBlock( -#if (TK_MAJOR_VERSION == 8 && TK_MINOR_VERSION >= 5 || TK_MAJOR_VERSION > 8) - NULL, -#endif -photoHandle, &block, 0, 0, imageWidth, imageHeight -#if (TK_MAJOR_VERSION == 8 && TK_MINOR_VERSION >= 4 || TK_MAJOR_VERSION > 8) - , TK_PHOTO_COMPOSITE_SET -#endif - ); -#ifdef TKANIM_DEBUG - fprintf(stderr, " Retrieving result\n"); -#endif - /* retrieve result */ - sprintf(newresbuf, "{%s %d %d %d %d %d} ", - imageName, imageWidth, imageHeight, imageLeftPos, imageTopPos, - delay); -#ifdef TKANIM_DEBUG - fprintf(stderr, " newresbuf = %s\n", newresbuf); -#endif - ckfree((char *) block.pixelPtr); -#ifdef TKANIM_DEBUG - fprintf(stderr, " free done (now append result)"); -#endif - Tcl_DStringAppend( &resultbuf, newresbuf, -1 ); -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\t\tFrame done (%d)", ftell(f) - prevpos); - prevpos = ftell(f); -#endif - } - sprintf( widthbuf, "%d", loop ); - Tcl_DStringAppend( &resultbuf, "} ", -1 ); - resultptr = Tcl_DStringAppend( &resultbuf, widthbuf, -1 ); -#ifdef TKANIM_DEBUG - fprintf(stderr, "\nResult = %s\n", resultptr); -#endif - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, resultptr, NULL); - Tcl_DStringFree(&resultbuf); - return TCL_OK; - - error: - Tcl_DStringFree(&resultbuf); - ckfree((char *) block.pixelPtr); - return TCL_ERROR; - -} - -static int -DoExtension(fd, label, transparent, delay, loop) -FILE *fd; -int label; -int *transparent; -int *delay; -int *loop; -{ - static unsigned char buf[256]; - int count = 0; - - switch (label) { - case 0x01: /* Plain Text Extension */ - break; - - case 0xff: /* Application Extension */ - count = GetDataBlock(fd, (unsigned char*) buf); - if( count < 0){ - return 1; - } - if( !strncmp (buf, "NETSCAPE", 8) ) { - /* we ignore check of "2.0" */ - count = GetDataBlock (fd, (unsigned char*) buf); - if( count < 0){ - return 1; - } - if( buf[0] != 1 ){ - fprintf(stderr, "??? %d", buf[0]); - } - *loop = LM_to_uint(buf[1], buf[2]); - } - do { - count = GetDataBlock(fd, (unsigned char*) buf); - } while (count > 0); - return count; - break; - - case 0xfe: /* Comment Extension */ - do { - count = GetDataBlock(fd, (unsigned char*) buf); - } while (count > 0); - return count; - - case 0xf9: /* Graphic Control Extension */ - count = GetDataBlock(fd, (unsigned char*) buf); - if (count < 0) { - return 1; - } - if ((buf[0] & 0x1) != 0) { - *transparent = buf[3]; - } - - /* Delay time */ - *delay = LM_to_uint(buf[1],buf[2]); - - do { - count = GetDataBlock(fd, (unsigned char*) buf); - } while (count > 0); - return count; - } - - do { - count = GetDataBlock(fd, (unsigned char*) buf); - } while (count > 0); - return count; -} - -/* - *---------------------------------------------------------------------- - * - * ReadGIFHeader -- - * - * This procedure reads the GIF header from the beginning of a - * GIF file and returns the dimensions of the image. - * - * Results: - * The return value is 1 if file "f" appears to start with - * a valid GIF header, 0 otherwise. If the header is valid, - * then *widthPtr and *heightPtr are modified to hold the - * dimensions of the image. - * - * Side effects: - * The access position in f advances. - * - *---------------------------------------------------------------------- - */ - -static int -ReadGIFHeader(f, widthPtr, heightPtr) - FILE *f; /* Image file to read the header from */ - int *widthPtr, *heightPtr; /* The dimensions of the image are - * returned here. */ -{ - unsigned char buf[7]; - - if ((fread(buf, 1, 6, f) != 6) - || ((strncmp("GIF87a", (char *) buf, 6) != 0) - && (strncmp("GIF89a", (char *) buf, 6) != 0))) { - return 0; - } - - if (fread(buf, 1, 4, f) != 4) { - return 0; - } - - *widthPtr = LM_to_uint(buf[0],buf[1]); - *heightPtr = LM_to_uint(buf[2],buf[3]); - return 1; -} - -/* - *----------------------------------------------------------------- - * The code below is copied from the giftoppm program and modified - * just slightly. - *----------------------------------------------------------------- - */ - -static int -ReadColorMap(fd,number,buffer) -FILE *fd; -int number; -unsigned char buffer[3][MAXCOLORMAPSIZE]; -{ - int i; - unsigned char rgb[3]; - - for (i = 0; i < number; ++i) { - if (! ReadOK(fd, rgb, sizeof(rgb))) - return 0; - - buffer[CM_RED][i] = rgb[0] ; - buffer[CM_GREEN][i] = rgb[1] ; - buffer[CM_BLUE][i] = rgb[2] ; - } - return 1; -} - - - -static int ZeroDataBlock = 0; - -static int -GetDataBlock(fd, buf) -FILE *fd; -unsigned char *buf; -{ - unsigned char count; - - if (! ReadOK(fd,&count,1)) { - return -1; - } - - ZeroDataBlock = count == 0; - - if ((count != 0) && (! ReadOK(fd, buf, count))) { - return -1; - } - - return count; -} - - -static int -ReadImage(interp, imagePtr, fd, len, height, cmap, interlace, transparent) -Tcl_Interp *interp; -char *imagePtr; -FILE *fd; -int len, height; -unsigned char cmap[3][MAXCOLORMAPSIZE]; -int interlace; -int transparent; -{ - unsigned char c; - int v; - int xpos = 0, ypos = 0, pass = 0; - char *colStr; - - - /* - * Initialize the Compression routines - */ - if (! ReadOK(fd,&c,1)) { - Tcl_AppendResult(interp, "error reading GIF image: ", - Tcl_PosixError(interp), (char *) NULL); - return TCL_ERROR; - } - - if (LWZReadByte(fd, 1, c) < 0) { - interp->result = "format error in GIF image"; - return TCL_ERROR; - } - - if (transparent!=-1 && - (colStr = Tcl_GetVar(interp, "TRANSPARENT_GIF_COLOR", 0L))) { - XColor *colorPtr; - colorPtr = Tk_GetColor(interp, Tk_MainWindow(interp), - Tk_GetUid(colStr)); - if (colorPtr) { -/* - printf("color is %d %d %d\n", - colorPtr->red >> 8, - colorPtr->green >> 8, - colorPtr->blue >> 8); -*/ - cmap[CM_RED][transparent] = colorPtr->red >> 8; - cmap[CM_GREEN][transparent] = colorPtr->green >> 8; - cmap[CM_BLUE][transparent] = colorPtr->blue >> 8; - Tk_FreeColor(colorPtr); - } - } - - while ((v = LWZReadByte(fd,0,c)) >= 0 ) { - - imagePtr[ (xpos*3) + (ypos *len*3)] = cmap[CM_RED][v]; - imagePtr[ (xpos*3) + (ypos *len*3) +1] = cmap[CM_GREEN][v]; - imagePtr[ (xpos*3) + (ypos *len*3) +2] = cmap[CM_BLUE][v]; - - ++xpos; - if (xpos == len) { - xpos = 0; - if (interlace) { - switch (pass) { - case 0: - case 1: - ypos += 8; break; - case 2: - ypos += 4; break; - case 3: - ypos += 2; break; - } - - if (ypos >= height) { - ++pass; - switch (pass) { - case 1: - ypos = 4; break; - case 2: - ypos = 2; break; - case 3: - ypos = 1; break; - default: - return TCL_OK; - } - } - } else { - ++ypos; - } - } - if (ypos >= height) - break; - } - return TCL_OK; -} - -static int -LWZReadByte(fd, flag, input_code_size) -FILE *fd; -int flag; -int input_code_size; -{ - static int fresh = 0; - int code, incode; - static int code_size, set_code_size; - static int max_code, max_code_size; - static int firstcode, oldcode; - static int clear_code, end_code; - static int table[2][(1<< MAX_LWZ_BITS)]; - static int stack[(1<<(MAX_LWZ_BITS))*2], *sp; - register int i; - - - if (flag) { - - set_code_size = input_code_size; - code_size = set_code_size+1; - clear_code = 1 << set_code_size ; - end_code = clear_code + 1; - max_code_size = 2*clear_code; - max_code = clear_code+2; - - GetCode(fd, 0, 1); - - fresh = 1; - - for (i = 0; i < clear_code; ++i) { - table[0][i] = 0; - table[1][i] = i; - } - for (; i < (1< stack) - return *--sp; - - while ((code = GetCode(fd, code_size, 0)) >= 0) { - if (code == clear_code) { - for (i = 0; i < clear_code; ++i) { - table[0][i] = 0; - table[1][i] = i; - } - - for (; i < (1< 0) - ; - - if (count != 0) - return -2; - } - - incode = code; - - if (code >= max_code) { - *sp++ = firstcode; - code = oldcode; - } - - while (code >= clear_code) { - *sp++ = table[1][code]; - if (code == table[0][code]) { - return -2; - - fprintf(stderr, "circular table entry BIG ERROR\n"); - /* - * Used to be this instead, Steve Ball suggested - * the change to just return. - - printf("circular table entry BIG ERROR\n"); - */ - } - code = table[0][code]; - } - - *sp++ = firstcode = table[1][code]; - - if ((code = max_code) <(1<=max_code_size) && (max_code_size < (1< stack) - return *--sp; - } - return code; -} - - -static int -GetCode(fd, code_size, flag) -FILE *fd; -int code_size; -int flag; -{ - static unsigned char buf[280]; - static int curbit, lastbit, done, last_byte; - int i, j, ret; - unsigned char count; - - if (flag) { - curbit = 0; - lastbit = 0; - done = 0; - return 0; - } - - - if ( (curbit+code_size) >= lastbit) { - if (done) { - /* ran off the end of my bits */ - return -1; - } - buf[0] = buf[last_byte-2]; - buf[1] = buf[last_byte-1]; - - if ((count = GetDataBlock(fd, &buf[2])) == 0) - done = 1; - - last_byte = 2 + count; - curbit = (curbit - lastbit) + 16; - lastbit = (2+count)*8 ; - } - - ret = 0; - for (i = curbit, j = 0; j < code_size; ++i, ++j) - ret |= ((buf[ i / 8 ] & (1 << (i % 8))) != 0) << j; - - - curbit += code_size; - - return ret; -} - -int Tk_AnimationCmd(clientData, interp, argc, argv) - ClientData clientData; /* Main window associated with interpreter. */ - Tcl_Interp *interp; /* Current interpreter. */ - int argc; /* Number of arguments. */ - char **argv; /* Argument strings. */ -{ - char c; - int length; - - if (argc < 2) { - Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], - " option ?arg arg ...?\"", (char *) NULL); - return TCL_ERROR; - } - c = argv[1][0]; - length = strlen(argv[1]); - if((c == 'c') && (length >= 2) - && (strncmp(argv[1], "create", length) == 0)) { - - char * realFileName; - Tcl_DString buffer; - FILE *f; - -#ifdef TKANIM_DEBUG - fprintf(stderr, "AnimationCmd => create "); -#endif - - if ( argc != 3 ){ - Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], - " create GifFile\"", (char *) NULL); - return TCL_ERROR; - } -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\tRealFileName = "); -#endif - realFileName = Tcl_TranslateFileName(interp, argv[2], - &buffer); - if(realFileName == NULL) { - Tcl_DStringFree(&buffer); - return TCL_ERROR; - } -#ifdef TKANIM_DEBUG - fprintf(stderr, "%s ", realFileName); -#endif -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\tOpen ", realFileName); -#endif - f = fopen(realFileName, "rb"); - Tcl_DStringFree(&buffer); - if (f == NULL ){ - Tcl_AppendResult(interp, "couldn't read image file \"", - argv[2], "\": ", Tcl_PosixError(interp), - (char *) NULL); - return TCL_ERROR; - } -#ifdef TKANIM_DEBUG - fprintf(stderr, "success ", realFileName); -#endif -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\tRead ", realFileName); -#endif - if( FileReadGIF(interp, f, argv[2], "gif") != TCL_OK ){ -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\tRead failed", realFileName); -#endif - return TCL_ERROR; - } - fclose(f); -#ifdef TKANIM_DEBUG - fprintf(stderr, "\n\tRead done", realFileName); -#endif -#ifdef TKANIM_DEBUG - fprintf(stderr, "done\n"); -#endif - } - return TCL_OK; -} - -void -TkDeleteTkAnim(clientData) - ClientData clientData; -{ -#ifdef TKANIM_DEBUG - fprintf(stderr, "TkDeleteTkAnim\n"); -#endif -} - -int Tkanim_Init(interp) - Tcl_Interp *interp; -{ -#ifdef TKANIM_DEBUG - fprintf(stderr, "Tkanim initialize..."); -#endif - Tcl_CreateCommand(interp, "animation", Tk_AnimationCmd, - (ClientData) NULL, - (Tcl_CmdDeleteProc *) TkDeleteTkAnim); -#ifdef TKANIM_DEBUG - fprintf(stderr, "done\n"); -#endif - return Tcl_PkgProvide(interp, "Tkanim", TKANIM_VERSION ); -} diff --git a/otherlibs/labltk/tkanim/tkAppInit.c b/otherlibs/labltk/tkanim/tkAppInit.c deleted file mode 100644 index 60807d91..00000000 --- a/otherlibs/labltk/tkanim/tkAppInit.c +++ /dev/null @@ -1,141 +0,0 @@ -/***********************************************************************/ -/* */ -/* MLTk, Tcl/Tk interface of Objective Caml */ -/* */ -/* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis */ -/* projet Cristal, INRIA Rocquencourt */ -/* Jacques Garrigue, Kyoto University RIMS */ -/* */ -/* Copyright 2002 Institut National de Recherche en Informatique et */ -/* en Automatique and Kyoto University. 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 found in the Objective Caml source tree. */ -/* */ -/***********************************************************************/ -/* - * tkAppInit.c -- - * - * Provides a default version of the Tcl_AppInit procedure for - * use in wish and similar Tk-based applications. - * - * Copyright (c) 1993 The Regents of the University of California. - * Copyright (c) 1994 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#ifndef lint -static char sccsid[] = "@(#) tkAppInit.c 1.19 95/12/23 17:09:24"; -#endif /* not lint */ - -#include "tk.h" - -int Tkanimation_Init _ANSI_ARGS_ ((Tcl_Interp *interp)); - -/* - * The following variable is a special hack that is needed in order for - * Sun shared libraries to be used for Tcl. - */ - -extern int matherr(); -int *tclDummyMathPtr = (int *) matherr; - -#ifdef TK_TEST -EXTERN int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp)); -#endif /* TK_TEST */ - -/* - *---------------------------------------------------------------------- - * - * main -- - * - * This is the main program for the application. - * - * Results: - * None: Tk_Main never returns here, so this procedure never - * returns either. - * - * Side effects: - * Whatever the application does. - * - *---------------------------------------------------------------------- - */ - -int -main(argc, argv) - int argc; /* Number of command-line arguments. */ - char **argv; /* Values of command-line arguments. */ -{ - Tk_Main(argc, argv, Tcl_AppInit); - return 0; /* Needed only to prevent compiler warning. */ -} - -/* - *---------------------------------------------------------------------- - * - * Tcl_AppInit -- - * - * This procedure performs application-specific initialization. - * Most applications, especially those that incorporate additional - * packages, will have their own version of this procedure. - * - * Results: - * Returns a standard Tcl completion code, and leaves an error - * message in interp->result if an error occurs. - * - * Side effects: - * Depends on the startup script. - * - *---------------------------------------------------------------------- - */ - -int -Tcl_AppInit(interp) - Tcl_Interp *interp; /* Interpreter for application. */ -{ - if (Tcl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - if (Tk_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL); -#ifdef TK_TEST - if (Tktest_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } -#endif /* TK_TEST */ - - - /* - * Call the init procedures for included packages. Each call should - * look like this: - * - * if (Mod_Init(interp) == TCL_ERROR) { - * return TCL_ERROR; - * } - * - * where "Mod" is the name of the module. - */ - - if (Tkanim_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - */ - - /* - * Specify a user-specific startup file to invoke if the application - * is run interactively. Typically the startup file is "~/.apprc" - * where "app" is the name of the application. If this line is deleted - * then no user-specific startup file will be run under any conditions. - */ - - Tcl_SetVar(interp, "tcl_rcFileName", "~/.tkanimationrc", TCL_GLOBAL_ONLY); - return TCL_OK; -} diff --git a/otherlibs/labltk/tkanim/tkanim.ml b/otherlibs/labltk/tkanim/tkanim.ml deleted file mode 100644 index d4d693f6..00000000 --- a/otherlibs/labltk/tkanim/tkanim.ml +++ /dev/null @@ -1,230 +0,0 @@ -(***********************************************************************) -(* *) -(* MLTk, Tcl/Tk interface of Objective Caml *) -(* *) -(* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis *) -(* projet Cristal, INRIA Rocquencourt *) -(* Jacques Garrigue, Kyoto University RIMS *) -(* *) -(* Copyright 2002 Institut National de Recherche en Informatique et *) -(* en Automatique and Kyoto University. 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 found in the Objective Caml source tree. *) -(* *) -(***********************************************************************) -open Camltk -open Widget -open Support -open Protocol -open Tkintf - -external init : unit -> unit = "tkanim_init" - -type gifFrame = { - imagephoto : imagePhoto; - frameWidth : int; - frameHeight : int; - left : int; - top : int; - delay : int - } - -type animatedGif = { - frames : gifFrame list; - animWidth : int; - animHeight : int; - loop : int -} - -type imageType = - | Still of Tk.options - | Animated of animatedGif - -let debug = ref false - -let cTKtoCAMLgifFrame s = - match splitlist s with - | [photo; width; height; left; top; delay] -> - {imagephoto = cTKtoCAMLimagePhoto photo; - frameWidth = int_of_string width; - frameHeight = int_of_string height; - left = int_of_string left; - top = int_of_string top; - delay = int_of_string delay} - | _ -> raise (Invalid_argument ("cTKtoCAMLgifFrame: " ^ s)) - -let cTKtoCAMLanimatedGif s = - match splitlist s with - | [width; height; frames; loop] -> - {frames = List.map cTKtoCAMLgifFrame (splitlist frames); - animWidth = int_of_string width; - animHeight = int_of_string height; - loop = int_of_string loop} - | _ -> raise (Invalid_argument ("cTKtoCAMLgifFrame: " ^ s)) - -(* check Tkanim package is in the interpreter *) -let available () = - let packages = - splitlist (Protocol.tkEval [| TkToken "package"; - TkToken "names" |]) - in - List.mem "Tkanim" packages - -let create file = - let s = - Protocol.tkEval [| TkToken "animation"; - TkToken "create"; - TkToken file |] - in - let anmgif = cTKtoCAMLanimatedGif s in - match anmgif.frames with - | [] -> raise (TkError "Null frame in a gif ?") - | [x] -> Still (ImagePhoto x.imagephoto) - | _ -> Animated anmgif - -let delete anim = - List.iter (fun {imagephoto = i} -> Imagephoto.delete i) anim.frames - -let width anm = anm.animWidth -let height anm = anm.animHeight -let images anm = List.map (fun x -> x.imagephoto) anm.frames - -let image_existence_check img = - (* I found there is a bug in Tk (even v8.0a2). *) - (* We can copy from deleted images, Tk never says "it doesn't exist", *) - (* But just do some operation. And sometimes it causes Seg-fault. *) - (* So, before using Imagephoto.copy, I should check the source image *) - (* really exists. *) - try ignore (Imagephoto.height img) with - TkError s -> prerr_endline ("tkanim: " ^ s); raise (TkError s) - -let imagephoto_copy dst src opts = - image_existence_check src; - Imagephoto.copy dst src opts - -let animate_gen w i anim = - let length = List.length anim.frames in - let frames = Array.of_list anim.frames in - let current = ref 0 in - let loop = ref anim.loop in - let f = frames.(!current) in - imagephoto_copy i f.imagephoto - [ImgTo (f.left, f.top, f.left + f.frameWidth, - f.top + f.frameHeight)]; - let visible = ref true in - let animated = ref false in - let timer = ref None in - (* Loop *) - let display_current () = - let f = frames.(!current) in - imagephoto_copy i f.imagephoto - [ImgTo (f.left, f.top, - f.left + f.frameWidth, f.top + f.frameHeight)] - in - let rec tick () = - if not (Winfo.exists w && Winfo.viewable w) then begin - (* the widget is invisible. stop animation for efficiency *) - if !debug then prerr_endline "Stopped (Visibility)"; - visible := false; - end else - begin - display_current (); - let t = - Timer.add (if f.delay = 0 then 100 else f.delay * 10) - (fun () -> - incr current; - if !current = length then begin - current := 0; - (* loop check *) - if !loop > 1 then begin - decr loop; - if !loop = 0 then begin - if !debug then prerr_endline "Loop end"; - (* stop *) - loop := anim.loop; - timer := None - end - end - end; - tick ()) - in - timer := Some t - end - in - let start () = - animated := true; - tick () - in - let stop () = - match !timer with - | Some t -> - Timer.remove t; - timer := None; - animated := false - | None -> () - in - let next () = - if !timer = None then begin - incr current; - if !current = length then current := 0; - display_current () - end - in - (* We shouldn't delete the animation here. *) -(* - bind w [[], Destroy] - (BindSet ([], (fun _ -> Imagephoto.delete i))); -*) - bind w [[], Visibility] - (BindSet ([], (fun _ -> - if not !visible then begin - visible := true; - if !animated then start () - end))); - (function - | false -> - if !animated then stop () else start () - | true -> next ()) - -let animate label anim = - (* prerr_endline "animate"; *) - let i = Imagephoto.create [Width (Pixels anim.animWidth); - Height (Pixels anim.animHeight)] - in - bind label [[], Destroy] (BindExtend ([], (fun _ -> - Imagephoto.delete i))); - Label.configure label [ImagePhoto i]; - animate_gen label i anim - -let animate_canvas_item canvas tag anim = -(* prerr_endline "animate"; *) - let i = Imagephoto.create [Width (Pixels anim.animWidth); - Height (Pixels anim.animHeight)] - in - bind canvas [[], Destroy] (BindExtend ([], (fun _ -> - Imagephoto.delete i))); - Canvas.configure_image canvas tag [ImagePhoto i]; - animate_gen canvas i anim - -let gifdata s = - let tmp_dir = ref Filename.temp_dir_name in - let mktemp = - let cnter = ref 0 - and pid = Unix.getpid() in - (function prefx -> - incr cnter; - (Filename.concat !tmp_dir - (prefx ^ string_of_int pid ^ "." ^ string_of_int !cnter))) - in - let fname = mktemp "gifdata" in - let oc = open_out_bin fname in - try - output_string oc s; - close_out oc; - let anim = create fname in - Unix.unlink fname; - anim - with - e -> begin Unix.unlink fname; raise e end - diff --git a/otherlibs/labltk/tkanim/tkanim.mli b/otherlibs/labltk/tkanim/tkanim.mli deleted file mode 100644 index e83ceb9b..00000000 --- a/otherlibs/labltk/tkanim/tkanim.mli +++ /dev/null @@ -1,95 +0,0 @@ -(***********************************************************************) -(* *) -(* MLTk, Tcl/Tk interface of Objective Caml *) -(* *) -(* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis *) -(* projet Cristal, INRIA Rocquencourt *) -(* Jacques Garrigue, Kyoto University RIMS *) -(* *) -(* Copyright 2002 Institut National de Recherche en Informatique et *) -(* en Automatique and Kyoto University. 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 found in the Objective Caml source tree. *) -(* *) -(***********************************************************************) -open Camltk -open Widget -open Support - -(*** Data types ***) - -type animatedGif - - (* This data type contains all the information of an animation of - gif89a format. It is still test implementation, so I should - keep it abstract. --- JPF *) - -type imageType = - | Still of Tk.options - | Animated of animatedGif - - (* This data type is required to distinguish normal still images - and animated gifs. Usually objects typed imagePhoto or - imageBitmap are used for Still. *) - -(*** Flags ***) - -val debug : bool ref - -(*** Library availability check ***) - -val init : unit -> unit - - (* This function calls the initialization function for Tkanim - Tcl/Tk extension. *) - -val available : unit -> bool - - (* [available ()] returns true if there is Tkanim Tcl/Tk - extension linked statically/dynamically in Tcl/Tk - interpreter. Otherwise, return false. *) - -(*** User interface ***) - -(* create is unsafe *) -val create : string -> imageType - - (* [create file] loads a gif87 or gif89 image file and parse it, - and returns [Animated animated_gif] if the image file has - more than one images. Otherwise, it returns - [Still (ImagePhoto image_photo)] *) - -val delete : animatedGif -> unit - - (* [delete anim] deletes all the images in anim. Usually - animatedGifs contain many images, so you must not forget to - use this function to free the memory. *) - -val width : animatedGif -> int -val height : animatedGif -> int - (* [width anim] and [height anim] return the width and height of - given animated gif. *) - -val images : animatedGif -> imagePhoto list - (* [images anim] returns the list of still images used in the - animation *) - -val animate : widget -> animatedGif -> bool -> unit -val animate_canvas_item : widget -> tagOrId -> animatedGif -> bool -> unit - (* The display functions for animated gifs. Since [animatedGif] is - an abstract type, you must use those functions to display - [animatedGif] images. - [animate label anim] and [animate_canvas_item canvas tag anim] - display animation [anim] on a label widget [label] or an - image tag [tag] on a canvas widget [canvas] respectively. - - Note that animation is stopped by default. - These functions return interface functions, say, [inter : - bool -> unit]. Currently, [inter false] toggles start/stop of - the animation, and [inter true] displays the next frame of - the animation if the animation is stopped. *) - -val gifdata : string -> imageType - (* [gifdata data] reads [data] as a row data of a gif file and - decodes it. *) diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend index 51dcc1cf..5530c4bc 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -27,24 +27,24 @@ nat_stubs.o: nat_stubs.c ../../byterun/alloc.h \ ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ ../../byterun/misc.h ../../byterun/mlvalues.h bng.h nat.h -arith_flags.cmi: -arith_status.cmi: -big_int.cmi: nat.cmi -int_misc.cmi: -nat.cmi: -num.cmi: ratio.cmi nat.cmi big_int.cmi -ratio.cmi: nat.cmi big_int.cmi -arith_flags.cmo: arith_flags.cmi -arith_flags.cmx: arith_flags.cmi -arith_status.cmo: arith_flags.cmi arith_status.cmi -arith_status.cmx: arith_flags.cmx arith_status.cmi -big_int.cmo: nat.cmi int_misc.cmi big_int.cmi -big_int.cmx: nat.cmx int_misc.cmx big_int.cmi -int_misc.cmo: int_misc.cmi -int_misc.cmx: int_misc.cmi -nat.cmo: int_misc.cmi nat.cmi -nat.cmx: int_misc.cmx nat.cmi -num.cmo: ratio.cmi nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi num.cmi -num.cmx: ratio.cmx nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx num.cmi -ratio.cmo: nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi ratio.cmi -ratio.cmx: nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx ratio.cmi +arith_flags.cmi: +arith_status.cmi: +big_int.cmi: nat.cmi +int_misc.cmi: +nat.cmi: +num.cmi: ratio.cmi nat.cmi big_int.cmi +ratio.cmi: nat.cmi big_int.cmi +arith_flags.cmo: arith_flags.cmi +arith_flags.cmx: arith_flags.cmi +arith_status.cmo: arith_flags.cmi arith_status.cmi +arith_status.cmx: arith_flags.cmx arith_status.cmi +big_int.cmo: nat.cmi int_misc.cmi big_int.cmi +big_int.cmx: nat.cmx int_misc.cmx big_int.cmi +int_misc.cmo: int_misc.cmi +int_misc.cmx: int_misc.cmi +nat.cmo: int_misc.cmi nat.cmi +nat.cmx: int_misc.cmx nat.cmi +num.cmo: ratio.cmi nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi num.cmi +num.cmx: ratio.cmx nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx num.cmi +ratio.cmo: nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi ratio.cmi +ratio.cmx: nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx ratio.cmi diff --git a/otherlibs/num/.depend.nt b/otherlibs/num/.depend.nt index fbb31b29..a22644ba 100644 --- a/otherlibs/num/.depend.nt +++ b/otherlibs/num/.depend.nt @@ -14,23 +14,23 @@ nat_stubs.dobj: nat_stubs.c ../../byterun/alloc.h \ ../../byterun/io.h ../../byterun/fix_code.h ../../byterun/fail.h \ ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ ../../byterun/freelist.h ../../byterun/minor_gc.h bng.h nat.h -big_int.cmi: nat.cmi -num.cmi: ratio.cmi nat.cmi big_int.cmi -ratio.cmi: nat.cmi big_int.cmi -arith_flags.cmo: arith_flags.cmi -arith_flags.cmx: arith_flags.cmi -arith_status.cmo: arith_flags.cmi arith_status.cmi -arith_status.cmx: arith_flags.cmx arith_status.cmi -big_int.cmo: nat.cmi int_misc.cmi big_int.cmi -big_int.cmx: nat.cmx int_misc.cmx big_int.cmi -int_misc.cmo: int_misc.cmi -int_misc.cmx: int_misc.cmi -nat.cmo: int_misc.cmi nat.cmi -nat.cmx: int_misc.cmx nat.cmi -num.cmo: ratio.cmi nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi num.cmi -num.cmx: ratio.cmx nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx num.cmi -ratio.cmo: nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi ratio.cmi -ratio.cmx: nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx ratio.cmi +big_int.cmi: nat.cmi +num.cmi: ratio.cmi nat.cmi big_int.cmi +ratio.cmi: nat.cmi big_int.cmi +arith_flags.cmo: arith_flags.cmi +arith_flags.cmx: arith_flags.cmi +arith_status.cmo: arith_flags.cmi arith_status.cmi +arith_status.cmx: arith_flags.cmx arith_status.cmi +big_int.cmo: nat.cmi int_misc.cmi big_int.cmi +big_int.cmx: nat.cmx int_misc.cmx big_int.cmi +int_misc.cmo: int_misc.cmi +int_misc.cmx: int_misc.cmi +nat.cmo: int_misc.cmi nat.cmi +nat.cmx: int_misc.cmx nat.cmi +num.cmo: ratio.cmi nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi num.cmi +num.cmx: ratio.cmx nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx num.cmi +ratio.cmo: nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi ratio.cmi +ratio.cmx: nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx ratio.cmi bng.sobj: bng.c bng.h ../../byterun/config.h ../../config/m.h \ ../../config/s.h ../../byterun/compatibility.h bng_ppc.c bng_digit.c bng_alpha.sobj: bng_alpha.c @@ -47,20 +47,20 @@ nat_stubs.sobj: nat_stubs.c ../../byterun/alloc.h \ ../../byterun/io.h ../../byterun/fix_code.h ../../byterun/fail.h \ ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ ../../byterun/freelist.h ../../byterun/minor_gc.h bng.h nat.h -big_int.cmi: nat.cmi -num.cmi: ratio.cmi nat.cmi big_int.cmi -ratio.cmi: nat.cmi big_int.cmi -arith_flags.cmo: arith_flags.cmi -arith_flags.cmx: arith_flags.cmi -arith_status.cmo: arith_flags.cmi arith_status.cmi -arith_status.cmx: arith_flags.cmx arith_status.cmi -big_int.cmo: nat.cmi int_misc.cmi big_int.cmi -big_int.cmx: nat.cmx int_misc.cmx big_int.cmi -int_misc.cmo: int_misc.cmi -int_misc.cmx: int_misc.cmi -nat.cmo: int_misc.cmi nat.cmi -nat.cmx: int_misc.cmx nat.cmi -num.cmo: ratio.cmi nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi num.cmi -num.cmx: ratio.cmx nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx num.cmi -ratio.cmo: nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi ratio.cmi -ratio.cmx: nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx ratio.cmi +big_int.cmi: nat.cmi +num.cmi: ratio.cmi nat.cmi big_int.cmi +ratio.cmi: nat.cmi big_int.cmi +arith_flags.cmo: arith_flags.cmi +arith_flags.cmx: arith_flags.cmi +arith_status.cmo: arith_flags.cmi arith_status.cmi +arith_status.cmx: arith_flags.cmx arith_status.cmi +big_int.cmo: nat.cmi int_misc.cmi big_int.cmi +big_int.cmx: nat.cmx int_misc.cmx big_int.cmi +int_misc.cmo: int_misc.cmi +int_misc.cmx: int_misc.cmi +nat.cmo: int_misc.cmi nat.cmi +nat.cmx: int_misc.cmx nat.cmi +num.cmo: ratio.cmi nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi num.cmi +num.cmx: ratio.cmx nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx num.cmi +ratio.cmo: nat.cmi int_misc.cmi big_int.cmi arith_flags.cmi ratio.cmi +ratio.cmx: nat.cmx int_misc.cmx big_int.cmx arith_flags.cmx ratio.cmi diff --git a/otherlibs/num/Makefile b/otherlibs/num/Makefile index 5c51f55e..0a4349e8 100644 --- a/otherlibs/num/Makefile +++ b/otherlibs/num/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 9021 2008-09-10 16:10:43Z weis $ +# $Id$ # Makefile for the "num" (exact rational arithmetic) library @@ -26,7 +26,6 @@ include ../Makefile clean:: rm -f *~ - cd test; $(MAKE) clean bng.$(O): bng.h bng_digit.c \ bng_alpha.c bng_amd64.c bng_ia32.c bng_mips.c bng_ppc.c bng_sparc.c diff --git a/otherlibs/num/Makefile.nt b/otherlibs/num/Makefile.nt index 98968652..b986460c 100644 --- a/otherlibs/num/Makefile.nt +++ b/otherlibs/num/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ # Makefile for the "num" (exact rational arithmetic) library diff --git a/otherlibs/num/README b/otherlibs/num/README index d4969bfd..a979356d 100644 --- a/otherlibs/num/README +++ b/otherlibs/num/README @@ -9,11 +9,11 @@ maintenance and bug fixing. Initially, the low-level big integer operations were provided by the BigNum package developed by Bernard Serpette, Jean Vuillemin and -Jean-Claude Herve (INRIA and Digital PRL). License issues forced us to +Jean-Claude Herve (INRIA and Digital PRL). License issues forced us to replace the BigNum package. The current implementation of low-level big integer operations is due to Xavier Leroy. -This library is documented in "The CAML Numbers Reference Manual" by +This library is documented in "The CAML Numbers Reference Manual" by Valerie Menissier-Morain, technical report 141, INRIA, july 1992, available at ftp://ftp.inria.fr/INRIA/publication/RT/RT-0141.ps.gz @@ -44,7 +44,7 @@ As an example, try: PROCESSOR-SPECIFIC OPTIMIZATIONS: When compiled with GCC, the low-level primitives use "inline extended asm" -to exploit useful features of the target processor (additions and +to exploit useful features of the target processor (additions and subtractions with carry; double-width multiplication, division). Here are the processors for which such optimizations are available: IA32 (x86) (carry, dwmult, dwdiv, 64-bit ops with SSE2 if available) diff --git a/otherlibs/num/arith_flags.ml b/otherlibs/num/arith_flags.ml index 4debbcfd..00e2813e 100644 --- a/otherlibs/num/arith_flags.ml +++ b/otherlibs/num/arith_flags.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arith_flags.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) let error_when_null_denominator_flag = ref true;; @@ -22,4 +22,3 @@ let normalize_ratio_when_printing_flag = ref true;; let floating_precision = ref 12;; let approx_printing_flag = ref false;; - diff --git a/otherlibs/num/arith_flags.mli b/otherlibs/num/arith_flags.mli index a132ea41..36160edb 100644 --- a/otherlibs/num/arith_flags.mli +++ b/otherlibs/num/arith_flags.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arith_flags.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) val error_when_null_denominator_flag : bool ref val normalize_ratio_flag : bool ref diff --git a/otherlibs/num/arith_status.ml b/otherlibs/num/arith_status.ml index 923ca00e..8b6fa9f7 100644 --- a/otherlibs/num/arith_status.ml +++ b/otherlibs/num/arith_status.ml @@ -11,22 +11,22 @@ (* *) (***********************************************************************) -(* $Id: arith_status.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) open Arith_flags;; let get_error_when_null_denominator () = - !error_when_null_denominator_flag + !error_when_null_denominator_flag and set_error_when_null_denominator choice = error_when_null_denominator_flag := choice;; -let get_normalize_ratio () = !normalize_ratio_flag -and set_normalize_ratio choice = normalize_ratio_flag := choice;; +let get_normalize_ratio () = !normalize_ratio_flag +and set_normalize_ratio choice = normalize_ratio_flag := choice;; -let get_normalize_ratio_when_printing () = +let get_normalize_ratio_when_printing () = !normalize_ratio_when_printing_flag -and set_normalize_ratio_when_printing choice = - normalize_ratio_when_printing_flag := choice;; +and set_normalize_ratio_when_printing choice = + normalize_ratio_when_printing_flag := choice;; let get_floating_precision () = !floating_precision and set_floating_precision i = floating_precision := i;; diff --git a/otherlibs/num/arith_status.mli b/otherlibs/num/arith_status.mli index aea83246..121b4d57 100644 --- a/otherlibs/num/arith_status.mli +++ b/otherlibs/num/arith_status.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arith_status.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Flags that control rational arithmetic. *) @@ -21,7 +21,7 @@ val arith_status: unit -> unit val get_error_when_null_denominator : unit -> bool (** See {!Arith_status.set_error_when_null_denominator}.*) val set_error_when_null_denominator : bool -> unit - (** Get or set the flag [null_denominator]. When on, attempting to + (** Get or set the flag [null_denominator]. When on, attempting to create a rational with a null denominator raises an exception. When off, rationals with null denominators are accepted. Initially: on. *) @@ -57,4 +57,3 @@ val set_floating_precision : int -> unit This parameter is the number of digits displayed when [approx_printing] is on. Initially: 12. *) - diff --git a/otherlibs/num/big_int.ml b/otherlibs/num/big_int.ml index 71b8e180..8342d52d 100644 --- a/otherlibs/num/big_int.ml +++ b/otherlibs/num/big_int.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: big_int.ml 9277 2009-05-24 19:46:44Z xleroy $ *) +(* $Id$ *) open Int_misc open Nat @@ -346,7 +346,7 @@ let nativeint_of_big_int bi = if bi.sign >= 0 then if i >= 0n then i else failwith "nativeint_of_big_int" else - if i >= 0n || i = Nativeint.min_int + if i >= 0n || i = Nativeint.min_int then Nativeint.neg i else failwith "nativeint_of_big_int" @@ -385,7 +385,7 @@ let int64_of_big_int bi = (Int64.logand (Int64.of_nativeint (nth_digit_nat_native bi.abs_value 0)) 0xFFFFFFFFL) - (Int64.shift_left + (Int64.shift_left (Int64.of_nativeint (nth_digit_nat_native bi.abs_value 1)) 32) | _ -> failwith "int64_of_big_int" in @@ -395,7 +395,7 @@ let int64_of_big_int bi = if i >= 0L || i = Int64.min_int then Int64.neg i else failwith "int64_of_big_int" - end + end (* Coercion with nat type *) let nat_of_big_int bi = @@ -658,3 +658,178 @@ let approx_big_int prec bi = else (sign^(String.sub s off 1)^"."^ (String.sub s (succ off) (pred prec)) ^"e"^(string_of_int (n - succ off + String.length s))) + +(* Logical operations *) + +(* Shift left by N bits *) + +let shift_left_big_int bi n = + if n < 0 then invalid_arg "shift_left_big_int" + else if n = 0 then bi + else if bi.sign = 0 then bi + else begin + let size_bi = num_digits_big_int bi in + let size_res = size_bi + ((n + length_of_digit - 1) / length_of_digit) in + let res = create_nat size_res in + let ndigits = n / length_of_digit in + set_to_zero_nat res 0 ndigits; + blit_nat res ndigits bi.abs_value 0 size_bi; + let nbits = n mod length_of_digit in + if nbits > 0 then + shift_left_nat res ndigits size_bi res (ndigits + size_bi) nbits; + { sign = bi.sign; abs_value = res } + end + +(* Shift right by N bits (rounds toward zero) *) + +let shift_right_big_int bi n = + if n < 0 then invalid_arg "shift_right_big_int" + else if n = 0 then bi + else if bi.sign = 0 then bi + else begin + let size_bi = num_digits_big_int bi in + let ndigits = n / length_of_digit in + let nbits = n mod length_of_digit in + if ndigits >= size_bi then zero_big_int else begin + let size_res = size_bi - ndigits in + let res = create_nat size_res in + blit_nat res 0 bi.abs_value ndigits size_res; + if nbits > 0 then begin + let tmp = create_nat 1 in + shift_right_nat res 0 size_res tmp 0 nbits + end; + { sign = bi.sign; abs_value = res } + end + end + +(************************************* +(* Compute 2^n *) + +let two_power_big_int n = + if n < 0 then invalid_arg "two_power_big_int"; + let size_res = (n + length_of_digit - 1) / length_of_digit in + let res = make_nat n in + set_digit_nat_native res (n / length_of_digit) + (Nativeint.shift_left 1n (n mod length_of_digit)); + { sign = 1; abs_value = res } + +(* Compute 2^n - 1 *) + +let two_power_m1_big_int n = + if n < 0 then invalid_arg "two_power_m1_big_int" + else if n = 0 then zero_big_int + else begin + let size_res = (n + length_of_digit - 1) / length_of_digit in + let res = make_nat n in + set_digit_nat_native res (n / length_of_digit) + (Nativeint.shift_left 1n (n mod length_of_digit)); + ignore (decr_nat res 0 size_res 0); + { sign = 1; abs_value = res } + end + +(* Shift right logical by N bits (rounds toward minus infinity) *) + +let lsr_big_int bi n = + if n < 0 then invalid_arg "asr_big_int" + else if bi.sign >= 0 then asr_big_int bi n + else asr_big_int (sub_big_int bi (two_power_m1_big_int n)) n +**************************) + +(* Extract N bits starting at ofs. + Treats bi in two's complement. + Result is always positive. *) + +let extract_big_int bi ofs n = + if ofs < 0 || n < 0 then invalid_arg "extract_big_int" + else if bi.sign = 0 then bi + else begin + let size_bi = num_digits_big_int bi in + let size_res = (n + length_of_digit - 1) / length_of_digit in + let ndigits = ofs / length_of_digit in + let nbits = ofs mod length_of_digit in + let res = make_nat size_res in + if ndigits < size_bi then + blit_nat res 0 bi.abs_value ndigits (min size_res (size_bi - ndigits)); + if bi.sign < 0 then begin + (* Two's complement *) + complement_nat res 0 size_res; + ignore (incr_nat res 0 size_res 1) + end; + if nbits > 0 then begin + let tmp = create_nat 1 in + shift_right_nat res 0 size_res tmp 0 nbits + end; + let n' = n mod length_of_digit in + if n' > 0 then begin + let tmp = create_nat 1 in + set_digit_nat_native tmp 0 + (Nativeint.shift_right_logical (-1n) (length_of_digit - n')); + land_digit_nat res (size_res - 1) tmp 0 + end; + if is_zero_nat res 0 size_res + then zero_big_int + else { sign = 1; abs_value = res } + end + +(* Bitwise logical operations. Arguments must be >= 0. *) + +let and_big_int a b = + if a.sign < 0 || b.sign < 0 then invalid_arg "and_big_int" + else if a.sign = 0 || b.sign = 0 then zero_big_int + else begin + let size_a = num_digits_big_int a + and size_b = num_digits_big_int b in + let size_res = min size_a size_b in + let res = create_nat size_res in + blit_nat res 0 a.abs_value 0 size_res; + for i = 0 to size_res - 1 do + land_digit_nat res i b.abs_value i + done; + if is_zero_nat res 0 size_res + then zero_big_int + else { sign = 1; abs_value = res } + end + +let or_big_int a b = + if a.sign < 0 || b.sign < 0 then invalid_arg "or_big_int" + else if a.sign = 0 then b + else if b.sign = 0 then a + else begin + let size_a = num_digits_big_int a + and size_b = num_digits_big_int b in + let size_res = max size_a size_b in + let res = create_nat size_res in + let or_aux a' b' size_b' = + blit_nat res 0 a'.abs_value 0 size_res; + for i = 0 to size_b' - 1 do + lor_digit_nat res i b'.abs_value i + done in + if size_a >= size_b + then or_aux a b size_b + else or_aux b a size_a; + if is_zero_nat res 0 size_res + then zero_big_int + else { sign = 1; abs_value = res } + end + +let xor_big_int a b = + if a.sign < 0 || b.sign < 0 then invalid_arg "xor_big_int" + else if a.sign = 0 then b + else if b.sign = 0 then a + else begin + let size_a = num_digits_big_int a + and size_b = num_digits_big_int b in + let size_res = max size_a size_b in + let res = create_nat size_res in + let xor_aux a' b' size_b' = + blit_nat res 0 a'.abs_value 0 size_res; + for i = 0 to size_b' - 1 do + lxor_digit_nat res i b'.abs_value i + done in + if size_a >= size_b + then xor_aux a b size_b + else xor_aux b a size_a; + if is_zero_nat res 0 size_res + then zero_big_int + else { sign = 1; abs_value = res } + end diff --git a/otherlibs/num/big_int.mli b/otherlibs/num/big_int.mli index 6fdb2a5a..70c4c73d 100644 --- a/otherlibs/num/big_int.mli +++ b/otherlibs/num/big_int.mli @@ -11,15 +11,15 @@ (* *) (***********************************************************************) -(* $Id: big_int.mli 8751 2008-01-04 13:15:52Z xleroy $ *) +(* $Id$ *) (** Operations on arbitrary-precision integers. - Big integers (type [big_int]) are signed integers of arbitrary size. + Big integers (type [big_int]) are signed integers of arbitrary size. *) - + open Nat - + type big_int (** The type of big integers. *) @@ -152,6 +152,32 @@ val float_of_big_int : big_int -> float (** Returns a floating-point number approximating the given big integer. *) +(** {6 Bit-oriented operations} *) + +val and_big_int : big_int -> big_int -> big_int + (** Bitwise logical ``and''. + The arguments must be positive or zero. *) +val or_big_int : big_int -> big_int -> big_int + (** Bitwise logical ``or''. + The arguments must be positive or zero. *) +val xor_big_int : big_int -> big_int -> big_int + (** Bitwise logical ``exclusive or''. + The arguments must be positive or zero. *) +val shift_left_big_int : big_int -> int -> big_int + (** [shift_left_big_int b n] returns [b] shifted left by [n] bits. + Equivalent to multiplication by [2^n]. *) +val shift_right_big_int : big_int -> int -> big_int + (** [shift_right_big_int b n] returns [b] shifted right by [n] bits. + The shift is performed on the absolute value of [b]. + The result has the same sign as [b]. + Equivalent to division by [2^n] with the result being + rounded towards zero. *) +val extract_big_int : big_int -> int -> int -> big_int + (** [extract_big_int bi ofs n] returns a nonnegative number + corresponding to bits [ofs] to [ofs + n - 1] of the + binary representation of [bi]. If [bi] is negative, + a two's complement representation is used. *) + (**/**) (** {6 For internal use} *) diff --git a/otherlibs/num/bng.c b/otherlibs/num/bng.c index a14502e1..c95ded1d 100644 --- a/otherlibs/num/bng.c +++ b/otherlibs/num/bng.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng.c 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #include "bng.h" #include "config.h" @@ -153,7 +153,7 @@ static bngcarry bng_generic_sub return 1; } -/* {a,alen} := {a,alen} << shift. +/* {a,alen} := {a,alen} << shift. Return the bits shifted out of the most significant digit of a. Require 0 <= shift < BITS_PER_BNGDIGIT. */ static bngdigit bng_generic_shift_left @@ -172,7 +172,7 @@ static bngdigit bng_generic_shift_left return carry; } -/* {a,alen} := {a,alen} >> shift. +/* {a,alen} := {a,alen} >> shift. Return the bits shifted out of the least significant digit of a. Require 0 <= shift < BITS_PER_BNGDIGIT. */ static bngdigit bng_generic_shift_right @@ -285,7 +285,7 @@ static bngcarry bng_generic_square_add /* Double products */ for (carry1 = 0, i = 1; i < blen; i++) { aofs = 2 * i - 1; - carry1 += bng_mult_add_digit(a + aofs, alen - aofs, + carry1 += bng_mult_add_digit(a + aofs, alen - aofs, b + i, blen - i, b[i - 1]); } /* Multiply by two */ @@ -426,7 +426,7 @@ struct bng_operations bng_ops = { #endif bng_generic_div_rem }; - + void bng_init(void) { #ifdef BNG_SETUP_OPS diff --git a/otherlibs/num/bng.h b/otherlibs/num/bng.h index bc8f4797..6d12c87c 100644 --- a/otherlibs/num/bng.h +++ b/otherlibs/num/bng.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng.h 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #include #include "config.h" @@ -52,7 +52,7 @@ struct bng_operations { bngcarry carry); #define bng_sub bng_ops.sub - /* {a,alen} := {a,alen} << shift. + /* {a,alen} := {a,alen} << shift. Return the bits shifted out of the most significant digit of a. Require 0 <= shift < BITS_PER_BNGDIGIT. */ bngdigit (*shift_left) @@ -60,7 +60,7 @@ struct bng_operations { int shift); #define bng_shift_left bng_ops.shift_left - /* {a,alen} := {a,alen} >> shift. + /* {a,alen} := {a,alen} >> shift. Return the bits shifted out of the least significant digit of a. Require 0 <= shift < BITS_PER_BNGDIGIT. */ bngdigit (*shift_right) @@ -154,4 +154,3 @@ extern int bng_compare(bng a/*[alen]*/, bngsize alen, /* Return the number of leading zero bits in digit d. */ extern int bng_leading_zero_bits(bngdigit d); - diff --git a/otherlibs/num/bng_alpha.c b/otherlibs/num/bng_alpha.c index 82b21346..5bf964b5 100644 --- a/otherlibs/num/bng_alpha.c +++ b/otherlibs/num/bng_alpha.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_alpha.c 5880 2003-10-24 09:18:01Z xleroy $ */ +/* $Id$ */ /* Code specific to the Alpha architecture. */ @@ -20,4 +20,3 @@ "umulh %2, %3, %1" \ : "=&r" (resl), "=r" (resh) \ : "r" (arg1), "r" (arg2)) - diff --git a/otherlibs/num/bng_amd64.c b/otherlibs/num/bng_amd64.c index 00a771af..e829eef2 100644 --- a/otherlibs/num/bng_amd64.c +++ b/otherlibs/num/bng_amd64.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_amd64.c 5880 2003-10-24 09:18:01Z xleroy $ */ +/* $Id$ */ /* Code specific to the AMD x86_64 architecture. */ @@ -193,4 +193,3 @@ static void bng_amd64_setup_ops(void) } #define BNG_SETUP_OPS bng_amd64_setup_ops() - diff --git a/otherlibs/num/bng_digit.c b/otherlibs/num/bng_digit.c index bf1da7e7..20012aa5 100644 --- a/otherlibs/num/bng_digit.c +++ b/otherlibs/num/bng_digit.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_digit.c 5880 2003-10-24 09:18:01Z xleroy $ */ +/* $Id$ */ /**** Generic operations on digits ****/ @@ -168,4 +168,3 @@ static void bng_div_aux(bngdigit * quo, bngdigit * rem, } #endif - diff --git a/otherlibs/num/bng_ia32.c b/otherlibs/num/bng_ia32.c index 35035676..bbca8e9d 100644 --- a/otherlibs/num/bng_ia32.c +++ b/otherlibs/num/bng_ia32.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_ia32.c 7019 2005-08-13 20:59:37Z doligez $ */ +/* $Id$ */ /* Code specific to the Intel IA32 (x86) architecture. */ @@ -318,7 +318,7 @@ static bngdigit bng_ia32sse2_mult_sub_digit "movd (%1), %%mm2 \n\t" /* MM2 is next digit of b */ "paddq %%mm6, %%mm1 \n\t" /* bias digit of a */ "pmuludq %%mm7, %%mm2 \n\t" /* MM2 = d * digit of b */ - /* Compute + /* Compute digit of a + ENC(carry) + 0xFFFFFFFF00000000 - 0xFFFFFFFF - product = digit of a - carry + 0xFFFFFFFF00000000 - product = digit of a - carry - productlow + (ENC(nextcarry) << 32) */ @@ -409,4 +409,3 @@ static void bng_ia32_setup_ops(void) } #define BNG_SETUP_OPS bng_ia32_setup_ops() - diff --git a/otherlibs/num/bng_mips.c b/otherlibs/num/bng_mips.c index 0ee283e9..f246843c 100644 --- a/otherlibs/num/bng_mips.c +++ b/otherlibs/num/bng_mips.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_mips.c 5880 2003-10-24 09:18:01Z xleroy $ */ +/* $Id$ */ /* Code specific to the MIPS architecture. */ @@ -21,4 +21,3 @@ "mfhi %1" \ : "=r" (resl), "=r" (resh) \ : "r" (arg1), "r" (arg2)) - diff --git a/otherlibs/num/bng_ppc.c b/otherlibs/num/bng_ppc.c index f566539e..32d573cd 100644 --- a/otherlibs/num/bng_ppc.c +++ b/otherlibs/num/bng_ppc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_ppc.c 7430 2006-05-31 08:16:34Z xleroy $ */ +/* $Id$ */ /* Code specific to the PowerPC architecture. */ diff --git a/otherlibs/num/bng_sparc.c b/otherlibs/num/bng_sparc.c index 55639f01..934c0b2f 100644 --- a/otherlibs/num/bng_sparc.c +++ b/otherlibs/num/bng_sparc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bng_sparc.c 5880 2003-10-24 09:18:01Z xleroy $ */ +/* $Id$ */ /* Code specific to the SPARC (V8 and above) architecture. */ diff --git a/otherlibs/num/int_misc.ml b/otherlibs/num/int_misc.ml index 1560bf16..b7eb4c67 100644 --- a/otherlibs/num/int_misc.ml +++ b/otherlibs/num/int_misc.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: int_misc.ml 4845 2002-05-27 12:06:49Z weis $ *) +(* $Id$ *) (* Some extra operations on integers *) diff --git a/otherlibs/num/int_misc.mli b/otherlibs/num/int_misc.mli index d20c56b0..28bb335b 100644 --- a/otherlibs/num/int_misc.mli +++ b/otherlibs/num/int_misc.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: int_misc.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Some extra operations on integers *) diff --git a/otherlibs/num/nat.h b/otherlibs/num/nat.h index 98bee6da..7f67b916 100644 --- a/otherlibs/num/nat.h +++ b/otherlibs/num/nat.h @@ -11,9 +11,8 @@ /* */ /***********************************************************************/ -/* $Id: nat.h 5880 2003-10-24 09:18:01Z xleroy $ */ +/* $Id$ */ /* Nats are represented as unstructured blocks with tag Custom_tag. */ #define Digit_val(nat,pos) (((bng) Data_custom_val(nat))[pos]) - diff --git a/otherlibs/num/nat.ml b/otherlibs/num/nat.ml index e1e0ae58..cda80d5d 100644 --- a/otherlibs/num/nat.ml +++ b/otherlibs/num/nat.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: nat.ml 8751 2008-01-04 13:15:52Z xleroy $ *) +(* $Id$ *) open Int_misc @@ -61,16 +61,16 @@ let make_nat len = (* Nat temporaries *) let a_2 = make_nat 2 -and a_1 = make_nat 1 -and b_2 = make_nat 2 +and a_1 = make_nat 1 +and b_2 = make_nat 2 let copy_nat nat off_set length = let res = create_nat (length) in - blit_nat res 0 nat off_set length; + blit_nat res 0 nat off_set length; res let is_zero_nat n off len = - compare_nat (make_nat 1) 0 1 n off (num_digits_nat n off len) = 0 + compare_nat (make_nat 1) 0 1 n off (num_digits_nat n off len) = 0 let is_nat_int nat off len = num_digits_nat nat off len = 1 && is_digit_int nat off @@ -109,15 +109,15 @@ and gt_nat nat1 off1 len1 nat2 off2 len2 = Fortunately, the carry is never used. *) (*** let square_nat nat1 off1 len1 nat2 off2 len2 = - let c = ref 0 + let c = ref 0 and trash = make_nat 1 in (* Double product *) for i = 0 to len2 - 2 do - c := !c + mult_digit_nat + c := !c + mult_digit_nat nat1 (succ (off1 + 2 * i)) (2 * (pred (len2 - i))) - nat2 + nat2 (succ (off2 + i)) (pred (len2 - i)) nat2 @@ -126,8 +126,8 @@ let square_nat nat1 off1 len1 nat2 off2 len2 = shift_left_nat nat1 0 len1 trash 0 1; (* Square of digit *) for i = 0 to len2 - 1 do - c := !c + mult_digit_nat - nat1 + c := !c + mult_digit_nat + nat1 (off1 + 2 * i) (len1 - 2 * i) nat2 @@ -139,14 +139,14 @@ let square_nat nat1 off1 len1 nat2 off2 len2 = !c ***) -let gcd_int_nat i nat off len = +let gcd_int_nat i nat off len = if i = 0 then 1 else if is_nat_int nat off len then begin set_digit_nat nat off (gcd_int (nth_digit_nat nat off) i); 0 end else begin let len_copy = succ len in - let copy = create_nat len_copy - and quotient = create_nat 1 + let copy = create_nat len_copy + and quotient = create_nat 1 and remainder = create_nat 1 in blit_nat copy 0 nat off len; set_digit_nat copy len 0; @@ -170,9 +170,9 @@ let gcd_nat nat1 off1 len1 nat2 off2 len2 = set_digit_nat !copy2 len2 0; if lt_nat !copy1 0 len1 !copy2 0 len2 then exchange copy1 copy2; - let real_len1 = + let real_len1 = ref (num_digits_nat !copy1 0 (length_nat !copy1)) - and real_len2 = + and real_len2 = ref (num_digits_nat !copy2 0 (length_nat !copy2)) in while not (is_zero_nat !copy2 0 !real_len2) do set_digit_nat !copy1 !real_len1 0; @@ -180,7 +180,7 @@ let gcd_nat nat1 off1 len1 nat2 off2 len2 = exchange copy1 copy2; real_len1 := !real_len2; real_len2 := num_digits_nat !copy2 0 !real_len2 - done; + done; blit_nat nat1 off1 !copy1 0 !real_len1; !real_len1 end @@ -205,7 +205,7 @@ let sqrt_nat rad off len = set_digit_nat res len 0; set_digit_nat res (rad_len - 1) 0; res in - let cand_len = (len + 1) / 2 in (* ceiling len / 2 *) + let cand_len = (len + 1) / 2 in (* ceiling len / 2 *) let cand_rest = rad_len - cand_len in (* Racine carrée supposée cand = "|FFFF .... |" *) let cand = make_nat cand_len in @@ -245,10 +245,10 @@ let sqrt_nat rad off len = let power_base_max = make_nat 2;; match length_of_digit with - | 64 -> + | 64 -> set_digit_nat power_base_max 0 (Int64.to_int 1000000000000000000L); ignore - (mult_digit_nat power_base_max 0 2 + (mult_digit_nat power_base_max 0 2 power_base_max 0 1 (nat_of_int 9) 0) | 32 -> set_digit_nat power_base_max 0 1000000000 | _ -> assert false @@ -275,8 +275,8 @@ let max_power_10_power_in_int = ;; let raw_string_of_digit nat off = - if is_nat_int nat off 1 - then begin string_of_int (nth_digit_nat nat off) end + if is_nat_int nat off 1 + then begin string_of_int (nth_digit_nat nat off) end else begin blit_nat b_2 0 nat off 1; div_digit_nat a_2 0 a_1 0 b_2 0 2 max_power_10_power_in_int 0; @@ -285,15 +285,15 @@ let raw_string_of_digit nat off = let len = String.length s1 in if leading_digits < 10 then begin let result = String.make (max_superscript_10_power_in_int+1) '0' in - String.set result 0 + String.set result 0 (Char.chr (48 + leading_digits)); - String.blit s1 0 + String.blit s1 0 result (String.length result - len) len; result end else begin let result = String.make (max_superscript_10_power_in_int+2) '0' in String.blit (string_of_int leading_digits) 0 result 0 2; - String.blit s1 0 + String.blit s1 0 result (String.length result - len) len; result end @@ -318,32 +318,32 @@ let string_of_digit nat = let digits = "0123456789ABCDEF" (* - make_power_base affecte power_base des puissances successives de base a + make_power_base affecte power_base des puissances successives de base a partir de la puissance 1-ieme. - 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 + 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. *) -let make_power_base base power_base = - let i = ref 0 +let make_power_base base power_base = + let i = ref 0 and j = ref 0 in set_digit_nat power_base 0 base; while incr i; is_digit_zero power_base !i do ignore - (mult_digit_nat power_base !i 2 - power_base (pred !i) 1 + (mult_digit_nat power_base !i 2 + power_base (pred !i) 1 power_base 0) done; while !j <= !i && is_digit_int power_base !j do incr j done; (!i - 2, !j) -(* - int_to_string place la representation de l entier int en base base - dans la chaine s en le rangeant de la fin indiquee par pos vers le - debut, sur times places et affecte a pos sa nouvelle valeur. +(* + int_to_string place la representation de l entier int en base base + dans la chaine s en le rangeant de la fin indiquee par pos vers le + debut, sur times places et affecte a pos sa nouvelle valeur. *) -let int_to_string int s pos_ref base times = - let i = ref int +let int_to_string int s pos_ref base times = + let i = ref int and j = ref times in while ((!i != 0) || (!j != 0)) && (!pos_ref != -1) do String.set s !pos_ref (String.get digits (!i mod base)); @@ -354,15 +354,15 @@ let int_to_string int s pos_ref base times = (* XL: suppression de adjust_string *) -let power_base_int base i = +let power_base_int base i = if i = 0 then - nat_of_int 1 + nat_of_int 1 else if i < 0 then invalid_arg "power_base_int" else begin let power_base = make_nat (succ length_of_digit) in let (pmax, pint) = make_power_base base power_base in - let n = i / (succ pmax) + let n = i / (succ pmax) and rem = i mod (succ pmax) in if n > 0 then begin let newn = @@ -380,7 +380,7 @@ let power_base_int base i = if n land !p > 0 then begin set_to_zero_nat res 0 len; ignore - (mult_digit_nat res 0 succ_len2 + (mult_digit_nat res 0 succ_len2 res2 0 len2 power_base pmax) end else blit_nat res 0 res2 0 len2; @@ -389,11 +389,11 @@ let power_base_int base i = done; if rem > 0 then begin ignore - (mult_digit_nat res2 0 newn + (mult_digit_nat res2 0 newn res 0 n power_base (pred rem)); res2 end else res - end else + end else copy_nat power_base (pred rem) 1 end @@ -409,47 +409,47 @@ let power_base_int base i = (* Puis suppression (inutile?) *) (****** -let num_digits_max_vector = - [|0; 0; 1024; 1623; 2048; 2378; 2647; 2875; 3072; 3246; 3402; +let num_digits_max_vector = + [|0; 0; 1024; 1623; 2048; 2378; 2647; 2875; 3072; 3246; 3402; 3543; 3671; 3789; 3899; 4001; 4096|] -let num_digits_max_vector = +let num_digits_max_vector = match length_of_digit with - 16 -> [|0; 0; 2048; 3246; 4096; 4755; 5294; 5749; 6144; 6492; 6803; + 16 -> [|0; 0; 2048; 3246; 4096; 4755; 5294; 5749; 6144; 6492; 6803; 7085; 7342; 7578; 7797; 8001; 8192|] (* If really exotic machines !!!! - | 17 -> [|0; 0; 1928; 3055; 3855; 4476; 4983; 5411; 5783; 6110; 6403; + | 17 -> [|0; 0; 1928; 3055; 3855; 4476; 4983; 5411; 5783; 6110; 6403; 6668; 6910; 7133; 7339; 7530; 7710|] - | 18 -> [|0; 0; 1821; 2886; 3641; 4227; 4706; 5111; 5461; 5771; 6047; + | 18 -> [|0; 0; 1821; 2886; 3641; 4227; 4706; 5111; 5461; 5771; 6047; 6298; 6526; 6736; 6931; 7112; 7282|] - | 19 -> [|0; 0; 1725; 2734; 3449; 4005; 4458; 4842; 5174; 5467; 5729; + | 19 -> [|0; 0; 1725; 2734; 3449; 4005; 4458; 4842; 5174; 5467; 5729; 5966; 6183; 6382; 6566; 6738; 6898|] - | 20 -> [|0; 0; 1639; 2597; 3277; 3804; 4235; 4600; 4915; 5194; 5443; - 5668; 5874; 6063; 6238; 6401; 6553|] - | 21 -> [|0; 0; 1561; 2473; 3121; 3623; 4034; 4381; 4681; 4946; 5183; + | 20 -> [|0; 0; 1639; 2597; 3277; 3804; 4235; 4600; 4915; 5194; 5443; + 5668; 5874; 6063; 6238; 6401; 6553|] + | 21 -> [|0; 0; 1561; 2473; 3121; 3623; 4034; 4381; 4681; 4946; 5183; 5398; 5594; 5774; 5941; 6096; 6241|] - | 22 -> [|0; 0; 1490; 2361; 2979; 3459; 3850; 4182; 4468; 4722; 4948; + | 22 -> [|0; 0; 1490; 2361; 2979; 3459; 3850; 4182; 4468; 4722; 4948; 5153; 5340; 5512; 5671; 5819; 5958|] - | 23 -> [|0; 0; 1425; 2258; 2850; 3308; 3683; 4000; 4274; 4516; 4733; + | 23 -> [|0; 0; 1425; 2258; 2850; 3308; 3683; 4000; 4274; 4516; 4733; 4929; 5108; 5272; 5424; 5566; 5699|] - | 24 -> [|0; 0; 1366; 2164; 2731; 3170; 3530; 3833; 4096; 4328; 4536; + | 24 -> [|0; 0; 1366; 2164; 2731; 3170; 3530; 3833; 4096; 4328; 4536; 4723; 4895; 5052; 5198; 5334; 5461|] - | 25 -> [|0; 0; 1311; 2078; 2622; 3044; 3388; 3680; 3932; 4155; 4354; + | 25 -> [|0; 0; 1311; 2078; 2622; 3044; 3388; 3680; 3932; 4155; 4354; 4534; 4699; 4850; 4990; 5121; 5243|] - | 26 -> [|0; 0; 1261; 1998; 2521; 2927; 3258; 3538; 3781; 3995; 4187; + | 26 -> [|0; 0; 1261; 1998; 2521; 2927; 3258; 3538; 3781; 3995; 4187; 4360; 4518; 4664; 4798; 4924; 5041|] - | 27 -> [|0; 0; 1214; 1924; 2428; 2818; 3137; 3407; 3641; 3847; 4032; + | 27 -> [|0; 0; 1214; 1924; 2428; 2818; 3137; 3407; 3641; 3847; 4032; 4199; 4351; 4491; 4621; 4742; 4855|] - | 28 -> [|0; 0; 1171; 1855; 2341; 2718; 3025; 3286; 3511; 3710; 3888; + | 28 -> [|0; 0; 1171; 1855; 2341; 2718; 3025; 3286; 3511; 3710; 3888; 4049; 4196; 4331; 4456; 4572; 4681|] - | 29 -> [|0; 0; 1130; 1791; 2260; 2624; 2921; 3172; 3390; 3582; 3754; + | 29 -> [|0; 0; 1130; 1791; 2260; 2624; 2921; 3172; 3390; 3582; 3754; 3909; 4051; 4181; 4302; 4415; 4520|] - | 30 -> [|0; 0; 1093; 1732; 2185; 2536; 2824; 3067; 3277; 3463; 3629; + | 30 -> [|0; 0; 1093; 1732; 2185; 2536; 2824; 3067; 3277; 3463; 3629; 3779; 3916; 4042; 4159; 4267; 4369|] - | 31 -> [|0; 0; 1057; 1676; 2114; 2455; 2733; 2968; 3171; 3351; 3512; + | 31 -> [|0; 0; 1057; 1676; 2114; 2455; 2733; 2968; 3171; 3351; 3512; 3657; 3790; 3912; 4025; 4130; 4228|] *) - | 32 -> [|0; 0; 1024; 1623; 2048; 2378; 2647; 2875; 3072; 3246; 3402; + | 32 -> [|0; 0; 1024; 1623; 2048; 2378; 2647; 2875; 3072; 3246; 3402; 3543; 3671; 3789; 3899; 4001; 4096|] | n -> failwith "num_digits_max_vector" ******) @@ -466,34 +466,34 @@ let unadjusted_string_of_nat nat off len_nat = and copy2 = make_nat !len_copy and rest_digit = make_nat 2 in if len > biggest_int / (succ pmax) - then failwith "number too long" + then failwith "number too long" else let len_s = (succ pmax) * len in let s = String.make len_s '0' and pos_ref = ref len_s in - len_copy := pred !len_copy; + len_copy := pred !len_copy; blit_nat copy1 0 nat off len; set_digit_nat copy1 len 0; - while not (is_zero_nat copy1 0 !len_copy) do - div_digit_nat copy2 0 - rest_digit 0 - copy1 0 (succ !len_copy) + while not (is_zero_nat copy1 0 !len_copy) do + div_digit_nat copy2 0 + rest_digit 0 + copy1 0 (succ !len_copy) power_base_max 0; let str = raw_string_of_digit rest_digit 0 in - String.blit str 0 + String.blit str 0 s (!pos_ref - String.length str) (String.length str); (* XL: il y avait pmax a la place de String.length str mais ca ne marche pas avec le blit de Caml Light, qui ne verifie pas les debordements *) pos_ref := !pos_ref - pmax; - len_copy := num_digits_nat copy2 0 !len_copy; + len_copy := num_digits_nat copy2 0 !len_copy; blit_nat copy1 0 copy2 0 !len_copy; - set_digit_nat copy1 !len_copy 0 + set_digit_nat copy1 !len_copy 0 done; s -let string_of_nat nat = - let s = unadjusted_string_of_nat nat 0 (length_nat nat) +let string_of_nat nat = + let s = unadjusted_string_of_nat nat 0 (length_nat nat) and index = ref 0 in begin try for i = 0 to String.length s - 2 do @@ -513,11 +513,11 @@ let base_digit_of_char c base = else if n >= 65 && n <= 65 + base - 11 then n - 55 else failwith "invalid digit" -(* - La sous-chaine (s, off, len) represente un nat en base base que - on determine ici +(* + La sous-chaine (s, off, len) represente un nat en base base que + on determine ici *) -let sys_nat_of_string base s off len = +let sys_nat_of_string base s off len = let power_base = make_nat (succ length_of_digit) in let (pmax, pint) = make_power_base base power_base in let new_len = ref (1 + len / (pmax + 1)) @@ -525,33 +525,33 @@ let sys_nat_of_string base s off len = let possible_len = ref (min 2 !new_len) in let nat1 = make_nat !new_len - and nat2 = make_nat !new_len + and nat2 = make_nat !new_len - and digits_read = ref 0 + and digits_read = ref 0 and bound = off + len - 1 and int = ref 0 in for i = off to bound do - (* - on lit pint (au maximum) chiffres, on en fait un int + (* + on lit pint (au maximum) chiffres, on en fait un int et on l integre au nombre *) let c = String.get s i in - begin match c with + begin match c with ' ' | '\t' | '\n' | '\r' | '\\' -> () | _ -> int := !int * base + base_digit_of_char c base; incr digits_read end; - if (!digits_read = pint || i = bound) && not (!digits_read = 0) then + if (!digits_read = pint || i = bound) && not (!digits_read = 0) then begin set_digit_nat nat1 0 !int; let erase_len = if !new_len = !current_len then !current_len - 1 else !current_len in - for j = 1 to erase_len do + for j = 1 to erase_len do set_digit_nat nat1 j 0 done; ignore - (mult_digit_nat nat1 0 !possible_len + (mult_digit_nat nat1 0 !possible_len nat2 0 !current_len power_base (pred !digits_read)); blit_nat nat2 0 nat1 0 !possible_len; current_len := num_digits_nat nat1 0 !possible_len; @@ -560,8 +560,8 @@ let sys_nat_of_string base s off len = digits_read := 0 end done; - (* - On recadre le nat + (* + On recadre le nat *) let nat = create_nat !current_len in blit_nat nat 0 nat1 0 !current_len; diff --git a/otherlibs/num/nat.mli b/otherlibs/num/nat.mli index 186239f8..3b32ac8d 100644 --- a/otherlibs/num/nat.mli +++ b/otherlibs/num/nat.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: nat.mli 8751 2008-01-04 13:15:52Z xleroy $ *) +(* $Id$ *) (* Module [Nat]: operations on natural numbers *) @@ -29,7 +29,7 @@ external set_digit_nat: nat -> int -> int -> unit = "set_digit_nat" external nth_digit_nat: nat -> int -> int = "nth_digit_nat" external set_digit_nat_native: nat -> int -> nativeint -> unit = "set_digit_nat_native" external nth_digit_nat_native: nat -> int -> nativeint = "nth_digit_nat_native" -val length_nat : nat -> int +val length_nat : nat -> int external num_digits_nat: nat -> int -> int -> int = "num_digits_nat" external num_leading_zero_bits_in_digit: nat -> int -> int = "num_leading_zero_bits_in_digit" external is_digit_int: nat -> int -> bool = "is_digit_int" diff --git a/otherlibs/num/nat_stubs.c b/otherlibs/num/nat_stubs.c index 9c69e231..cffe1237 100644 --- a/otherlibs/num/nat_stubs.c +++ b/otherlibs/num/nat_stubs.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: nat_stubs.c 9320 2009-07-22 15:36:28Z doligez $ */ +/* $Id$ */ #include "alloc.h" #include "config.h" @@ -267,7 +267,7 @@ CAMLprim value div_nat(value *argv, int argn) return div_nat_native(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); } - + value shift_right_nat_native(value nat1, value ofs1, value len1, value nat2, value ofs2, value nbits) { @@ -283,7 +283,7 @@ CAMLprim value shift_right_nat(value *argv, int argn) argv[3], argv[4], argv[5]); } -CAMLprim value compare_digits_nat(value nat1, value ofs1, +CAMLprim value compare_digits_nat(value nat1, value ofs1, value nat2, value ofs2) { bngdigit d1 = Digit_val(nat1, Long_val(ofs1)); @@ -333,7 +333,7 @@ CAMLprim value lxor_digit_nat(value nat1, value ofs1, value nat2, value ofs2) For big-endian 64-bit platforms, we need to swap the two 32-bit halves of 64-bit words to obtain the correct behavior. */ -static void serialize_nat(value nat, +static void serialize_nat(value nat, uintnat * wsize_32, uintnat * wsize_64) { diff --git a/otherlibs/num/num.ml b/otherlibs/num/num.ml index e6565e02..52fe8cc0 100644 --- a/otherlibs/num/num.ml +++ b/otherlibs/num/num.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: num.ml 9022 2008-09-10 16:12:05Z weis $ *) +(* $Id$ *) open Int_misc open Nat @@ -438,8 +438,3 @@ and approx_num_exp n num = approx_ratio_exp n (ratio_of_num num) let incr_num r = r := succ_num !r and decr_num r = r := pred_num !r - - - - - diff --git a/otherlibs/num/num.mli b/otherlibs/num/num.mli index 88cd094b..8bf3d4e6 100644 --- a/otherlibs/num/num.mli +++ b/otherlibs/num/num.mli @@ -11,12 +11,12 @@ (* *) (***********************************************************************) -(* $Id: num.mli 4199 2001-12-28 23:15:23Z guesdon $ *) +(* $Id$ *) (** Operation on arbitrary-precision numbers. Numbers (type [num]) are arbitrary-precision rational numbers, - plus the special elements [1/0] (infinity) and [0/0] (undefined). + plus the special elements [1/0] (infinity) and [0/0] (undefined). *) open Nat @@ -24,7 +24,7 @@ open Big_int open Ratio (** The type of numbers. *) -type num = +type num = Int of int | Big_int of big_int | Ratio of ratio @@ -96,7 +96,7 @@ val is_integer_num : num -> bool (** The four following functions approximate a number by an integer : *) val integer_num : num -> num -(** [integer_num n] returns the integer closest to [n]. In case of ties, +(** [integer_num n] returns the integer closest to [n]. In case of ties, rounds towards zero. *) val floor_num : num -> num @@ -168,4 +168,3 @@ val big_int_of_num : num -> big_int val ratio_of_num : num -> ratio val num_of_ratio : ratio -> num val float_of_num : num -> float - diff --git a/otherlibs/num/ratio.ml b/otherlibs/num/ratio.ml index e587efe3..7885df15 100644 --- a/otherlibs/num/ratio.ml +++ b/otherlibs/num/ratio.ml @@ -17,18 +17,18 @@ open Big_int open Arith_flags (* Definition of the type ratio : - Conventions : - - the denominator is always a positive number - - the sign of n/0 is the sign of n -These convention is automatically respected when a ratio is created with + Conventions : + - the denominator is always a positive number + - the sign of n/0 is the sign of n +These convention is automatically respected when a ratio is created with the create_ratio primitive *) -type ratio = { mutable numerator : big_int; - mutable denominator : big_int; +type ratio = { mutable numerator : big_int; + mutable denominator : big_int; mutable normalized : bool} -let failwith_zero name = +let failwith_zero name = let s = "infinite or undefined rational number" in failwith (if String.length name = 0 then s else name ^ " " ^ s) @@ -37,18 +37,18 @@ and denominator_ratio r = r.denominator let null_denominator r = sign_big_int r.denominator = 0 -let verify_null_denominator r = +let verify_null_denominator r = if sign_big_int r.denominator = 0 then (if !error_when_null_denominator_flag then (failwith_zero "") else true) else false -let sign_ratio r = sign_big_int r.numerator +let sign_ratio r = sign_big_int r.numerator (* Physical normalization of rational numbers *) (* 1/0, 0/0 and -1/0 are the normalized forms for n/0 numbers *) -let normalize_ratio r = +let normalize_ratio r = if r.normalized then r else if verify_null_denominator r then begin r.numerator <- big_int_of_int (sign_big_int r.numerator); @@ -56,12 +56,12 @@ let normalize_ratio r = r end else begin let p = gcd_big_int r.numerator r.denominator in - if eq_big_int p unit_big_int + if eq_big_int p unit_big_int then begin r.normalized <- true; r end else begin - r.numerator <- div_big_int (r.numerator) p; - r.denominator <- div_big_int (r.denominator) p; + r.numerator <- div_big_int (r.numerator) p; + r.denominator <- div_big_int (r.denominator) p; r.normalized <- true; r end end @@ -73,24 +73,24 @@ let cautious_normalize_ratio_when_printing r = if (!normalize_ratio_when_printing_flag) then (normalize_ratio r) else r let create_ratio bi1 bi2 = - match sign_big_int bi2 with + match sign_big_int bi2 with -1 -> cautious_normalize_ratio - { numerator = minus_big_int bi1; + { numerator = minus_big_int bi1; denominator = minus_big_int bi2; normalized = false } - | 0 -> if !error_when_null_denominator_flag + | 0 -> if !error_when_null_denominator_flag then (failwith_zero "create_ratio") - else cautious_normalize_ratio + else cautious_normalize_ratio { numerator = bi1; denominator = bi2; normalized = false } - | _ -> cautious_normalize_ratio + | _ -> cautious_normalize_ratio { numerator = bi1; denominator = bi2; normalized = false } let create_normalized_ratio bi1 bi2 = match sign_big_int bi2 with - -1 -> { numerator = minus_big_int bi1; - denominator = minus_big_int bi2; + -1 -> { numerator = minus_big_int bi1; + denominator = minus_big_int bi2; normalized = true } -| 0 -> if !error_when_null_denominator_flag +| 0 -> if !error_when_null_denominator_flag then failwith_zero "create_normalized_ratio" else { numerator = bi1; denominator = bi2; normalized = true } | _ -> { numerator = bi1; denominator = bi2; normalized = true } @@ -99,10 +99,10 @@ let is_normalized_ratio r = r.normalized let report_sign_ratio r bi = if sign_ratio r = -1 - then minus_big_int bi + then minus_big_int bi else bi -let abs_ratio r = +let abs_ratio r = { numerator = abs_big_int r.numerator; denominator = r.denominator; normalized = r.normalized } @@ -114,17 +114,17 @@ let is_integer_ratio r = let add_ratio r1 r2 = if !normalize_ratio_flag then begin - let p = gcd_big_int ((normalize_ratio r1).denominator) + let p = gcd_big_int ((normalize_ratio r1).denominator) ((normalize_ratio r2).denominator) in - if eq_big_int p unit_big_int then - {numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator) + if eq_big_int p unit_big_int then + {numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator) (mult_big_int (r2.numerator) r1.denominator); denominator = mult_big_int (r1.denominator) r2.denominator; normalized = true} else begin let d1 = div_big_int (r1.denominator) p and d2 = div_big_int (r2.denominator) p in - let n = add_big_int (mult_big_int (r1.numerator) d2) + let n = add_big_int (mult_big_int (r1.numerator) d2) (mult_big_int d1 r2.numerator) in let p' = gcd_big_int n p in { numerator = div_big_int n p'; @@ -132,7 +132,7 @@ let add_ratio r1 r2 = normalized = true } end end else - { numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator) + { numerator = add_big_int (mult_big_int (r1.numerator) r2.denominator) (mult_big_int (r1.denominator) r2.numerator); denominator = mult_big_int (r1.denominator) r2.denominator; normalized = false } @@ -142,13 +142,13 @@ let minus_ratio r = denominator = r.denominator; normalized = r.normalized } -let add_int_ratio i r = +let add_int_ratio i r = ignore (cautious_normalize_ratio r); { numerator = add_big_int (mult_int_big_int i r.denominator) r.numerator; denominator = r.denominator; normalized = r.normalized } -let add_big_int_ratio bi r = +let add_big_int_ratio bi r = ignore (cautious_normalize_ratio r); { numerator = add_big_int (mult_big_int bi r.denominator) r.numerator ; denominator = r.denominator; @@ -158,15 +158,15 @@ let sub_ratio r1 r2 = add_ratio r1 (minus_ratio r2) let mult_ratio r1 r2 = if !normalize_ratio_flag then begin - let p1 = gcd_big_int ((normalize_ratio r1).numerator) - ((normalize_ratio r2).denominator) + let p1 = gcd_big_int ((normalize_ratio r1).numerator) + ((normalize_ratio r2).denominator) and p2 = gcd_big_int (r2.numerator) r1.denominator in - let (n1, d2) = - if eq_big_int p1 unit_big_int + let (n1, d2) = + if eq_big_int p1 unit_big_int then (r1.numerator, r2.denominator) else (div_big_int (r1.numerator) p1, div_big_int (r2.denominator) p1) and (n2, d1) = - if eq_big_int p2 unit_big_int + if eq_big_int p2 unit_big_int then (r2.numerator, r1.denominator) else (div_big_int r2.numerator p2, div_big_int r1.denominator p2) in { numerator = mult_big_int n1 n2; @@ -177,15 +177,15 @@ let mult_ratio r1 r2 = denominator = mult_big_int (r1.denominator) r2.denominator; normalized = false } -let mult_int_ratio i r = +let mult_int_ratio i r = if !normalize_ratio_flag then begin let p = gcd_big_int ((normalize_ratio r).denominator) (big_int_of_int i) in - if eq_big_int p unit_big_int + if eq_big_int p unit_big_int then { numerator = mult_big_int (big_int_of_int i) r.numerator; denominator = r.denominator; normalized = true } - else { numerator = mult_big_int (div_big_int (big_int_of_int i) p) + else { numerator = mult_big_int (div_big_int (big_int_of_int i) p) r.numerator; denominator = div_big_int (r.denominator) p; normalized = true } @@ -195,8 +195,8 @@ let mult_int_ratio i r = denominator = r.denominator; normalized = false } -let mult_big_int_ratio bi r = - if !normalize_ratio_flag then +let mult_big_int_ratio bi r = + if !normalize_ratio_flag then begin let p = gcd_big_int ((normalize_ratio r).denominator) bi in if eq_big_int p unit_big_int @@ -221,24 +221,24 @@ let square_ratio r = let inverse_ratio r = if !error_when_null_denominator_flag && (sign_big_int r.numerator) = 0 then failwith_zero "inverse_ratio" - else {numerator = report_sign_ratio r r.denominator; - denominator = abs_big_int r.numerator; + else {numerator = report_sign_ratio r r.denominator; + denominator = abs_big_int r.numerator; normalized = r.normalized} -let div_ratio r1 r2 = +let div_ratio r1 r2 = mult_ratio r1 (inverse_ratio r2) (* Integer part of a rational number *) (* Odd function *) -let integer_ratio r = +let integer_ratio r = if null_denominator r then failwith_zero "integer_ratio" else if sign_ratio r = 0 then zero_big_int - else report_sign_ratio r (div_big_int (abs_big_int r.numerator) + else report_sign_ratio r (div_big_int (abs_big_int r.numerator) (abs_big_int r.denominator)) (* Floor of a rational number *) (* Always less or equal to r *) -let floor_ratio r = +let floor_ratio r = ignore (verify_null_denominator r); div_big_int (r.numerator) r.denominator @@ -248,17 +248,17 @@ let round_ratio r = ignore (verify_null_denominator r); let abs_num = abs_big_int r.numerator in let bi = div_big_int abs_num r.denominator in - report_sign_ratio r - (if sign_big_int - (sub_big_int - (mult_int_big_int - 2 - (sub_big_int abs_num (mult_big_int (r.denominator) bi))) + report_sign_ratio r + (if sign_big_int + (sub_big_int + (mult_int_big_int + 2 + (sub_big_int abs_num (mult_big_int (r.denominator) bi))) r.denominator) = -1 then bi else succ_big_int bi) -let ceiling_ratio r = +let ceiling_ratio r = if (is_integer_ratio r) then r.numerator else succ_big_int (floor_ratio r) @@ -266,33 +266,33 @@ let ceiling_ratio r = (* Comparison operators on rational numbers *) let eq_ratio r1 r2 = - ignore (normalize_ratio r1); + ignore (normalize_ratio r1); ignore (normalize_ratio r2); eq_big_int (r1.numerator) r2.numerator && - eq_big_int (r1.denominator) r2.denominator + eq_big_int (r1.denominator) r2.denominator let compare_ratio r1 r2 = if verify_null_denominator r1 then let sign_num_r1 = sign_big_int r1.numerator in if (verify_null_denominator r2) - then + then let sign_num_r2 = sign_big_int r2.numerator in - if sign_num_r1 = 1 && sign_num_r2 = -1 then 1 + if sign_num_r1 = 1 && sign_num_r2 = -1 then 1 else if sign_num_r1 = -1 && sign_num_r2 = 1 then -1 else 0 else sign_num_r1 else if verify_null_denominator r2 then -(sign_big_int r2.numerator) - else match compare_int (sign_big_int r1.numerator) + else match compare_int (sign_big_int r1.numerator) (sign_big_int r2.numerator) with 1 -> 1 | -1 -> -1 - | _ -> if eq_big_int (r1.denominator) r2.denominator + | _ -> if eq_big_int (r1.denominator) r2.denominator then compare_big_int (r1.numerator) r2.numerator - else compare_big_int - (mult_big_int (r1.numerator) r2.denominator) + else compare_big_int + (mult_big_int (r1.numerator) r2.denominator) (mult_big_int (r1.denominator) r2.numerator) - + let lt_ratio r1 r2 = compare_ratio r1 r2 < 0 and le_ratio r1 r2 = compare_ratio r1 r2 <= 0 @@ -319,18 +319,18 @@ and ge_big_int_ratio bi r = compare_big_int_ratio bi r >= 0 (* Coercions *) (* Coercions with type int *) -let int_of_ratio r = +let int_of_ratio r = if ((is_integer_ratio r) && (is_int_big_int r.numerator)) then (int_of_big_int r.numerator) else failwith "integer argument required" and ratio_of_int i = - { numerator = big_int_of_int i; + { numerator = big_int_of_int i; denominator = unit_big_int; normalized = true } (* Coercions with type nat *) -let ratio_of_nat nat = +let ratio_of_nat nat = { numerator = big_int_of_nat nat; denominator = unit_big_int; normalized = true } @@ -344,27 +344,27 @@ and nat_of_ratio r = else failwith "nat_of_ratio" (* Coercions with type big_int *) -let ratio_of_big_int bi = +let ratio_of_big_int bi = { numerator = bi; denominator = unit_big_int; normalized = true } and big_int_of_ratio r = ignore (normalize_ratio r); - if is_integer_ratio r + if is_integer_ratio r then r.numerator else failwith "big_int_of_ratio" -let div_int_ratio i r = +let div_int_ratio i r = ignore (verify_null_denominator r); mult_int_ratio i (inverse_ratio r) -let div_ratio_int r i = +let div_ratio_int r i = div_ratio r (ratio_of_int i) -let div_big_int_ratio bi r = +let div_big_int_ratio bi r = ignore (verify_null_denominator r); mult_big_int_ratio bi (inverse_ratio r) -let div_ratio_big_int r bi = +let div_ratio_big_int r bi = div_ratio r (ratio_of_big_int bi) (* Functions on type string *) @@ -422,14 +422,14 @@ let approx_ratio_fix n r = (* Don't need to normalize *) if (null_denominator r) then failwith_zero "approx_ratio_fix" else - let sign_r = sign_ratio r in + let sign_r = sign_ratio r in if sign_r = 0 then "+0" (* r = 0 *) else - (* r.numerator and r.denominator are not null numbers + (* r.numerator and r.denominator are not null numbers s1 contains one more digit than desired for the round off operation *) if n >= 0 then begin - let s1 = + let s1 = string_of_nat (nat_of_big_int (div_big_int @@ -464,7 +464,7 @@ let approx_ratio_fix n r = (* Dubious; what is this code supposed to do? *) let s = string_of_big_int (div_big_int - (abs_big_int r.numerator) + (abs_big_int r.numerator) (base_power_big_int 10 (-n) r.denominator)) in let len = succ (String.length s) in @@ -475,13 +475,13 @@ let approx_ratio_fix n r = end (* Number of digits of the decimal representation of an int *) -let num_decimal_digits_int n = +let num_decimal_digits_int n = String.length (string_of_int n) (* Approximation with floating decimal point *) (* This is an odd function and the last digit is round off *) (* Format (+/-)(0. n_first_digits e msd)/(1. n_zeros e (msd+1) *) -let approx_ratio_exp n r = +let approx_ratio_exp n r = (* Don't need to normalize *) if (null_denominator r) then failwith_zero "approx_ratio_exp" else if n <= 0 then invalid_arg "approx_ratio_exp" @@ -493,22 +493,22 @@ let approx_ratio_exp n r = let s = String.make (n + 5) '0' in (String.blit "+0." 0 s 0 3); (String.blit "e0" 0 s !i 2); s - else + else let msd = msd_ratio (abs_ratio r) in let k = n - msd in - let s = + let s = (let nat = nat_of_big_int (if k < 0 - then - div_big_int (abs_big_int r.numerator) - (base_power_big_int 10 (- k) + then + div_big_int (abs_big_int r.numerator) + (base_power_big_int 10 (- k) r.denominator) - else + else div_big_int (base_power_big_int 10 k (abs_big_int r.numerator)) r.denominator) in string_of_nat nat) in - if (round_futur_last_digit s 0 (String.length s)) + if (round_futur_last_digit s 0 (String.length s)) then let m = num_decimal_digits_int (succ msd) in let str = String.make (n + m + 4) '0' in @@ -516,8 +516,8 @@ let approx_ratio_exp n r = String.set str !i ('e'); incr i; (if m = 0 - then String.set str !i '0' - else String.blit (string_of_int (succ msd)) 0 str !i m); + then String.set str !i '0' + else String.blit (string_of_int (succ msd)) 0 str !i m); str else let m = num_decimal_digits_int (succ msd) @@ -533,14 +533,14 @@ let approx_ratio_exp n r = (* String approximation of a rational with a fixed number of significant *) (* digits printed *) -let float_of_rational_string r = +let float_of_rational_string r = let s = approx_ratio_exp !floating_precision r in if String.get s 0 = '+' then (String.sub s 1 (pred (String.length s))) else s (* Coercions with type string *) -let string_of_ratio r = +let string_of_ratio r = ignore (cautious_normalize_ratio_when_printing r); if !approx_printing_flag then float_of_rational_string r @@ -566,10 +566,10 @@ let float_of_ratio r = (* XL: suppression de ratio_of_float *) -let power_ratio_positive_int r n = - create_ratio (power_big_int_positive_int (r.numerator) n) +let power_ratio_positive_int r n = + create_ratio (power_big_int_positive_int (r.numerator) n) (power_big_int_positive_int (r.denominator) n) -let power_ratio_positive_big_int r bi = - create_ratio (power_big_int_positive_big_int (r.numerator) bi) +let power_ratio_positive_big_int r bi = + create_ratio (power_big_int_positive_big_int (r.numerator) bi) (power_big_int_positive_big_int (r.denominator) bi) diff --git a/otherlibs/num/ratio.mli b/otherlibs/num/ratio.mli index 672abc34..12621f08 100644 --- a/otherlibs/num/ratio.mli +++ b/otherlibs/num/ratio.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: ratio.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [Ratio]: operations on rational numbers *) @@ -85,4 +85,3 @@ val ratio_of_string : string -> ratio val float_of_ratio : ratio -> float val power_ratio_positive_int : ratio -> int -> ratio val power_ratio_positive_big_int : ratio -> big_int -> ratio - diff --git a/otherlibs/num/test/.depend b/otherlibs/num/test/.depend deleted file mode 100644 index 28fea1f5..00000000 --- a/otherlibs/num/test/.depend +++ /dev/null @@ -1,10 +0,0 @@ -end_test.cmo: test.cmo -end_test.cmx: test.cmx -test_big_ints.cmo: test.cmo -test_big_ints.cmx: test.cmx -test_nats.cmo: test.cmo -test_nats.cmx: test.cmx -test_nums.cmo: test.cmo -test_nums.cmx: test.cmx -test_ratios.cmo: test.cmo -test_ratios.cmx: test.cmx diff --git a/otherlibs/num/test/Makefile b/otherlibs/num/test/Makefile deleted file mode 100644 index 7ee8570f..00000000 --- a/otherlibs/num/test/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -######################################################################### -# # -# Objective Caml # -# # -# Xavier Leroy, projet Cristal, INRIA Rocquencourt # -# # -# Copyright 1999 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: Makefile 9019 2008-09-10 16:02:52Z weis $ - -include ../../../config/Makefile - -CAMLC=../../../boot/ocamlrun ../../../ocamlc -I ../../../stdlib -w A -warn-error A -CAMLOPT=../../../boot/ocamlrun ../../../ocamlopt -I ../../../stdlib -CC=$(BYTECC) -CFLAGS=-I.. -I../../../byterun $(BYTECCCOMPOPTS) - -test: test.byt test.opt test_pi - if $(SUPPORTS_SHARED_LIBRARIES); \ - then ../../../byterun/ocamlrun -I .. ./test.byt; else ./test.byt; fi - ./test.opt - -TESTFILES=test.cmo \ - test_nats.cmo test_big_ints.cmo test_ratios.cmo test_nums.cmo \ - test_io.cmo end_test.cmo - -TESTOPTFILES=$(TESTFILES:.cmo=.cmx) - -test.byt: $(TESTFILES) ../nums.cma ../libnums.a - $(CAMLC) -ccopt -L.. -I .. -o test.byt -g ../nums.cma $(TESTFILES) - -test.opt: $(TESTOPTFILES) ../nums.cmxa ../libnums.a - $(CAMLOPT) -ccopt -L.. -I .. -o test.opt ../nums.cmxa $(TESTOPTFILES) - -test_bng: test_bng.o - $(CC) $(CFLAGS) -o test_bng ../bng.o test_bng.o -lbignum - -$(TESTOPTFILES): ../../../ocamlopt - -test_pi: test_pi.byt test_pi.bin - -test_pi.byt: pi_big_int.cmo pi_num.cmo - $(CAMLC) -ccopt -L.. -I .. -o pi_big_int.byt -g ../nums.cma pi_big_int.cmo - $(CAMLC) -ccopt -L.. -I .. -o pi_num.byt -g ../nums.cma pi_num.cmo - ./pi_big_int.byt 1000 - ./pi_num.byt 1000 - -test_pi.bin: pi_big_int.cmx pi_num.cmx - $(CAMLOPT) -ccopt -L.. -I .. -o pi_big_int.bin -g ../nums.cmxa pi_big_int.cmx - $(CAMLOPT) -ccopt -L.. -I .. -o pi_num.bin -g ../nums.cmxa pi_num.cmx - ./pi_big_int.bin 1000 - ./pi_num.bin 1000 - -.SUFFIXES: .ml .cmo .cmx - -.ml.cmo: - $(CAMLC) -I .. -c -g $< - -.ml.cmx: - $(CAMLOPT) -I .. -c $< - -ocamlnum: - ocamlmktop -o ocamlnum -custom ../nums.cma ../libnums.a - -clean: - rm -f *.byt *.opt *.bin test_bng *.o *.cm? ocamlnum *~ - -depend: - ocamldep *.ml > .depend - -include .depend diff --git a/otherlibs/num/test/Makefile.nt b/otherlibs/num/test/Makefile.nt deleted file mode 100644 index 2858ee21..00000000 --- a/otherlibs/num/test/Makefile.nt +++ /dev/null @@ -1,61 +0,0 @@ -######################################################################### -# # -# Objective Caml # -# # -# Xavier Leroy, projet Cristal, INRIA Rocquencourt # -# # -# Copyright 1999 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: Makefile.nt 6180 2004-04-01 13:10:12Z xleroy $ - -include ../../../config/Makefile - -CAMLC=../../../boot/ocamlrun ../../../ocamlc -I ../../../stdlib -I .. -CAMLOPT=../../../boot/ocamlrun ../../../ocamlopt -I ../../../stdlib -I .. -CC=$(BYTECC) -CFLAGS=-I.. $(BYTECCCOMPOPTS) - -test: test.byt test.opt - ../../../byterun/ocamlrun -I .. ./test.byt - ./test.opt - -TESTFILES=test.cmo \ - test_nats.cmo test_big_ints.cmo test_ratios.cmo test_nums.cmo \ - test_io.cmo end_test.cmo - -TESTOPTFILES=$(TESTFILES:.cmo=.cmx) - -test.byt: $(TESTFILES) ../nums.cma ../libnums.$(A) - $(CAMLC) -o test.byt nums.cma $(TESTFILES) - -test.opt: $(TESTOPTFILES) ../nums.cmxa ../libnums.$(A) - $(CAMLOPT) -o test.opt nums.cmxa $(TESTOPTFILES) - -test_bng.exe: test_bng.o - $(CC) $(CFLAGS) -o test_bng.exe ../bng.o test_bng.o -lbignum - -$(TESTOPTFILES): ../../../ocamlopt - -.SUFFIXES: .ml .cmo .cmx - -.ml.cmo: - $(CAMLC) -c $< - -.ml.cmx: - $(CAMLOPT) -c $< - -ocamltopnum.exe: - ocamlmktop -o ocamltopnum.exe -custom ../nums.cma ../libnums.$(A) - -clean: - rm -f test.byt test.opt test_bng.exe *.$(O) *.cm? ocamltopnum.exe - -depend: - ocamldep *.ml > .depend - -include .depend diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index bafddbd7..83d70098 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -12,6 +12,6 @@ strstubs.o: strstubs.c ../../byterun/mlvalues.h \ ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ ../../byterun/compatibility.h ../../byterun/misc.h \ ../../byterun/mlvalues.h -str.cmi: -str.cmo: str.cmi -str.cmx: str.cmi +str.cmi: +str.cmo: str.cmi +str.cmx: str.cmi diff --git a/otherlibs/str/Makefile b/otherlibs/str/Makefile index 79ce0e57..b6c16a07 100644 --- a/otherlibs/str/Makefile +++ b/otherlibs/str/Makefile @@ -11,21 +11,22 @@ # # ######################################################################### -# $Id: Makefile 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ # Makefile for the str library LIBNAME=str COBJS=strstubs.$(O) +CLIBNAME=camlstr CAMLOBJS=str.cmo include ../Makefile depend: -str.cmo: str.cmi -str.cmx: str.cmi +str.cmo: str.cmi +str.cmx: str.cmi depend: gcc -MM $(CFLAGS) *.c > .depend diff --git a/otherlibs/str/Makefile.nt b/otherlibs/str/Makefile.nt index 34340739..5aeff80b 100644 --- a/otherlibs/str/Makefile.nt +++ b/otherlibs/str/Makefile.nt @@ -11,17 +11,18 @@ # # ######################################################################### -# $Id: Makefile.nt 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ # Makefile for the str library LIBNAME=str COBJS=strstubs.$(O) +CLIBNAME=camlstr CAMLOBJS=str.cmo include ../Makefile.nt depend: -str.cmo: str.cmi -str.cmx: str.cmi +str.cmo: str.cmi +str.cmx: str.cmi diff --git a/otherlibs/str/str.ml b/otherlibs/str/str.ml index 16832c7d..741eaa56 100644 --- a/otherlibs/str/str.ml +++ b/otherlibs/str/str.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: str.ml 9157 2008-12-12 08:54:15Z xleroy $ *) +(* $Id$ *) (** String utilities *) @@ -367,14 +367,14 @@ let compile fold_case re = emit_code r; let lbl = !progpos in patch_instr pos_pushback op_PUSHBACK lbl - | Group(n, r) -> + | Group(n, r) -> if n >= 32 then failwith "too many \\(...\\) groups"; emit_instr op_BEGGROUP n; emit_code r; emit_instr op_ENDGROUP n; numgroups := max !numgroups (n+1) | Refgroup n -> - emit_instr op_REFGROUP n + emit_instr op_REFGROUP n | Bol -> emit_instr op_BOL 0 | Eol -> @@ -565,9 +565,9 @@ let quote s = done; String.sub buf 0 !pos -let regexp_string s = compile false (String s) +let regexp_string s = compile false (String s) -let regexp_string_case_fold s = compile true (String s) +let regexp_string_case_fold s = compile true (String s) (** Matching functions **) @@ -642,7 +642,7 @@ let replace_matched repl matched = let substitute_first expr repl_fun text = try let pos = search_forward expr text 0 in - String.concat "" [string_before text pos; + String.concat "" [string_before text pos; repl_fun text; string_after text (match_end())] with Not_found -> @@ -656,9 +656,9 @@ let global_substitute expr repl_fun text = let startpos = if last_was_empty then start + 1 else start in if startpos > String.length text then string_after text start :: accu - else + else match opt_search_forward expr text startpos with - | None -> + | None -> string_after text start :: accu | Some pos -> let end_pos = match_end() in @@ -671,7 +671,7 @@ let global_substitute expr repl_fun text = let global_replace expr repl text = global_substitute expr (replace_matched repl) text and replace_first expr repl text = - substitute_first expr (replace_matched repl) text + substitute_first expr (replace_matched repl) text (** Splitting *) @@ -679,7 +679,7 @@ let opt_search_forward_progress expr text start = match opt_search_forward expr text start with | None -> None | Some pos -> - if match_end() > start then + if match_end() > start then Some pos else if start < String.length text then opt_search_forward expr text (start + 1) diff --git a/otherlibs/str/str.mli b/otherlibs/str/str.mli index 89d021e0..b63faf84 100644 --- a/otherlibs/str/str.mli +++ b/otherlibs/str/str.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: str.mli 6824 2005-03-24 17:20:54Z doligez $ *) +(* $Id$ *) (** Regular expressions and high-level string processing *) @@ -55,7 +55,7 @@ val regexp_case_fold : string -> regexp (** Same as [regexp], but the compiled expression will match text in a case-insensitive way: uppercase and lowercase letters will be considered equivalent. *) - + val quote : string -> string (** [Str.quote s] returns a regexp string that matches exactly [s] and nothing else. *) @@ -65,10 +65,10 @@ val regexp_string : string -> regexp that matches exactly [s] and nothing else.*) val regexp_string_case_fold : string -> regexp -(** [Str.regexp_string_case_fold] is similar to {!Str.regexp_string}, +(** [Str.regexp_string_case_fold] is similar to {!Str.regexp_string}, but the regexp matches in a case-insensitive way. *) - + (** {6 String matching and searching} *) @@ -99,25 +99,25 @@ val string_partial_match : regexp -> string -> int -> bool val matched_string : string -> string (** [matched_string s] returns the substring of [s] that was matched - by the latest {!Str.string_match}, {!Str.search_forward} or + by the latest {!Str.string_match}, {!Str.search_forward} or {!Str.search_backward}. The user must make sure that the parameter [s] is the same string that was passed to the matching or searching function. *) - + val match_beginning : unit -> int (** [match_beginning()] returns the position of the first character of the substring that was matched by {!Str.string_match}, {!Str.search_forward} or {!Str.search_backward}. *) val match_end : unit -> int -(** [match_end()] returns the position of the character following the +(** [match_end()] returns the position of the character following the last character of the substring that was matched by [string_match], [search_forward] or [search_backward]. *) - + val matched_group : int -> string -> string (** [matched_group n s] returns the substring of [s] that was matched by the [n]th group [\(...\)] of the regular expression during - the latest {!Str.string_match}, {!Str.search_forward} or + the latest {!Str.string_match}, {!Str.search_forward} or {!Str.search_backward}. The user must make sure that the parameter [s] is the same string that was passed to the matching or searching function. @@ -131,7 +131,7 @@ val matched_group : int -> string -> string val group_beginning : int -> int (** [group_beginning n] returns the position of the first character of the substring that was matched by the [n]th group of - the regular expression. + the regular expression. @raise Not_found if the [n]th group of the regular expression was not matched. @raise Invalid_argument if there are fewer than [n] groups in @@ -140,7 +140,7 @@ val group_beginning : int -> int val group_end : int -> int (** [group_end n] returns the position of the character following the last character of - substring that was matched by the [n]th group of the regular expression. + substring that was matched by the [n]th group of the regular expression. @raise Not_found if the [n]th group of the regular expression was not matched. @raise Invalid_argument if there are fewer than [n] groups in @@ -168,7 +168,7 @@ val global_substitute : regexp -> (string -> string) -> string -> string have been replaced by the result of function [subst]. The function [subst] is called once for each matching substring, and receives [s] (the whole text) as argument. *) - + val substitute_first : regexp -> (string -> string) -> string -> string (** Same as {!Str.global_substitute}, except that only the first substring matching the regular expression is replaced. *) @@ -178,8 +178,8 @@ val replace_matched : string -> string -> string in which [\1], [\2], etc. have been replaced by the text matched by the corresponding groups in the most recent matching operation. [s] must be the same string that was matched during - this matching operation. *) - + this matching operation. *) + (** {6 Splitting} *) @@ -190,7 +190,7 @@ val split : regexp -> string -> string list For instance, [split (regexp "[ \t]+") s] splits [s] into blank-separated words. An occurrence of the delimiter at the beginning and at the end of the string is ignored. *) - + val bounded_split : regexp -> string -> int -> string list (** Same as {!Str.split}, but splits into at most [n] substrings, where [n] is the extra integer parameter. *) @@ -208,7 +208,7 @@ val bounded_split_delim : regexp -> string -> int -> string list delimiter at the beginning and at the end of the string are recognized and returned as empty strings in the result. *) -type split_result = +type split_result = Text of string | Delim of string @@ -234,7 +234,7 @@ val string_before : string -> int -> string (** [string_before s n] returns the substring of all characters of [s] that precede position [n] (excluding the character at position [n]). *) - + val string_after : string -> int -> string (** [string_after s n] returns the substring of all characters of [s] that follow position [n] (including the character at @@ -243,7 +243,6 @@ val string_after : string -> int -> string val first_chars : string -> int -> string (** [first_chars s n] returns the first [n] characters of [s]. This is the same function as {!Str.string_before}. *) - + val last_chars : string -> int -> string (** [last_chars s n] returns the last [n] characters of [s]. *) - diff --git a/otherlibs/str/strstubs.c b/otherlibs/str/strstubs.c index 5c1d8cad..ac530ef0 100644 --- a/otherlibs/str/strstubs.c +++ b/otherlibs/str/strstubs.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: strstubs.c 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ #include #include @@ -65,7 +65,7 @@ enum { SIMPLESTAR, /* match a character class 0, 1 or several times */ SIMPLEPLUS, /* match a character class 1 or several times */ GOTO, /* unconditional branch */ - PUSHBACK, /* record a backtrack point -- + PUSHBACK, /* record a backtrack point -- where to jump in case of failure */ SETMARK, /* remember current position in given register # */ CHECKPROGRESS /* backtrack if no progress was made w.r.t. reg # */ @@ -116,7 +116,7 @@ static unsigned char re_word_letters[32] = { #define Is_word_letter(c) ((re_word_letters[(c) >> 3] >> ((c) & 7)) & 1) /* The bytecode interpreter for the NFA */ -static int re_match(value re, +static int re_match(value re, unsigned char * starttxt, register unsigned char * txt, register unsigned char * endtxt, @@ -196,7 +196,7 @@ static int re_match(value re, /* At beginning and end of text: no At beginning of text: OK if current char is a letter At end of text: OK if previous char is a letter - Otherwise: + Otherwise: OK if previous char is a letter and current char not a letter or previous char is not a letter and current char is a letter */ if (txt == starttxt) { @@ -290,7 +290,7 @@ static int re_match(value re, push: /* Push an item on the backtrack stack and continue with next instr */ if (sp == stack->point + BACKTRACK_STACK_BLOCK_SIZE) { - struct backtrack_stack * newstack = + struct backtrack_stack * newstack = stat_alloc(sizeof(struct backtrack_stack)); newstack->previous = stack; stack = newstack; @@ -521,4 +521,3 @@ CAMLprim value re_replacement_text(value repl, value groups, value orig) } CAMLreturn(res); } - diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index fa6bbbda..43ac5781 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -22,22 +22,22 @@ posix.o: posix.c ../../byterun/alloc.h ../../byterun/compatibility.h \ ../../byterun/mlvalues.h ../../byterun/stacks.h ../../byterun/misc.h \ ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/sys.h \ ../../byterun/misc.h -condition.cmi: mutex.cmi -event.cmi: -mutex.cmi: -thread.cmi: -threadUnix.cmi: -condition.cmo: mutex.cmi condition.cmi -condition.cmx: mutex.cmx condition.cmi -event.cmo: mutex.cmi condition.cmi event.cmi -event.cmx: mutex.cmx condition.cmx event.cmi -mutex.cmo: mutex.cmi -mutex.cmx: mutex.cmi -thread.cmo: thread.cmi -thread.cmx: thread.cmi -threadUnix.cmo: thread.cmi threadUnix.cmi -threadUnix.cmx: thread.cmx threadUnix.cmi -thread_posix.cmo: -thread_posix.cmx: -thread_win32.cmo: -thread_win32.cmx: +condition.cmi: mutex.cmi +event.cmi: +mutex.cmi: +thread.cmi: +threadUnix.cmi: +condition.cmo: mutex.cmi condition.cmi +condition.cmx: mutex.cmx condition.cmi +event.cmo: mutex.cmi condition.cmi event.cmi +event.cmx: mutex.cmx condition.cmx event.cmi +mutex.cmo: mutex.cmi +mutex.cmx: mutex.cmi +thread.cmo: thread.cmi +thread.cmx: thread.cmi +threadUnix.cmo: thread.cmi threadUnix.cmi +threadUnix.cmx: thread.cmx threadUnix.cmi +thread_posix.cmo: +thread_posix.cmx: +thread_win32.cmo: +thread_win32.cmx: diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index 7887f03b..b74f9bc7 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8916 2008-07-15 15:31:32Z frisch $ +# $Id$ include ../../config/Makefile @@ -50,15 +50,15 @@ posix_n.o: posix.c threads.cma: $(THREAD_OBJS) $(MKLIB) -ocamlc '$(CAMLC)' -o threads $(THREAD_OBJS) \ - -cclib -lunix $(PTHREAD_LINK) + -cclib -lunix $(PTHREAD_LINK) # See remark above: force static linking of libthreadsnat.a threads.cmxa: $(THREAD_OBJS:.cmo=.cmx) $(CAMLOPT) -a -o threads.cmxa $(THREAD_OBJS:.cmo=.cmx) \ - -cclib -lthreadsnat $(PTHREAD_LINK) + -cclib -lthreadsnat $(PTHREAD_LINK) -# Note: I removed "-cclib -lunix" from the line above. -# Indeed, if we link threads.cmxa, then we must also link unix.cmxa, +# Note: I removed "-cclib -lunix" from the line above. +# Indeed, if we link threads.cmxa, then we must also link unix.cmxa, # which itself will pass -lunix to the C linker. It seems more # modular to me this way. -- Alain diff --git a/otherlibs/systhreads/Makefile.nt b/otherlibs/systhreads/Makefile.nt index c9c0129a..a5380134 100644 --- a/otherlibs/systhreads/Makefile.nt +++ b/otherlibs/systhreads/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ include ../../config/Makefile diff --git a/otherlibs/systhreads/condition.ml b/otherlibs/systhreads/condition.ml index 48055696..6549c642 100644 --- a/otherlibs/systhreads/condition.ml +++ b/otherlibs/systhreads/condition.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: condition.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) type t external create: unit -> t = "caml_condition_new" diff --git a/otherlibs/systhreads/condition.mli b/otherlibs/systhreads/condition.mli index 98dce638..5bc9d674 100644 --- a/otherlibs/systhreads/condition.mli +++ b/otherlibs/systhreads/condition.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: condition.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Condition variables to synchronize between threads. @@ -45,9 +45,9 @@ val wait : t -> Mutex.t -> unit The mutex [m] is locked again before [wait] returns. *) val signal : t -> unit -(** [signal c] restarts one of the processes waiting on the +(** [signal c] restarts one of the processes waiting on the condition variable [c]. *) val broadcast : t -> unit -(** [broadcast c] restarts all processes waiting on the +(** [broadcast c] restarts all processes waiting on the condition variable [c]. *) diff --git a/otherlibs/systhreads/event.ml b/otherlibs/systhreads/event.ml index 8d4a1c4e..74f457b0 100644 --- a/otherlibs/systhreads/event.ml +++ b/otherlibs/systhreads/event.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: event.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Events *) type 'a basic_event = @@ -92,7 +92,7 @@ let basic_sync abort_env genev = (* Extract the result *) if abort_env = [] then (* Preserve tail recursion *) - bev.(!performed).result() + bev.(!performed).result() else begin let num = !performed in let result = bev.(num).result() in diff --git a/otherlibs/systhreads/event.mli b/otherlibs/systhreads/event.mli index 882ad889..08d6b0bf 100644 --- a/otherlibs/systhreads/event.mli +++ b/otherlibs/systhreads/event.mli @@ -11,14 +11,14 @@ (* *) (***********************************************************************) -(* $Id: event.mli 7322 2006-01-12 03:24:56Z garrigue $ *) +(* $Id$ *) (** First-class synchronous communication. This module implements synchronous inter-thread communications over - channels. As in John Reppy's Concurrent ML system, the communication + channels. As in John Reppy's Concurrent ML system, the communication events are first-class values: they can be built and combined - independently before being offered for communication. + independently before being offered for communication. *) type 'a channel @@ -31,12 +31,12 @@ type +'a event (** The type of communication events returning a result of type ['a]. *) (** [send ch v] returns the event consisting in sending the value [v] - over the channel [ch]. The result value of this event is [()]. *) + over the channel [ch]. The result value of this event is [()]. *) val send : 'a channel -> 'a -> unit event (** [receive ch] returns the event consisting in receiving a value from the channel [ch]. The result value of this event is the - value received. *) + value received. *) val receive : 'a channel -> 'a event val always : 'a -> 'a event @@ -64,7 +64,7 @@ val guard : (unit -> 'a event) -> 'a event operation. *) val sync : 'a event -> 'a -(** ``Synchronize'' on an event: offer all the communication +(** ``Synchronize'' on an event: offer all the communication possibilities specified in the event to the outside world, and block until one of the communications succeed. The result value of that communication is returned. *) @@ -74,9 +74,8 @@ val select : 'a event list -> 'a [select evl] is shorthand for [sync(choose evl)]. *) val poll : 'a event -> 'a option -(** Non-blocking version of {!Event.sync}: offer all the communication +(** Non-blocking version of {!Event.sync}: offer all the communication possibilities specified in the event to the outside world, and if one can take place immediately, perform it and return [Some r] where [r] is the result value of that communication. Otherwise, return [None] without blocking. *) - diff --git a/otherlibs/systhreads/mutex.ml b/otherlibs/systhreads/mutex.ml index a7d1795a..4e108f4a 100644 --- a/otherlibs/systhreads/mutex.ml +++ b/otherlibs/systhreads/mutex.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: mutex.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) type t external create: unit -> t = "caml_mutex_new" diff --git a/otherlibs/systhreads/mutex.mli b/otherlibs/systhreads/mutex.mli index 83c11bba..b1fe1413 100644 --- a/otherlibs/systhreads/mutex.mli +++ b/otherlibs/systhreads/mutex.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: mutex.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Locks for mutual exclusion. @@ -47,4 +47,3 @@ val try_lock : t -> bool val unlock : t -> unit (** Unlock the given mutex. Other threads suspended trying to lock the mutex will restart. *) - diff --git a/otherlibs/systhreads/posix.c b/otherlibs/systhreads/posix.c index 33f3b91e..f20f49ad 100644 --- a/otherlibs/systhreads/posix.c +++ b/otherlibs/systhreads/posix.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: posix.c 9201 2009-03-28 17:35:59Z xleroy $ */ +/* $Id$ */ /* Thread interface for POSIX 1003.1c threads */ @@ -475,7 +475,7 @@ static void * caml_thread_start(void * arg) #endif /* The thread now stops running */ return NULL; -} +} value caml_thread_new(value clos) /* ML */ { @@ -535,7 +535,7 @@ value caml_thread_new(value clos) /* ML */ caml_pthread_check(err, "Thread.create"); } End_roots(); - /* Create the tick thread if not already done. + /* Create the tick thread if not already done. Because of PR#4666, we start the tick thread late, only when we create the first additional thread in the current process*/ if (! caml_tick_thread_running) { @@ -905,7 +905,7 @@ value caml_wait_signal(value sigs) /* ML */ return Val_int(signo); #else invalid_argument("Thread.wait_signal not implemented"); - return Val_int(0); /* not reached */ + return Val_int(0); /* not reached */ #endif } @@ -927,4 +927,3 @@ static void caml_pthread_check(int retcode, char *msg) memmove (&Byte(str, msglen + 2), err, errlen); raise_sys_error(str); } - diff --git a/otherlibs/systhreads/thread.mli b/otherlibs/systhreads/thread.mli index a7a81bbb..3c2fc01b 100644 --- a/otherlibs/systhreads/thread.mli +++ b/otherlibs/systhreads/thread.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: thread.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (** Lightweight threads for Posix [1003.1c] and Win32. *) @@ -74,7 +74,7 @@ val wait_timed_write : Unix.file_descr -> float -> bool on the given Unix file descriptor. Wait for at most the amount of time given as second argument (in seconds). Return [true] if the file descriptor is ready for input/output - and [false] if the timeout expired. + and [false] if the timeout expired. These functions return immediately [true] in the Win32 implementation. *) @@ -131,4 +131,3 @@ val wait_signal : int list -> int Signal handlers attached to the signals in [sigs] will not be invoked. The signals [sigs] are expected to be blocked before calling [wait_signal]. *) - diff --git a/otherlibs/systhreads/threadUnix.ml b/otherlibs/systhreads/threadUnix.ml index 5b3fcfa5..71855ec6 100644 --- a/otherlibs/systhreads/threadUnix.ml +++ b/otherlibs/systhreads/threadUnix.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: threadUnix.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [ThreadUnix]: thread-compatible system calls *) diff --git a/otherlibs/systhreads/threadUnix.mli b/otherlibs/systhreads/threadUnix.mli index bd03bad6..c05346fe 100644 --- a/otherlibs/systhreads/threadUnix.mli +++ b/otherlibs/systhreads/threadUnix.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: threadUnix.mli 4951 2002-06-26 09:48:00Z xleroy $ *) +(* $Id$ *) (** Thread-compatible system calls. diff --git a/otherlibs/systhreads/thread_posix.ml b/otherlibs/systhreads/thread_posix.ml index 7c017975..9f077b33 100644 --- a/otherlibs/systhreads/thread_posix.ml +++ b/otherlibs/systhreads/thread_posix.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: thread_posix.ml 7000 2005-07-31 12:32:41Z xleroy $ *) +(* $Id$ *) (* User-level threads *) @@ -19,7 +19,7 @@ type t external thread_initialize : unit -> unit = "caml_thread_initialize" external thread_new : (unit -> unit) -> t = "caml_thread_new" -external thread_uncaught_exception : exn -> unit = +external thread_uncaught_exception : exn -> unit = "caml_thread_uncaught_exception" external yield : unit -> unit = "caml_thread_yield" diff --git a/otherlibs/systhreads/thread_win32.ml b/otherlibs/systhreads/thread_win32.ml index 6cd8690e..32422319 100644 --- a/otherlibs/systhreads/thread_win32.ml +++ b/otherlibs/systhreads/thread_win32.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: thread_win32.ml 7000 2005-07-31 12:32:41Z xleroy $ *) +(* $Id$ *) (* User-level threads *) @@ -24,7 +24,7 @@ external yield : unit -> unit = "caml_thread_yield" external self : unit -> t = "caml_thread_self" external id : t -> int = "caml_thread_id" external join : t -> unit = "caml_thread_join" -external thread_uncaught_exception : exn -> unit = +external thread_uncaught_exception : exn -> unit = "caml_thread_uncaught_exception" (* For new, make sure the function passed to thread_new never @@ -74,4 +74,3 @@ let wait_pid p = Unix.waitpid [] p let sigmask cmd set = invalid_arg "Thread.sigmask: not implemented" let wait_signal set = invalid_arg "Thread.wait_signal: not implemented" - diff --git a/otherlibs/systhreads/win32.c b/otherlibs/systhreads/win32.c index 3875e4a6..dfec43cc 100644 --- a/otherlibs/systhreads/win32.c +++ b/otherlibs/systhreads/win32.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: win32.c 8468 2007-10-31 09:12:29Z xleroy $ */ +/* $Id$ */ /* Thread interface for Win32 threads */ diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index e5037efa..ba507a09 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -21,27 +21,27 @@ scheduler.o: scheduler.c ../../byterun/alloc.h \ ../../byterun/mlvalues.h ../../byterun/stacks.h ../../byterun/misc.h \ ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/sys.h \ ../../byterun/misc.h -condition.cmi: mutex.cmi -event.cmi: -marshal.cmi: -mutex.cmi: -pervasives.cmi: -thread.cmi: unix.cmi -threadUnix.cmi: unix.cmi -unix.cmi: -condition.cmo: thread.cmi mutex.cmi condition.cmi -condition.cmx: thread.cmx mutex.cmx condition.cmi -event.cmo: mutex.cmi condition.cmi event.cmi -event.cmx: mutex.cmx condition.cmx event.cmi -marshal.cmo: pervasives.cmi marshal.cmi -marshal.cmx: pervasives.cmx marshal.cmi -mutex.cmo: thread.cmi mutex.cmi -mutex.cmx: thread.cmx mutex.cmi -pervasives.cmo: unix.cmi pervasives.cmi -pervasives.cmx: unix.cmx pervasives.cmi -thread.cmo: unix.cmi thread.cmi -thread.cmx: unix.cmx thread.cmi -threadUnix.cmo: unix.cmi thread.cmi threadUnix.cmi -threadUnix.cmx: unix.cmx thread.cmx threadUnix.cmi -unix.cmo: unix.cmi -unix.cmx: unix.cmi +condition.cmi: mutex.cmi +event.cmi: +marshal.cmi: +mutex.cmi: +pervasives.cmi: +thread.cmi: unix.cmi +threadUnix.cmi: unix.cmi +unix.cmi: +condition.cmo: thread.cmi mutex.cmi condition.cmi +condition.cmx: thread.cmx mutex.cmx condition.cmi +event.cmo: mutex.cmi condition.cmi event.cmi +event.cmx: mutex.cmx condition.cmx event.cmi +marshal.cmo: pervasives.cmi marshal.cmi +marshal.cmx: pervasives.cmx marshal.cmi +mutex.cmo: thread.cmi mutex.cmi +mutex.cmx: thread.cmx mutex.cmi +pervasives.cmo: unix.cmi pervasives.cmi +pervasives.cmx: unix.cmx pervasives.cmi +thread.cmo: unix.cmi thread.cmi +thread.cmx: unix.cmx thread.cmi +threadUnix.cmo: unix.cmi thread.cmi threadUnix.cmi +threadUnix.cmx: unix.cmx thread.cmx threadUnix.cmi +unix.cmo: unix.cmi +unix.cmx: unix.cmi diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 94128849..0e6ef86f 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 9079 2008-10-08 13:09:39Z doligez $ +# $Id$ include ../../config/Makefile diff --git a/otherlibs/threads/condition.ml b/otherlibs/threads/condition.ml index cb6b05c8..e012a86e 100644 --- a/otherlibs/threads/condition.ml +++ b/otherlibs/threads/condition.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: condition.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) type t = { mutable waiting: Thread.t list } @@ -33,4 +33,3 @@ let broadcast cond = let w = cond.waiting in (* atomic *) cond.waiting <- []; (* atomic *) List.iter Thread.wakeup w - diff --git a/otherlibs/threads/condition.mli b/otherlibs/threads/condition.mli index 98dce638..5bc9d674 100644 --- a/otherlibs/threads/condition.mli +++ b/otherlibs/threads/condition.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: condition.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Condition variables to synchronize between threads. @@ -45,9 +45,9 @@ val wait : t -> Mutex.t -> unit The mutex [m] is locked again before [wait] returns. *) val signal : t -> unit -(** [signal c] restarts one of the processes waiting on the +(** [signal c] restarts one of the processes waiting on the condition variable [c]. *) val broadcast : t -> unit -(** [broadcast c] restarts all processes waiting on the +(** [broadcast c] restarts all processes waiting on the condition variable [c]. *) diff --git a/otherlibs/threads/event.ml b/otherlibs/threads/event.ml index 8d4a1c4e..74f457b0 100644 --- a/otherlibs/threads/event.ml +++ b/otherlibs/threads/event.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: event.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Events *) type 'a basic_event = @@ -92,7 +92,7 @@ let basic_sync abort_env genev = (* Extract the result *) if abort_env = [] then (* Preserve tail recursion *) - bev.(!performed).result() + bev.(!performed).result() else begin let num = !performed in let result = bev.(num).result() in diff --git a/otherlibs/threads/event.mli b/otherlibs/threads/event.mli index 882ad889..08d6b0bf 100644 --- a/otherlibs/threads/event.mli +++ b/otherlibs/threads/event.mli @@ -11,14 +11,14 @@ (* *) (***********************************************************************) -(* $Id: event.mli 7322 2006-01-12 03:24:56Z garrigue $ *) +(* $Id$ *) (** First-class synchronous communication. This module implements synchronous inter-thread communications over - channels. As in John Reppy's Concurrent ML system, the communication + channels. As in John Reppy's Concurrent ML system, the communication events are first-class values: they can be built and combined - independently before being offered for communication. + independently before being offered for communication. *) type 'a channel @@ -31,12 +31,12 @@ type +'a event (** The type of communication events returning a result of type ['a]. *) (** [send ch v] returns the event consisting in sending the value [v] - over the channel [ch]. The result value of this event is [()]. *) + over the channel [ch]. The result value of this event is [()]. *) val send : 'a channel -> 'a -> unit event (** [receive ch] returns the event consisting in receiving a value from the channel [ch]. The result value of this event is the - value received. *) + value received. *) val receive : 'a channel -> 'a event val always : 'a -> 'a event @@ -64,7 +64,7 @@ val guard : (unit -> 'a event) -> 'a event operation. *) val sync : 'a event -> 'a -(** ``Synchronize'' on an event: offer all the communication +(** ``Synchronize'' on an event: offer all the communication possibilities specified in the event to the outside world, and block until one of the communications succeed. The result value of that communication is returned. *) @@ -74,9 +74,8 @@ val select : 'a event list -> 'a [select evl] is shorthand for [sync(choose evl)]. *) val poll : 'a event -> 'a option -(** Non-blocking version of {!Event.sync}: offer all the communication +(** Non-blocking version of {!Event.sync}: offer all the communication possibilities specified in the event to the outside world, and if one can take place immediately, perform it and return [Some r] where [r] is the result value of that communication. Otherwise, return [None] without blocking. *) - diff --git a/otherlibs/threads/marshal.ml b/otherlibs/threads/marshal.ml index 90fc903b..d31a667d 100644 --- a/otherlibs/threads/marshal.ml +++ b/otherlibs/threads/marshal.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: marshal.ml 6338 2004-05-27 15:28:05Z doligez $ *) +(* $Id$ *) type extern_flags = No_sharing @@ -53,6 +53,6 @@ let from_string buff ofs = if ofs > String.length buff - (header_size + len) then invalid_arg "Marshal.from_string" else from_string_unsafe buff ofs - end + end let from_channel = Pervasives.input_value diff --git a/otherlibs/threads/mutex.ml b/otherlibs/threads/mutex.ml index 5b2e189b..f0f6845b 100644 --- a/otherlibs/threads/mutex.ml +++ b/otherlibs/threads/mutex.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: mutex.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) type t = { mutable locked: bool; mutable waiting: Thread.t list } @@ -36,4 +36,3 @@ let unlock m = m.waiting <- []; (* atomic *) m.locked <- false; (* atomic *) List.iter Thread.wakeup w - diff --git a/otherlibs/threads/mutex.mli b/otherlibs/threads/mutex.mli index 83c11bba..b1fe1413 100644 --- a/otherlibs/threads/mutex.mli +++ b/otherlibs/threads/mutex.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: mutex.mli 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (** Locks for mutual exclusion. @@ -47,4 +47,3 @@ val try_lock : t -> bool val unlock : t -> unit (** Unlock the given mutex. Other threads suspended trying to lock the mutex will restart. *) - diff --git a/otherlibs/threads/pervasives.ml b/otherlibs/threads/pervasives.ml index 98ae5df5..7cfd0250 100644 --- a/otherlibs/threads/pervasives.ml +++ b/otherlibs/threads/pervasives.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: pervasives.ml 7918 2007-02-25 12:37:30Z xleroy $ *) +(* $Id$ *) (* Same as ../../stdlib/pervasives.ml, except that I/O functions have been redefined to not block the whole process, but only the calling @@ -87,6 +87,7 @@ external ( *. ) : float -> float -> float = "%mulfloat" external (/.) : float -> float -> float = "%divfloat" external ( ** ) : float -> float -> float = "caml_power_float" "pow" "float" external exp : float -> float = "caml_exp_float" "exp" "float" +external expm1 : float -> float = "caml_expm1_float" "caml_expm1" "float" external acos : float -> float = "caml_acos_float" "acos" "float" external asin : float -> float = "caml_asin_float" "asin" "float" external atan : float -> float = "caml_atan_float" "atan" "float" @@ -95,6 +96,7 @@ external cos : float -> float = "caml_cos_float" "cos" "float" external cosh : float -> float = "caml_cosh_float" "cosh" "float" external log : float -> float = "caml_log_float" "log" "float" external log10 : float -> float = "caml_log10_float" "log10" "float" +external log1p : float -> float = "caml_log1p_float" "caml_log1p" "float" external sin : float -> float = "caml_sin_float" "sin" "float" external sinh : float -> float = "caml_sinh_float" "sinh" "float" external sqrt : float -> float = "caml_sqrt_float" "sqrt" "float" @@ -268,10 +270,10 @@ let rec flush oc = wait_outchan oc (-1); false in if success then () else flush oc -external out_channels_list : unit -> out_channel list +external out_channels_list : unit -> out_channel list = "caml_ml_out_channels_list" -let flush_all () = +let flush_all () = let rec iter = function [] -> () | a::l -> @@ -296,7 +298,7 @@ let rec unsafe_output oc buf pos len = unsafe_output oc buf (pos + written) (len - written) end -external output_char_blocking : out_channel -> char -> unit +external output_char_blocking : out_channel -> char -> unit = "caml_ml_output_char" external output_byte_blocking : out_channel -> int -> unit = "caml_ml_output_char" @@ -311,7 +313,7 @@ let output_string oc s = unsafe_output oc s 0 (string_length s) let output oc s ofs len = - if ofs < 0 || len < 0 || ofs > string_length s - len + if ofs < 0 || len < 0 || ofs > string_length s - len then invalid_arg "output" else unsafe_output oc s ofs len @@ -329,7 +331,7 @@ let output_binary_int oc n = output_byte oc (n asr 8); output_byte oc n -external marshal_to_string : 'a -> unit list -> string +external marshal_to_string : 'a -> unit list -> string = "caml_output_value_to_string" let output_value oc v = output_string oc (marshal_to_string v []) @@ -492,7 +494,7 @@ module LargeFile = end (* Formats *) -type ('a, 'b, 'c, 'd) format4 = ('a, 'b, 'c, 'c, 'c, 'd) format6 +type ('a, 'b, 'c, 'd) format4 = ('a, 'b, 'c, 'c, 'c, 'd) format6 type ('a, 'b, 'c) format = ('a, 'b, 'c, 'c) format4 diff --git a/otherlibs/threads/scheduler.c b/otherlibs/threads/scheduler.c index 0580b2d3..c73ac67e 100644 --- a/otherlibs/threads/scheduler.c +++ b/otherlibs/threads/scheduler.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: scheduler.c 7064 2005-09-22 14:21:50Z xleroy $ */ +/* $Id$ */ /* The thread scheduler */ diff --git a/otherlibs/threads/thread.ml b/otherlibs/threads/thread.ml index c7df37cb..723669a3 100644 --- a/otherlibs/threads/thread.ml +++ b/otherlibs/threads/thread.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: thread.ml 5445 2003-03-20 16:23:04Z xleroy $ *) +(* $Id$ *) (* User-level threads *) @@ -28,7 +28,7 @@ type resumption_status = Unix.file_descr list * Unix.file_descr list * Unix.file_descr list | Resumed_wait of int * Unix.process_status -(* It is mucho important that the primitives that reschedule are called +(* It is mucho important that the primitives that reschedule are called through an ML function call, not directly. That's because when such a primitive returns, the bytecode interpreter is only semi-obedient: it takes sp from the new thread, but keeps pc from the old thread. @@ -100,7 +100,7 @@ let wait_timed_write fd delay = let wait_pid_aux pid = thread_wait_pid pid -let wait_pid pid = +let wait_pid pid = match wait_pid_aux pid with Resumed_wait(pid, status) -> (pid, status) | _ -> invalid_arg "Thread.wait_pid" diff --git a/otherlibs/threads/thread.mli b/otherlibs/threads/thread.mli index 4ea8e35d..9577a54e 100644 --- a/otherlibs/threads/thread.mli +++ b/otherlibs/threads/thread.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: thread.mli 6553 2004-07-13 12:25:21Z xleroy $ *) +(* $Id$ *) (** Lightweight threads. *) @@ -101,7 +101,7 @@ val wait_signal : int list -> int until the process receives one of the signals specified in the list [sigs]. It then returns the number of the signal received. Signal handlers attached to the signals in [sigs] will not - be invoked. Do not call [wait_signal] concurrently + be invoked. Do not call [wait_signal] concurrently from several threads on the same signals. *) val yield : unit -> unit @@ -114,7 +114,7 @@ val yield : unit -> unit (** {6 Synchronization primitives} - The following primitives provide the basis for implementing + The following primitives provide the basis for implementing synchronization functions between threads. Their direct use is discouraged, as they are very low-level and prone to race conditions and deadlocks. The modules {!Mutex}, {!Condition} and {!Event} @@ -138,4 +138,3 @@ val sleep : unit -> unit val wakeup : t -> unit (** Reactivate the given thread. After the call to [wakeup], the suspended thread will resume execution at some future time. *) - diff --git a/otherlibs/threads/threadUnix.ml b/otherlibs/threads/threadUnix.ml index 9831db7e..66a3704c 100644 --- a/otherlibs/threads/threadUnix.ml +++ b/otherlibs/threads/threadUnix.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: threadUnix.ml 6553 2004-07-13 12:25:21Z xleroy $ *) +(* $Id$ *) (* Module [ThreadUnix]: thread-compatible system calls *) diff --git a/otherlibs/threads/threadUnix.mli b/otherlibs/threads/threadUnix.mli index 0d45884b..1b4dde29 100644 --- a/otherlibs/threads/threadUnix.mli +++ b/otherlibs/threads/threadUnix.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: threadUnix.mli 6553 2004-07-13 12:25:21Z xleroy $ *) +(* $Id$ *) (** Thread-compatible system calls. diff --git a/otherlibs/threads/unix.ml b/otherlibs/threads/unix.ml index 6343b488..5a8bb697 100644 --- a/otherlibs/threads/unix.ml +++ b/otherlibs/threads/unix.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix.ml 8972 2008-08-01 16:29:44Z mauny $ *) +(* $Id$ *) (* An alternate implementation of the Unix module from ../unix which is safe in conjunction with bytecode threads. *) @@ -203,7 +203,7 @@ external close : file_descr -> unit = "unix_close" external unsafe_read : file_descr -> string -> int -> int -> int = "unix_read" external unsafe_write : file_descr -> string -> int -> int -> int = "unix_write" -external unsafe_single_write : file_descr -> string -> int -> int -> int +external unsafe_single_write : file_descr -> string -> int -> int -> int = "unix_single_write" let rec read fd buf ofs len = @@ -411,13 +411,13 @@ external fork : unit -> int = "unix_fork" external _waitpid : wait_flag list -> int -> int * process_status = "unix_waitpid" -let wait_pid pid = +let wait_pid pid = match wait_pid_aux pid with Resumed_wait(pid, status) -> (pid, status) | _ -> invalid_arg "Thread.wait_pid" let wait () = wait_pid (-1) - + let waitpid flags pid = if List.mem WNOHANG flags then _waitpid flags pid @@ -473,6 +473,8 @@ external getgid : unit -> int = "unix_getgid" external getegid : unit -> int = "unix_getegid" external setgid : int -> unit = "unix_setgid" external getgroups : unit -> int array = "unix_getgroups" +external setgroups : int array -> unit = "unix_setgroups" +external initgroups : string -> int -> unit = "unix_initgroups" type passwd_entry = { pw_name : string; @@ -569,7 +571,7 @@ let rec accept req = external bind : file_descr -> sockaddr -> unit = "unix_bind" external listen : file_descr -> int -> unit = "unix_listen" -external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" +external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" external getsockname : file_descr -> sockaddr = "unix_getsockname" external getpeername : file_descr -> sockaddr = "unix_getpeername" @@ -621,7 +623,7 @@ let rec send fd buf ofs len flags = with Unix_error((EAGAIN | EWOULDBLOCK), _, _) -> wait_write fd; send fd buf ofs len flags - + let rec sendto fd buf ofs len flags addr = try if ofs < 0 || len < 0 || ofs > String.length buf - len @@ -675,7 +677,7 @@ end = struct let optint = 2 let float = 3 let error = 4 - external get: ('opt, 'v) t -> file_descr -> 'opt -> 'v + external get: ('opt, 'v) t -> file_descr -> 'opt -> 'v = "unix_getsockopt" external set: ('opt, 'v) t -> file_descr -> 'opt -> 'v -> unit = "unix_setsockopt" @@ -761,7 +763,7 @@ let getaddrinfo_emulation node service opts = with Failure _ -> try [ty, (getservbyname service kind).s_port] - with Not_found -> [] + with Not_found -> [] in let ports = match !opt_socktype with @@ -792,7 +794,7 @@ let getaddrinfo_emulation node service opts = [] in (* Cross-product of addresses and ports *) List.flatten - (List.map + (List.map (fun (ty, port) -> List.map (fun (addr, name) -> @@ -1046,7 +1048,7 @@ let find_proc_id fun_name proc = raise(Unix_error(EBADF, fun_name, "")) let rec waitpid_non_intr pid = - try waitpid [] pid + try waitpid [] pid with Unix_error (EINTR, _, _) -> waitpid_non_intr pid let close_process_in inchan = @@ -1110,4 +1112,3 @@ let establish_server server_fun sockaddr = exit 0 | id -> close s; ignore(waitpid [] id) (* Reclaim the son *) done - diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 2c589e92..22ddf3e7 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -390,6 +390,15 @@ gmtime.o: gmtime.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ ../../byterun/misc.h ../../byterun/mlvalues.h unixsupport.h +initgroups.o: initgroups.c ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/alloc.h ../../byterun/compatibility.h \ + ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/mlvalues.h unixsupport.h isatty.o: isatty.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ ../../byterun/config.h ../../byterun/../config/m.h \ ../../byterun/../config/s.h ../../byterun/compatibility.h \ @@ -584,6 +593,20 @@ setgid.o: setgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ ../../byterun/../config/s.h ../../byterun/compatibility.h \ ../../byterun/misc.h ../../byterun/compatibility.h \ ../../byterun/config.h unixsupport.h +setgroups.o: setgroups.c ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/alloc.h ../../byterun/compatibility.h \ + ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h \ + ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ + ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ + ../../byterun/misc.h ../../byterun/mlvalues.h unixsupport.h setsid.o: setsid.c ../../byterun/fail.h ../../byterun/compatibility.h \ ../../byterun/misc.h ../../byterun/compatibility.h \ ../../byterun/config.h ../../byterun/../config/m.h \ @@ -788,9 +811,9 @@ write.o: write.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ ../../byterun/compatibility.h ../../byterun/misc.h \ ../../byterun/mlvalues.h unixsupport.h -unix.cmi: -unixLabels.cmi: unix.cmi -unix.cmo: unix.cmi -unix.cmx: unix.cmi -unixLabels.cmo: unix.cmi unixLabels.cmi -unixLabels.cmx: unix.cmx unixLabels.cmi +unix.cmi: +unixLabels.cmi: unix.cmi +unix.cmo: unix.cmi +unix.cmx: unix.cmi +unixLabels.cmo: unix.cmi unixLabels.cmi +unixLabels.cmx: unix.cmx unixLabels.cmi diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index d7211e88..e489001b 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ # Makefile for the Unix interface library @@ -26,11 +26,11 @@ COBJS=accept.o access.o addrofstr.o alarm.o bind.o chdir.o chmod.o \ getaddrinfo.o getcwd.o getegid.o geteuid.o getgid.o \ getgr.o getgroups.o gethost.o gethostname.o getlogin.o \ getnameinfo.o getpeername.o getpid.o getppid.o getproto.o getpw.o \ - gettimeofday.o getserv.o getsockname.o getuid.o \ - gmtime.o isatty.o itimer.o kill.o link.o listen.o lockf.o lseek.o mkdir.o \ - mkfifo.o nice.o open.o opendir.o pipe.o putenv.o read.o \ + gettimeofday.o getserv.o getsockname.o getuid.o gmtime.o \ + initgroups.o isatty.o itimer.o kill.o link.o listen.o lockf.o lseek.o \ + mkdir.o mkfifo.o nice.o open.o opendir.o pipe.o putenv.o read.o \ readdir.o readlink.o rename.o rewinddir.o rmdir.o select.o sendrecv.o \ - setgid.o setsid.o setuid.o shutdown.o signals.o \ + setgid.o setgroups.o setsid.o setuid.o shutdown.o signals.o \ sleep.o socket.o socketaddr.o \ socketpair.o sockopt.o stat.o strofaddr.o symlink.o termios.o \ time.o times.o truncate.o umask.o unixsupport.o unlink.o \ diff --git a/otherlibs/unix/accept.c b/otherlibs/unix/accept.c index 64152a52..a6e80f06 100644 --- a/otherlibs/unix/accept.c +++ b/otherlibs/unix/accept.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: accept.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -50,5 +50,5 @@ CAMLprim value unix_accept(value sock) CAMLprim value unix_accept(value sock) { invalid_argument("accept not implemented"); } - + #endif diff --git a/otherlibs/unix/access.c b/otherlibs/unix/access.c index f0c07ac7..0c0c5fc1 100644 --- a/otherlibs/unix/access.c +++ b/otherlibs/unix/access.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: access.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/addrofstr.c b/otherlibs/unix/addrofstr.c index 2fb125b9..6947d66f 100644 --- a/otherlibs/unix/addrofstr.c +++ b/otherlibs/unix/addrofstr.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: addrofstr.c 6193 2004-04-09 13:25:23Z xleroy $ */ +/* $Id$ */ #include #include @@ -49,5 +49,5 @@ CAMLprim value unix_inet_addr_of_string(value s) CAMLprim value unix_inet_addr_of_string(value s) { invalid_argument("inet_addr_of_string not implemented"); } - + #endif diff --git a/otherlibs/unix/alarm.c b/otherlibs/unix/alarm.c index 2cf2d019..55e4d6cf 100644 --- a/otherlibs/unix/alarm.c +++ b/otherlibs/unix/alarm.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: alarm.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/bind.c b/otherlibs/unix/bind.c index c02c6883..85cf1d28 100644 --- a/otherlibs/unix/bind.c +++ b/otherlibs/unix/bind.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bind.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -20,7 +20,7 @@ #ifdef HAS_SOCKETS #include "socketaddr.h" - + CAMLprim value unix_bind(value socket, value address) { int ret; @@ -37,5 +37,5 @@ CAMLprim value unix_bind(value socket, value address) CAMLprim value unix_bind(value socket, value address) { invalid_argument("bind not implemented"); } - + #endif diff --git a/otherlibs/unix/chdir.c b/otherlibs/unix/chdir.c index 520891ae..7901eca0 100644 --- a/otherlibs/unix/chdir.c +++ b/otherlibs/unix/chdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: chdir.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/chmod.c b/otherlibs/unix/chmod.c index 443d54b6..dff83722 100644 --- a/otherlibs/unix/chmod.c +++ b/otherlibs/unix/chmod.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: chmod.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/chown.c b/otherlibs/unix/chown.c index 15d89d5e..bfd16400 100644 --- a/otherlibs/unix/chown.c +++ b/otherlibs/unix/chown.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: chown.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/chroot.c b/otherlibs/unix/chroot.c index 2ad88d44..24f49877 100644 --- a/otherlibs/unix/chroot.c +++ b/otherlibs/unix/chroot.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: chroot.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/close.c b/otherlibs/unix/close.c index 043d3c74..27e1937d 100644 --- a/otherlibs/unix/close.c +++ b/otherlibs/unix/close.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: close.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/closedir.c b/otherlibs/unix/closedir.c index a0ac5191..b2fd5135 100644 --- a/otherlibs/unix/closedir.c +++ b/otherlibs/unix/closedir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: closedir.c 6113 2004-02-14 10:21:23Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/connect.c b/otherlibs/unix/connect.c index de0008ab..669c347f 100644 --- a/otherlibs/unix/connect.c +++ b/otherlibs/unix/connect.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: connect.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -40,5 +40,5 @@ CAMLprim value unix_connect(value socket, value address) CAMLprim value unix_connect(value socket, value address) { invalid_argument("connect not implemented"); } - + #endif diff --git a/otherlibs/unix/cst2constr.c b/otherlibs/unix/cst2constr.c index 782ceed1..9035160d 100644 --- a/otherlibs/unix/cst2constr.c +++ b/otherlibs/unix/cst2constr.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: cst2constr.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/cst2constr.h b/otherlibs/unix/cst2constr.h index d404b007..3cb1c118 100644 --- a/otherlibs/unix/cst2constr.h +++ b/otherlibs/unix/cst2constr.h @@ -11,6 +11,6 @@ /* */ /***********************************************************************/ -/* $Id: cst2constr.h 6193 2004-04-09 13:25:23Z xleroy $ */ +/* $Id$ */ extern 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 e4438b19..0e37914d 100644 --- a/otherlibs/unix/cstringv.c +++ b/otherlibs/unix/cstringv.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: cstringv.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include @@ -28,5 +28,3 @@ char ** cstringvect(value arg) res[size] = NULL; return res; } - - diff --git a/otherlibs/unix/dup.c b/otherlibs/unix/dup.c index 2a2e0099..5935d0b4 100644 --- a/otherlibs/unix/dup.c +++ b/otherlibs/unix/dup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dup.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/dup2.c b/otherlibs/unix/dup2.c index dec473e7..beb98713 100644 --- a/otherlibs/unix/dup2.c +++ b/otherlibs/unix/dup2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dup2.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/envir.c b/otherlibs/unix/envir.c index b0291e88..1df842c5 100644 --- a/otherlibs/unix/envir.c +++ b/otherlibs/unix/envir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: envir.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/errmsg.c b/otherlibs/unix/errmsg.c index d1cd5a6e..ae8793e1 100644 --- a/otherlibs/unix/errmsg.c +++ b/otherlibs/unix/errmsg.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: errmsg.c 6315 2004-05-23 15:53:50Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/execv.c b/otherlibs/unix/execv.c index 4ccc7887..bc0330b3 100644 --- a/otherlibs/unix/execv.c +++ b/otherlibs/unix/execv.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: execv.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include @@ -29,4 +29,3 @@ CAMLprim value unix_execv(value path, value args) return Val_unit; /* never reached, but suppress warnings */ /* from smart compilers */ } - diff --git a/otherlibs/unix/execve.c b/otherlibs/unix/execve.c index 9aad005f..4d29fb55 100644 --- a/otherlibs/unix/execve.c +++ b/otherlibs/unix/execve.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: execve.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include @@ -32,4 +32,3 @@ CAMLprim value unix_execve(value path, value args, value env) return Val_unit; /* never reached, but suppress warnings */ /* from smart compilers */ } - diff --git a/otherlibs/unix/execvp.c b/otherlibs/unix/execvp.c index 04555a73..6d03a29e 100644 --- a/otherlibs/unix/execvp.c +++ b/otherlibs/unix/execvp.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: execvp.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include @@ -48,4 +48,3 @@ CAMLprim value unix_execvpe(value path, value args, value env) return Val_unit; /* never reached, but suppress warnings */ /* from smart compilers */ } - diff --git a/otherlibs/unix/exit.c b/otherlibs/unix/exit.c index 21e2217e..8f1df6d5 100644 --- a/otherlibs/unix/exit.c +++ b/otherlibs/unix/exit.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: exit.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" @@ -22,5 +22,3 @@ CAMLprim value unix_exit(value n) return Val_unit; /* never reached, but suppress warnings */ /* from smart compilers */ } - - diff --git a/otherlibs/unix/fchmod.c b/otherlibs/unix/fchmod.c index 76111409..a90de6ef 100644 --- a/otherlibs/unix/fchmod.c +++ b/otherlibs/unix/fchmod.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fchmod.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -31,5 +31,5 @@ CAMLprim value unix_fchmod(value fd, value perm) CAMLprim value unix_fchmod(value fd, value perm) { invalid_argument("fchmod not implemented"); } - + #endif diff --git a/otherlibs/unix/fchown.c b/otherlibs/unix/fchown.c index c2edb06c..29683a5c 100644 --- a/otherlibs/unix/fchown.c +++ b/otherlibs/unix/fchown.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fchown.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -30,5 +30,5 @@ CAMLprim value unix_fchown(value fd, value uid, value gid) CAMLprim value unix_fchown(value fd, value uid, value gid) { invalid_argument("fchown not implemented"); } - + #endif diff --git a/otherlibs/unix/fcntl.c b/otherlibs/unix/fcntl.c index 9cb6dca2..a0891b2c 100644 --- a/otherlibs/unix/fcntl.c +++ b/otherlibs/unix/fcntl.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fcntl.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/fork.c b/otherlibs/unix/fork.c index d4f3dc13..428137dc 100644 --- a/otherlibs/unix/fork.c +++ b/otherlibs/unix/fork.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fork.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" @@ -23,4 +23,3 @@ CAMLprim value unix_fork(value unit) if (ret == -1) uerror("fork", Nothing); return Val_int(ret); } - diff --git a/otherlibs/unix/ftruncate.c b/otherlibs/unix/ftruncate.c index 51560cc3..661640e3 100644 --- a/otherlibs/unix/ftruncate.c +++ b/otherlibs/unix/ftruncate.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: ftruncate.c 7849 2007-02-09 13:31:15Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getaddrinfo.c b/otherlibs/unix/getaddrinfo.c index e390d18b..adc54998 100644 --- a/otherlibs/unix/getaddrinfo.c +++ b/otherlibs/unix/getaddrinfo.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getaddrinfo.c 7019 2005-08-13 20:59:37Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getcwd.c b/otherlibs/unix/getcwd.c index a8c5b99b..7c735b68 100644 --- a/otherlibs/unix/getcwd.c +++ b/otherlibs/unix/getcwd.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getcwd.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getegid.c b/otherlibs/unix/getegid.c index c76544bf..02beaf12 100644 --- a/otherlibs/unix/getegid.c +++ b/otherlibs/unix/getegid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getegid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/geteuid.c b/otherlibs/unix/geteuid.c index 7b5fe2b2..7c9f660a 100644 --- a/otherlibs/unix/geteuid.c +++ b/otherlibs/unix/geteuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: geteuid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/getgid.c b/otherlibs/unix/getgid.c index d2f8f4ba..d0ed4bff 100644 --- a/otherlibs/unix/getgid.c +++ b/otherlibs/unix/getgid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getgid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/getgr.c b/otherlibs/unix/getgr.c index 1c61da11..eefaa597 100644 --- a/otherlibs/unix/getgr.c +++ b/otherlibs/unix/getgr.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getgr.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getgroups.c b/otherlibs/unix/getgroups.c index ed07c8c6..4d34d5be 100644 --- a/otherlibs/unix/getgroups.c +++ b/otherlibs/unix/getgroups.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getgroups.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/gethost.c b/otherlibs/unix/gethost.c index 714b5a7e..36fdfd8e 100644 --- a/otherlibs/unix/gethost.c +++ b/otherlibs/unix/gethost.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gethost.c 7619 2006-09-20 11:14:37Z doligez $ */ +/* $Id$ */ #include #include @@ -176,8 +176,8 @@ CAMLprim value unix_gethostbyname(value name) CAMLprim value unix_gethostbyaddr(value name) { invalid_argument("gethostbyaddr not implemented"); } - + CAMLprim value unix_gethostbyname(value name) { invalid_argument("gethostbyname not implemented"); } - + #endif diff --git a/otherlibs/unix/gethostname.c b/otherlibs/unix/gethostname.c index 9f8c7c09..f84f8f5b 100644 --- a/otherlibs/unix/gethostname.c +++ b/otherlibs/unix/gethostname.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gethostname.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getlogin.c b/otherlibs/unix/getlogin.c index afd3e2c8..132ed443 100644 --- a/otherlibs/unix/getlogin.c +++ b/otherlibs/unix/getlogin.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getlogin.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getnameinfo.c b/otherlibs/unix/getnameinfo.c index 8a49909e..c8878569 100644 --- a/otherlibs/unix/getnameinfo.c +++ b/otherlibs/unix/getnameinfo.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getnameinfo.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -46,7 +46,7 @@ CAMLprim value unix_getnameinfo(value vaddr, value vopts) get_sockaddr(vaddr, &addr, &addr_len); opts = convert_flag_list(vopts, getnameinfo_flag_table); enter_blocking_section(); - retcode = + retcode = getnameinfo((const struct sockaddr *) &addr.s_gen, addr_len, host, sizeof(host), serv, sizeof(serv), opts); leave_blocking_section(); diff --git a/otherlibs/unix/getpeername.c b/otherlibs/unix/getpeername.c index e2d3463a..20a837ca 100644 --- a/otherlibs/unix/getpeername.c +++ b/otherlibs/unix/getpeername.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getpeername.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -37,5 +37,5 @@ CAMLprim value unix_getpeername(value sock) CAMLprim value unix_getpeername(value sock) { invalid_argument("getpeername not implemented"); } - + #endif diff --git a/otherlibs/unix/getpid.c b/otherlibs/unix/getpid.c index 891cc83f..cb522749 100644 --- a/otherlibs/unix/getpid.c +++ b/otherlibs/unix/getpid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getpid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/getppid.c b/otherlibs/unix/getppid.c index 511e3f6d..0d69aafb 100644 --- a/otherlibs/unix/getppid.c +++ b/otherlibs/unix/getppid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getppid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/getproto.c b/otherlibs/unix/getproto.c index 696cb34e..c9ca1a5c 100644 --- a/otherlibs/unix/getproto.c +++ b/otherlibs/unix/getproto.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getproto.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -63,7 +63,7 @@ CAMLprim value unix_getprotobynumber(value proto) CAMLprim value unix_getprotobynumber(value proto) { invalid_argument("getprotobynumber not implemented"); } - + CAMLprim value unix_getprotobyname(value name) { invalid_argument("getprotobyname not implemented"); } diff --git a/otherlibs/unix/getpw.c b/otherlibs/unix/getpw.c index d250cb8f..eba9d6c3 100644 --- a/otherlibs/unix/getpw.c +++ b/otherlibs/unix/getpw.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getpw.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getserv.c b/otherlibs/unix/getserv.c index 55e13444..e252aacb 100644 --- a/otherlibs/unix/getserv.c +++ b/otherlibs/unix/getserv.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getserv.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -69,7 +69,7 @@ CAMLprim value unix_getservbyport(value port, value proto) CAMLprim value unix_getservbyport(value port, value proto) { invalid_argument("getservbyport not implemented"); } - + CAMLprim value unix_getservbyname(value name, value proto) { invalid_argument("getservbyname not implemented"); } diff --git a/otherlibs/unix/getsockname.c b/otherlibs/unix/getsockname.c index 263cdd90..6f0b64dc 100644 --- a/otherlibs/unix/getsockname.c +++ b/otherlibs/unix/getsockname.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getsockname.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -37,5 +37,5 @@ CAMLprim value unix_getsockname(value sock) CAMLprim value unix_getsockname(value sock) { invalid_argument("getsockname not implemented"); } - + #endif diff --git a/otherlibs/unix/gettimeofday.c b/otherlibs/unix/gettimeofday.c index 0575b2b2..e095326e 100644 --- a/otherlibs/unix/gettimeofday.c +++ b/otherlibs/unix/gettimeofday.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gettimeofday.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/getuid.c b/otherlibs/unix/getuid.c index a6f0efae..780a8d8e 100644 --- a/otherlibs/unix/getuid.c +++ b/otherlibs/unix/getuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getuid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/gmtime.c b/otherlibs/unix/gmtime.c index 701a6fe3..2ffeb392 100644 --- a/otherlibs/unix/gmtime.c +++ b/otherlibs/unix/gmtime.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gmtime.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/initgroups.c b/otherlibs/unix/initgroups.c new file mode 100644 index 00000000..df358dae --- /dev/null +++ b/otherlibs/unix/initgroups.c @@ -0,0 +1,43 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Copyright 2009 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Contributed by Stephane Glondu */ + +/* $Id$ */ + +#include +#include +#include + +#ifdef HAS_INITGROUPS + +#include +#ifdef HAS_UNISTD +#include +#endif +#include +#include +#include "unixsupport.h" + +CAMLprim value unix_initgroups(value user, value group) +{ + if (initgroups(String_val(user), Int_val(group)) == -1) { + uerror("initgroups", Nothing); + } + return Val_unit; +} + +#else + +CAMLprim value unix_initgroups(value user, value group) +{ invalid_argument("initgroups not implemented"); } + +#endif diff --git a/otherlibs/unix/isatty.c b/otherlibs/unix/isatty.c index 3b913bfd..f534dd77 100644 --- a/otherlibs/unix/isatty.c +++ b/otherlibs/unix/isatty.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: isatty.c 7632 2006-09-21 13:54:26Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/itimer.c b/otherlibs/unix/itimer.c index f6ecb8b3..14bac626 100644 --- a/otherlibs/unix/itimer.c +++ b/otherlibs/unix/itimer.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: itimer.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -56,7 +56,7 @@ CAMLprim value unix_setitimer(value which, value newval) uerror("setitimer", Nothing); return unix_convert_itimer(&old); } - + CAMLprim value unix_getitimer(value which) { struct itimerval val; diff --git a/otherlibs/unix/kill.c b/otherlibs/unix/kill.c index 78956d48..8d8a4734 100644 --- a/otherlibs/unix/kill.c +++ b/otherlibs/unix/kill.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: kill.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/libunix.clib b/otherlibs/unix/libunix.clib index e6ce2d52..b866ea06 100644 --- a/otherlibs/unix/libunix.clib +++ b/otherlibs/unix/libunix.clib @@ -5,11 +5,11 @@ fchmod.o fchown.o fcntl.o fork.o ftruncate.o getaddrinfo.o getcwd.o getegid.o geteuid.o getgid.o getgr.o getgroups.o gethost.o gethostname.o getlogin.o getnameinfo.o getpeername.o getpid.o getppid.o getproto.o getpw.o -gettimeofday.o getserv.o getsockname.o getuid.o -gmtime.o isatty.o itimer.o kill.o link.o listen.o lockf.o lseek.o mkdir.o -mkfifo.o nice.o open.o opendir.o pipe.o putenv.o read.o +gettimeofday.o getserv.o getsockname.o getuid.o gmtime.o +initgroups.o isatty.o itimer.o kill.o link.o listen.o lockf.o lseek.o +mkdir.o mkfifo.o nice.o open.o opendir.o pipe.o putenv.o read.o readdir.o readlink.o rename.o rewinddir.o rmdir.o select.o sendrecv.o -setgid.o setsid.o setuid.o shutdown.o signals.o +setgid.o setgroups.o setsid.o setuid.o shutdown.o signals.o sleep.o socket.o socketaddr.o socketpair.o sockopt.o stat.o strofaddr.o symlink.o termios.o time.o times.o truncate.o umask.o unixsupport.o unlink.o diff --git a/otherlibs/unix/link.c b/otherlibs/unix/link.c index d24da919..181e9c18 100644 --- a/otherlibs/unix/link.c +++ b/otherlibs/unix/link.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: link.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/listen.c b/otherlibs/unix/listen.c index cda2943e..2f40cfba 100644 --- a/otherlibs/unix/listen.c +++ b/otherlibs/unix/listen.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: listen.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/lockf.c b/otherlibs/unix/lockf.c index d3a12d36..6e6ce5c1 100644 --- a/otherlibs/unix/lockf.c +++ b/otherlibs/unix/lockf.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: lockf.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/lseek.c b/otherlibs/unix/lseek.c index 8d8d40c9..cb59bb55 100644 --- a/otherlibs/unix/lseek.c +++ b/otherlibs/unix/lseek.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: lseek.c 4474 2002-03-02 09:16:39Z xleroy $ */ +/* $Id$ */ #include #include @@ -39,8 +39,10 @@ static int seek_command_table[] = { CAMLprim value unix_lseek(value fd, value ofs, value cmd) { file_offset ret; + caml_enter_blocking_section(); ret = lseek(Int_val(fd), Long_val(ofs), seek_command_table[Int_val(cmd)]); + caml_leave_blocking_section(); if (ret == -1) uerror("lseek", Nothing); if (ret > Max_long) unix_error(EOVERFLOW, "lseek", Nothing); return Val_long(ret); @@ -49,9 +51,13 @@ CAMLprim value unix_lseek(value fd, value ofs, value cmd) CAMLprim value unix_lseek_64(value fd, value ofs, value cmd) { file_offset ret; - ret = lseek(Int_val(fd), File_offset_val(ofs), - seek_command_table[Int_val(cmd)]); + /* [ofs] is an Int64, which is stored as a custom block; we must therefore + extract its contents before dropping the runtime lock, or it might be + moved. */ + file_offset ofs_c = File_offset_val(ofs); + caml_enter_blocking_section(); + ret = lseek(Int_val(fd), ofs_c, seek_command_table[Int_val(cmd)]); + caml_leave_blocking_section(); if (ret == -1) uerror("lseek", Nothing); return Val_file_offset(ret); } - diff --git a/otherlibs/unix/mkdir.c b/otherlibs/unix/mkdir.c index fc1606e9..1b8fd624 100644 --- a/otherlibs/unix/mkdir.c +++ b/otherlibs/unix/mkdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mkdir.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/mkfifo.c b/otherlibs/unix/mkfifo.c index 8f2cfac5..3e2cf3dd 100644 --- a/otherlibs/unix/mkfifo.c +++ b/otherlibs/unix/mkfifo.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mkfifo.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/nice.c b/otherlibs/unix/nice.c index 5dc4caa7..77def267 100644 --- a/otherlibs/unix/nice.c +++ b/otherlibs/unix/nice.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: nice.c 8967 2008-08-01 13:14:36Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/open.c b/otherlibs/unix/open.c index c734e173..42121830 100644 --- a/otherlibs/unix/open.c +++ b/otherlibs/unix/open.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: open.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -35,7 +35,7 @@ #endif static int open_flag_table[] = { - O_RDONLY, O_WRONLY, O_RDWR, O_NONBLOCK, O_APPEND, O_CREAT, O_TRUNC, O_EXCL, + O_RDONLY, O_WRONLY, O_RDWR, O_NONBLOCK, O_APPEND, O_CREAT, O_TRUNC, O_EXCL, O_NOCTTY, O_DSYNC, O_SYNC, O_RSYNC }; diff --git a/otherlibs/unix/opendir.c b/otherlibs/unix/opendir.c index a5482308..0497ef1f 100644 --- a/otherlibs/unix/opendir.c +++ b/otherlibs/unix/opendir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: opendir.c 6113 2004-02-14 10:21:23Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/pipe.c b/otherlibs/unix/pipe.c index 438b1332..b68705e9 100644 --- a/otherlibs/unix/pipe.c +++ b/otherlibs/unix/pipe.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: pipe.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/putenv.c b/otherlibs/unix/putenv.c index 148d8fee..e403d296 100644 --- a/otherlibs/unix/putenv.c +++ b/otherlibs/unix/putenv.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: putenv.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/read.c b/otherlibs/unix/read.c index 4479f6fc..03a9e6aa 100644 --- a/otherlibs/unix/read.c +++ b/otherlibs/unix/read.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: read.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/readdir.c b/otherlibs/unix/readdir.c index e7feb611..fb8a67b2 100644 --- a/otherlibs/unix/readdir.c +++ b/otherlibs/unix/readdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: readdir.c 6113 2004-02-14 10:21:23Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/readlink.c b/otherlibs/unix/readlink.c index 7544eb7e..d2b9c4e1 100644 --- a/otherlibs/unix/readlink.c +++ b/otherlibs/unix/readlink.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: readlink.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/rename.c b/otherlibs/unix/rename.c index dac48a47..65f33c8b 100644 --- a/otherlibs/unix/rename.c +++ b/otherlibs/unix/rename.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: rename.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/rewinddir.c b/otherlibs/unix/rewinddir.c index 61ce6af5..d14c526d 100644 --- a/otherlibs/unix/rewinddir.c +++ b/otherlibs/unix/rewinddir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: rewinddir.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/rmdir.c b/otherlibs/unix/rmdir.c index 79d27c54..8de22346 100644 --- a/otherlibs/unix/rmdir.c +++ b/otherlibs/unix/rmdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: rmdir.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/select.c b/otherlibs/unix/select.c index 5b63d273..612d5970 100644 --- a/otherlibs/unix/select.c +++ b/otherlibs/unix/select.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: select.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -62,7 +62,7 @@ static value fdset_to_fdlist(value fdlist, fd_set *fdset) return res; } -CAMLprim value unix_select(value readfds, value writefds, value exceptfds, +CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value timeout) { fd_set read, write, except; diff --git a/otherlibs/unix/sendrecv.c b/otherlibs/unix/sendrecv.c index bce164b6..bb3989af 100644 --- a/otherlibs/unix/sendrecv.c +++ b/otherlibs/unix/sendrecv.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sendrecv.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/setgid.c b/otherlibs/unix/setgid.c index 698e6e25..bd8810f8 100644 --- a/otherlibs/unix/setgid.c +++ b/otherlibs/unix/setgid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: setgid.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/setgroups.c b/otherlibs/unix/setgroups.c new file mode 100644 index 00000000..dd4592ad --- /dev/null +++ b/otherlibs/unix/setgroups.c @@ -0,0 +1,53 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Copyright 2009 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Contributed by Stephane Glondu */ + +/* $Id$ */ + +#include +#include +#include +#include + +#ifdef HAS_SETGROUPS + +#include +#ifdef HAS_UNISTD +#include +#endif +#include +#include +#include "unixsupport.h" + +CAMLprim value unix_setgroups(value groups) +{ + gid_t * gidset; + mlsize_t size, i; + int n; + + size = Wosize_val(groups); + gidset = (gid_t *) stat_alloc(size * sizeof(gid_t)); + for (i = 0; i < size; i++) gidset[i] = Int_val(Field(groups, i)); + + n = setgroups(size, gidset); + + stat_free(gidset); + if (n == -1) uerror("setgroups", Nothing); + return Val_unit; +} + +#else + +CAMLprim value unix_setgroups(value groups) +{ invalid_argument("setgroups not implemented"); } + +#endif diff --git a/otherlibs/unix/setsid.c b/otherlibs/unix/setsid.c index cfaa3e65..bfa9dac0 100644 --- a/otherlibs/unix/setsid.c +++ b/otherlibs/unix/setsid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: setsid.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/setuid.c b/otherlibs/unix/setuid.c index fb2a9ddc..c867f4c6 100644 --- a/otherlibs/unix/setuid.c +++ b/otherlibs/unix/setuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: setuid.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/shutdown.c b/otherlibs/unix/shutdown.c index 9a274529..d51b1a3d 100644 --- a/otherlibs/unix/shutdown.c +++ b/otherlibs/unix/shutdown.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: shutdown.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/signals.c b/otherlibs/unix/signals.c index 7232739b..c388b139 100644 --- a/otherlibs/unix/signals.c +++ b/otherlibs/unix/signals.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/sleep.c b/otherlibs/unix/sleep.c index a5b97786..ec14e39d 100644 --- a/otherlibs/unix/sleep.c +++ b/otherlibs/unix/sleep.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sleep.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/socket.c b/otherlibs/unix/socket.c index 62f8428e..82f6329c 100644 --- a/otherlibs/unix/socket.c +++ b/otherlibs/unix/socket.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: socket.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/socketaddr.c b/otherlibs/unix/socketaddr.c index d3441252..f285d15a 100644 --- a/otherlibs/unix/socketaddr.c +++ b/otherlibs/unix/socketaddr.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: socketaddr.c 9377 2009-10-18 09:36:13Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/socketaddr.h b/otherlibs/unix/socketaddr.h index 9cc3a219..79bc80fa 100644 --- a/otherlibs/unix/socketaddr.h +++ b/otherlibs/unix/socketaddr.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: socketaddr.h 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/socketpair.c b/otherlibs/unix/socketpair.c index 9e5aeb0d..df4dcff0 100644 --- a/otherlibs/unix/socketpair.c +++ b/otherlibs/unix/socketpair.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: socketpair.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/sockopt.c b/otherlibs/unix/sockopt.c index 524c2dd4..31c95c1f 100644 --- a/otherlibs/unix/sockopt.c +++ b/otherlibs/unix/sockopt.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sockopt.c 8968 2008-08-01 13:46:08Z xleroy $ */ +/* $Id$ */ #include #include @@ -126,10 +126,10 @@ static struct socket_option sockopt_int[] = { { SOL_SOCKET, SO_SNDLOWAT } }; static struct socket_option sockopt_linger[] = { - { SOL_SOCKET, SO_LINGER } + { SOL_SOCKET, SO_LINGER } }; -static struct socket_option sockopt_timeval[] = { +static struct socket_option sockopt_timeval[] = { { SOL_SOCKET, SO_RCVTIMEO }, { SOL_SOCKET, SO_SNDTIMEO } }; @@ -226,7 +226,7 @@ unix_getsockopt_aux(char * name, } } -CAMLexport value +CAMLexport value unix_setsockopt_aux(char * name, enum option_type ty, int level, int option, value socket, value val) diff --git a/otherlibs/unix/stat.c b/otherlibs/unix/stat.c index 6c7470a1..9cd00006 100644 --- a/otherlibs/unix/stat.c +++ b/otherlibs/unix/stat.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stat.c 5540 2003-05-05 14:20:58Z xleroy $ */ +/* $Id$ */ #include #include @@ -137,4 +137,3 @@ CAMLprim value unix_fstat_64(value fd) if (ret == -1) uerror("fstat", Nothing); return stat_aux(1, &buf); } - diff --git a/otherlibs/unix/strofaddr.c b/otherlibs/unix/strofaddr.c index 51927873..ad9ea191 100644 --- a/otherlibs/unix/strofaddr.c +++ b/otherlibs/unix/strofaddr.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: strofaddr.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/symlink.c b/otherlibs/unix/symlink.c index 6fd7c1fd..6085fd51 100644 --- a/otherlibs/unix/symlink.c +++ b/otherlibs/unix/symlink.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: symlink.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/termios.c b/otherlibs/unix/termios.c index 88e87870..ce49d77e 100644 --- a/otherlibs/unix/termios.c +++ b/otherlibs/unix/termios.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: termios.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include @@ -39,7 +39,7 @@ enum { Input, Output }; #define NFIELDS 38 /* Structure of the terminal_io record. Cf. unix.mli */ - + static long terminal_io_descr[] = { /* Input modes */ Bool, iflags, IGNBRK, @@ -314,4 +314,3 @@ CAMLprim value unix_tcflow(value fd, value action) { invalid_argument("tcflow not implemented"); } #endif - diff --git a/otherlibs/unix/time.c b/otherlibs/unix/time.c index 476abc3b..2fdf4978 100644 --- a/otherlibs/unix/time.c +++ b/otherlibs/unix/time.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: time.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/times.c b/otherlibs/unix/times.c index e79f4ca0..aa32f10d 100644 --- a/otherlibs/unix/times.c +++ b/otherlibs/unix/times.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: times.c 7382 2006-04-16 23:28:22Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/truncate.c b/otherlibs/unix/truncate.c index 362b477e..c23eb47b 100644 --- a/otherlibs/unix/truncate.c +++ b/otherlibs/unix/truncate.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: truncate.c 7849 2007-02-09 13:31:15Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/umask.c b/otherlibs/unix/umask.c index edd5cfae..6f5d14fd 100644 --- a/otherlibs/unix/umask.c +++ b/otherlibs/unix/umask.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: umask.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/unix.ml b/otherlibs/unix/unix.ml index 4e70ecc6..8de827b0 100644 --- a/otherlibs/unix/unix.ml +++ b/otherlibs/unix/unix.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix.ml 8968 2008-08-01 13:46:08Z xleroy $ *) +(* $Id$ *) type error = E2BIG @@ -365,6 +365,8 @@ external getgid : unit -> int = "unix_getgid" external getegid : unit -> int = "unix_getegid" external setgid : int -> unit = "unix_setgid" external getgroups : unit -> int array = "unix_getgroups" +external setgroups : int array -> unit = "unix_setgroups" +external initgroups : string -> int -> unit = "unix_initgroups" type passwd_entry = { pw_name : string; @@ -442,7 +444,7 @@ external accept : file_descr -> file_descr * sockaddr = "unix_accept" external bind : file_descr -> sockaddr -> unit = "unix_bind" external connect : file_descr -> sockaddr -> unit = "unix_connect" external listen : file_descr -> int -> unit = "unix_listen" -external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" +external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" external getsockname : file_descr -> sockaddr = "unix_getsockname" external getpeername : file_descr -> sockaddr = "unix_getpeername" @@ -519,7 +521,7 @@ end = struct let optint = 2 let float = 3 let error = 4 - external get: ('opt, 'v) t -> file_descr -> 'opt -> 'v + external get: ('opt, 'v) t -> file_descr -> 'opt -> 'v = "unix_getsockopt" external set: ('opt, 'v) t -> file_descr -> 'opt -> 'v -> unit = "unix_setsockopt" @@ -606,7 +608,7 @@ let getaddrinfo_emulation node service opts = with Failure _ -> try [ty, (getservbyname service kind).s_port] - with Not_found -> [] + with Not_found -> [] in let ports = match !opt_socktype with @@ -637,7 +639,7 @@ let getaddrinfo_emulation node service opts = [] in (* Cross-product of addresses and ports *) List.flatten - (List.map + (List.map (fun (ty, port) -> List.map (fun (addr, name) -> @@ -893,7 +895,7 @@ let find_proc_id fun_name proc = raise(Unix_error(EBADF, fun_name, "")) let rec waitpid_non_intr pid = - try waitpid [] pid + try waitpid [] pid with Unix_error (EINTR, _, _) -> waitpid_non_intr pid let close_process_in inchan = @@ -963,4 +965,3 @@ let establish_server server_fun sockaddr = exit 0 | id -> close s; ignore(waitpid_non_intr id) (* Reclaim the son *) done - diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli index 53d2c67e..251c31ae 100644 --- a/otherlibs/unix/unix.mli +++ b/otherlibs/unix/unix.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix.mli 9200 2009-03-28 16:58:56Z xleroy $ *) +(* $Id$ *) (** Interface to the Unix system *) @@ -820,6 +820,16 @@ val getgroups : unit -> int array (** Return the list of groups to which the user executing the process belongs. *) +val setgroups : int array -> unit + (** [setgroups groups] sets the supplementary group IDs for the + calling process. Appropriate privileges are required. *) + +val initgroups : string -> int -> unit + (** [initgroups user group] initializes the group access list by + reading the group database /etc/group and using all groups of + which [user] is a member. The additional group [group] is also + added to the list. *) + type passwd_entry = { pw_name : string; pw_passwd : string; diff --git a/otherlibs/unix/unixLabels.ml b/otherlibs/unix/unixLabels.ml index f69bef90..683f15ec 100644 --- a/otherlibs/unix/unixLabels.ml +++ b/otherlibs/unix/unixLabels.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unixLabels.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [UnixLabels]: labelled Unix module *) diff --git a/otherlibs/unix/unixLabels.mli b/otherlibs/unix/unixLabels.mli index 99b541d1..c2295e35 100644 --- a/otherlibs/unix/unixLabels.mli +++ b/otherlibs/unix/unixLabels.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unixLabels.mli 8968 2008-08-01 13:46:08Z xleroy $ *) +(* $Id$ *) (** Interface to the Unix system. To use as replacement to default {!Unix} module, diff --git a/otherlibs/unix/unixsupport.c b/otherlibs/unix/unixsupport.c index 811b92c2..c6eaf706 100644 --- a/otherlibs/unix/unixsupport.c +++ b/otherlibs/unix/unixsupport.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unixsupport.c 7045 2005-09-06 12:38:32Z doligez $ */ +/* $Id$ */ #include #include @@ -252,7 +252,7 @@ value unix_error_of_code (int errcode) int errconstr; value err; - errconstr = + errconstr = cst_to_constr(errcode, error_table, sizeof(error_table)/sizeof(int), -1); if (errconstr == Val_int(-1)) { err = alloc_small(1, 0); @@ -290,4 +290,3 @@ void uerror(char *cmdname, value cmdarg) { unix_error(errno, cmdname, cmdarg); } - diff --git a/otherlibs/unix/unixsupport.h b/otherlibs/unix/unixsupport.h index 55c21f52..84179f43 100644 --- a/otherlibs/unix/unixsupport.h +++ b/otherlibs/unix/unixsupport.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unixsupport.h 7045 2005-09-06 12:38:32Z doligez $ */ +/* $Id$ */ #ifdef HAS_UNISTD #include diff --git a/otherlibs/unix/unlink.c b/otherlibs/unix/unlink.c index f1c9a058..1d956758 100644 --- a/otherlibs/unix/unlink.c +++ b/otherlibs/unix/unlink.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unlink.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/unix/utimes.c b/otherlibs/unix/utimes.c index c424c2f4..da291357 100644 --- a/otherlibs/unix/utimes.c +++ b/otherlibs/unix/utimes.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: utimes.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/wait.c b/otherlibs/unix/wait.c index d44d6ad2..486d06af 100644 --- a/otherlibs/unix/wait.c +++ b/otherlibs/unix/wait.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: wait.c 6845 2005-04-17 08:23:51Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/unix/write.c b/otherlibs/unix/write.c index bdc6d7de..9ddf74e3 100644 --- a/otherlibs/unix/write.c +++ b/otherlibs/unix/write.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: write.c 6553 2004-07-13 12:25:21Z xleroy $ */ +/* $Id$ */ #include #include @@ -63,7 +63,7 @@ CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) This problem is avoided in unix_single_write, which is faithful to the Unix system call. */ -CAMLprim value unix_single_write(value fd, value buf, value vofs, value vlen) +CAMLprim value unix_single_write(value fd, value buf, value vofs, value vlen) { long ofs, len; int numbytes, ret; @@ -84,4 +84,3 @@ CAMLprim value unix_single_write(value fd, value buf, value vofs, value vlen) End_roots(); return Val_int(ret); } - diff --git a/otherlibs/win32graph/Makefile.nt b/otherlibs/win32graph/Makefile.nt index 92f244d5..12e3d239 100644 --- a/otherlibs/win32graph/Makefile.nt +++ b/otherlibs/win32graph/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8477 2007-11-06 15:16:56Z frisch $ +# $Id$ LIBNAME=graphics COBJS=open.$(O) draw.$(O) events.$(O) dib.$(O) diff --git a/otherlibs/win32graph/dib.c b/otherlibs/win32graph/dib.c index d6d0418d..cbf4725a 100644 --- a/otherlibs/win32graph/dib.c +++ b/otherlibs/win32graph/dib.c @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: dib.c 5029 2002-07-23 14:12:03Z doligez $ */ +/* $Id$ */ //----------------------------------------------------------------------------- // DIB.C @@ -493,4 +493,3 @@ void AfficheBitmap(char *filename,HDC hDC,int x,int y) DessinerBitmap(hdib,hDC,&rc); GlobalFree(hdib); } - diff --git a/otherlibs/win32graph/draw.c b/otherlibs/win32graph/draw.c index 9e2e7ac4..62710ec0 100644 --- a/otherlibs/win32graph/draw.c +++ b/otherlibs/win32graph/draw.c @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: draw.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "mlvalues.h" @@ -32,7 +32,7 @@ static void GetCurrentPosition(HDC hDC,POINT *pt) } static value gr_draw_or_fill_arc(value vx, value vy, value vrx, value vry, - value vstart, value vend, BOOL fill); + value vstart, value vend, BOOL fill); CAMLprim value caml_gr_plot(value vx, value vy) { @@ -94,10 +94,10 @@ CAMLprim value caml_gr_draw_rect(value vx, value vy, value vw, value vh) h=Int_val(vh); pt[0].x = x; pt[0].y = y - h; - pt[1].x = x + w; pt[1].y = y - h; - pt[2].x = x + w; pt[2].y = y; - pt[3].x = x; pt[3].y = y; - pt[4].x = x; pt[4].y = y - h; + pt[1].x = x + w; pt[1].y = y - h; + pt[2].x = x + w; pt[2].y = y; + pt[3].x = x; pt[3].y = y; + pt[4].x = x; pt[4].y = y - h; if (grremember_mode) { Polyline(grwindow.gcBitmap,pt, 5); } @@ -191,7 +191,7 @@ CAMLprim value caml_gr_set_window_title(value text) CAMLprim value caml_gr_draw_arc(value *argv, int argc) { return gr_draw_or_fill_arc(argv[0], argv[1], argv[2], argv[3], - argv[4], argv[5], FALSE); + argv[4], argv[5], FALSE); } CAMLprim value caml_gr_draw_arc_nat(vx, vy, vrx, vry, vstart, vend) @@ -252,7 +252,7 @@ CAMLprim value caml_gr_set_color(value vcolor) static value gr_draw_or_fill_arc(value vx, value vy, value vrx, value vry, - value vstart, value vend, BOOL fill) + value vstart, value vend, BOOL fill) { int x, y, r_x, r_y, start, end; int x1, y1, x2, y2, x3, y3, x4, y4; @@ -418,7 +418,7 @@ CAMLprim value caml_gr_fill_poly(value vect) CAMLprim value caml_gr_fill_arc(value *argv, int argc) { return gr_draw_or_fill_arc(argv[0], argv[1], argv[2], argv[3], - argv[4], argv[5], TRUE); + argv[4], argv[5], TRUE); } CAMLprim value caml_gr_fill_arc_nat(vx, vy, vrx, vry, vstart, vend) @@ -438,7 +438,7 @@ struct image { #define Height(i) (((struct image *)Data_custom_val(i))->h) #define Data(i) (((struct image *)Data_custom_val(i))->data) #define Mask(i) (((struct image *)Data_custom_val(i))->mask) -#define Max_image_mem 500000 +#define Max_image_mem 500000 static void finalize_image (value i) { @@ -459,19 +459,19 @@ CAMLprim value caml_gr_create_image(value vw, value vh) { HBITMAP cbm; value res; - int w = Int_val(vw); - int h = Int_val(vh); + int w = Int_val(vw); + int h = Int_val(vh); if (w < 0 || h < 0) gr_fail("create_image: width and height must be positive",0); cbm = CreateCompatibleBitmap(grwindow.gc, w, h); - if (cbm == NULL) - gr_fail("create_image: cannot create bitmap", 0); + if (cbm == NULL) + gr_fail("create_image: cannot create bitmap", 0); res = alloc_custom(&image_ops, sizeof(struct image), w * h, Max_image_mem); if (res) { - Width (res) = w; + Width (res) = w; Height (res) = h; Data (res) = cbm; Mask (res) = NULL; diff --git a/otherlibs/win32graph/events.c b/otherlibs/win32graph/events.c index e9482206..9e0791c3 100755 --- a/otherlibs/win32graph/events.c +++ b/otherlibs/win32graph/events.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: events.c 6553 2004-07-13 12:25:21Z xleroy $ */ +/* $Id$ */ #include "mlvalues.h" #include "alloc.h" diff --git a/otherlibs/win32graph/libgraph.h b/otherlibs/win32graph/libgraph.h index 6fc2448d..6c32f15d 100644 --- a/otherlibs/win32graph/libgraph.h +++ b/otherlibs/win32graph/libgraph.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: libgraph.h 6553 2004-07-13 12:25:21Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32graph/open.c b/otherlibs/win32graph/open.c index 1d260d77..2797bc66 100644 --- a/otherlibs/win32graph/open.c +++ b/otherlibs/win32graph/open.c @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: open.c 8477 2007-11-06 15:16:56Z frisch $ */ +/* $Id$ */ #include #include @@ -72,7 +72,7 @@ void ResetForClose(HWND hwnd) gr_initialized = 0; } - + static LRESULT CALLBACK GraphicsWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { @@ -154,7 +154,7 @@ static value gr_reset(void) grwindow.CurrentBrush = SelectObject(grwindow.gc,GetStockObject(WHITE_BRUSH)); SelectObject(grwindow.gc,grwindow.CurrentBrush); SelectObject(grwindow.gcBitmap,grwindow.CurrentBrush); - caml_gr_set_color(Val_long(0)); + caml_gr_set_color(Val_long(0)); SelectObject(grwindow.gc,grwindow.CurrentFont); SelectObject(grwindow.gcBitmap,grwindow.CurrentFont); grdisplay_mode = grremember_mode = 1; @@ -229,11 +229,11 @@ static DWORD WINAPI gr_open_graph_internal(value arg) } gr_reset(); ShowWindow(grwindow.hwnd,SW_SHOWNORMAL); - + /* Position the current point at origin */ grwindow.grx = 0; grwindow.gry = 0; - + caml_gr_init_event_queue(); /* The global data structures are now correctly initialized. @@ -256,7 +256,7 @@ CAMLprim value caml_gr_open_graph(value arg) long tid; if (gr_initialized) return Val_unit; open_graph_event = CreateEvent(NULL, FALSE, FALSE, NULL); - threadHandle = + threadHandle = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)gr_open_graph_internal,(void **)arg, 0, @@ -270,7 +270,7 @@ CAMLprim value caml_gr_open_graph(value arg) CAMLprim value caml_gr_close_graph(void) { if (gr_initialized) { - PostMessage(grwindow.hwnd, WM_CLOSE, 0, 0); + PostMessage(grwindow.hwnd, WM_CLOSE, 0, 0); WaitForSingleObject(threadHandle, INFINITE); } return Val_unit; diff --git a/otherlibs/win32unix/.depend b/otherlibs/win32unix/.depend index 6e1130b1..a608240c 100644 --- a/otherlibs/win32unix/.depend +++ b/otherlibs/win32unix/.depend @@ -1,5 +1,5 @@ -unix.cmo: unix.cmi -unix.cmx: unix.cmi -unixLabels.cmo: unix.cmi unixLabels.cmi -unixLabels.cmx: unix.cmx unixLabels.cmi -unixLabels.cmi: unix.cmi +unix.cmo: unix.cmi +unix.cmx: unix.cmi +unixLabels.cmo: unix.cmi unixLabels.cmi +unixLabels.cmx: unix.cmx unixLabels.cmi +unixLabels.cmi: unix.cmi diff --git a/otherlibs/win32unix/Makefile.nt b/otherlibs/win32unix/Makefile.nt index 8c61587f..1fd635a7 100644 --- a/otherlibs/win32unix/Makefile.nt +++ b/otherlibs/win32unix/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8955 2008-07-29 08:31:41Z xleroy $ +# $Id$ # Files in this directory WIN_FILES = accept.c bind.c channels.c close.c \ diff --git a/otherlibs/win32unix/accept.c b/otherlibs/win32unix/accept.c index d0a7abd4..1d54b89b 100644 --- a/otherlibs/win32unix/accept.c +++ b/otherlibs/win32unix/accept.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: accept.c 7697 2006-10-18 08:26:54Z xleroy $ */ +/* $Id$ */ #include #include @@ -37,7 +37,7 @@ CAMLprim value unix_accept(sock) if (retcode == 0) { /* Set sockets to synchronous mode */ newvalue = SO_SYNCHRONOUS_NONALERT; - setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *) &newvalue, sizeof(newvalue)); } addr_len = sizeof(sock_addr); @@ -47,7 +47,7 @@ CAMLprim value unix_accept(sock) leave_blocking_section(); if (retcode == 0) { /* Restore initial mode */ - setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *) &oldvalue, oldvaluelen); } if (snew == INVALID_SOCKET) { @@ -63,4 +63,3 @@ CAMLprim value unix_accept(sock) End_roots(); return res; } - diff --git a/otherlibs/win32unix/bind.c b/otherlibs/win32unix/bind.c index ba74ef7c..fca96948 100644 --- a/otherlibs/win32unix/bind.c +++ b/otherlibs/win32unix/bind.c @@ -11,12 +11,12 @@ /* */ /***********************************************************************/ -/* $Id: bind.c 4765 2002-04-30 15:00:48Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" #include "socketaddr.h" - + CAMLprim value unix_bind(socket, address) value socket, address; { diff --git a/otherlibs/win32unix/channels.c b/otherlibs/win32unix/channels.c index f719abbf..1c2cd273 100644 --- a/otherlibs/win32unix/channels.c +++ b/otherlibs/win32unix/channels.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: channels.c 9450 2009-12-07 10:39:54Z xleroy $ */ +/* $Id$ */ #include #include @@ -44,7 +44,7 @@ CAMLprim value win_inchannel_of_filedescr(value handle) if (Descr_kind_val(handle) == KIND_SOCKET) chan->flags |= CHANNEL_FLAG_FROM_SOCKET; vchan = caml_alloc_channel(chan); - CAMLreturn(vchan); + CAMLreturn(vchan); } CAMLprim value win_outchannel_of_filedescr(value handle) @@ -58,7 +58,7 @@ CAMLprim value win_outchannel_of_filedescr(value handle) if (Descr_kind_val(handle) == KIND_SOCKET) chan->flags |= CHANNEL_FLAG_FROM_SOCKET; vchan = caml_alloc_channel(chan); - CAMLreturn(vchan); + CAMLreturn(vchan); } CAMLprim value win_filedescr_of_channel(value vchan) diff --git a/otherlibs/win32unix/close.c b/otherlibs/win32unix/close.c index 4890ae0b..48cd60e7 100644 --- a/otherlibs/win32unix/close.c +++ b/otherlibs/win32unix/close.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: close.c 4765 2002-04-30 15:00:48Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/close_on.c b/otherlibs/win32unix/close_on.c index 69913608..5b2c4ece 100644 --- a/otherlibs/win32unix/close_on.c +++ b/otherlibs/win32unix/close_on.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: close_on.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/connect.c b/otherlibs/win32unix/connect.c index a361d2ad..198d02e2 100644 --- a/otherlibs/win32unix/connect.c +++ b/otherlibs/win32unix/connect.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: connect.c 7697 2006-10-18 08:26:54Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/createprocess.c b/otherlibs/win32unix/createprocess.c index ba405116..042eaef9 100644 --- a/otherlibs/win32unix/createprocess.c +++ b/otherlibs/win32unix/createprocess.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: createprocess.c 9284 2009-06-02 13:12:53Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/dup.c b/otherlibs/win32unix/dup.c index 0c4046b7..2668e75b 100644 --- a/otherlibs/win32unix/dup.c +++ b/otherlibs/win32unix/dup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dup.c 4765 2002-04-30 15:00:48Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" @@ -31,4 +31,3 @@ CAMLprim value unix_dup(value fd) Descr_kind_val(newfd) = kind; return newfd; } - diff --git a/otherlibs/win32unix/dup2.c b/otherlibs/win32unix/dup2.c index 848c1869..3f6d37e7 100644 --- a/otherlibs/win32unix/dup2.c +++ b/otherlibs/win32unix/dup2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dup2.c 7630 2006-09-21 09:43:58Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/errmsg.c b/otherlibs/win32unix/errmsg.c index 08ef2c00..9ce9dddb 100644 --- a/otherlibs/win32unix/errmsg.c +++ b/otherlibs/win32unix/errmsg.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: errmsg.c 6043 2003-12-31 00:00:57Z doligez $ */ +/* $Id$ */ #include #include @@ -26,7 +26,7 @@ CAMLprim value unix_error_message(value err) { int errnum; char buffer[512]; - + errnum = Is_block(err) ? Int_val(Field(err, 0)) : error_table[Int_val(err)]; if (errnum > 0) return copy_string(strerror(errnum)); @@ -38,7 +38,6 @@ CAMLprim value unix_error_message(value err) sizeof(buffer), NULL)) return copy_string(buffer); - sprintf(buffer, "unknown error #%d", errnum); + sprintf(buffer, "unknown error #%d", errnum); return copy_string(buffer); } - diff --git a/otherlibs/win32unix/getpeername.c b/otherlibs/win32unix/getpeername.c index ff1e634c..9aeb4c21 100644 --- a/otherlibs/win32unix/getpeername.c +++ b/otherlibs/win32unix/getpeername.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getpeername.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/getpid.c b/otherlibs/win32unix/getpid.c index 92ba55af..0892f8f9 100644 --- a/otherlibs/win32unix/getpid.c +++ b/otherlibs/win32unix/getpid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getpid.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/getsockname.c b/otherlibs/win32unix/getsockname.c index 5b6ea300..88487a43 100644 --- a/otherlibs/win32unix/getsockname.c +++ b/otherlibs/win32unix/getsockname.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: getsockname.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/gettimeofday.c b/otherlibs/win32unix/gettimeofday.c index 622ef4dd..f1313f06 100644 --- a/otherlibs/win32unix/gettimeofday.c +++ b/otherlibs/win32unix/gettimeofday.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gettimeofday.c 7946 2007-03-01 13:51:24Z xleroy $ */ +/* $Id$ */ #include #include @@ -31,6 +31,6 @@ CAMLprim value unix_gettimeofday(value unit) return copy_double((double) initial_time); } else { return copy_double((double) initial_time + - (double) (tickcount - initial_tickcount) * 1e-3); + (double) (tickcount - initial_tickcount) * 1e-3); } } diff --git a/otherlibs/win32unix/link.c b/otherlibs/win32unix/link.c index f0097e2a..89214342 100644 --- a/otherlibs/win32unix/link.c +++ b/otherlibs/win32unix/link.c @@ -11,24 +11,24 @@ /* */ /***********************************************************************/ -/* $Id: link.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include #include #include "unixsupport.h" - -typedef + +typedef BOOL (WINAPI *tCreateHardLink)( LPCTSTR lpFileName, LPCTSTR lpExistingFileName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes + LPSECURITY_ATTRIBUTES lpSecurityAttributes ); - + CAMLprim value unix_link(value path1, value path2) -{ +{ HMODULE hModKernel32; - tCreateHardLink pCreateHardLink; + tCreateHardLink pCreateHardLink; hModKernel32 = GetModuleHandle("KERNEL32.DLL"); pCreateHardLink = (tCreateHardLink) GetProcAddress(hModKernel32, "CreateHardLinkA"); @@ -39,4 +39,4 @@ CAMLprim value unix_link(value path1, value path2) uerror("link", path2); } return Val_unit; -} +} diff --git a/otherlibs/win32unix/listen.c b/otherlibs/win32unix/listen.c index cd61bdbd..20789e1a 100644 --- a/otherlibs/win32unix/listen.c +++ b/otherlibs/win32unix/listen.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: listen.c 4765 2002-04-30 15:00:48Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/lockf.c b/otherlibs/win32unix/lockf.c index 668932ae..524f9516 100644 --- a/otherlibs/win32unix/lockf.c +++ b/otherlibs/win32unix/lockf.c @@ -13,7 +13,7 @@ /* */ /***********************************************************************/ -/* $Id: lockf.c 9078 2008-10-08 13:05:48Z xleroy $ */ +/* $Id$ */ #include #include @@ -71,7 +71,7 @@ CAMLprim value unix_lockf(value fd, value cmd, value span) } h = Handle_val(fd); - + l_len = Long_val(span); /* No matter what, we need the current position in the file */ @@ -108,19 +108,19 @@ CAMLprim value unix_lockf(value fd, value cmd, value span) switch(Int_val(cmd)) { case 0: /* F_ULOCK - unlock */ if (! UnlockFileEx(h, 0, - lock_len.LowPart, lock_len.HighPart, &overlap)) + lock_len.LowPart, lock_len.HighPart, &overlap)) err = GetLastError(); break; case 1: /* F_LOCK - blocking write lock */ enter_blocking_section(); if (! LockFileEx(h, LOCKFILE_EXCLUSIVE_LOCK, 0, - lock_len.LowPart, lock_len.HighPart, &overlap)) + lock_len.LowPart, lock_len.HighPart, &overlap)) err = GetLastError(); leave_blocking_section(); break; case 2: /* F_TLOCK - non-blocking write lock */ if (! LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0, - lock_len.LowPart, lock_len.HighPart, &overlap)) + lock_len.LowPart, lock_len.HighPart, &overlap)) err = GetLastError(); break; case 3: /* F_TEST - check whether a write lock can be obtained */ @@ -130,7 +130,7 @@ CAMLprim value unix_lockf(value fd, value cmd, value span) * it is not clear the nature of the lock test performed * by ocaml (unix) currently. */ if (LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0, - lock_len.LowPart, lock_len.HighPart, &overlap)) { + lock_len.LowPart, lock_len.HighPart, &overlap)) { UnlockFileEx(h, 0, lock_len.LowPart, lock_len.HighPart, &overlap); } else { err = GetLastError(); @@ -139,13 +139,13 @@ CAMLprim value unix_lockf(value fd, value cmd, value span) case 4: /* F_RLOCK - blocking read lock */ enter_blocking_section(); if (! LockFileEx(h, 0, 0, - lock_len.LowPart, lock_len.HighPart, &overlap)) + lock_len.LowPart, lock_len.HighPart, &overlap)) err = GetLastError(); leave_blocking_section(); break; case 5: /* F_TRLOCK - non-blocking read lock */ if (! LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY, 0, - lock_len.LowPart, lock_len.HighPart, &overlap)) + lock_len.LowPart, lock_len.HighPart, &overlap)) err = GetLastError(); break; default: diff --git a/otherlibs/win32unix/lseek.c b/otherlibs/win32unix/lseek.c index 95be0093..9619fcc9 100644 --- a/otherlibs/win32unix/lseek.c +++ b/otherlibs/win32unix/lseek.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: lseek.c 6774 2005-02-02 15:52:26Z xleroy $ */ +/* $Id$ */ #include #include @@ -52,7 +52,7 @@ CAMLprim value unix_lseek(value fd, value ofs, value cmd) __int64 ret; ret = caml_set_file_pointer(Handle_val(fd), Long_val(ofs), - seek_command_table[Int_val(cmd)]); + seek_command_table[Int_val(cmd)]); if (ret > Max_long) { win32_maperr(ERROR_ARITHMETIC_OVERFLOW); uerror("lseek", Nothing); @@ -65,6 +65,6 @@ CAMLprim value unix_lseek_64(value fd, value ofs, value cmd) __int64 ret; ret = caml_set_file_pointer(Handle_val(fd), Int64_val(ofs), - seek_command_table[Int_val(cmd)]); + seek_command_table[Int_val(cmd)]); return copy_int64(ret); } diff --git a/otherlibs/win32unix/mkdir.c b/otherlibs/win32unix/mkdir.c index d2895253..aae54783 100644 --- a/otherlibs/win32unix/mkdir.c +++ b/otherlibs/win32unix/mkdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: mkdir.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/nonblock.c b/otherlibs/win32unix/nonblock.c index b5bc1471..733a79d8 100755 --- a/otherlibs/win32unix/nonblock.c +++ b/otherlibs/win32unix/nonblock.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: nonblock.c 5375 2003-01-06 16:44:21Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/open.c b/otherlibs/win32unix/open.c index 60fa80bd..f2f334bb 100644 --- a/otherlibs/win32unix/open.c +++ b/otherlibs/win32unix/open.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: open.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/pipe.c b/otherlibs/win32unix/pipe.c index 765f1aa7..afacd3e1 100644 --- a/otherlibs/win32unix/pipe.c +++ b/otherlibs/win32unix/pipe.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: pipe.c 9196 2009-03-28 15:30:08Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/read.c b/otherlibs/win32unix/read.c index 2319cb67..67882eb7 100644 --- a/otherlibs/win32unix/read.c +++ b/otherlibs/win32unix/read.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: read.c 7697 2006-10-18 08:26:54Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/rename.c b/otherlibs/win32unix/rename.c index d5280ffb..9ab43fca 100644 --- a/otherlibs/win32unix/rename.c +++ b/otherlibs/win32unix/rename.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: rename.c 6553 2004-07-13 12:25:21Z xleroy $ */ +/* $Id$ */ #include #include @@ -31,13 +31,13 @@ CAMLprim value unix_rename(value path1, value path2) } if (supports_MoveFileEx > 0) ok = MoveFileEx(String_val(path1), String_val(path2), - MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | - MOVEFILE_COPY_ALLOWED); + MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | + MOVEFILE_COPY_ALLOWED); else ok = MoveFile(String_val(path1), String_val(path2)); if (! ok) { win32_maperr(GetLastError()); uerror("rename", path1); - } + } return Val_unit; } diff --git a/otherlibs/win32unix/select.c b/otherlibs/win32unix/select.c index 9de11351..efe3a32e 100644 --- a/otherlibs/win32unix/select.c +++ b/otherlibs/win32unix/select.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: select.c 9143 2008-11-26 13:27:21Z xleroy $ */ +/* $Id$ */ #include #include @@ -29,7 +29,7 @@ * It takes the following parameters into account: * - limitation on number of objects is mostly due to limitation * a WaitForMultipleObjects - * - there is always an event "hStop" to watch + * - there is always an event "hStop" to watch * * This lead to pick the following value as the biggest possible * value @@ -115,7 +115,7 @@ typedef enum _SELECTHANDLETYPE { typedef enum _SELECTMODE { SELECT_MODE_NONE = 0, SELECT_MODE_READ, - SELECT_MODE_WRITE, + SELECT_MODE_WRITE, SELECT_MODE_EXCEPT, } SELECTMODE; @@ -188,13 +188,13 @@ LPSELECTDATA select_data_new (LPSELECTDATA lpSelectData, SELECTTYPE EType) /* Allocate the data structure */ LPSELECTDATA res; DWORD i; - + if (!HeapLock(GetProcessHeap())) { win32_maperr(GetLastError()); uerror("select", Nothing); } - res = (LPSELECTDATA)HeapAlloc(GetProcessHeap(), 0, sizeof(SELECTDATA)); + res = (LPSELECTDATA)HeapAlloc(GetProcessHeap(), 0, sizeof(SELECTDATA)); HeapUnlock(GetProcessHeap()); /* Init common data */ @@ -202,10 +202,10 @@ LPSELECTDATA select_data_new (LPSELECTDATA lpSelectData, SELECTTYPE EType) list_next_set((LPLIST)res, (LPLIST)lpSelectData); res->EType = EType; res->nResultsCount = 0; - + /* Data following are dedicated to APC like call, they - will be initialized if required. For now they are set to + will be initialized if required. For now they are set to invalid values. */ res->funcWorker = NULL; @@ -269,7 +269,7 @@ DWORD select_data_result_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, LPVOI DWORD select_data_query_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE hFileDescr, LPVOID lpOrig) { DWORD res; - DWORD i; + DWORD i; res = 0; if (lpSelectData->nQueriesCount < MAXIMUM_SELECT_OBJECTS) @@ -286,15 +286,16 @@ DWORD select_data_query_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE } /* Search for a job that has available query slots and that match provided type. - * If none is found, create a new one. Return the corresponding SELECTDATA, and + * If none is found, create a new one. Return the corresponding SELECTDATA, and * update provided SELECTDATA head, if required. */ -LPSELECTDATA select_data_job_search (LPSELECTDATA *lppSelectData, SELECTTYPE EType) +LPSELECTDATA select_data_job_search (LPSELECTDATA *lppSelectData, + SELECTTYPE EType) { LPSELECTDATA res; - + res = NULL; - + /* Search for job */ #ifdef DBUG dbug_print("Searching an available job for type %d", EType); @@ -303,7 +304,7 @@ LPSELECTDATA select_data_job_search (LPSELECTDATA *lppSelectData, SELECTTYPE ETy while ( res != NULL && !( - res->EType == EType + res->EType == EType && res->nQueriesCount < MAXIMUM_SELECT_OBJECTS ) ) @@ -336,7 +337,7 @@ void read_console_poll(HANDLE hStop, void *_data) DWORD n; LPSELECTDATA lpSelectData; LPSELECTQUERY lpQuery; - + #ifdef DBUG dbug_print("Waiting for data on console"); #endif @@ -350,7 +351,7 @@ void read_console_poll(HANDLE hStop, void *_data) events[0] = hStop; events[1] = lpQuery->hFileDescr; while (lpSelectData->EState == SELECT_STATE_NONE) - { + { waitRes = WaitForMultipleObjects(2, events, FALSE, INFINITE); if (waitRes == WAIT_OBJECT_0 || check_error(lpSelectData, waitRes == WAIT_FAILED)) { @@ -371,7 +372,7 @@ void read_console_poll(HANDLE hStop, void *_data) lpSelectData->EState = SELECT_STATE_SIGNALED; break; } - else + else { /* discard everything else and try again */ if (check_error(lpSelectData, ReadConsoleInput(lpQuery->hFileDescr, &record, 1, &n) == 0)) @@ -421,13 +422,13 @@ void read_pipe_poll (HANDLE hStop, void *_data) { iterQuery = &(lpSelectData->aQueries[i]); if (check_error( - lpSelectData, + lpSelectData, PeekNamedPipe( - iterQuery->hFileDescr, - NULL, - 0, - NULL, - &n, + iterQuery->hFileDescr, + NULL, + 0, + NULL, + &n, NULL) == 0)) { break; @@ -441,7 +442,7 @@ void read_pipe_poll (HANDLE hStop, void *_data) }; /* Alas, nothing except polling seems to work for pipes. - Check the state & stop_worker_event every 10 ms + Check the state & stop_worker_event every 10 ms */ if (lpSelectData->EState == SELECT_STATE_NONE) { @@ -462,17 +463,17 @@ LPSELECTDATA read_pipe_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HA { LPSELECTDATA res; LPSELECTDATA hd; - + hd = lpSelectData; /* Polling pipe is a non blocking operation by default. This means that each - worker can handle many pipe. We begin to try to find a worker that is + worker can handle many pipe. We begin to try to find a worker that is polling pipe, but for which there is under the limit of pipe per worker. */ #ifdef DBUG dbug_print("Searching an available worker handling pipe"); #endif res = select_data_job_search(&hd, SELECT_TYPE_PIPE_READ); - + /* Add a new pipe to poll */ res->funcWorker = read_pipe_poll; select_data_query_add(res, EMode, hFileDescr, lpOrig); @@ -516,22 +517,22 @@ void socket_poll (HANDLE hStop, void *_data) } check_error(lpSelectData, WSAEventSelect( - (SOCKET)(iterQuery->hFileDescr), - aEvents[nEvents], + (SOCKET)(iterQuery->hFileDescr), + aEvents[nEvents], maskEvents) == SOCKET_ERROR); } - + /* Add stop event */ aEvents[nEvents] = hStop; nEvents++; if (lpSelectData->nError == 0) { - check_error(lpSelectData, + check_error(lpSelectData, WaitForMultipleObjects( - nEvents, - aEvents, - FALSE, + nEvents, + aEvents, + FALSE, INFINITE) == WAIT_FAILED); }; @@ -568,7 +569,7 @@ LPSELECTDATA socket_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDL { LPSELECTDATA res; LPSELECTDATA hd; - + hd = lpSelectData; /* Polling socket can be done mulitple handle at the same time. You just need one worker to use it. Try to find if there is already a worker @@ -578,7 +579,7 @@ LPSELECTDATA socket_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDL dbug_print("Scanning list of worker to find one that already handle socket"); #endif res = select_data_job_search(&hd, SELECT_TYPE_SOCKET); - + /* Add a new socket to poll */ res->funcWorker = socket_poll; #ifdef DBUG @@ -601,11 +602,11 @@ LPSELECTDATA static_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDL { LPSELECTDATA res; LPSELECTDATA hd; - + /* Look for an already initialized static element */ hd = lpSelectData; res = select_data_job_search(&hd, SELECT_TYPE_STATIC); - + /* Add a new query/result */ select_data_query_add(res, EMode, hFileDescr, lpOrig); select_data_result_add(res, EMode, lpOrig); @@ -636,7 +637,7 @@ static SELECTHANDLETYPE get_handle_type(value fd) { switch(GetFileType(Handle_val(fd))) { - case FILE_TYPE_DISK: + case FILE_TYPE_DISK: res = SELECT_HANDLE_DISK; break; @@ -685,8 +686,8 @@ LPSELECTDATA select_data_dispatch (LPSELECTDATA lpSelectData, SELECTMODE EMode, #ifdef DBUG dbug_print("Waiting for %d on handle %x", EMode, hFileDescr); #endif - - /* There is only 2 way to have except mode: transmission of OOB data through + + /* There is only 2 way to have except mode: transmission of OOB data through a socket TCP/IP and through a strange interaction with a TTY. With windows, we only consider the TCP/IP except condition */ @@ -795,12 +796,12 @@ static DWORD caml_list_length (value lst) #define MAX(a, b) ((a) > (b) ? (a) : (b)) CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value timeout) -{ +{ /* Event associated to handle */ DWORD nEventsCount; DWORD nEventsMax; HANDLE *lpEventsDone; - + /* Data for all handles */ LPSELECTDATA lpSelectData; LPSELECTDATA iterSelectData; @@ -861,8 +862,8 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value uerror("select", Nothing); } hdsData = (HANDLE *)HeapAlloc( - GetProcessHeap(), - 0, + GetProcessHeap(), + 0, sizeof(HANDLE) * hdsMax); HeapUnlock(GetProcessHeap()); @@ -973,12 +974,12 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value /* Execute APC */ if (iterSelectData->funcWorker != NULL) { - iterSelectData->lpWorker = + iterSelectData->lpWorker = worker_job_submit( - iterSelectData->funcWorker, + iterSelectData->funcWorker, (void *)iterSelectData); #ifdef DBUG - dbug_print("Job submitted to worker %x", iterSelectData->lpWorker); + dbug_print("Job submitted to worker %x", iterSelectData->lpWorker); #endif lpEventsDone[nEventsCount] = worker_job_event_done(iterSelectData->lpWorker); nEventsCount++; @@ -1034,7 +1035,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value }; iterSelectData = LIST_NEXT(LPSELECTDATA, iterSelectData); }; - + #ifdef DBUG dbug_print("Waiting for every select worker to be done"); #endif @@ -1067,7 +1068,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value #ifdef DBUG dbug_print("Building result"); #endif - read_list = Val_unit; + read_list = Val_unit; write_list = Val_unit; except_list = Val_unit; @@ -1116,7 +1117,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value select_data_free(lpSelectData); } lpSelectData = NULL; - + /* Free allocated events/handle set array */ #ifdef DBUG dbug_print("Free local allocated resources"); diff --git a/otherlibs/win32unix/sendrecv.c b/otherlibs/win32unix/sendrecv.c index 9141f3d0..855957bd 100644 --- a/otherlibs/win32unix/sendrecv.c +++ b/otherlibs/win32unix/sendrecv.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sendrecv.c 7697 2006-10-18 08:26:54Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/shutdown.c b/otherlibs/win32unix/shutdown.c index ae968727..f3d2c6e0 100644 --- a/otherlibs/win32unix/shutdown.c +++ b/otherlibs/win32unix/shutdown.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: shutdown.c 4765 2002-04-30 15:00:48Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" diff --git a/otherlibs/win32unix/sleep.c b/otherlibs/win32unix/sleep.c index e5054a6f..421e5f90 100644 --- a/otherlibs/win32unix/sleep.c +++ b/otherlibs/win32unix/sleep.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sleep.c 4899 2002-06-07 09:49:45Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/socket.c b/otherlibs/win32unix/socket.c index 15f0bafd..3cd55ec2 100644 --- a/otherlibs/win32unix/socket.c +++ b/otherlibs/win32unix/socket.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: socket.c 4765 2002-04-30 15:00:48Z xleroy $ */ +/* $Id$ */ #include #include "unixsupport.h" @@ -36,7 +36,7 @@ CAMLprim value unix_socket(domain, type, proto) if (retcode == 0) { /* Set sockets to synchronous mode */ newvalue = SO_SYNCHRONOUS_NONALERT; - setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *) &newvalue, sizeof(newvalue)); } s = socket(socket_domain_table[Int_val(domain)], @@ -44,7 +44,7 @@ CAMLprim value unix_socket(domain, type, proto) Int_val(proto)); if (retcode == 0) { /* Restore initial mode */ - setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *) &oldvalue, oldvaluelen); } if (s == INVALID_SOCKET) { diff --git a/otherlibs/win32unix/socketaddr.h b/otherlibs/win32unix/socketaddr.h index 0a05dfff..8abc63b4 100644 --- a/otherlibs/win32unix/socketaddr.h +++ b/otherlibs/win32unix/socketaddr.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: socketaddr.h 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include diff --git a/otherlibs/win32unix/sockopt.c b/otherlibs/win32unix/sockopt.c index 9ffa315e..f82d810e 100644 --- a/otherlibs/win32unix/sockopt.c +++ b/otherlibs/win32unix/sockopt.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: sockopt.c 8968 2008-08-01 13:46:08Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/stat.c b/otherlibs/win32unix/stat.c index 813788d5..79fc3b2e 100644 --- a/otherlibs/win32unix/stat.c +++ b/otherlibs/win32unix/stat.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stat.c 9199 2009-03-28 16:39:50Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/system.c b/otherlibs/win32unix/system.c index 5885e03b..51dc9bfb 100644 --- a/otherlibs/win32unix/system.c +++ b/otherlibs/win32unix/system.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: system.c 7626 2006-09-21 08:03:56Z xleroy $ */ +/* $Id$ */ #include #include @@ -42,6 +42,3 @@ CAMLprim value win_system(cmd) Field(st, 0) = Val_int(ret); return st; } - - - diff --git a/otherlibs/win32unix/unix.ml b/otherlibs/win32unix/unix.ml index 8385ec51..c8396d7f 100644 --- a/otherlibs/win32unix/unix.ml +++ b/otherlibs/win32unix/unix.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix.ml 8968 2008-08-01 13:46:08Z xleroy $ *) +(* $Id$ *) (* Initialization *) @@ -145,7 +145,7 @@ external waitpid : wait_flag list -> int -> int * process_status external getpid : unit -> int = "unix_getpid" let fork () = invalid_arg "Unix.fork not implemented" -let wait () = invalid_arg "Unix.wait not implemented" +let wait () = invalid_arg "Unix.wait not implemented" let getppid () = invalid_arg "Unix.getppid not implemented" let nice prio = invalid_arg "Unix.nice not implemented" @@ -435,6 +435,8 @@ let getegid = getgid let setgid id = invalid_arg "Unix.setgid not implemented" let getgroups () = [|1|] +let setgroups _ = invalid_arg "Unix.setgroups not implemented" +let initgroups _ _ = invalid_arg "Unix.initgroups not implemented" type passwd_entry = { pw_name : string; @@ -513,7 +515,7 @@ external accept : file_descr -> file_descr * sockaddr = "unix_accept" external bind : file_descr -> sockaddr -> unit = "unix_bind" external connect : file_descr -> sockaddr -> unit = "unix_connect" external listen : file_descr -> int -> unit = "unix_listen" -external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" +external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" external getsockname : file_descr -> sockaddr = "unix_getsockname" external getpeername : file_descr -> sockaddr = "unix_getpeername" @@ -590,7 +592,7 @@ end = struct let optint = 2 let float = 3 let error = 4 - external get: ('opt, 'v) t -> file_descr -> 'opt -> 'v + external get: ('opt, 'v) t -> file_descr -> 'opt -> 'v = "unix_getsockopt" external set: ('opt, 'v) t -> file_descr -> 'opt -> 'v -> unit = "unix_setsockopt" @@ -676,7 +678,7 @@ let getaddrinfo node service opts = with Failure _ -> try [ty, (getservbyname service kind).s_port] - with Not_found -> [] + with Not_found -> [] in let ports = match !opt_socktype with @@ -707,7 +709,7 @@ let getaddrinfo node service opts = [] in (* Cross-product of addresses and ports *) List.flatten - (List.map + (List.map (fun (ty, port) -> List.map (fun (addr, name) -> @@ -770,7 +772,7 @@ let create_process prog args fd1 fd2 fd3 = let create_process_env prog args env fd1 fd2 fd3 = win_create_process prog (make_cmdline args) (Some(String.concat "\000" (Array.to_list env) ^ "\000")) - fd1 fd2 fd3 + fd1 fd2 fd3 external system: string -> process_status = "win_system" diff --git a/otherlibs/win32unix/unixsupport.c b/otherlibs/win32unix/unixsupport.c index d01b228c..6e32a39e 100644 --- a/otherlibs/win32unix/unixsupport.c +++ b/otherlibs/win32unix/unixsupport.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unixsupport.c 9450 2009-12-07 10:39:54Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/unixsupport.h b/otherlibs/win32unix/unixsupport.h index faeb5c18..bf71ac6d 100644 --- a/otherlibs/win32unix/unixsupport.h +++ b/otherlibs/win32unix/unixsupport.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unixsupport.h 9450 2009-12-07 10:39:54Z xleroy $ */ +/* $Id$ */ #define WIN32_LEAN_AND_MEAN #include diff --git a/otherlibs/win32unix/windbug.c b/otherlibs/win32unix/windbug.c index 313f2aff..5bf494e7 100644 --- a/otherlibs/win32unix/windbug.c +++ b/otherlibs/win32unix/windbug.c @@ -11,16 +11,11 @@ /* */ /***********************************************************************/ -/* $Id: windbug.c 9144 2008-11-26 13:41:01Z xleroy $ */ +/* $Id$ */ #include -#include -#include -#include "windbug.h" -#ifdef DBUG - -static int dbug = 0; +int dbug = 0; void dbug_init (void) { @@ -35,17 +30,3 @@ int dbug_test (void) { return dbug; } - -void dbug_print(const char * fmt, ...) -{ - va_list ap; - if (dbug) { - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); - fflush(stderr); - va_end(ap); - } -} - -#endif diff --git a/otherlibs/win32unix/windbug.h b/otherlibs/win32unix/windbug.h index d0c4f260..232bb198 100644 --- a/otherlibs/win32unix/windbug.h +++ b/otherlibs/win32unix/windbug.h @@ -11,12 +11,27 @@ /* */ /***********************************************************************/ -/* $Id: windbug.h 9143 2008-11-26 13:27:21Z xleroy $ */ +/* $Id$ */ /*#define DBUG*/ #ifdef DBUG +#include +#include + +#define DBUG_PRINT(fmt, ...) \ + do \ + { \ + if (dbug_test()) \ + { \ + fprintf(stderr, "DBUG (pid:%d, tid: %d): ", GetCurrentProcessId(), GetCurrentThreadId()); \ + fprintf(stderr, fmt, __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + fflush(stderr); \ + }; \ + } while(0) + /* Initialize and cleanup dbug variable */ void dbug_init (void); void dbug_cleanup (void); @@ -24,14 +39,11 @@ void dbug_cleanup (void); /* Test if we are in dbug mode */ int dbug_test (void); -/* Print if we are in dbug mode */ -void dbug_print (const char * fmt, ...); - #define DBUG_INIT dbug_init() #define DBUG_CLEANUP dbug_cleanup() #else +#define DBUG_PRINT(fmt, ...) #define DBUG_INIT #define DBUG_CLEANUP #endif - diff --git a/otherlibs/win32unix/windir.c b/otherlibs/win32unix/windir.c index 23ce8c22..8b96589e 100644 --- a/otherlibs/win32unix/windir.c +++ b/otherlibs/win32unix/windir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: windir.c 5029 2002-07-23 14:12:03Z doligez $ */ +/* $Id$ */ #include #include @@ -77,4 +77,3 @@ CAMLprim value win_findclose(valh) } return Val_unit; } - diff --git a/otherlibs/win32unix/winlist.c b/otherlibs/win32unix/winlist.c index 52a9525c..318a0add 100644 --- a/otherlibs/win32unix/winlist.c +++ b/otherlibs/win32unix/winlist.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: winlist.c 8961 2008-07-31 12:09:18Z xleroy $ */ +/* $Id$ */ /* Basic list function in C. */ diff --git a/otherlibs/win32unix/winlist.h b/otherlibs/win32unix/winlist.h index 6f86c1b2..be388a4c 100644 --- a/otherlibs/win32unix/winlist.h +++ b/otherlibs/win32unix/winlist.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: winlist.h 8961 2008-07-31 12:09:18Z xleroy $ */ +/* $Id$ */ #ifndef _WINLIST_H #define _WINLIST_H diff --git a/otherlibs/win32unix/winwait.c b/otherlibs/win32unix/winwait.c index 4de4818c..895a6926 100644 --- a/otherlibs/win32unix/winwait.c +++ b/otherlibs/win32unix/winwait.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: winwait.c 8768 2008-01-11 16:13:18Z doligez $ */ +/* $Id$ */ #include #include diff --git a/otherlibs/win32unix/winworker.c b/otherlibs/win32unix/winworker.c index 0b66892e..aa83684b 100644 --- a/otherlibs/win32unix/winworker.c +++ b/otherlibs/win32unix/winworker.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: winworker.c 9144 2008-11-26 13:41:01Z xleroy $ */ +/* $Id$ */ #include "winworker.h" #include "winlist.h" @@ -53,24 +53,20 @@ DWORD WINAPI worker_wait (LPVOID _data) { BOOL bExit; LPWORKER lpWorker; - + lpWorker = (LPWORKER )_data; bExit = FALSE; -#ifdef DBUG - dbug_print("Worker %x starting", lpWorker); -#endif + DBUG_PRINT("Worker %x starting", lpWorker); while ( - !bExit + !bExit && SignalObjectAndWait( - lpWorker->hWorkerReady, + lpWorker->hWorkerReady, lpWorker->hCommandReady, - INFINITE, + INFINITE, TRUE) == WAIT_OBJECT_0) { -#ifdef DBUG - dbug_print("Worker %x running", lpWorker); -#endif + DBUG_PRINT("Worker %x running", lpWorker); switch (lpWorker->ECommand) { case WORKER_CMD_NONE: @@ -90,9 +86,7 @@ DWORD WINAPI worker_wait (LPVOID _data) break; } }; -#ifdef DBUG - dbug_print("Worker %x exiting", lpWorker); -#endif + DBUG_PRINT("Worker %x exiting", lpWorker); return 0; } @@ -117,11 +111,11 @@ LPWORKER worker_new (void) lpWorker->hCommandReady = CreateEvent(NULL, FALSE, FALSE, NULL); lpWorker->ECommand = WORKER_CMD_NONE; lpWorker->hThread = CreateThread( - NULL, - THREAD_WORKERS_MEM, - worker_wait, - (LPVOID)lpWorker, - 0, + NULL, + THREAD_WORKERS_MEM, + worker_wait, + (LPVOID)lpWorker, + 0, NULL); return lpWorker; @@ -130,18 +124,14 @@ LPWORKER worker_new (void) void worker_free (LPWORKER lpWorker) { /* Wait for termination of the worker */ -#ifdef DBUG - dbug_print("Shutting down worker %x", lpWorker); -#endif + DBUG_PRINT("Shutting down worker %x", lpWorker); WaitForSingleObject(lpWorker->hWorkerReady, INFINITE); lpWorker->ECommand = WORKER_CMD_STOP; SetEvent(lpWorker->hCommandReady); WaitForSingleObject(lpWorker->hThread, INFINITE); /* Free resources */ -#ifdef DBUG - dbug_print("Freeing resources of worker %x", lpWorker); -#endif + DBUG_PRINT("Freeing resources of worker %x", lpWorker); if (lpWorker->hThread != INVALID_HANDLE_VALUE) { CloseHandle(lpWorker->hThread); @@ -203,12 +193,10 @@ LPWORKER worker_pop (void) } nWorkersCurrent++; nWorkersMax = (nWorkersCurrent > nWorkersMax ? nWorkersCurrent : nWorkersMax); -#ifdef DBUG - dbug_print("Workers running current/runnning max/waiting: %d/%d/%d", + DBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", nWorkersCurrent, nWorkersMax, list_length((LPLIST)lpWorkers)); -#endif ReleaseMutex(hWorkersMutex); if (lpWorkerFree == NULL) @@ -236,34 +224,24 @@ void worker_push(LPWORKER lpWorker) bFreeWorker = TRUE; WaitForSingleObject(hWorkersMutex, INFINITE); -#ifdef DBUG - dbug_print("Testing if we are under the maximum number of running workers"); -#endif + DBUG_PRINT("Testing if we are under the maximum number of running workers"); if (list_length((LPLIST)lpWorkers) < THREAD_WORKERS_MAX) { -#ifdef DBUG - dbug_print("Saving this worker for future use"); -#endif -#ifdef DBUG - dbug_print("Next: %x", ((LPLIST)lpWorker)->lpNext); -#endif + DBUG_PRINT("Saving this worker for future use"); + DBUG_PRINT("Next: %x", ((LPLIST)lpWorker)->lpNext); lpWorkers = (LPWORKER)list_concat((LPLIST)lpWorker, (LPLIST)lpWorkers); bFreeWorker = FALSE; }; nWorkersCurrent--; -#ifdef DBUG - dbug_print("Workers running current/runnning max/waiting: %d/%d/%d", + DBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", nWorkersCurrent, nWorkersMax, list_length((LPLIST)lpWorkers)); -#endif ReleaseMutex(hWorkersMutex); if (bFreeWorker) { -#ifdef DBUG - dbug_print("Freeing worker %x", lpWorker); -#endif + DBUG_PRINT("Freeing worker %x", lpWorker); worker_free(lpWorker); } } @@ -275,9 +253,7 @@ void worker_init (void) /* Init a shared variable. The only way to ensure that no other worker will be at the same point is to use a critical section. */ -#ifdef DBUG - dbug_print("Allocating mutex for workers"); -#endif + DBUG_PRINT("Allocating mutex for workers"); if (hWorkersMutex == INVALID_HANDLE_VALUE) { hWorkersMutex = CreateMutex(NULL, FALSE, NULL); @@ -300,22 +276,18 @@ void worker_cleanup(void) if (hWorkersMutex != INVALID_HANDLE_VALUE) { WaitForSingleObject(hWorkersMutex, INFINITE); -#ifdef DBUG - dbug_print("Freeing global resource of workers"); -#endif + DBUG_PRINT("Freeing global resource of workers"); /* Empty the queue of worker worker */ while (lpWorkers != NULL) { ReleaseMutex(hWorkersMutex); lpWorker = worker_pop(); -#ifdef DBUG - dbug_print("Freeing worker %x", lpWorker); -#endif + DBUG_PRINT("Freeing worker %x", lpWorker); WaitForSingleObject(hWorkersMutex, INFINITE); worker_free(lpWorker); }; ReleaseMutex(hWorkersMutex); - + /* Destroy associated mutex */ CloseHandle(hWorkersMutex); hWorkersMutex = INVALID_HANDLE_VALUE; @@ -326,24 +298,18 @@ LPWORKER worker_job_submit (WORKERFUNC f, void *user_data) { LPWORKER lpWorker = worker_pop(); -#ifdef DBUG - dbug_print("Waiting for worker to be ready"); -#endif + DBUG_PRINT("Waiting for worker to be ready"); enter_blocking_section(); WaitForSingleObject(lpWorker->hWorkerReady, INFINITE); ResetEvent(lpWorker->hWorkerReady); leave_blocking_section(); -#ifdef DBUG - dbug_print("Worker is ready"); -#endif + DBUG_PRINT("Worker is ready"); lpWorker->hJobFunc = f; lpWorker->lpJobUserData = user_data; lpWorker->ECommand = WORKER_CMD_EXEC; -#ifdef DBUG - dbug_print("Call worker (func: %x, worker: %x)", f, lpWorker); -#endif + DBUG_PRINT("Call worker (func: %x, worker: %x)", f, lpWorker); SetEvent(lpWorker->hCommandReady); return (LPWORKER)lpWorker; @@ -356,20 +322,14 @@ HANDLE worker_job_event_done (LPWORKER lpWorker) void worker_job_stop (LPWORKER lpWorker) { -#ifdef DBUG - dbug_print("Sending stop signal to worker %x", lpWorker); -#endif + DBUG_PRINT("Sending stop signal to worker %x", lpWorker); SetEvent(lpWorker->hJobStop); -#ifdef DBUG - dbug_print("Signal sent to worker %x", lpWorker); -#endif + DBUG_PRINT("Signal sent to worker %x", lpWorker); } void worker_job_finish (LPWORKER lpWorker) { -#ifdef DBUG - dbug_print("Finishing call of worker %x", lpWorker); -#endif + DBUG_PRINT("Finishing call of worker %x", lpWorker); enter_blocking_section(); WaitForSingleObject(lpWorker->hJobDone, INFINITE); leave_blocking_section(); diff --git a/otherlibs/win32unix/winworker.h b/otherlibs/win32unix/winworker.h index 6597619a..06450a4e 100644 --- a/otherlibs/win32unix/winworker.h +++ b/otherlibs/win32unix/winworker.h @@ -11,19 +11,19 @@ /* */ /***********************************************************************/ -/* $Id: winworker.h 8961 2008-07-31 12:09:18Z xleroy $ */ +/* $Id$ */ #ifndef _WINWORKER_H #define _WINWORKER_H #define _WIN32_WINNT 0x0400 #include -/* Pool of worker threads. +/* Pool of worker threads. * * These functions help to manage a pool of worker thread and submit task to * the pool. It helps to reduce the number of thread creation. * - * Each worker are started in alertable wait state and jobs are submitted as + * Each worker are started in alertable wait state and jobs are submitted as * APC (asynchronous procedure call). */ @@ -42,16 +42,16 @@ typedef WORKER *LPWORKER; */ typedef void (*WORKERFUNC) (HANDLE, void *); -/* Initialize global data structure for worker +/* Initialize global data structure for worker */ void worker_init (void); -/* Free global data structure for worker +/* Free global data structure for worker */ void worker_cleanup (void); /* Submit a job to worker. Use returned data to synchronize with the procedure - * submitted. + * submitted. */ LPWORKER worker_job_submit (WORKERFUNC f, void *data); @@ -63,7 +63,7 @@ HANDLE worker_job_event_done (LPWORKER); */ void worker_job_stop (LPWORKER); -/* End a job submitted to worker. +/* End a job submitted to worker. */ void worker_job_finish (LPWORKER); diff --git a/otherlibs/win32unix/write.c b/otherlibs/win32unix/write.c index e739f4ba..190d9025 100644 --- a/otherlibs/win32unix/write.c +++ b/otherlibs/win32unix/write.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: write.c 9315 2009-07-15 12:19:12Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index cd6d8c12..2530b44c 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: asttypes.mli 5510 2003-04-25 12:27:31Z xleroy $ *) +(* $Id$ *) (* Auxiliary a.s.t. types used by parsetree and typedtree. *) @@ -33,4 +33,8 @@ type mutable_flag = Immutable | Mutable type virtual_flag = Virtual | Concrete +type override_flag = Override | Fresh + +type closed_flag = Closed | Open + type label = string diff --git a/parsing/lexer.mli b/parsing/lexer.mli index 2e6ff1bc..3ddb5dde 100644 --- a/parsing/lexer.mli +++ b/parsing/lexer.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mli 5961 2003-11-21 16:01:13Z xleroy $ *) +(* $Id$ *) (* The lexical analyzer *) diff --git a/parsing/lexer.mll b/parsing/lexer.mll index a5b0fd37..5da264ec 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lexer.mll 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) (* The lexer definition *) @@ -156,6 +156,17 @@ let char_for_hexadecimal_code lexbuf i = in Char.chr (val1 * 16 + val2) +(* To convert integer literals, allowing max_int + 1 (PR#4210) *) + +let cvt_int_literal s = + - int_of_string ("-" ^ s) +let cvt_int32_literal s = + Int32.neg (Int32.of_string ("-" ^ String.sub s 0 (String.length s - 1))) +let cvt_int64_literal s = + Int64.neg (Int64.of_string ("-" ^ String.sub s 0 (String.length s - 1))) +let cvt_nativeint_literal s = + Nativeint.neg (Nativeint.of_string ("-" ^ String.sub s 0 (String.length s - 1))) + (* Remove underscores from float literals *) let remove_underscores s = @@ -239,7 +250,8 @@ rule token = parse { token lexbuf } | "_" { UNDERSCORE } - | "~" { TILDE } + | "~" + { TILDE } | "~" lowercase identchar * ':' { let s = Lexing.lexeme lexbuf in let name = String.sub s 1 (String.length s - 2) in @@ -264,29 +276,25 @@ rule token = parse { UIDENT(Lexing.lexeme lexbuf) } (* No capitalized keywords *) | int_literal { try - INT (int_of_string(Lexing.lexeme lexbuf)) + INT (cvt_int_literal (Lexing.lexeme lexbuf)) with Failure _ -> raise (Error(Literal_overflow "int", Location.curr lexbuf)) } | float_literal { FLOAT (remove_underscores(Lexing.lexeme lexbuf)) } | int_literal "l" - { let s = Lexing.lexeme lexbuf in - try - INT32 (Int32.of_string(String.sub s 0 (String.length s - 1))) + { try + INT32 (cvt_int32_literal (Lexing.lexeme lexbuf)) with Failure _ -> raise (Error(Literal_overflow "int32", Location.curr lexbuf)) } | int_literal "L" - { let s = Lexing.lexeme lexbuf in - try - INT64 (Int64.of_string(String.sub s 0 (String.length s - 1))) + { try + INT64 (cvt_int64_literal (Lexing.lexeme lexbuf)) with Failure _ -> raise (Error(Literal_overflow "int64", Location.curr lexbuf)) } | int_literal "n" - { let s = Lexing.lexeme lexbuf in - try - NATIVEINT - (Nativeint.of_string(String.sub s 0 (String.length s - 1))) + { try + NATIVEINT (cvt_nativeint_literal (Lexing.lexeme lexbuf)) with Failure _ -> raise (Error(Literal_overflow "nativeint", Location.curr lexbuf)) } | "\"" @@ -372,13 +380,15 @@ rule token = parse | ">]" { GREATERRBRACKET } | "}" { RBRACE } | ">}" { GREATERRBRACE } + | "!" { BANG } | "!=" { INFIXOP0 "!=" } | "+" { PLUS } + | "+." { PLUSDOT } | "-" { MINUS } | "-." { MINUSDOT } - | "!" symbolchar * + | "!" symbolchar + { PREFIXOP(Lexing.lexeme lexbuf) } | ['~' '?'] symbolchar + { PREFIXOP(Lexing.lexeme lexbuf) } @@ -481,7 +491,9 @@ and string = parse end } | newline - { update_loc lexbuf None 1 false 0; + { if not (in_comment ()) then + Location.prerr_warning (Location.curr lexbuf) Warnings.Eol_in_string; + update_loc lexbuf None 1 false 0; let s = Lexing.lexeme lexbuf in for i = 0 to String.length s - 1 do store_string_char s.[i]; diff --git a/parsing/linenum.mli b/parsing/linenum.mli index 0dc4978d..50cc57e8 100644 --- a/parsing/linenum.mli +++ b/parsing/linenum.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: linenum.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* An auxiliary lexer for determining the line number corresponding to a file position, honoring the directives # linenum "filename" *) diff --git a/parsing/linenum.mll b/parsing/linenum.mll index 13924738..91e71e97 100644 --- a/parsing/linenum.mll +++ b/parsing/linenum.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: linenum.mll 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* An auxiliary lexer for determining the line number corresponding to a file position, honoring the directives # linenum "filename" *) @@ -30,7 +30,7 @@ let parse_sharp_line s = linenum := int_of_string(String.sub s !l1 (!l2 - !l1)); let f1 = ref (!l2 + 1) in while !f1 < String.length s && s.[!f1] <> '"' do incr f1 done; - let f2 = ref (!f1 + 1) in + let f2 = ref (!f1 + 1) in while !f2 < String.length s && s.[!f2] <> '"' do incr f2 done; if !f1 < String.length s then filename := String.sub s (!f1 + 1) (!f2 - !f1 - 1) diff --git a/parsing/location.ml b/parsing/location.ml index a9b73597..15b074ac 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: location.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) open Lexing diff --git a/parsing/location.mli b/parsing/location.mli index 9ca64c1f..a496a355 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: location.mli 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) (* Source code locations (ranges of positions), used in parsetree. *) diff --git a/parsing/longident.ml b/parsing/longident.ml index a54a33c6..1b459ca3 100644 --- a/parsing/longident.ml +++ b/parsing/longident.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: longident.ml 2990 2000-03-25 18:55:45Z xleroy $ *) +(* $Id$ *) type t = Lident of string @@ -24,6 +24,11 @@ let rec flat accu = function let flatten lid = flat [] lid +let last = function + Lident s -> s + | Ldot(lid, s) -> s + | Lapply(l1, l2) -> Misc.fatal_error "Longident.last" + let rec split_at_dots s pos = try let dot = String.index_from s pos '.' in diff --git a/parsing/longident.mli b/parsing/longident.mli index fd360c44..4568bc95 100644 --- a/parsing/longident.mli +++ b/parsing/longident.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: longident.mli 2990 2000-03-25 18:55:45Z xleroy $ *) +(* $Id$ *) (* Long identifiers, used in parsetree. *) @@ -20,4 +20,5 @@ type t = | Lapply of t * t val flatten: t -> string list +val last: t -> string val parse: string -> t diff --git a/parsing/parse.ml b/parsing/parse.ml index 0ec6abf0..7f3e4cdc 100644 --- a/parsing/parse.ml +++ b/parsing/parse.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parse.ml 5224 2002-11-01 17:06:47Z doligez $ *) +(* $Id$ *) (* Entry points in the parser *) @@ -53,7 +53,7 @@ let wrap parsing_fun lexbuf = raise err | Parsing.Parse_error | Syntaxerr.Escape_error -> let loc = Location.curr lexbuf in - if !Location.input_name = "" + if !Location.input_name = "" then maybe_skip_phrase lexbuf; raise(Syntaxerr.Error(Syntaxerr.Other loc)) ;; diff --git a/parsing/parse.mli b/parsing/parse.mli index 8fc222c5..87a09f0e 100644 --- a/parsing/parse.mli +++ b/parsing/parse.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parse.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Entry points in the parser *) @@ -18,4 +18,3 @@ val implementation : Lexing.lexbuf -> Parsetree.structure val interface : Lexing.lexbuf -> Parsetree.signature val toplevel_phrase : Lexing.lexbuf -> Parsetree.toplevel_phrase val use_file : Lexing.lexbuf -> Parsetree.toplevel_phrase list - diff --git a/parsing/parser.mly b/parsing/parser.mly index 65b9ca34..6232e4fd 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: parser.mly 9412 2009-11-09 11:42:39Z weis $ */ +/* $Id$ */ /* The parser definition */ @@ -98,6 +98,12 @@ let mkuminus name arg = | _ -> mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg])) +let mkuplus name arg = + match name, arg.pexp_desc with + | "+", desc -> mkexp desc + | _ -> + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg])) + let rec mktailexp = function [] -> ghexp(Pexp_construct(Lident "[]", None, false)) @@ -169,7 +175,7 @@ let bigarray_get arr arg = ["", arr; "", ghexp(Pexp_array coords)])) let bigarray_set arr arg newval = - let set = if !Clflags.fast then "unsafe_set" else "set" in + let set = if !Clflags.fast then "unsafe_set" else "set" in match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" set)), @@ -185,6 +191,18 @@ let bigarray_set arr arg newval = ["", arr; "", ghexp(Pexp_array coords); "", newval])) + +let lapply p1 p2 = + if !Clflags.applicative_functors + then Lapply(p1, p2) + else raise (Syntaxerr.Error(Syntaxerr.Applicative_path (symbol_rloc()))) + +let exp_of_label lbl = + mkexp (Pexp_ident(Lident(Longident.last lbl))) + +let pat_of_label lbl = + mkpat (Ppat_var(Longident.last lbl)) + %} /* Tokens */ @@ -195,6 +213,7 @@ let bigarray_set arr arg newval = %token AS %token ASSERT %token BACKQUOTE +%token BANG %token BAR %token BARBAR %token BARRBRACKET @@ -269,6 +288,7 @@ let bigarray_set arr arg newval = %token OR /* %token PARSER */ %token PLUS +%token PLUSDOT %token PREFIXOP %token PRIVATE %token QUESTION @@ -344,10 +364,10 @@ The precedences must be listed from low to high. %left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e) */ %right INFIXOP1 /* expr (e OP e OP e) */ %right COLONCOLON /* expr (e :: e :: e) */ -%left INFIXOP2 PLUS MINUS MINUSDOT /* expr (e OP e OP e) */ +%left INFIXOP2 PLUS PLUSDOT MINUS MINUSDOT /* expr (e OP e OP e) */ %left INFIXOP3 STAR /* expr (e OP e OP e) */ %right INFIXOP4 /* expr (e OP e OP e) */ -%nonassoc prec_unary_minus /* unary - */ +%nonassoc prec_unary_minus prec_unary_plus /* unary - */ %nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */ %nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */ %nonassoc below_SHARP @@ -355,7 +375,7 @@ The precedences must be listed from low to high. %nonassoc below_DOT %nonassoc DOT /* Finally, the first tokens of simple_expr are above everything else. */ -%nonassoc BACKQUOTE BEGIN CHAR FALSE FLOAT INT INT32 INT64 +%nonassoc BACKQUOTE BANG BEGIN CHAR FALSE FLOAT INT INT32 INT64 LBRACE LBRACELESS LBRACKET LBRACKETBAR LIDENT LPAREN NEW NATIVEINT PREFIXOP STRING TRUE UIDENT @@ -428,6 +448,8 @@ module_expr: { $2 } | LPAREN module_expr error { unclosed "(" 1 ")" 3 } + | LPAREN VAL expr COLON package_type RPAREN + { mkmod(Pmod_unpack($3, $5)) } ; structure: structure_tail { $1 } @@ -498,6 +520,8 @@ module_type: { mkmty(Pmty_functor($3, $5, $8)) } | module_type WITH with_constraints { mkmty(Pmty_with($1, List.rev $3)) } + | MODULE TYPE OF module_expr + { mkmty(Pmty_typeof $4) } | LPAREN module_type RPAREN { $2 } | LPAREN module_type error @@ -623,8 +647,8 @@ class_self_pattern: class_fields: /* empty */ { [] } - | class_fields INHERIT class_expr parent_binder - { Pcf_inher ($3, $4) :: $1 } + | class_fields INHERIT override_flag class_expr parent_binder + { Pcf_inher ($3, $4, $5) :: $1 } | class_fields VAL virtual_value { Pcf_valvirt $3 :: $1 } | class_fields VAL value @@ -645,29 +669,32 @@ parent_binder: { None } ; virtual_value: - MUTABLE VIRTUAL label COLON core_type - { $3, Mutable, $5, symbol_rloc () } + override_flag MUTABLE VIRTUAL label COLON core_type + { if $1 = Override then syntax_error (); + $4, Mutable, $6, 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'))), + override_flag mutable_flag label EQUAL seq_expr + { $3, $2, $1, $5, symbol_rloc () } + | override_flag mutable_flag label type_constraint EQUAL seq_expr + { $3, $2, $1, (let (t, t') = $4 in ghexp(Pexp_constraint($6, t, t'))), symbol_rloc () } ; virtual_method: - METHOD PRIVATE VIRTUAL label COLON poly_type - { $4, Private, $6, symbol_rloc () } - | METHOD VIRTUAL private_flag label COLON poly_type - { $4, $3, $6, symbol_rloc () } + METHOD override_flag PRIVATE VIRTUAL label COLON poly_type + { if $2 = Override then syntax_error (); + $5, Private, $7, symbol_rloc () } + | METHOD override_flag VIRTUAL private_flag label COLON poly_type + { if $2 = Override then syntax_error (); + $5, $4, $7, symbol_rloc () } ; concrete_method : - METHOD private_flag label strict_binding - { $3, $2, ghexp(Pexp_poly ($4, None)), symbol_rloc () } - | METHOD private_flag label COLON poly_type EQUAL seq_expr - { $3, $2, ghexp(Pexp_poly($7,Some $5)), symbol_rloc () } + METHOD override_flag private_flag label strict_binding + { $4, $3, $2, ghexp(Pexp_poly ($5, None)), symbol_rloc () } + | METHOD override_flag private_flag label COLON poly_type EQUAL seq_expr + { $4, $3, $2, ghexp(Pexp_poly($8,Some $6)), symbol_rloc () } ; /* Class types */ @@ -677,12 +704,14 @@ class_type: { $1 } | QUESTION LIDENT COLON simple_core_type_or_tuple MINUSGREATER class_type { mkcty(Pcty_fun("?" ^ $2 , - {ptyp_desc = Ptyp_constr(Ldot (Lident "*predef*", "option"), [$4]); + {ptyp_desc = + Ptyp_constr(Ldot (Lident "*predef*", "option"), [$4]); ptyp_loc = $4.ptyp_loc}, $6)) } | OPTLABEL simple_core_type_or_tuple MINUSGREATER class_type { mkcty(Pcty_fun("?" ^ $1 , - {ptyp_desc = Ptyp_constr(Ldot (Lident "*predef*", "option"), [$2]); + {ptyp_desc = + Ptyp_constr(Ldot (Lident "*predef*", "option"), [$2]); ptyp_loc = $2.ptyp_loc}, $4)) } | LIDENT COLON simple_core_type_or_tuple MINUSGREATER class_type @@ -714,7 +743,7 @@ class_sig_fields: /* empty */ { [] } | class_sig_fields INHERIT class_signature { Pctf_inher $3 :: $1 } | class_sig_fields VAL value_type { Pctf_val $3 :: $1 } - | class_sig_fields virtual_method { Pctf_virt $2 :: $1 } + | class_sig_fields virtual_method_type { Pctf_virt $2 :: $1 } | class_sig_fields method_type { Pctf_meth $2 :: $1 } | class_sig_fields CONSTRAINT constrain { Pctf_cstr $3 :: $1 } ; @@ -730,6 +759,12 @@ method_type: METHOD private_flag label COLON poly_type { $3, $2, $5, symbol_rloc () } ; +virtual_method_type: + METHOD PRIVATE VIRTUAL label COLON poly_type + { $4, Private, $6, symbol_rloc () } + | METHOD VIRTUAL private_flag label COLON poly_type + { $4, $3, $6, symbol_rloc () } +; constrain: core_type EQUAL core_type { $1, $3, symbol_rloc () } ; @@ -813,10 +848,16 @@ expr: { mkexp(Pexp_let($2, List.rev $3, $5)) } | LET MODULE UIDENT module_binding IN seq_expr { mkexp(Pexp_letmodule($3, $4, $6)) } + | LET OPEN mod_longident IN seq_expr + { mkexp(Pexp_open($3, $5)) } + | mod_longident DOT LPAREN seq_expr RPAREN + { mkexp(Pexp_open($1, $4)) } | FUNCTION opt_bar match_cases { mkexp(Pexp_function("", None, List.rev $3)) } | FUN labeled_simple_pattern fun_def { 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 { mkexp(Pexp_match($2, List.rev $5)) } | TRY seq_expr WITH opt_bar match_cases @@ -857,6 +898,8 @@ expr: { mkinfix $1 $2 $3 } | expr PLUS expr { mkinfix $1 "+" $3 } + | expr PLUSDOT expr + { mkinfix $1 "+." $3 } | expr MINUS expr { mkinfix $1 "-" $3 } | expr MINUSDOT expr @@ -881,6 +924,8 @@ expr: { mkinfix $1 ":=" $3 } | subtractive expr %prec prec_unary_minus { mkuminus $1 $2 } + | additive expr %prec prec_unary_plus + { mkuplus $1 $2 } | simple_expr DOT label_longident LESSMINUS expr { mkexp(Pexp_setfield($1, $3, $5)) } | simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr @@ -955,6 +1000,8 @@ simple_expr: { unclosed "[" 1 "]" 4 } | PREFIXOP simple_expr { mkexp(Pexp_apply(mkoperator $1 1, ["",$2])) } + | BANG simple_expr + { mkexp(Pexp_apply(mkoperator "!" 1, ["",$2])) } | NEW class_longident { mkexp(Pexp_new($2)) } | LBRACELESS field_expr_list opt_semi GREATERRBRACE @@ -965,6 +1012,8 @@ simple_expr: { mkexp(Pexp_override []) } | simple_expr SHARP label { mkexp(Pexp_send($1, $3)) } + | LPAREN MODULE module_expr COLON package_type RPAREN + { mkexp (Pexp_pack ($3, $5)) } ; simple_labeled_expr_list: labeled_simple_expr @@ -998,6 +1047,10 @@ let_bindings: let_binding: val_ident fun_binding { ({ppat_desc = Ppat_var $1; ppat_loc = rhs_loc 1}, $2) } + | val_ident COLON typevar_list DOT core_type EQUAL seq_expr + { (ghpat(Ppat_constraint({ppat_desc = Ppat_var $1; ppat_loc = rhs_loc 1}, + ghtyp(Ptyp_poly($3,$5)))), + $7) } | pattern EQUAL seq_expr { ($1, $3) } ; @@ -1012,6 +1065,8 @@ strict_binding: { $2 } | labeled_simple_pattern fun_binding { 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] } @@ -1021,6 +1076,8 @@ fun_def: match_action { $1 } | labeled_simple_pattern fun_def { let (l,o,p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) } + | LPAREN TYPE LIDENT RPAREN fun_def + { mkexp(Pexp_newtype($3, $5)) } ; match_action: MINUSGREATER seq_expr { $2 } @@ -1037,8 +1094,12 @@ record_expr: lbl_expr_list: label_longident EQUAL expr { [$1,$3] } + | label_longident + { [$1, exp_of_label $1] } | lbl_expr_list SEMI label_longident EQUAL expr { ($3, $5) :: $1 } + | lbl_expr_list SEMI label_longident + { ($3, exp_of_label $3) :: $1 } ; field_expr_list: label EQUAL expr @@ -1097,8 +1158,8 @@ simple_pattern: { mkpat(Ppat_variant($1, None)) } | SHARP type_longident { mkpat(Ppat_type $2) } - | LBRACE lbl_pattern_list opt_semi RBRACE - { mkpat(Ppat_record(List.rev $2)) } + | LBRACE lbl_pattern_list record_pattern_end RBRACE + { mkpat(Ppat_record(List.rev $2, $3)) } | LBRACE lbl_pattern_list opt_semi error { unclosed "{" 1 "}" 4 } | LBRACKET pattern_semi_list opt_semi RBRACKET @@ -1131,7 +1192,13 @@ pattern_semi_list: ; lbl_pattern_list: label_longident EQUAL pattern { [($1, $3)] } + | label_longident { [($1, pat_of_label $1)] } | lbl_pattern_list SEMI label_longident EQUAL pattern { ($3, $5) :: $1 } + | lbl_pattern_list SEMI label_longident { ($3, pat_of_label $3) :: $1 } +; +record_pattern_end: + opt_semi { Closed } + | SEMI UNDERSCORE opt_semi { Open } ; /* Primitive declarations */ @@ -1169,6 +1236,8 @@ type_kind: { (Ptype_abstract, Public, None) } | EQUAL core_type { (Ptype_abstract, Public, Some $2) } + | EQUAL PRIVATE core_type + { (Ptype_abstract, Private, Some $3) } | EQUAL constructor_declarations { (Ptype_variant(List.rev $2), Public, None) } | EQUAL PRIVATE constructor_declarations @@ -1181,8 +1250,6 @@ type_kind: { (Ptype_variant(List.rev $6), $4, Some $2) } | EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_semi RBRACE { (Ptype_record(List.rev $6), $4, Some $2) } - | EQUAL PRIVATE core_type - { (Ptype_abstract, Private, Some $3) } ; type_parameters: /*empty*/ { [] } @@ -1238,8 +1305,19 @@ with_constraint: ptype_loc = symbol_rloc()}) } /* used label_longident instead of type_longident to disallow functor applications in type path */ + | TYPE type_parameters label_longident COLONEQUAL core_type + { let params, variance = List.split $2 in + ($3, Pwith_typesubst {ptype_params = params; + ptype_cstrs = []; + ptype_kind = Ptype_abstract; + ptype_manifest = Some $5; + ptype_private = Public; + ptype_variance = variance; + ptype_loc = symbol_rloc()}) } | MODULE mod_longident EQUAL mod_ext_longident { ($2, Pwith_module $4) } + | MODULE mod_longident COLONEQUAL mod_ext_longident + { ($2, Pwith_modsubst $4) } ; with_type_binder: EQUAL { Public } @@ -1329,6 +1407,19 @@ simple_core_type2: { mktyp(Ptyp_variant(List.rev $3, true, Some [])) } | LBRACKETLESS opt_bar row_field_list GREATER name_tag_list RBRACKET { mktyp(Ptyp_variant(List.rev $3, true, Some (List.rev $5))) } + | LPAREN MODULE package_type RPAREN + { mktyp(Ptyp_package $3) } +; +package_type: + mty_longident { ($1, []) } + | mty_longident WITH package_type_cstrs { ($1, $3) } + +package_type_cstr: + TYPE LIDENT EQUAL core_type { ($2, $4) } +; +package_type_cstrs: + package_type_cstr { [$1] } + | package_type_cstr AND package_type_cstrs { $1::$3 } ; row_field_list: row_field { [$1] } @@ -1427,7 +1518,9 @@ operator: | INFIXOP2 { $1 } | INFIXOP3 { $1 } | INFIXOP4 { $1 } + | BANG { "!" } | PLUS { "+" } + | PLUSDOT { "+." } | MINUS { "-" } | MINUSDOT { "-." } | STAR { "*" } @@ -1476,7 +1569,7 @@ mod_longident: mod_ext_longident: UIDENT { Lident $1 } | mod_ext_longident DOT UIDENT { Ldot($1, $3) } - | mod_ext_longident LPAREN mod_ext_longident RPAREN { Lapply($1, $3) } + | mod_ext_longident LPAREN mod_ext_longident RPAREN { lapply $1 $3 } ; mty_longident: ident { Lident $1 } @@ -1527,6 +1620,10 @@ virtual_flag: /* empty */ { Concrete } | VIRTUAL { Virtual } ; +override_flag: + /* empty */ { Fresh } + | BANG { Override } +; opt_bar: /* empty */ { () } | BAR { () } @@ -1539,4 +1636,8 @@ subtractive: | MINUS { "-" } | MINUSDOT { "-." } ; +additive: + | PLUS { "+" } + | PLUSDOT { "+." } +; %% diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 3d6ceef9..05f92bd0 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parsetree.mli 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) (* Abstract syntax tree produced by parsing *) @@ -22,7 +22,7 @@ type core_type = { ptyp_desc: core_type_desc; ptyp_loc: Location.t } -and core_type_desc = +and core_type_desc = Ptyp_any | Ptyp_var of string | Ptyp_arrow of label * core_type * core_type @@ -33,6 +33,9 @@ and core_type_desc = | Ptyp_alias of core_type * string | Ptyp_variant of row_field list * bool * label list option | Ptyp_poly of string list * core_type + | Ptyp_package of package_type + +and package_type = Longident.t * (string * core_type) list and core_field_type = { pfield_desc: core_field_desc; @@ -46,7 +49,7 @@ and row_field = Rtag of label * bool * core_type list | Rinherit of core_type -(* XXX Type expressions for the class language *) +(* Type expressions for the class language *) type 'a class_infos = { pci_virt: virtual_flag; @@ -70,7 +73,7 @@ and pattern_desc = | Ppat_tuple of pattern list | Ppat_construct of Longident.t * pattern option * bool | Ppat_variant of label * pattern option - | Ppat_record of (Longident.t * pattern) list + | Ppat_record of (Longident.t * pattern) list * closed_flag | Ppat_array of pattern list | Ppat_or of pattern * pattern | Ppat_constraint of pattern * core_type @@ -112,6 +115,9 @@ and expression_desc = | Pexp_lazy of expression | Pexp_poly of expression * core_type option | Pexp_object of class_structure + | Pexp_newtype of string * expression + | Pexp_pack of module_expr * package_type + | Pexp_open of Longident.t * expression (* Value descriptions *) @@ -179,11 +185,11 @@ and class_expr_desc = and class_structure = pattern * class_field list and class_field = - Pcf_inher of class_expr * string option + Pcf_inher of override_flag * class_expr * string option | Pcf_valvirt of (string * mutable_flag * core_type * Location.t) - | Pcf_val of (string * mutable_flag * expression * Location.t) + | Pcf_val of (string * mutable_flag * override_flag * expression * Location.t) | Pcf_virt of (string * private_flag * core_type * Location.t) - | Pcf_meth of (string * private_flag * expression * Location.t) + | Pcf_meth of (string * private_flag *override_flag * expression * Location.t) | Pcf_cstr of (core_type * core_type * Location.t) | Pcf_let of rec_flag * (pattern * expression) list * Location.t | Pcf_init of expression @@ -201,6 +207,7 @@ and module_type_desc = | Pmty_signature of signature | Pmty_functor of string * module_type * module_type | Pmty_with of module_type * (Longident.t * with_constraint) list + | Pmty_typeof of module_expr and signature = signature_item list @@ -227,8 +234,10 @@ and modtype_declaration = and with_constraint = Pwith_type of type_declaration | Pwith_module of Longident.t + | Pwith_typesubst of type_declaration + | Pwith_modsubst of Longident.t -(* Value expressions for the module language *) +(* value expressions for the module language *) and module_expr = { pmod_desc: module_expr_desc; @@ -240,6 +249,7 @@ and module_expr_desc = | Pmod_functor of string * module_type * module_expr | Pmod_apply of module_expr * module_expr | Pmod_constraint of module_expr * module_type + | Pmod_unpack of expression * package_type and structure = structure_item list diff --git a/parsing/printast.ml b/parsing/printast.ml index aa5b1fd1..f63e21b8 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printast.ml 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) open Asttypes;; open Format;; @@ -65,6 +65,12 @@ let fmt_virtual_flag f x = | Concrete -> fprintf f "Concrete"; ;; +let fmt_override_flag f x = + match x with + | Override -> fprintf f "Override"; + | Fresh -> fprintf f "Fresh"; +;; + let fmt_rec_flag f x = match x with | Nonrecursive -> fprintf f "Nonrec"; @@ -146,6 +152,13 @@ let rec core_type i ppf x = line i ppf "Ptyp_poly%a\n" (fun ppf -> List.iter (fun x -> fprintf ppf " '%s" x)) sl; core_type i ppf ct; + | Ptyp_package (s, l) -> + line i ppf "Ptyp_package %a\n" fmt_longident s; + list i package_with ppf l + +and package_with i ppf (s, t) = + line i ppf "with type %s\n" s; + core_type i ppf t and core_field_type i ppf x = line i ppf "core_field_type %a\n" fmt_location x.pfield_loc; @@ -176,7 +189,7 @@ and pattern i ppf x = | Ppat_variant (l, po) -> line i ppf "Ppat_variant \"%s\"\n" l; option i pattern ppf po; - | Ppat_record (l) -> + | Ppat_record (l, c) -> line i ppf "Ppat_record\n"; list i longident_x_pattern ppf l; | Ppat_array (l) -> @@ -305,6 +318,16 @@ and expression i ppf x = | Pexp_object s -> line i ppf "Pexp_object"; class_structure i ppf s + | Pexp_newtype (s, e) -> + line i ppf "Pexp_newtype \"%s\"\n" s; + expression i ppf e + | Pexp_pack (me, (p,l)) -> + line i ppf "Pexp_pack %a" fmt_longident p; + list i package_with ppf l; + module_expr i ppf me + | Pexp_open (m, e) -> + line i ppf "Pexp_open \"%a\"\n" fmt_longident m; + expression i ppf e and value_description i ppf x = line i ppf "value_description\n"; @@ -436,25 +459,25 @@ and class_structure i ppf (p, l) = and class_field i ppf x = match x with - | Pcf_inher (ce, so) -> - line i ppf "Pcf_inher\n"; + | Pcf_inher (ovf, ce, so) -> + line i ppf "Pcf_inher %a\n" fmt_override_flag ovf; 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; + 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; + | Pcf_val (s, mf, ovf, e, loc) -> + line i ppf "Pcf_val \"%s\" %a %a %a\n" + s fmt_mutable_flag mf fmt_override_flag ovf fmt_location loc; expression (i+1) ppf e; | Pcf_virt (s, pf, ct, loc) -> - line i ppf - "Pcf_virt \"%s\" %a %a\n" s fmt_private_flag pf fmt_location loc; + line i ppf "Pcf_virt \"%s\" %a %a\n" + s fmt_private_flag pf fmt_location loc; core_type (i+1) ppf ct; - | Pcf_meth (s, pf, e, loc) -> - line i ppf - "Pcf_meth \"%s\" %a %a\n" s fmt_private_flag pf fmt_location loc; + | Pcf_meth (s, pf, ovf, e, loc) -> + line i ppf "Pcf_meth \"%s\" %a %a %a\n" + s fmt_private_flag pf fmt_override_flag ovf fmt_location loc; expression (i+1) ppf e; | Pcf_cstr (ct1, ct2, loc) -> line i ppf "Pcf_cstr %a\n" fmt_location loc; @@ -493,6 +516,9 @@ and module_type i ppf x = line i ppf "Pmty_with\n"; module_type i ppf mt; list i longident_x_with_constraint ppf l; + | Pmty_typeof m -> + line i ppf "Pmty_typeof\n"; + module_expr i ppf m and signature i ppf x = list i signature_item ppf x @@ -541,7 +567,11 @@ and with_constraint i ppf x = | Pwith_type (td) -> line i ppf "Pwith_type\n"; type_declaration (i+1) ppf td; + | Pwith_typesubst (td) -> + line i ppf "Pwith_typesubst\n"; + 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; and module_expr i ppf x = line i ppf "module_expr %a\n" fmt_location x.pmod_loc; @@ -563,6 +593,10 @@ and module_expr i ppf x = line i ppf "Pmod_constraint\n"; module_expr i ppf me; module_type i ppf mt; + | Pmod_unpack (e, (p, l)) -> + line i ppf "Pmod_unpack %a\n" fmt_longident p; + list i package_with ppf l; + expression i ppf e; and structure i ppf x = list i structure_item ppf x diff --git a/parsing/printast.mli b/parsing/printast.mli index 4a33e3fe..7ea14867 100644 --- a/parsing/printast.mli +++ b/parsing/printast.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printast.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) open Parsetree;; open Format;; diff --git a/parsing/syntaxerr.ml b/parsing/syntaxerr.ml index ddaf72ce..edaabda1 100644 --- a/parsing/syntaxerr.ml +++ b/parsing/syntaxerr.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: syntaxerr.ml 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) (* Auxiliary type for reporting syntax errors *) @@ -18,6 +18,7 @@ open Format type error = Unclosed of Location.t * string * Location.t * string + | Applicative_path of Location.t | Other of Location.t exception Error of error @@ -35,5 +36,8 @@ let report_error ppf = function fprintf ppf "%aThis '%s' might be unmatched" Location.print_error opening_loc opening end + | Applicative_path loc -> + fprintf ppf "%aSyntax error: applicative paths of the form F(X).t are not supported when the option -no-app-func is set." + Location.print_error loc | Other loc -> fprintf ppf "%aSyntax error" Location.print_error loc diff --git a/parsing/syntaxerr.mli b/parsing/syntaxerr.mli index 4aa715a2..4e967992 100644 --- a/parsing/syntaxerr.mli +++ b/parsing/syntaxerr.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: syntaxerr.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) (* Auxiliary type for reporting syntax errors *) @@ -18,6 +18,7 @@ open Format type error = Unclosed of Location.t * string * Location.t * string + | Applicative_path of Location.t | Other of Location.t exception Error of error diff --git a/stdlib/.depend b/stdlib/.depend index e3bbebea..1c7e2a3f 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -1,144 +1,146 @@ -arg.cmi: -array.cmi: -arrayLabels.cmi: -buffer.cmi: -callback.cmi: -camlinternalLazy.cmi: -camlinternalMod.cmi: obj.cmi -camlinternalOO.cmi: obj.cmi -char.cmi: -complex.cmi: -digest.cmi: -filename.cmi: -format.cmi: pervasives.cmi buffer.cmi -gc.cmi: -genlex.cmi: stream.cmi -hashtbl.cmi: -int32.cmi: -int64.cmi: -lazy.cmi: -lexing.cmi: -list.cmi: -listLabels.cmi: -map.cmi: -marshal.cmi: -moreLabels.cmi: set.cmi map.cmi hashtbl.cmi -nativeint.cmi: -obj.cmi: -oo.cmi: camlinternalOO.cmi -parsing.cmi: obj.cmi lexing.cmi -pervasives.cmi: -printexc.cmi: -printf.cmi: obj.cmi buffer.cmi -queue.cmi: -random.cmi: nativeint.cmi int64.cmi int32.cmi -scanf.cmi: -set.cmi: -sort.cmi: -stack.cmi: -stdLabels.cmi: -stream.cmi: -string.cmi: -stringLabels.cmi: -sys.cmi: -weak.cmi: hashtbl.cmi -arg.cmo: sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi arg.cmi -arg.cmx: sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx arg.cmi -array.cmo: array.cmi -array.cmx: array.cmi -arrayLabels.cmo: array.cmi arrayLabels.cmi -arrayLabels.cmx: array.cmx arrayLabels.cmi -buffer.cmo: sys.cmi string.cmi buffer.cmi -buffer.cmx: sys.cmx string.cmx buffer.cmi -callback.cmo: obj.cmi callback.cmi -callback.cmx: obj.cmx callback.cmi -camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi -camlinternalLazy.cmx: obj.cmx camlinternalLazy.cmi -camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi -camlinternalMod.cmx: obj.cmx camlinternalOO.cmx array.cmx camlinternalMod.cmi +arg.cmi: +array.cmi: +arrayLabels.cmi: +buffer.cmi: +callback.cmi: +camlinternalLazy.cmi: +camlinternalMod.cmi: obj.cmi +camlinternalOO.cmi: obj.cmi +char.cmi: +complex.cmi: +digest.cmi: +filename.cmi: +format.cmi: pervasives.cmi buffer.cmi +gc.cmi: +genlex.cmi: stream.cmi +hashtbl.cmi: +int32.cmi: +int64.cmi: +lazy.cmi: +lexing.cmi: +list.cmi: +listLabels.cmi: +map.cmi: +marshal.cmi: +moreLabels.cmi: set.cmi map.cmi hashtbl.cmi +nativeint.cmi: +obj.cmi: int32.cmi +oo.cmi: camlinternalOO.cmi +parsing.cmi: obj.cmi lexing.cmi +pervasives.cmi: +printexc.cmi: +printf.cmi: obj.cmi buffer.cmi +queue.cmi: +random.cmi: nativeint.cmi int64.cmi int32.cmi +scanf.cmi: pervasives.cmi +set.cmi: +sort.cmi: +stack.cmi: +stdLabels.cmi: +stream.cmi: +string.cmi: +stringLabels.cmi: +sys.cmi: +weak.cmi: hashtbl.cmi +arg.cmo: sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi arg.cmi +arg.cmx: sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx arg.cmi +array.cmo: array.cmi +array.cmx: array.cmi +arrayLabels.cmo: array.cmi arrayLabels.cmi +arrayLabels.cmx: array.cmx arrayLabels.cmi +buffer.cmo: sys.cmi string.cmi buffer.cmi +buffer.cmx: sys.cmx string.cmx buffer.cmi +callback.cmo: obj.cmi callback.cmi +callback.cmx: obj.cmx callback.cmi +camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi +camlinternalLazy.cmx: obj.cmx camlinternalLazy.cmi +camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi +camlinternalMod.cmx: obj.cmx camlinternalOO.cmx array.cmx camlinternalMod.cmi camlinternalOO.cmo: sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ - array.cmi camlinternalOO.cmi + array.cmi camlinternalOO.cmi camlinternalOO.cmx: sys.cmx string.cmx obj.cmx map.cmx list.cmx char.cmx \ - array.cmx camlinternalOO.cmi -char.cmo: char.cmi -char.cmx: char.cmi -complex.cmo: complex.cmi -complex.cmx: complex.cmi -digest.cmo: string.cmi printf.cmi digest.cmi -digest.cmx: string.cmx printf.cmx digest.cmi + array.cmx camlinternalOO.cmi +char.cmo: char.cmi +char.cmx: char.cmi +complex.cmo: complex.cmi +complex.cmx: complex.cmi +digest.cmo: string.cmi printf.cmi digest.cmi +digest.cmx: string.cmx printf.cmx digest.cmi filename.cmo: sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \ - filename.cmi + filename.cmi filename.cmx: sys.cmx string.cmx random.cmx printf.cmx buffer.cmx \ - filename.cmi -format.cmo: string.cmi printf.cmi obj.cmi list.cmi buffer.cmi format.cmi -format.cmx: string.cmx printf.cmx obj.cmx list.cmx buffer.cmx format.cmi -gc.cmo: sys.cmi printf.cmi gc.cmi -gc.cmx: sys.cmx printf.cmx gc.cmi -genlex.cmo: string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi -genlex.cmx: string.cmx stream.cmx list.cmx hashtbl.cmx char.cmx genlex.cmi -hashtbl.cmo: sys.cmi array.cmi hashtbl.cmi -hashtbl.cmx: sys.cmx array.cmx hashtbl.cmi -int32.cmo: pervasives.cmi int32.cmi -int32.cmx: pervasives.cmx int32.cmi -int64.cmo: pervasives.cmi int64.cmi -int64.cmx: pervasives.cmx int64.cmi -lazy.cmo: obj.cmi camlinternalLazy.cmi lazy.cmi -lazy.cmx: obj.cmx camlinternalLazy.cmx lazy.cmi -lexing.cmo: sys.cmi string.cmi array.cmi lexing.cmi -lexing.cmx: sys.cmx string.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 -map.cmo: map.cmi -map.cmx: map.cmi -marshal.cmo: string.cmi marshal.cmi -marshal.cmx: string.cmx marshal.cmi -moreLabels.cmo: set.cmi map.cmi hashtbl.cmi moreLabels.cmi -moreLabels.cmx: set.cmx map.cmx hashtbl.cmx moreLabels.cmi -nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi -nativeint.cmx: sys.cmx pervasives.cmx nativeint.cmi -obj.cmo: marshal.cmi array.cmi obj.cmi -obj.cmx: marshal.cmx array.cmx obj.cmi -oo.cmo: camlinternalOO.cmi oo.cmi -oo.cmx: camlinternalOO.cmx oo.cmi -parsing.cmo: obj.cmi lexing.cmi array.cmi parsing.cmi -parsing.cmx: obj.cmx lexing.cmx array.cmx parsing.cmi -pervasives.cmo: pervasives.cmi -pervasives.cmx: pervasives.cmi -printexc.cmo: printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi -printexc.cmx: printf.cmx obj.cmx buffer.cmx array.cmx printexc.cmi + filename.cmi +format.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi buffer.cmi \ + format.cmi +format.cmx: string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx buffer.cmx \ + format.cmi +gc.cmo: sys.cmi printf.cmi gc.cmi +gc.cmx: sys.cmx printf.cmx gc.cmi +genlex.cmo: string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi +genlex.cmx: string.cmx stream.cmx list.cmx hashtbl.cmx char.cmx genlex.cmi +hashtbl.cmo: sys.cmi array.cmi hashtbl.cmi +hashtbl.cmx: sys.cmx array.cmx hashtbl.cmi +int32.cmo: pervasives.cmi int32.cmi +int32.cmx: pervasives.cmx int32.cmi +int64.cmo: pervasives.cmi int64.cmi +int64.cmx: pervasives.cmx int64.cmi +lazy.cmo: obj.cmi camlinternalLazy.cmi lazy.cmi +lazy.cmx: obj.cmx camlinternalLazy.cmx lazy.cmi +lexing.cmo: sys.cmi string.cmi array.cmi lexing.cmi +lexing.cmx: sys.cmx string.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 +map.cmo: map.cmi +map.cmx: map.cmi +marshal.cmo: string.cmi marshal.cmi +marshal.cmx: string.cmx marshal.cmi +moreLabels.cmo: set.cmi map.cmi hashtbl.cmi moreLabels.cmi +moreLabels.cmx: set.cmx map.cmx hashtbl.cmx moreLabels.cmi +nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi +nativeint.cmx: sys.cmx pervasives.cmx nativeint.cmi +obj.cmo: marshal.cmi int32.cmi array.cmi obj.cmi +obj.cmx: marshal.cmx int32.cmx array.cmx obj.cmi +oo.cmo: camlinternalOO.cmi oo.cmi +oo.cmx: camlinternalOO.cmx oo.cmi +parsing.cmo: obj.cmi lexing.cmi array.cmi parsing.cmi +parsing.cmx: obj.cmx lexing.cmx array.cmx parsing.cmi +pervasives.cmo: pervasives.cmi +pervasives.cmx: pervasives.cmi +printexc.cmo: printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi +printexc.cmx: printf.cmx obj.cmx buffer.cmx array.cmx printexc.cmi printf.cmo: string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \ - array.cmi printf.cmi + array.cmi printf.cmi printf.cmx: string.cmx pervasives.cmx obj.cmx list.cmx char.cmx buffer.cmx \ - array.cmx printf.cmi -queue.cmo: obj.cmi queue.cmi -queue.cmx: obj.cmx queue.cmi + array.cmx printf.cmi +queue.cmo: obj.cmi queue.cmi +queue.cmx: obj.cmx queue.cmi random.cmo: string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \ - digest.cmi char.cmi array.cmi random.cmi + digest.cmi char.cmi array.cmi random.cmi random.cmx: string.cmx pervasives.cmx nativeint.cmx int64.cmx int32.cmx \ - digest.cmx char.cmx array.cmx random.cmi -scanf.cmo: string.cmi printf.cmi obj.cmi list.cmi hashtbl.cmi buffer.cmi \ - array.cmi scanf.cmi -scanf.cmx: string.cmx printf.cmx obj.cmx list.cmx hashtbl.cmx buffer.cmx \ - array.cmx scanf.cmi -set.cmo: set.cmi -set.cmx: set.cmi -sort.cmo: array.cmi sort.cmi -sort.cmx: array.cmx sort.cmi -stack.cmo: list.cmi stack.cmi -stack.cmx: list.cmx stack.cmi -stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi -stdLabels.cmx: stringLabels.cmx listLabels.cmx arrayLabels.cmx stdLabels.cmi -std_exit.cmo: -std_exit.cmx: -stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi -stream.cmx: string.cmx obj.cmx list.cmx lazy.cmx stream.cmi -string.cmo: pervasives.cmi list.cmi char.cmi string.cmi -string.cmx: pervasives.cmx list.cmx char.cmx string.cmi -stringLabels.cmo: string.cmi stringLabels.cmi -stringLabels.cmx: string.cmx stringLabels.cmi -sys.cmo: sys.cmi -sys.cmx: sys.cmi -weak.cmo: sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi -weak.cmx: sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi + digest.cmx char.cmx array.cmx random.cmi +scanf.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi hashtbl.cmi \ + buffer.cmi array.cmi scanf.cmi +scanf.cmx: string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx hashtbl.cmx \ + buffer.cmx array.cmx scanf.cmi +set.cmo: set.cmi +set.cmx: set.cmi +sort.cmo: array.cmi sort.cmi +sort.cmx: array.cmx sort.cmi +stack.cmo: list.cmi stack.cmi +stack.cmx: list.cmx stack.cmi +stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi +stdLabels.cmx: stringLabels.cmx listLabels.cmx arrayLabels.cmx stdLabels.cmi +std_exit.cmo: +std_exit.cmx: +stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi +stream.cmx: string.cmx obj.cmx list.cmx lazy.cmx stream.cmi +string.cmo: pervasives.cmi list.cmi char.cmi string.cmi +string.cmx: pervasives.cmx list.cmx char.cmx string.cmi +stringLabels.cmo: string.cmi stringLabels.cmi +stringLabels.cmx: string.cmx stringLabels.cmi +sys.cmo: sys.cmi +sys.cmx: sys.cmi +weak.cmo: sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi +weak.cmx: sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi diff --git a/stdlib/Compflags b/stdlib/Compflags index deaef912..862a1c4e 100755 --- a/stdlib/Compflags +++ b/stdlib/Compflags @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: Compflags 6694 2004-11-25 00:06:06Z doligez $ +# $Id$ case $1 in pervasives.cm[iox]|pervasives.p.cmx) echo ' -nopervasives';; diff --git a/stdlib/Makefile b/stdlib/Makefile index fb66e0bf..874dcf6f 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8929 2008-07-24 05:18:31Z frisch $ +# $Id$ include Makefile.shared @@ -32,7 +32,7 @@ installopt-noprof: rm -f $(LIBDIR)/stdlib.p.cmxa; ln -s stdlib.cmxa $(LIBDIR)/stdlib.p.cmxa rm -f $(LIBDIR)/stdlib.p.a; ln -s stdlib.a $(LIBDIR)/stdlib.p.a rm -f $(LIBDIR)/std_exit.p.cmx; \ - ln -s std_exit.cmx $(LIBDIR)/std_exit.p.cmx + ln -s std_exit.cmx $(LIBDIR)/std_exit.p.cmx rm -f $(LIBDIR)/std_exit.p.o; ln -s std_exit.o $(LIBDIR)/std_exit.p.o installopt-prof: @@ -44,16 +44,16 @@ stdlib.p.cmxa: $(OBJS:.cmo=.p.cmx) camlheader camlheader_ur: header.c ../config/Makefile if $(SHARPBANGSCRIPTS); then \ - echo '#!$(BINDIR)/ocamlrun' > camlheader && \ - echo '#!' | tr -d '\012' > camlheader_ur; \ - else \ + echo '#!$(BINDIR)/ocamlrun' > camlheader && \ + echo '#!' | tr -d '\012' > camlheader_ur; \ + else \ $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -DRUNTIME_NAME='"$(BINDIR)/ocamlrun"' \ - header.c -o tmpheader$(EXE) && \ - strip tmpheader$(EXE) && \ + -DRUNTIME_NAME='"$(BINDIR)/ocamlrun"' \ + header.c -o tmpheader$(EXE) && \ + strip tmpheader$(EXE) && \ mv tmpheader$(EXE) camlheader && \ - cp camlheader camlheader_ur; \ - fi + cp camlheader camlheader_ur; \ + fi .PHONY: all allopt allopt-noprof allopt-prof install installopt .PHONY: installopt-default installopt-noprof installopt-prof clean depend diff --git a/stdlib/Makefile.nt b/stdlib/Makefile.nt index bdf59c24..995a0c3f 100644 --- a/stdlib/Makefile.nt +++ b/stdlib/Makefile.nt @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8929 2008-07-24 05:18:31Z frisch $ +# $Id$ include Makefile.shared @@ -29,4 +29,3 @@ camlheader camlheader_ur: headernt.c ../config/Makefile # 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 78343ff4..a02650a6 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -11,13 +11,13 @@ # # ######################################################################### -# $Id: Makefile.shared 8974 2008-08-01 16:57:10Z mauny $ +# $Id$ include ../config/Makefile RUNTIME=../boot/ocamlrun COMPILER=../ocamlc CAMLC=$(RUNTIME) $(COMPILER) -COMPFLAGS=-g -warn-error A -nostdlib +COMPFLAGS=-strict-sequence -g -warn-error A -nostdlib OPTCOMPILER=../ocamlopt CAMLOPT=$(RUNTIME) $(OPTCOMPILER) OPTCOMPFLAGS=-warn-error A -nostdlib -g diff --git a/stdlib/StdlibModules b/stdlib/StdlibModules index 5a5246a1..4f689f8c 100644 --- a/stdlib/StdlibModules +++ b/stdlib/StdlibModules @@ -1,6 +1,6 @@ # This file lists all standard library modules. -*- Makefile -*- # It is used in particular to know what to expunge in toplevels. -# $Id: StdlibModules 8974 2008-08-01 16:57:10Z mauny $ +# $Id$ STDLIB_MODULES=\ arg \ diff --git a/stdlib/arg.ml b/stdlib/arg.ml index af6c9f28..009e2037 100644 --- a/stdlib/arg.ml +++ b/stdlib/arg.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arg.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) type key = string type doc = string diff --git a/stdlib/arg.mli b/stdlib/arg.mli index 778ef312..4e5ed08d 100644 --- a/stdlib/arg.mli +++ b/stdlib/arg.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arg.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (** Parsing of command line arguments. diff --git a/stdlib/array.ml b/stdlib/array.ml index 10cb9886..4eb0cadf 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: array.ml 6834 2005-04-11 16:44:26Z doligez $ *) +(* $Id$ *) (* Array operations *) diff --git a/stdlib/array.mli b/stdlib/array.mli index 7ba565b5..9fb74b06 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: array.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Array operations. *) diff --git a/stdlib/arrayLabels.ml b/stdlib/arrayLabels.ml index 1ff61349..fed0ad1c 100644 --- a/stdlib/arrayLabels.ml +++ b/stdlib/arrayLabels.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arrayLabels.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [ArrayLabels]: labelled Array module *) diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index 0b08227d..f45f70c6 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: arrayLabels.mli 7805 2007-01-22 08:06:09Z garrigue $ *) +(* $Id$ *) (** Array operations. *) diff --git a/stdlib/buffer.ml b/stdlib/buffer.ml index f43be1d0..9327aaef 100644 --- a/stdlib/buffer.ml +++ b/stdlib/buffer.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: buffer.ml 9340 2009-09-16 15:52:46Z xclerc $ *) +(* $Id$ *) (* Extensible buffers *) @@ -100,6 +100,8 @@ let add_buffer b bs = add_substring b bs.buffer 0 bs.position let add_channel b ic len = + if len < 0 || len > Sys.max_string_length then (* PR#5004 *) + invalid_arg "Buffer.add_channel"; if b.position + len > b.length then resize b len; really_input ic b.buffer b.position len; b.position <- b.position + len diff --git a/stdlib/buffer.mli b/stdlib/buffer.mli index 831e9c3a..32d15349 100644 --- a/stdlib/buffer.mli +++ b/stdlib/buffer.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: buffer.mli 9340 2009-09-16 15:52:46Z xclerc $ *) +(* $Id$ *) (** Extensible string buffers. diff --git a/stdlib/callback.ml b/stdlib/callback.ml index 29a2031a..819f9d3f 100644 --- a/stdlib/callback.ml +++ b/stdlib/callback.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: callback.ml 6044 2003-12-31 14:20:40Z doligez $ *) +(* $Id$ *) (* Registering Caml values with the C runtime for later callbacks *) diff --git a/stdlib/callback.mli b/stdlib/callback.mli index ce0fdc93..ba2ab7ec 100644 --- a/stdlib/callback.mli +++ b/stdlib/callback.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: callback.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Registering Caml values with the C runtime. diff --git a/stdlib/camlinternalLazy.ml b/stdlib/camlinternalLazy.ml index 820e20b4..46cf4278 100644 --- a/stdlib/camlinternalLazy.ml +++ b/stdlib/camlinternalLazy.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: camlinternalLazy.ml 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (* Internals of forcing lazy values. *) diff --git a/stdlib/camlinternalLazy.mli b/stdlib/camlinternalLazy.mli index 019fce30..37b707d4 100644 --- a/stdlib/camlinternalLazy.mli +++ b/stdlib/camlinternalLazy.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: camlinternalLazy.mli 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (* Internals of forcing lazy values *) diff --git a/stdlib/camlinternalMod.ml b/stdlib/camlinternalMod.ml index e2e82031..12a77cc8 100644 --- a/stdlib/camlinternalMod.ml +++ b/stdlib/camlinternalMod.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: camlinternalMod.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) type shape = | Function diff --git a/stdlib/camlinternalMod.mli b/stdlib/camlinternalMod.mli index 34006784..74bf28db 100644 --- a/stdlib/camlinternalMod.mli +++ b/stdlib/camlinternalMod.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: camlinternalMod.mli 6586 2004-08-12 12:57:00Z xleroy $ *) +(* $Id$ *) type shape = | Function diff --git a/stdlib/camlinternalOO.ml b/stdlib/camlinternalOO.ml index e5ae4590..2ffa71c0 100644 --- a/stdlib/camlinternalOO.ml +++ b/stdlib/camlinternalOO.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: camlinternalOO.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) open Obj diff --git a/stdlib/camlinternalOO.mli b/stdlib/camlinternalOO.mli index 81113211..d2aeea31 100644 --- a/stdlib/camlinternalOO.mli +++ b/stdlib/camlinternalOO.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: camlinternalOO.mli 7372 2006-04-05 02:28:13Z garrigue $ *) +(* $Id$ *) (** Run-time support for objects and classes. All functions in this module are for system use only, not for the diff --git a/stdlib/char.ml b/stdlib/char.ml index a6b8a5f7..28a1bcc4 100644 --- a/stdlib/char.ml +++ b/stdlib/char.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: char.ml 8189 2007-04-16 11:06:51Z weis $ *) +(* $Id$ *) (* Character operations *) diff --git a/stdlib/char.mli b/stdlib/char.mli index c3637ac8..8ab72bd9 100644 --- a/stdlib/char.mli +++ b/stdlib/char.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: char.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Character operations. *) diff --git a/stdlib/complex.ml b/stdlib/complex.ml index 90d42331..3c28a58b 100644 --- a/stdlib/complex.ml +++ b/stdlib/complex.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: complex.ml 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (* Complex numbers *) diff --git a/stdlib/complex.mli b/stdlib/complex.mli index 8c80b5e2..3c3b361d 100644 --- a/stdlib/complex.mli +++ b/stdlib/complex.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: complex.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Complex numbers. diff --git a/stdlib/digest.ml b/stdlib/digest.ml index 2d030666..78a45d54 100644 --- a/stdlib/digest.ml +++ b/stdlib/digest.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: digest.ml 6044 2003-12-31 14:20:40Z doligez $ *) +(* $Id$ *) (* Message digest (MD5) *) diff --git a/stdlib/digest.mli b/stdlib/digest.mli index d3359029..981bd02f 100644 --- a/stdlib/digest.mli +++ b/stdlib/digest.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: digest.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** MD5 message digest. diff --git a/stdlib/filename.ml b/stdlib/filename.ml index 2fef43af..e11f1e33 100644 --- a/stdlib/filename.ml +++ b/stdlib/filename.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: filename.ml 9339 2009-09-16 14:24:11Z xclerc $ *) +(* $Id$ *) let generic_quote quotequote s = let l = String.length s in diff --git a/stdlib/filename.mli b/stdlib/filename.mli index 7d93fd99..e0166095 100644 --- a/stdlib/filename.mli +++ b/stdlib/filename.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: filename.mli 9339 2009-09-16 14:24:11Z xclerc $ *) +(* $Id$ *) (** Operations on file names. *) diff --git a/stdlib/format.ml b/stdlib/format.ml index f3545f32..429bf7dd 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: format.ml 9244 2009-04-29 18:33:31Z weis $ *) +(* $Id$ *) (* A pretty-printing facility and definition of formatters for ``parallel'' (i.e. unrelated or independent) pretty-printing on multiple out channels. *) @@ -794,7 +794,7 @@ let pp_set_margin state n = new margin, if it is greater than 1. *) max (max (state.pp_margin - state.pp_min_space_left) (state.pp_margin / 2)) 1 in - (* Rebuild invariants. *) + (* Rebuild invariants. *) pp_set_max_indent state new_max_indent ;; @@ -809,8 +809,8 @@ let pp_get_formatter_output_functions state () = let pp_set_all_formatter_output_functions state ~out:f ~flush:g ~newline:h ~spaces:i = pp_set_formatter_output_functions state f g; - state.pp_output_newline <- (function () -> h ()); - state.pp_output_spaces <- (function n -> i n) + state.pp_output_newline <- h; + state.pp_output_spaces <- i; ;; let pp_get_all_formatter_output_functions state () = (state.pp_output_function, state.pp_flush_function, @@ -842,7 +842,8 @@ let pp_make_formatter f g h i = add_queue sys_tok pp_q; let sys_scan_stack = (Scan_elem (1, sys_tok)) :: scan_stack_bottom in - {pp_scan_stack = sys_scan_stack; + { + pp_scan_stack = sys_scan_stack; pp_format_stack = []; pp_tbox_stack = []; pp_tag_stack = []; @@ -905,9 +906,9 @@ let formatter_of_buffer b = let stdbuf = Buffer.create 512;; (* Predefined formatters. *) -let str_formatter = formatter_of_buffer stdbuf -and std_formatter = formatter_of_out_channel stdout -and err_formatter = formatter_of_out_channel stderr +let std_formatter = formatter_of_out_channel Pervasives.stdout +and err_formatter = formatter_of_out_channel Pervasives.stderr +and str_formatter = formatter_of_buffer stdbuf ;; let flush_str_formatter () = @@ -1066,7 +1067,7 @@ let implode_rev s0 = function (* [mkprintf] is the printf-like function generator: given the - [to_s] flag that tells if we are printing into a string, - the [get_out] function that has to be called to get a [ppf] function to - output onto. + output onto. It generates a [kprintf] function that takes as arguments a [k] continuation function to be called at the end of formatting, and a printing format string to print the rest of the arguments @@ -1301,9 +1302,10 @@ let mkprintf to_s get_out = **************************************************************) let kfprintf k ppf = mkprintf false (fun _ -> ppf) k;; -let ifprintf ppf = Tformat.kapr (fun _ -> Obj.magic ignore);; +let ikfprintf k ppf = Tformat.kapr (fun _ _ -> Obj.magic (k ppf));; let fprintf ppf = kfprintf ignore ppf;; +let ifprintf ppf = ikfprintf ignore ppf;; let printf fmt = fprintf std_formatter fmt;; let eprintf fmt = fprintf err_formatter fmt;; @@ -1322,9 +1324,10 @@ let ksprintf k = mkprintf true (fun _ -> formatter_of_buffer b) k ;; -let kprintf = ksprintf;; - let sprintf fmt = ksprintf (fun s -> s) fmt;; +(* Obsolete alias for ksprintf. *) +let kprintf = ksprintf;; + at_exit print_flush ;; diff --git a/stdlib/format.mli b/stdlib/format.mli index 3af97b25..2998a0b2 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: format.mli 9420 2009-11-19 10:17:41Z weis $ *) +(* $Id$ *) (** Pretty printing. @@ -36,10 +36,11 @@ than the [fprintf] concise formats. For instance, the sequence - [open_box 0; print_string "x ="; print_space (); print_int 1; close_box ()] + [open_box 0; print_string "x ="; print_space (); + print_int 1; close_box (); print_newline ()] that prints [x = 1] within a pretty-printing box, can be - abbreviated as [printf "@[%s@ %i@]" "x =" 1], or even shorter - [printf "@[x =@ %i@]" 1]. + abbreviated as [printf "@[%s@ %i@]@." "x =" 1], or even shorter + [printf "@[x =@ %i@]@." 1]. Rule of thumb for casual users of this library: - use simple boxes (as obtained by [open_box 0]); @@ -50,8 +51,8 @@ functions (e. g. [print_int] and [print_string]); - when the material for a box has been printed, call [close_box ()] to close the box; - - at the end of your routine, evaluate [print_newline ()] to close - all remaining boxes and flush the pretty-printer. + - at the end of your routine, flush the pretty-printer to display all the + remaining material, e.g. evaluate [print_newline ()]. The behaviour of pretty-printing commands is unspecified if there is no opened pretty-printing box. Each box opened via @@ -265,14 +266,14 @@ val set_ellipsis_text : string -> unit;; val get_ellipsis_text : unit -> string;; (** Return the text of the ellipsis. *) -(** {6 Semantics Tags} *) +(** {6:tags Semantics Tags} *) 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 - indications for a display device, or marking delimitation of semantics entities - (e.g. HTML or TeX elements or terminal escape sequences). + indications for a display device, or marking delimitation of semantics + entities (e.g. HTML or TeX elements or terminal escape sequences). By default, those tags do not influence line breaking calculation: the tag ``markers'' are not considered as part of the printing @@ -284,7 +285,7 @@ type tag = string;; pretty printing routine can output both simple ``verbatim'' material or richer decorated output depending on the treatment of tags. By default, tags are not active, hence the output is not - decorated with tag information. Once [set_tags] is set to [true], + decorated with tag information. Once [set_tags] is set to [true], the pretty printer engine honours tags and decorates the output accordingly. @@ -358,7 +359,7 @@ val get_formatter_output_functions : unit -> (string -> int -> int -> unit) * (unit -> unit);; (** Return the current output functions of the pretty-printer. *) -(** {6 Changing the meaning of standard formatter pretty printing} *) +(** {6:meaning Changing the meaning of standard formatter pretty printing} *) (** The [Format] module is versatile enough to let you completely redefine the meaning of pretty printing: you may provide your own functions to define @@ -370,7 +371,7 @@ val set_all_formatter_output_functions : flush:(unit -> unit) -> newline:(unit -> unit) -> spaces:(int -> unit) -> - unit;; + unit (** [set_all_formatter_output_functions out flush outnewline outspace] redirects the pretty-printer output to the functions [out] and [flush] as described in [set_formatter_output_functions]. In @@ -436,9 +437,8 @@ val get_formatter_tag_functions : (** {6 Multiple formatted output} *) type formatter;; -(** Abstract data type corresponding to a pretty-printer (also called a - formatter) and all its machinery. - Defining new pretty-printers permits the output of +(** Abstract data corresponding to a pretty-printer (also called a + formatter) and all its machinery. Defining new pretty-printers permits the output of material in parallel on several channels. Parameters of a pretty-printer are local to this pretty-printer: margin, maximum indentation limit, maximum number of boxes @@ -530,7 +530,7 @@ 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 -> out_channel -> unit;; +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 : @@ -551,7 +551,6 @@ val pp_get_formatter_tag_functions : evaluation of these primitives. For instance, [print_string] is equal to [pp_print_string std_formatter]. *) - (** {6 [printf] like functions for pretty-printing.} *) val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; @@ -610,8 +609,9 @@ val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; - [@\}]: close the most recently opened tag. - [@@]: print a plain [@] character. - Example: [printf "@[%s@ %d@]" "x =" 1] is equivalent to - [open_box (); print_string "x ="; print_space (); print_int 1; close_box ()]. + Example: [printf "@[%s@ %d@]@." "x =" 1] is equivalent to + [open_box (); print_string "x ="; print_space (); + print_int 1; close_box (); print_newline ()]. It prints [x = 1] within a pretty-printing box. *) @@ -621,11 +621,15 @@ val printf : ('a, formatter, unit) format -> 'a;; val eprintf : ('a, formatter, unit) format -> 'a;; (** Same as [fprintf] above, but output on [err_formatter]. *) +val ifprintf : formatter -> ('a, formatter, unit) format -> 'a;; +(** Same as [fprintf] above, but does not print anything. + Useful to ignore some material when conditionally printing. *) + val sprintf : ('a, unit, string) format -> 'a;; (** Same as [printf] above, but instead of printing on a formatter, returns a string containing the result of formatting the arguments. - Note that the pretty-printer queue is flushed at the end of each - call to [sprintf]. + Note that the pretty-printer queue is flushed at the end of {e each + call} to [sprintf]. In case of multiple and related calls to [sprintf] to output material on a single string, you should consider using [fprintf] @@ -647,13 +651,16 @@ val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a;; pretty-printer queue would result in unexpected and badly formatted output. *) +(** Formatted output functions with continuations. *) + 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 ifprintf : formatter -> ('a, formatter, unit) format -> 'a;; -(** Same as [fprintf] above, but does not print anything. +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. *) val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; diff --git a/stdlib/gc.ml b/stdlib/gc.ml index ca97665b..db98de97 100644 --- a/stdlib/gc.ml +++ b/stdlib/gc.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: gc.ml 9131 2008-11-18 10:24:43Z doligez $ *) +(* $Id$ *) type stat = { minor_words : float; diff --git a/stdlib/gc.mli b/stdlib/gc.mli index c399bcdd..809998c5 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: gc.mli 9131 2008-11-18 10:24:43Z doligez $ *) +(* $Id$ *) (** Memory management control and statistics; finalised values. *) diff --git a/stdlib/genlex.ml b/stdlib/genlex.ml index 12837de6..6ecc2805 100644 --- a/stdlib/genlex.ml +++ b/stdlib/genlex.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: genlex.ml 4694 2002-04-18 07:27:47Z garrigue $ *) +(* $Id$ *) type token = Kwd of string diff --git a/stdlib/genlex.mli b/stdlib/genlex.mli index c03ef294..93bc5f55 100644 --- a/stdlib/genlex.mli +++ b/stdlib/genlex.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: genlex.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** A generic lexical analyzer. diff --git a/stdlib/hashtbl.ml b/stdlib/hashtbl.ml index b65c5dc4..bcb2c927 100644 --- a/stdlib/hashtbl.ml +++ b/stdlib/hashtbl.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: hashtbl.ml 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (* Hash tables *) diff --git a/stdlib/hashtbl.mli b/stdlib/hashtbl.mli index e66c4864..1bf175ad 100644 --- a/stdlib/hashtbl.mli +++ b/stdlib/hashtbl.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: hashtbl.mli 6854 2005-05-04 13:36:47Z doligez $ *) +(* $Id$ *) (** Hash tables and hash functions. diff --git a/stdlib/header.c b/stdlib/header.c index f3d8a983..eda76325 100644 --- a/stdlib/header.c +++ b/stdlib/header.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: header.c 4144 2001-12-07 13:41:02Z xleroy $ */ +/* $Id$ */ /* The launcher for bytecode executables (if #! is not working) */ @@ -121,7 +121,7 @@ static char * searchpath(char * name) return name; } -#endif +#endif static unsigned long read_size(char * ptr) { diff --git a/stdlib/headernt.c b/stdlib/headernt.c index 6e742541..c8d23ee2 100644 --- a/stdlib/headernt.c +++ b/stdlib/headernt.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: headernt.c 7829 2007-02-07 10:31:36Z ertai $ */ +/* $Id$ */ #define STRICT #define WIN32_LEAN_AND_MEAN diff --git a/stdlib/int32.ml b/stdlib/int32.ml index 3eb10285..64d525e8 100644 --- a/stdlib/int32.ml +++ b/stdlib/int32.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: int32.ml 7818 2007-01-30 09:34:36Z xleroy $ *) +(* $Id$ *) (* Module [Int32]: 32-bit integers *) diff --git a/stdlib/int32.mli b/stdlib/int32.mli index eef35333..eeafb1a2 100644 --- a/stdlib/int32.mli +++ b/stdlib/int32.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: int32.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (** 32-bit integers. diff --git a/stdlib/int64.ml b/stdlib/int64.ml index 6d7168a2..e916fa4e 100644 --- a/stdlib/int64.ml +++ b/stdlib/int64.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: int64.ml 7818 2007-01-30 09:34:36Z xleroy $ *) +(* $Id$ *) (* Module [Int64]: 64-bit integers *) diff --git a/stdlib/int64.mli b/stdlib/int64.mli index 44fabfe3..3b641338 100644 --- a/stdlib/int64.mli +++ b/stdlib/int64.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: int64.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (** 64-bit integers. diff --git a/stdlib/lazy.ml b/stdlib/lazy.ml index 15becc85..b1a9cbbd 100644 --- a/stdlib/lazy.ml +++ b/stdlib/lazy.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: lazy.ml 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (* Module [Lazy]: deferred computations *) diff --git a/stdlib/lazy.mli b/stdlib/lazy.mli index 6d929044..f0255c22 100644 --- a/stdlib/lazy.mli +++ b/stdlib/lazy.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: lazy.mli 8974 2008-08-01 16:57:10Z mauny $ *) +(* $Id$ *) (** Deferred computations. *) diff --git a/stdlib/lexing.ml b/stdlib/lexing.ml index 78b41517..9e014152 100644 --- a/stdlib/lexing.ml +++ b/stdlib/lexing.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: lexing.ml 8787 2008-01-22 16:27:53Z doligez $ *) +(* $Id$ *) (* The run-time library for lexers generated by camllex *) diff --git a/stdlib/lexing.mli b/stdlib/lexing.mli index 591a74d0..884bf384 100644 --- a/stdlib/lexing.mli +++ b/stdlib/lexing.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: lexing.mli 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) (** The run-time library for lexers generated by [ocamllex]. *) diff --git a/stdlib/list.ml b/stdlib/list.ml index 80a76c49..8bb9e3fa 100644 --- a/stdlib/list.ml +++ b/stdlib/list.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: list.ml 7597 2006-09-11 12:18:00Z doligez $ *) +(* $Id$ *) (* List operations *) diff --git a/stdlib/list.mli b/stdlib/list.mli index 26c53869..8f895619 100644 --- a/stdlib/list.mli +++ b/stdlib/list.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: list.mli 7597 2006-09-11 12:18:00Z doligez $ *) +(* $Id$ *) (** List operations. diff --git a/stdlib/listLabels.ml b/stdlib/listLabels.ml index 896caf9b..be7bddea 100644 --- a/stdlib/listLabels.ml +++ b/stdlib/listLabels.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: listLabels.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [ListLabels]: labelled List module *) diff --git a/stdlib/listLabels.mli b/stdlib/listLabels.mli index b9f39366..1f6a4ead 100644 --- a/stdlib/listLabels.mli +++ b/stdlib/listLabels.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: listLabels.mli 7805 2007-01-22 08:06:09Z garrigue $ *) +(* $Id$ *) (** List operations. diff --git a/stdlib/map.ml b/stdlib/map.ml index fefbee68..b64fd747 100644 --- a/stdlib/map.ml +++ b/stdlib/map.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: map.ml 7019 2005-08-13 20:59:37Z doligez $ *) +(* $Id$ *) module type OrderedType = sig diff --git a/stdlib/map.mli b/stdlib/map.mli index 08290248..af1d4d37 100644 --- a/stdlib/map.mli +++ b/stdlib/map.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: map.mli 9190 2009-03-21 16:35:48Z xleroy $ *) +(* $Id$ *) (** Association tables over ordered types. diff --git a/stdlib/marshal.ml b/stdlib/marshal.ml index f2eaf00d..0410a23e 100644 --- a/stdlib/marshal.ml +++ b/stdlib/marshal.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: marshal.ml 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) type extern_flags = No_sharing diff --git a/stdlib/marshal.mli b/stdlib/marshal.mli index 16ba32c1..ac0775bb 100644 --- a/stdlib/marshal.mli +++ b/stdlib/marshal.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: marshal.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Marshaling of data structures. diff --git a/stdlib/moreLabels.ml b/stdlib/moreLabels.ml index 567c316f..f6cfddab 100644 --- a/stdlib/moreLabels.ml +++ b/stdlib/moreLabels.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: moreLabels.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [MoreLabels]: meta-module for compatibility labelled libraries *) diff --git a/stdlib/moreLabels.mli b/stdlib/moreLabels.mli index 96d98a29..fbf848cb 100644 --- a/stdlib/moreLabels.mli +++ b/stdlib/moreLabels.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: moreLabels.mli 6250 2004-04-23 10:01:34Z xleroy $ *) +(* $Id$ *) (** Extra labeled libraries. diff --git a/stdlib/nativeint.ml b/stdlib/nativeint.ml index 126e4d38..93478436 100644 --- a/stdlib/nativeint.ml +++ b/stdlib/nativeint.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: nativeint.ml 7818 2007-01-30 09:34:36Z xleroy $ *) +(* $Id$ *) (* Module [Nativeint]: processor-native integers *) diff --git a/stdlib/nativeint.mli b/stdlib/nativeint.mli index dd3fd7f7..ff499a26 100644 --- a/stdlib/nativeint.mli +++ b/stdlib/nativeint.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: nativeint.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Processor-native integers. diff --git a/stdlib/obj.ml b/stdlib/obj.ml index 32154e56..c16b5115 100644 --- a/stdlib/obj.ml +++ b/stdlib/obj.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: obj.ml 9482 2009-12-22 13:32:12Z doligez $ *) +(* $Id$ *) (* Operations on internal representations of values *) @@ -32,7 +32,7 @@ let set_double_field x i v = Array.set (obj x : float array) i v external new_block : int -> int -> t = "caml_obj_block" external dup : t -> t = "caml_obj_dup" external truncate : t -> int -> unit = "caml_obj_truncate" -external add_offset : t -> int -> t = "caml_obj_add_offset" +external add_offset : t -> Int32.t -> t = "caml_obj_add_offset" let marshal (obj : t) = Marshal.to_string obj [] diff --git a/stdlib/obj.mli b/stdlib/obj.mli index d3a8c064..d9c87601 100644 --- a/stdlib/obj.mli +++ b/stdlib/obj.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: obj.mli 9482 2009-12-22 13:32:12Z doligez $ *) +(* $Id$ *) (** Operations on internal representations of values. @@ -35,7 +35,7 @@ val set_double_field : t -> int -> float -> unit external new_block : int -> int -> t = "caml_obj_block" external dup : t -> t = "caml_obj_dup" external truncate : t -> int -> unit = "caml_obj_truncate" -external add_offset : t -> int -> t = "caml_obj_add_offset" +external add_offset : t -> Int32.t -> t = "caml_obj_add_offset" val lazy_tag : int val closure_tag : int diff --git a/stdlib/oo.ml b/stdlib/oo.ml index c7322c84..c9ec64ae 100644 --- a/stdlib/oo.ml +++ b/stdlib/oo.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: oo.ml 6331 2004-05-26 11:10:52Z garrigue $ *) +(* $Id$ *) let copy = CamlinternalOO.copy external id : < .. > -> int = "%field1" diff --git a/stdlib/oo.mli b/stdlib/oo.mli index 7ff2f1bc..b3111ce8 100644 --- a/stdlib/oo.mli +++ b/stdlib/oo.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: oo.mli 6331 2004-05-26 11:10:52Z garrigue $ *) +(* $Id$ *) (** Operations on objects *) diff --git a/stdlib/parsing.ml b/stdlib/parsing.ml index ce249174..44c7fb27 100644 --- a/stdlib/parsing.ml +++ b/stdlib/parsing.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parsing.ml 9163 2009-01-13 15:17:51Z doligez $ *) +(* $Id$ *) (* The parsing engine *) diff --git a/stdlib/parsing.mli b/stdlib/parsing.mli index 250a10cf..c323922c 100644 --- a/stdlib/parsing.mli +++ b/stdlib/parsing.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parsing.mli 8983 2008-08-06 09:38:25Z xleroy $ *) +(* $Id$ *) (** The run-time library for parsers generated by [ocamlyacc]. *) diff --git a/stdlib/pervasives.ml b/stdlib/pervasives.ml index 1c8c3d4e..c4f0bcfd 100644 --- a/stdlib/pervasives.ml +++ b/stdlib/pervasives.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: pervasives.ml 9412 2009-11-09 11:42:39Z weis $ *) +(* $Id$ *) (* type 'a option = None | Some of 'a *) @@ -83,6 +83,7 @@ external ( *. ) : float -> float -> float = "%mulfloat" external (/.) : float -> float -> float = "%divfloat" external ( ** ) : float -> float -> float = "caml_power_float" "pow" "float" external exp : float -> float = "caml_exp_float" "exp" "float" +external expm1 : float -> float = "caml_expm1_float" "caml_expm1" "float" external acos : float -> float = "caml_acos_float" "acos" "float" external asin : float -> float = "caml_asin_float" "asin" "float" external atan : float -> float = "caml_atan_float" "atan" "float" @@ -91,6 +92,7 @@ external cos : float -> float = "caml_cos_float" "cos" "float" external cosh : float -> float = "caml_cosh_float" "cosh" "float" external log : float -> float = "caml_log_float" "log" "float" external log10 : float -> float = "caml_log10_float" "log10" "float" +external log1p : float -> float = "caml_log1p_float" "caml_log1p" "float" external sin : float -> float = "caml_sin_float" "sin" "float" external sinh : float -> float = "caml_sinh_float" "sinh" "float" external sqrt : float -> float = "caml_sqrt_float" "sqrt" "float" diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index e07eeda8..754125f9 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -11,13 +11,13 @@ (* *) (***********************************************************************) -(* $Id: pervasives.mli 9352 2009-09-24 09:17:01Z doligez $ *) +(* $Id$ *) (** The initially opened module. This module provides the basic operations over the built-in types (numbers, booleans, strings, exceptions, references, lists, arrays, - input-output channels, ...) + input-output channels, ...). This module is automatically opened at the beginning of each compilation. All components of this module can therefore be referred by their short @@ -93,7 +93,7 @@ external compare : 'a -> 'a -> int = "%compare" the {!List.sort} and {!Array.sort} functions. *) val min : 'a -> 'a -> 'a -(** Return the smaller of the two arguments. +(** Return the smaller of the two arguments. The result is unspecified if one of the arguments contains the float value [nan]. *) @@ -104,9 +104,11 @@ val max : 'a -> 'a -> 'a external ( == ) : 'a -> 'a -> bool = "%eq" (** [e1 == e2] tests for physical equality of [e1] and [e2]. - On mutable structures, [e1 == e2] is true if and only if - physical modification of [e1] also affects [e2]. - On non-mutable structures, the behavior of [(==)] is + On mutable types such as references, arrays, strings, records with + mutable fields and objects with mutable instance variables, + [e1 == e2] is true if and only if physical modification of [e1] + also affects [e2]. + On non-mutable types, the behavior of [(==)] is implementation-dependent; however, it is guaranteed that [e1 == e2] implies [compare e1 e2 = 0]. *) @@ -264,55 +266,59 @@ external log : float -> float = "caml_log_float" "log" "float" external log10 : float -> float = "caml_log10_float" "log10" "float" (** Base 10 logarithm. *) +external expm1 : float -> float = "caml_expm1_float" "caml_expm1" "float" +(** [expm1 x] computes [exp x -. 1.0], giving numerically-accurate results + even if [x] is close to [0.0]. *) + +external log1p : float -> float = "caml_log1p_float" "caml_log1p" "float" +(** [log1p x] computes [log(1.0 +. x)] (natural logarithm), + giving numerically-accurate results even if [x] is close to [0.0]. *) + external cos : float -> float = "caml_cos_float" "cos" "float" -(** [cos a] returns the cosine of angle [a] measured in radians. *) +(** Cosine. Argument is in radians. *) external sin : float -> float = "caml_sin_float" "sin" "float" -(** [sin a] returns the sine of angle [a] measured in radians. *) +(** Sine. Argument is in radians. *) external tan : float -> float = "caml_tan_float" "tan" "float" -(** [tan a] returns the tangent of angle [a] measured in radians. *) +(** Tangent. Argument is in radians. *) external acos : float -> float = "caml_acos_float" "acos" "float" -(** [acos f] returns the arc cosine of [f]. The return angle is measured - in radians. *) +(** Arc cosine. The argument must fall within the range [[-1.0, 1.0]]. + Result is in radians and is between [0.0] and [pi]. *) external asin : float -> float = "caml_asin_float" "asin" "float" -(** [asin f] returns the arc sine of [f]. The return angle is measured - in radians. *) +(** Arc sine. The argument must fall within the range [[-1.0, 1.0]]. + Result is in radians and is between [-pi/2] and [pi/2]. *) external atan : float -> float = "caml_atan_float" "atan" "float" -(** [atan f] returns the arc tangent of [f]. The return angle is measured - in radians. *) +(** Arc tangent. + Result is in radians and is between [-pi/2] and [pi/2]. *) external atan2 : float -> float -> float = "caml_atan2_float" "atan2" "float" -(** [atan2 y x] returns the principal value of the arc tangent of - [y / x], using the signs of both arguments to determine the quadrant of the - result. The return angle is measured in radians. *) +(** [atan x y] returns the arc tangent of [y /. x]. The signs of [x] + and [y] are used to determine the quadrant of the result. + Result is in radians and is between [-pi] and [pi]. *) external cosh : float -> float = "caml_cosh_float" "cosh" "float" -(** [cosh a] returns the hyperbolic cosine of angle [a] measured - in radians. *) +(** Hyperbolic cosine. Argument is in radians. *) external sinh : float -> float = "caml_sinh_float" "sinh" "float" -(** [sinh a] returns the hyperbolic sine of angle [a] measured - in radians. *) +(** Hyperbolic sine. Argument is in radians. *) external tanh : float -> float = "caml_tanh_float" "tanh" "float" -(** [tanh f] returns the hyperbolic tangent of angle [a] measured - in radians. *) +(** Hyperbolic tangent. Argument is in radians. *) external ceil : float -> float = "caml_ceil_float" "ceil" "float" -(** Round the given float to an integer value. - [ceil f] returns the least integer value greater than or - equal to [f]. - See also {!Pervasives.floor}. *) +(** Round above to an integer value. + [ceil f] returns the least integer value greater than or equal to [f]. + The result is returned as a float. *) external floor : float -> float = "caml_floor_float" "floor" "float" -(** Round the given float to an integer value. - [floor f] returns the greatest integer value less than or - equal to [f]. - See also {!Pervasives.ceil}. *) +(** Round below to an integer value. + [floor f] returns the greatest integer value less than or + equal to [f]. + The result is returned as a float. *) external abs_float : float -> float = "%absfloat" (** [abs_float f] returns the absolute value of [f]. *) @@ -881,9 +887,9 @@ val at_exit : (unit -> unit) -> unit The functions are called in ``last in, first out'' order: the function most recently added with [at_exit] is called first. *) - (**/**) + (** {6 For system use only, not for the casual user} *) val valid_float_lexem : string -> string diff --git a/stdlib/printexc.ml b/stdlib/printexc.ml index 42dda408..63da48c5 100644 --- a/stdlib/printexc.ml +++ b/stdlib/printexc.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printexc.ml 9335 2009-09-16 13:34:57Z xclerc $ *) +(* $Id$ *) open Printf;; @@ -86,7 +86,7 @@ type loc_info = * int (* end char *) | Unknown_location of bool (*is_raise*) -external get_exception_backtrace: +external get_exception_backtrace: unit -> loc_info array option = "caml_get_exception_backtrace" let format_loc_info pos li = diff --git a/stdlib/printexc.mli b/stdlib/printexc.mli index 21d3e9af..99729e10 100644 --- a/stdlib/printexc.mli +++ b/stdlib/printexc.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printexc.mli 9335 2009-09-16 13:34:57Z xclerc $ *) +(* $Id$ *) (** Facilities for printing exceptions. *) diff --git a/stdlib/printf.ml b/stdlib/printf.ml index bc50ca75..a16c9184 100644 --- a/stdlib/printf.ml +++ b/stdlib/printf.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printf.ml 9412 2009-11-09 11:42:39Z weis $ *) +(* $Id$ *) external format_float: string -> float -> string = "caml_format_float" @@ -430,24 +430,33 @@ let get_index spec n = (* Format a float argument as a valid Caml lexeme. *) let format_float_lexeme = - let valid_float_lexeme sfmt s = - let l = String.length s in - if l = 0 then "nan" else - let add_dot sfmt s = s ^ "." in - let rec loop i = - if i >= l then add_dot sfmt s else - match s.[i] with - | '.' -> s - | _ -> loop (i + 1) in - - loop 0 in - - (fun sfmt x -> - let s = format_float sfmt x in - match classify_float x with - | FP_normal | FP_subnormal | FP_zero -> valid_float_lexeme sfmt s - | FP_nan | FP_infinite -> s) + (* To be revised: this procedure should be a unique loop that performs the + validity check and the string lexeme modification at the same time. + Otherwise, it is too difficult to handle the strange padding facilities + given by printf. Let alone handling the correct widths indication, + knowing that we have sometime to add a '.' at the end of the result! + *) + + let make_valid_float_lexeme s = + (* Check if s is already a valid lexeme: + in this case do nothing, + otherwise turn s into a valid Caml lexeme. *) + let l = String.length s in + let rec valid_float_loop i = + if i >= l then s ^ "." else + match s.[i] with + (* Sure, this is already a valid float lexeme. *) + | '.' | 'e' | 'E' -> s + | _ -> valid_float_loop (i + 1) in + + valid_float_loop 0 in + + (fun sfmt x -> + let s = format_float sfmt x in + match classify_float x with + | FP_normal | FP_subnormal | FP_zero -> make_valid_float_lexeme s + | FP_nan | FP_infinite -> s) ;; (* Decode a format string and act on it. diff --git a/stdlib/printf.mli b/stdlib/printf.mli index 450b497e..43106505 100644 --- a/stdlib/printf.mli +++ b/stdlib/printf.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printf.mli 9421 2009-11-19 10:21:42Z weis $ *) +(* $Id$ *) (** Formatted output functions. *) diff --git a/stdlib/queue.ml b/stdlib/queue.ml index d7d66a84..9e21686a 100644 --- a/stdlib/queue.ml +++ b/stdlib/queue.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: queue.ml 7032 2005-08-26 12:10:47Z doligez $ *) +(* $Id$ *) exception Empty diff --git a/stdlib/queue.mli b/stdlib/queue.mli index d8b802e9..085cfb00 100644 --- a/stdlib/queue.mli +++ b/stdlib/queue.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: queue.mli 4956 2002-06-27 08:48:26Z xleroy $ *) +(* $Id$ *) (** First-in first-out queues. diff --git a/stdlib/random.ml b/stdlib/random.ml index f38a067e..bd397991 100644 --- a/stdlib/random.ml +++ b/stdlib/random.ml @@ -11,13 +11,18 @@ (* *) (***********************************************************************) -(* $Id: random.ml 6023 2003-12-16 18:09:44Z doligez $ *) - -(* "Linear feedback shift register" pseudo-random number generator. *) -(* References: Robert Sedgewick, "Algorithms", Addison-Wesley *) - -(* The PRNG is a linear feedback shift register. - It is seeded by a MD5-based PRNG. +(* $Id$ *) + +(* Pseudo-random number generator + This is a lagged-Fibonacci F(55, 24, +) with a modified addition + function to enhance the mixing of bits. + If we use normal addition, the low-order bit fails tests 1 and 7 + of the Diehard test suite, and bits 1 and 2 also fail test 7. + If we use multiplication as suggested by Marsaglia, it doesn't fare + much better. + By mixing the bits of one of the numbers before addition (XOR the + 5 high-order bits into the low-order bits), we get a generator that + passes all the Diehard tests. *) external random_seed: unit -> int = "caml_sys_random_seed";; @@ -35,9 +40,10 @@ module State = struct let full_init s seed = let combine accu x = Digest.string (accu ^ string_of_int x) in let extract d = - (Char.code d.[0] + (Char.code d.[1] lsl 8) + (Char.code d.[2] lsl 16)) - lxor (Char.code d.[3] lsl 22) + Char.code d.[0] + (Char.code d.[1] lsl 8) + (Char.code d.[2] lsl 16) + + (Char.code d.[3] lsl 24) in + let seed = if seed = [| |] then [| 0 |] else seed in let l = Array.length seed in for i = 0 to 54 do s.st.(i) <- i; @@ -69,9 +75,10 @@ module State = struct (* Returns 30 random bits as an integer 0 <= x < 1073741824 *) let bits s = s.idx <- (s.idx + 1) mod 55; - let newval = (s.st.((s.idx + 24) mod 55) + s.st.(s.idx)) land 0x3FFFFFFF in + let newval = s.st.((s.idx + 24) mod 55) + + (s.st.(s.idx) lxor ((s.st.(s.idx) lsr 25) land 31)) in s.st.(s.idx) <- newval; - newval + newval land 0x3FFFFFFF (* land is needed for 64-bit arch *) ;; let rec intaux s n = @@ -137,19 +144,19 @@ module State = struct end;; -(* This is the state you get with [init 27182818] on a 32-bit machine. *) +(* This is the state you get with [init 27182818]. *) let default = { State.st = [| - 509760043; 399328820; 99941072; 112282318; 611886020; 516451399; - 626288598; 337482183; 748548471; 808894867; 657927153; 386437385; - 42355480; 977713532; 311548488; 13857891; 307938721; 93724463; - 1041159001; 444711218; 1040610926; 233671814; 664494626; 1071756703; - 188709089; 420289414; 969883075; 513442196; 275039308; 918830973; - 598627151; 134083417; 823987070; 619204222; 81893604; 871834315; - 398384680; 475117924; 520153386; 324637501; 38588599; 435158812; - 168033706; 585877294; 328347186; 293179100; 671391820; 846150845; - 283985689; 502873302; 718642511; 938465128; 962756406; 107944131; - 192910970; + 0x7ae2522b; 0x5d8d4634; 0x15b4fad0; 0x18b14ace; 0x12f8a3c4; 0x7b086c47; + 0x16d467d6; 0x501d91c7; 0x321df177; 0x4176c193; 0x1ff72bf1; 0x5e889109; + 0x0b464b18; 0x6b86b97c; 0x4891da48; 0x03137463; 0x485ac5a1; 0x15d61f2f; + 0x7bced359; 0x69c1c132; 0x7a86766e; 0x366d8c86; 0x1f5b6222; 0x7ce1b59f; + 0x2ebf78e1; 0x67cd1b86; 0x658f3dc3; 0x789a8194; 0x42e4c44c; 0x58c43f7d; + 0x0f6e534f; 0x1e7df359; 0x455d0b7e; 0x10e84e7e; 0x126198e4; 0x4e7722cb; + 0x5cbede28; 0x7391b964; 0x7d40e92a; 0x4c59933d; 0x0b8cd0b7; 0x64efff1c; + 0x2803fdaa; 0x08ebc72e; 0x4f522e32; 0x45398edc; 0x2144a04c; 0x4aef3cbd; + 0x41ad4719; 0x75b93cd6; 0x2a559d4f; 0x5e6fd768; 0x66e27f36; 0x186f18c3; + 0x2fbf967a; |]; State.idx = 0; };; @@ -194,20 +201,20 @@ init 27182818; init_diff2 1024; chisquare diff2 100000 1024;; init 27182818; init_diff2 100; chisquare diff2 100000 100;; init 14142136; init_diff2 100; chisquare diff2 100000 100;; init 299792643; init_diff2 100; chisquare diff2 100000 100;; -- : float * float * float = (936.754446796632465, 1032., 1063.24555320336754) -# - : float * float * float = (80., 91.3699999999953434, 120.) -# - : float * float * float = (4858.57864376269026, 4982., 5141.42135623730974) +- : float * float * float = (936.754446796632465, 997.5, 1063.24555320336754) +# - : float * float * float = (80., 89.7400000000052387, 120.) +# - : float * float * float = (4858.57864376269, 5045.5, 5141.42135623731) # - : float * float * float = -(936.754446796632465, 1017.99399999994785, 1063.24555320336754) -# - : float * float * float = (960., 984.565759999997681, 1088.) -# - : float * float * float = (960., 1003.40735999999742, 1088.) -# - : float * float * float = (960., 1035.23328000000038, 1088.) -# - : float * float * float = (960., 1026.79551999999967, 1088.) -# - : float * float * float = (80., 110.194000000003143, 120.) -# - : float * float * float = (960., 1067.98080000000482, 1088.) -# - : float * float * float = (80., 107.292000000001281, 120.) -# - : float * float * float = (80., 85.1180000000022119, 120.) -# - : float * float * float = (80., 86.614000000001397, 120.) +(936.754446796632465, 944.805999999982305, 1063.24555320336754) +# - : float * float * float = (960., 1019.19744000000355, 1088.) +# - : float * float * float = (960., 1059.31776000000536, 1088.) +# - : float * float * float = (960., 1039.98463999999512, 1088.) +# - : float * float * float = (960., 1054.38207999999577, 1088.) +# - : float * float * float = (80., 90.096000000005, 120.) +# - : float * float * float = (960., 1076.78720000000612, 1088.) +# - : float * float * float = (80., 85.1760000000067521, 120.) +# - : float * float * float = (80., 85.2160000000003492, 120.) +# - : float * float * float = (80., 80.6220000000030268, 120.) *) diff --git a/stdlib/random.mli b/stdlib/random.mli index 56785e0b..587a7820 100644 --- a/stdlib/random.mli +++ b/stdlib/random.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: random.mli 7849 2007-02-09 13:31:15Z doligez $ *) +(* $Id$ *) (** Pseudo-random number generators (PRNG). *) diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 93c1ace8..1e62e4b8 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -11,18 +11,24 @@ (* *) (***********************************************************************) -(* $Id: scanf.ml 9417 2009-11-19 09:46:46Z weis $ *) +(* $Id$ *) (* The run-time library for scanners. *) (* Scanning buffers. *) module type SCANNING = sig -type scanbuf;; +type in_channel;; -val stdib : scanbuf;; -(* The scanning buffer reading from [stdin]. - [stdib] is equivalent to [Scanning.from_channel stdin]. *) +type scanbuf = in_channel;; + +val stdin : in_channel;; +(* The scanning buffer reading from [Pervasives.stdin]. + [stdib] is equivalent to [Scanning.from_channel Pervasives.stdin]. *) + +val stdib : in_channel;; +(* An alias for [Scanf.stdin], the scanning buffer reading from + [Pervasives.stdin]. *) val next_char : scanbuf -> char;; (* [Scanning.next_char ib] advance the scanning buffer for @@ -98,11 +104,15 @@ val name_of_input : scanbuf -> string;; (* [Scanning.name_of_input ib] returns the name of the character source for input buffer [ib]. *) -val from_string : string -> scanbuf;; -val from_channel : in_channel -> scanbuf;; +val open_in : string -> scanbuf;; +val open_in_bin : string -> scanbuf;; val from_file : string -> scanbuf;; val from_file_bin : string -> scanbuf;; +val from_string : string -> scanbuf;; val from_function : (unit -> char) -> scanbuf;; +val from_channel : Pervasives.in_channel -> scanbuf;; + +val close_in : scanbuf -> unit;; end ;; @@ -110,9 +120,14 @@ end module Scanning : SCANNING = struct (* The run-time library for scanf. *) -type file_name = string;; +type in_channel_name = + | From_file of string * Pervasives.in_channel + | From_string + | From_function + | From_channel of Pervasives.in_channel +;; -type scanbuf = { +type in_channel = { mutable eof : bool; mutable current_char : char; mutable current_char_is_valid : bool; @@ -121,10 +136,12 @@ type scanbuf = { mutable token_count : int; mutable get_next_char : unit -> char; tokbuf : Buffer.t; - file_name : file_name; + input_name : in_channel_name; } ;; +type scanbuf = in_channel;; + let null_char = '\000';; (* Reads a new character from input buffer. Next_char never fails, @@ -168,7 +185,14 @@ let end_of_input ib = let eof ib = ib.eof;; let beginning_of_input ib = ib.char_count = 0;; -let name_of_input ib = ib.file_name;; +let name_of_input ib = + match ib.input_name with + | From_file (fname, _ic) -> fname + | From_string -> "unnamed character string" + | From_function -> "unnamed function" + | From_channel _ic -> "unnamed pervasives input channel" +;; + let char_count ib = if ib.current_char_is_valid then ib.char_count - 1 else ib.char_count ;; @@ -200,16 +224,16 @@ let store_char max ib c = let default_token_buffer_size = 1024;; -let create fname next = { +let create iname next = { eof = false; - current_char = '\000'; + current_char = null_char; current_char_is_valid = false; char_count = 0; line_count = 0; token_count = 0; get_next_char = next; tokbuf = Buffer.create default_token_buffer_size; - file_name = fname; + input_name = iname; } ;; @@ -221,10 +245,10 @@ let from_string s = let c = s.[!i] in incr i; c in - create "string input" next + create From_string next ;; -let from_function = create "function input";; +let from_function = create From_function;; (* Scanning from an input channel. *) @@ -240,11 +264,11 @@ let from_function = create "function input";; To circumvent this problem, all the scanning functions get a low level input buffer argument where they store the lookahead character when - needed; additionnaly, the input buffer is the only source of character of + needed; additionally, the input buffer is the only source of character of a scanner. The [scanbuf] input buffers are defined in module {!Scanning}. Now we understand that it is extremely important that related successive - calls to scanners inded read from the same input buffer. In effect, if a + calls to scanners indeed read from the same input buffer. In effect, if a scanner [scan1] is reading from [ib1] and stores an unused lookahead character [c1] into its input buffer [ib1], then another scanner [scan2] not reading from the same buffer [ib1] will miss the character [c], @@ -260,7 +284,7 @@ let from_function = create "function input";; shared (two functions of the user's program may successively read from [ic]). This is highly error prone since, one of the function may seek the input channel, while the other function has still an unused lookahead - character in its input buffer. In conclusion, you should never mixt direct + character in its input buffer. In conclusion, you should never mix direct low level reading and high level scanning from the same input channel. This phenomenon of reading mess is even worse when one defines more than @@ -290,7 +314,7 @@ let scan_close_at_end ic = close_in ic; raise End_of_file;; it just raises [End_of_file]. *) let scan_raise_at_end _ic = raise End_of_file;; -let from_ic scan_close_ic fname ic = +let from_ic scan_close_ic iname ic = let len = !file_buffer_size in let buf = String.create len in let i = ref 0 in @@ -305,40 +329,68 @@ let from_ic scan_close_ic fname ic = buf.[0] end end in - create fname next + create iname next ;; let from_ic_close_at_end = from_ic scan_close_at_end;; -let from_file fname = from_ic_close_at_end fname (open_in fname);; -let from_file_bin fname = from_ic_close_at_end fname (open_in_bin fname);; - -(* The scanning buffer reading from [stdin]. +(* The scanning buffer reading from [Pervasives.stdin]. One could try to define [stdib] as a scanning buffer reading a character at a - time (no bufferization at all), but unfortunately the toplevel + time (no bufferization at all), but unfortunately the top-level interaction would be wrong. - This is due to some kind of ``race condition'' when reading from [stdin], + This is due to some kind of ``race condition'' when reading from [Pervasives.stdin], since the interactive compiler and [scanf] will simultaneously read the - material they need from [stdin]; then, confusion will result from what should - be read by the toplevel and what should be read by [scanf]. + material they need from [Pervasives.stdin]; then, confusion will result from what should + be read by the top-level and what should be read by [scanf]. This is even more complicated by the one character lookahead that [scanf] is sometimes obliged to maintain: the lookahead character will be available - for the next ([scanf]) entry, seamingly coming from nowhere. + for the next ([scanf]) entry, seemingly coming from nowhere. Also no [End_of_file] is raised when reading from stdin: if not enough characters have been read, we simply ask to read more. *) -let stdib = from_ic scan_raise_at_end "stdin" stdin;; +let stdin = + from_ic scan_raise_at_end + (From_file ("-", Pervasives.stdin)) Pervasives.stdin +;; + +let stdib = stdin;; + +let open_in fname = + match fname with + | "-" -> stdin + | fname -> + let ic = open_in fname in + from_ic_close_at_end (From_file (fname, ic)) ic +;; + +let open_in_bin fname = + match fname with + | "-" -> stdin + | fname -> + let ic = open_in_bin fname in + from_ic_close_at_end (From_file (fname, ic)) ic +;; + +let from_file = open_in;; +let from_file_bin = open_in_bin;; let memo_from_ic = let memo = ref [] in - (fun scan_close_ic fname ic -> + (fun scan_close_ic ic -> try List.assq ic !memo with | Not_found -> - let ib = from_ic scan_close_ic fname ic in + let ib = from_ic scan_close_ic (From_channel ic) ic in memo := (ic, ib) :: !memo; ib) ;; -let from_channel = memo_from_ic scan_raise_at_end "input channel";; +let from_channel = memo_from_ic scan_raise_at_end;; + +let close_in ib = + match ib.input_name with + | From_file (_fname, ic) -> Pervasives.close_in ic + | From_string | From_function -> () + | From_channel ic -> Pervasives.close_in ic +;; end ;; @@ -346,7 +398,7 @@ end (* Formatted input functions. *) type ('a, 'b, 'c, 'd) scanner = - ('a, Scanning.scanbuf, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c + ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c ;; external string_to_format : @@ -435,7 +487,7 @@ let ignore_stoppers stps ib = (Printf.sprintf "looking for one of range %S, found %C" sr ci) ;; -(* Extracting tokens from ouput token buffer. *) +(* Extracting tokens from the output token buffer. *) let token_char ib = (Scanning.token ib).[0];; @@ -679,9 +731,12 @@ let scan_Float max ib = | c -> bad_float () ;; -(* Scan a regular string: stops when encountering a space or one of the - characters in stp. It also stops when the maximum number of - characters has been read.*) +(* Scan a regular string: + stops when encountering a space, if no scanning indication has been given; + otherwise, stops when encountering one of the characters in the scanning + indication list [stp]. + It also stops at end of file or when the maximum number of characters has + been read.*) let scan_string stp max ib = let rec loop max = if max = 0 then max else @@ -785,6 +840,7 @@ let scan_backslash_char max ib = | c -> bad_input_char c ;; +(* Scan a character (a Caml token). *) let scan_Char max ib = let rec find_start max = @@ -797,7 +853,7 @@ let scan_Char max ib = | '\\' -> find_stop (scan_backslash_char (Scanning.ignore_char max ib) ib) | c -> find_stop (Scanning.store_char max ib c) - and find_stop max = + and find_stop max = match check_next_char_for_char max ib with | '\'' -> Scanning.ignore_char max ib | c -> character_mismatch '\'' c in @@ -805,6 +861,7 @@ let scan_Char max ib = find_start max ;; +(* Scan a delimited string (a Caml token). *) let scan_String max ib = let rec find_start max = @@ -837,6 +894,7 @@ let scan_String max ib = find_start max ;; +(* Scan a boolean (a Caml token). *) let scan_bool max ib = if max < 4 then bad_input "a boolean" else let c = Scanning.checked_peek_char ib in @@ -882,7 +940,7 @@ let read_char_set fmt i = j, Pos_set (Sformat.sub fmt (Sformat.index_of_int i) (j - i)) ;; -(* Char sets are now represented as bitvects that are represented as +(* Char sets are now represented as bit vectors that are represented as byte strings. *) (* Bit manipulations into bytes. *) @@ -907,7 +965,7 @@ let get_bit_of_range r c = get_bit_of_byte (int_of_char byte) idx ;; -(* Char sets represented as bitvects represented as fixed length byte +(* Char sets represented as bit vectors represented as fixed length byte strings. *) (* Create a full or empty set of chars. *) let make_range bit = @@ -1139,17 +1197,17 @@ let ascanf sc fmt = - an input buffer [ib] from which to read characters, - an error handling function [ef], - a format [fmt] that specifies what to read in the input, - - a vector of user's defined readers rv, + - a vector of user's defined readers [rv], - and a function [f] to pass the tokens read to. Then [scan_format] scans the format and the input buffer in parallel to - find out tokens as specified by the format; when it founds one token, it + find out tokens as specified by the format; when it finds one token, it converts it as specified, remembers the converted value as a future argument to the function [f], and continues scanning. If the entire scanning succeeds (i.e. the format string has been exhausted and the buffer has provided tokens according to the - format string), [f] is applied to the tokens. + format string), [f] is applied to the tokens read. If the scanning or some conversion fails, the main scanning function aborts and applies the scanning buffer and a string that explains diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index 9f35a740..315ea166 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: scanf.mli 9421 2009-11-19 10:21:42Z weis $ *) +(* $Id$ *) (** Formatted input functions. *) @@ -23,9 +23,9 @@ The formatted input functions can read from any kind of input, including strings, files, or anything that can return characters. The more general - source of characters is named a {e scanning buffer} and has type - {!Scanning.scanbuf}. The more general formatted input function reads from - any scanning buffer and is named [bscanf]. + source of characters is named a {e formatted input channel} (or {e + scanning buffer}) and has type {!Scanning.in_channel}. The more general + formatted input function reads from any scanning buffer and is named [bscanf]. Generally speaking, the formatted input functions have 3 arguments: - the first argument is a source of characters for the input, @@ -35,10 +35,10 @@ values read. Hence, a typical call to the formatted input function {!Scanf.bscanf} is - [bscanf ib fmt f], where: + [bscanf ic fmt f], where: - - [ib] is a source of characters (typically a {e - scanning buffer} with type {!Scanning.scanbuf}), + - [ic] is a source of characters (typically a {e + formatted input channel} with type {!Scanning.in_channel}), - [fmt] is a format string (the same format strings as those used to print material with module {!Printf} or {!Format}), @@ -48,18 +48,18 @@ (** {7 A simple example} *) -(** As suggested above, the expression [bscanf ib "%d" f] reads a decimal - integer [n] from the source of characters [ib] and returns [f n]. +(** As suggested above, the expression [bscanf ic "%d" f] reads a decimal + integer [n] from the source of characters [ic] and returns [f n]. For instance, - - if we use [stdib] as the source of characters ({!Scanning.stdib} is - the predefined input buffer that reads from standard input), + - if we use [stdin] as the source of characters ({!Scanning.stdin} is + the predefined formatted input channel that reads from standard input), - if we define the receiver [f] as [let f x = x + 1], - then [bscanf stdib "%d" f] reads an integer [n] from the standard input - and returns [f n] (that is [n + 1]). Thus, if we evaluate [bscanf stdib + then [bscanf Scanning.stdin "%d" f] reads an integer [n] from the standard input + and returns [f n] (that is [n + 1]). Thus, if we evaluate [bscanf stdin "%d" f], and then enter [41] at the keyboard, we get [42] as the final result. *) @@ -77,93 +77,111 @@ polymorphic user-defined scanners. Furthermore, the Caml formatted input facility is fully type-checked at compile time. *) -(** {6 Scanning buffers} *) +(** {6 Formatted input channel} *) module Scanning : sig -type scanbuf;; +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. + A [Scanf.Scanning.in_channel] value is also called a {i formatted input + channel} or equivalently a {i scanning buffer}. + The type [scanbuf] below is an alias for [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 input, and a token buffer to store the string matched so far. - Note: a scan may often require to examine one character in advance; - when this ``lookahead'' character does not belong to the token read, - it is stored back in the scanning buffer and becomes the next + Note: a scanning action may often require to examine one character in + advance; when this ``lookahead'' character does not belong to the token + read, it is stored back in the scanning buffer and becomes the next character read. *) -val stdib : scanbuf;; -(** The scanning buffer reading from [stdin]. - [stdib] is equivalent to [Scanning.from_channel stdin]. +val stdin : in_channel;; +(** The standard input notion for the module [Scanf]. + [stdin] is equivalent to [Scanning.from_channel Pervasives.stdin]. Note: when input is read interactively from [stdin], the newline character that triggers the evaluation is incorporated in the input; thus, scanning specifications must properly skip this character (simply add a ['\n'] as the last character of the format string). *) -val from_string : string -> scanbuf;; -(** [Scanning.from_string s] returns a scanning buffer 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_file : string -> scanbuf;; +val open_in : string -> in_channel;; (** Bufferized file reading in text mode. The efficient and usual way to scan text mode files (in effect, [from_file] returns a scanning buffer that reads characters in large chunks, rather than one - character at a time as buffers returned by [from_channel] do). + character at a time as buffers returned by [from_channel] below do). [Scanning.from_file fname] returns a scanning buffer which reads from the given file [fname] in text mode. *) -val from_file_bin : string -> scanbuf;; +val open_in_bin : string -> in_channel;; (** Bufferized file reading in binary mode. *) -val from_function : (unit -> char) -> scanbuf;; +val from_file : string -> in_channel;; +(** An alias for [open_in] above. *) +val from_file_bin : string -> in_channel;; +(** An alias for [open_in_bin] above. *) + +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;; (** [Scanning.from_function f] returns a scanning buffer with the given function as its reading method. When scanning needs one more character, the given function is called. - When the function has no more character to provide, it must signal an + When the function has no more character to provide, it {e must} signal an end-of-input condition by raising the exception [End_of_file]. *) -val from_channel : in_channel -> scanbuf;; -(** [Scanning.from_channel ic] returns a scanning buffer which reads from the - input channel [ic], starting at the current reading position. *) +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;; +(** [Scanning.end_of_input ic] tests the end-of-input condition of the given + formatted input channel. *) -val end_of_input : scanbuf -> bool;; -(** [Scanning.end_of_input ib] tests the end-of-input condition of the given - scanning buffer. *) +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 beginning_of_input : scanbuf -> bool;; -(** [Scanning.beginning_of_input ib] tests the beginning of input condition of - the given scanning buffer. *) +val name_of_input : in_channel -> string;; +(** [Scanning.file_name_of_input ic] returns the name of the character source + for the formatted input channel [ic]. *) -val name_of_input : scanbuf -> string;; -(** [Scanning.file_name_of_input ib] returns the name of the character source - for the scanning buffer [ib]. *) +val stdib : in_channel;; +(** A deprecated alias for [Scanning.stdin], the scanning buffer reading from + [Pervasives.stdin]. *) end;; (** {6 Type of formatted input functions} *) type ('a, 'b, 'c, 'd) scanner = - ('a, Scanning.scanbuf, '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 scanning buffer + type of a formatted input function that reads from some formatted input channel according to some format string; more precisely, if [scan] is some - formatted input function, then [scan ib fmt f] applies [f] to the arguments + formatted input function, then [scan ic fmt f] applies [f] to the arguments specified by the format string [fmt], when [scan] has read those arguments - from the scanning input buffer [ib]. + from the formatted input channel [ic]. For instance, the [scanf] function below has type [('a, 'b, 'c, 'd) - scanner], since it is a formatted input function that reads from [stdib]: - [scanf fmt f] applies [f] to the arguments specified by [fmt], reading - those arguments from [stdin] as expected. + scanner], since it is a formatted input function that reads from + [Scanning.stdin]: [scanf fmt f] applies [f] to the arguments specified by + [fmt], reading those arguments from [Pervasives.stdin] as expected. If the format [fmt] has some [%r] indications, the corresponding input functions must be provided before the receiver [f] argument. For instance, if [read_elem] is an input function for values of type [t], - then [bscanf ib "%r;" read_elem f] reads a value [v] of type [t] followed + then [bscanf ic "%r;" read_elem f] reads a value [v] of type [t] followed by a [';'] character, and returns [f v]. *) exception Scan_failure of string;; @@ -172,10 +190,10 @@ exception Scan_failure of string;; (** {6 The general formatted input function} *) -val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; -(** [bscanf ib fmt r1 ... rN f] reads arguments for the function [f], from the - scanning buffer [ib], according to the format string [fmt], and applies [f] - to these values. +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. The result of this call to [f] is returned as the result of the entire [bscanf] call. For instance, if [f] is the function [fun s i -> i + 1], then @@ -189,12 +207,13 @@ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; (** The format is a character string which contains three types of objects: - plain characters, which are simply matched with the characters of the - input, + input (with a special case for {!Scanf.space} and line feed), - conversion specifications, each of which causes reading and conversion of - one argument for the function [f], - - scanning indications to specify boundaries of tokens. *) + one argument for the function [f] (see {!Scanf.conversion}), + - scanning indications to specify boundaries of tokens + (see scanning {!Scanf.indication}). *) -(** {7 The space character in format strings} *) +(** {7:space The space character in format strings} *) (** As mentioned above, a plain character in the format string is just matched with the next character of the input; however, two characters are @@ -213,7 +232,7 @@ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; input with various whitespace in it, such as [Price = 1 $], [Price = 1 $], or even [Price=1$]. *) -(** {7 Conversion specifications in format strings} *) +(** {7:conversion Conversion specifications in format strings} *) (** Conversion specifications consist in the [%] character, followed by an optional flag, an optional field width, and followed by one or @@ -228,9 +247,11 @@ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; - [x] or [X]: reads an unsigned hexadecimal integer. - [o]: reads an unsigned octal integer. - [s]: reads a string argument that spreads as much as possible, until the - following bounding condition holds: a whitespace has been found, a - scanning indication has been encountered, or the end-of-input has been - reached. + following bounding condition holds: + - a whitespace has been found (see {!Scanf.space}), + - a scanning indication (see scanning {!Scanf.indication}) has been + encountered, + - the end-of-input has been reached. Hence, this conversion always succeeds: it returns an empty string, if the bounding condition holds when the scan begins. - [S]: reads a delimited string argument (delimiters and special @@ -270,7 +291,7 @@ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; [\[^\]\]] matches any character that is not [\]]. - [r]: user-defined reader. Takes the next [ri] formatted input function and applies it to the scanning buffer [ib] to read the next argument. The - input function [ri] must therefore have type [Scanning.scanbuf -> 'a] and + input function [ri] must therefore have type [Scanning.in_channel -> 'a] and the argument read has type ['a]. - [\{ fmt %\}]: reads a format string argument. The format string read must have the same type as the format string @@ -321,7 +342,7 @@ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; [Str]), stream parsers, [ocamllex]-generated lexers, [ocamlyacc]-generated parsers. *) -(** {7 Scanning indications in format strings} *) +(** {7:indication Scanning indications in format strings} *) (** Scanning indications appear just after the string conversions [%s] and [%\[ range \]] to delimit the end of the token. A scanning @@ -363,47 +384,47 @@ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;; - as a consequence, scanning a [%s] conversion never raises exception [End_of_file]: if the end of input is reached the conversion succeeds and - simply returns the characters read so far, or [""] if none were read. *) + simply returns the characters read so far, or [""] if none were ever read. *) (** {6 Specialised formatted input functions} *) -val fscanf : in_channel -> ('a, 'b, 'c, 'd) scanner;; -(** Same as {!Scanf.bscanf}, but reads from the given channel. +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 scanning - buffer, be aware that each [fscanf] invocation will operate with a - scanning buffer reading from the given channel. This extra level of - bufferization can lead to strange scanning behaviour if you use low level - primitives on the channel (reading characters, seeking the reading + Warning: since all formatted input functions operate from a {e formatted + input channel}, be aware that each [fscanf] invocation will operate with a + formatted input channel reading from the given channel. This extra level + of bufferization can lead to strange scanning behaviour if you use low + level primitives on the channel (reading characters, seeking the reading position, and so on). As a consequence, never mix direct low level reading and high level - scanning from the same input channel. *) + scanning from the same regular input channel. *) 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;; -(** Same as {!Scanf.bscanf}, but reads from the predefined scanning - buffer {!Scanf.Scanning.stdib} that is connected to [stdin]. *) +(** Same as {!Scanf.bscanf}, but reads from the predefined formatted input + channel {!Scanf.Scanning.stdin} that is connected to [Pervasives.stdin]. *) val kscanf : - Scanning.scanbuf -> (Scanning.scanbuf -> exn -> 'd) -> + Scanning.in_channel -> (Scanning.in_channel -> exn -> 'd) -> ('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 error handling function [ef] with the scanning buffer and the - exception that aborted the scanning process. *) + exception that aborted the scanning process as arguments. *) (** {6 Reading format strings from input} *) val bscanf_format : - Scanning.scanbuf -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> + Scanning.in_channel -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;; -(** [bscanf_format ib fmt f] reads a format string token from the scanning - buffer [ib], according to the given format string [fmt], and applies [f] to - the resulting format string value. +(** [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. Raise [Scan_failure] if the format string value read does not have the same type as [fmt]. *) diff --git a/stdlib/set.ml b/stdlib/set.ml index 103595e3..375fc5d0 100644 --- a/stdlib/set.ml +++ b/stdlib/set.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: set.ml 6694 2004-11-25 00:06:06Z doligez $ *) +(* $Id$ *) (* Sets over ordered types *) diff --git a/stdlib/set.mli b/stdlib/set.mli index d8317bc2..851a9ef5 100644 --- a/stdlib/set.mli +++ b/stdlib/set.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: set.mli 6974 2005-07-21 14:52:45Z doligez $ *) +(* $Id$ *) (** Sets over ordered types. diff --git a/stdlib/sort.ml b/stdlib/sort.ml index 4bc0b8f5..7c53ab77 100644 --- a/stdlib/sort.ml +++ b/stdlib/sort.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: sort.ml 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (* Merging and sorting *) diff --git a/stdlib/sort.mli b/stdlib/sort.mli index 4a2a217b..7069052e 100644 --- a/stdlib/sort.mli +++ b/stdlib/sort.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: sort.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Sorting and merging lists. diff --git a/stdlib/stack.ml b/stdlib/stack.ml index 94008f5a..03277d07 100644 --- a/stdlib/stack.ml +++ b/stdlib/stack.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stack.ml 4956 2002-06-27 08:48:26Z xleroy $ *) +(* $Id$ *) type 'a t = { mutable c : 'a list } diff --git a/stdlib/stack.mli b/stdlib/stack.mli index dc305898..bf33d01a 100644 --- a/stdlib/stack.mli +++ b/stdlib/stack.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stack.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Last-in first-out stacks. diff --git a/stdlib/stdLabels.ml b/stdlib/stdLabels.ml index d0f9730a..bd6a5841 100644 --- a/stdlib/stdLabels.ml +++ b/stdlib/stdLabels.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stdLabels.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Module [StdLabels]: meta-module for labelled libraries *) diff --git a/stdlib/stdLabels.mli b/stdlib/stdLabels.mli index 325afd6b..73f72dc6 100644 --- a/stdlib/stdLabels.mli +++ b/stdlib/stdLabels.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stdLabels.mli 6694 2004-11-25 00:06:06Z doligez $ *) +(* $Id$ *) (** Standard labeled libraries. diff --git a/stdlib/std_exit.ml b/stdlib/std_exit.ml index f000f4b4..6f5ff301 100644 --- a/stdlib/std_exit.ml +++ b/stdlib/std_exit.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: std_exit.ml 4144 2001-12-07 13:41:02Z xleroy $ *) +(* $Id$ *) (* Ensure that [at_exit] functions are called at the end of every program *) diff --git a/stdlib/stdlib.mllib b/stdlib/stdlib.mllib index 0858e0aa..91265e5d 100644 --- a/stdlib/stdlib.mllib +++ b/stdlib/stdlib.mllib @@ -1,7 +1,7 @@ # This file lists all standard library modules # (in the same order as Makefile.shared). # It is used in particular to know what to expunge in toplevels. -# $Id: stdlib.mllib 9353 2009-09-24 09:17:39Z doligez $ +# $Id$ Pervasives Array diff --git a/stdlib/stream.ml b/stdlib/stream.ml index c1a74ac8..aa6a2a2a 100644 --- a/stdlib/stream.ml +++ b/stdlib/stream.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stream.ml 8893 2008-06-18 15:35:02Z mauny $ *) +(* $Id$ *) (* The fields of type t are not mutable to preserve polymorphism of the empty stream. This is type safe because the empty stream is never diff --git a/stdlib/stream.mli b/stdlib/stream.mli index 05b9b523..28cfd3a1 100644 --- a/stdlib/stream.mli +++ b/stdlib/stream.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stream.mli 7164 2005-10-25 18:34:07Z doligez $ *) +(* $Id$ *) (** Streams and parsers. *) diff --git a/stdlib/string.ml b/stdlib/string.ml index 63e2367d..0cb67d28 100644 --- a/stdlib/string.ml +++ b/stdlib/string.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: string.ml 9128 2008-11-12 10:55:15Z doligez $ *) +(* $Id$ *) (* String operations *) diff --git a/stdlib/string.mli b/stdlib/string.mli index 00d69ab1..21bfb7c0 100644 --- a/stdlib/string.mli +++ b/stdlib/string.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: string.mli 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) (** String operations. Given a string [s] of length [l], we call character number in [s] diff --git a/stdlib/stringLabels.ml b/stdlib/stringLabels.ml index 86701dcc..87d23d86 100644 --- a/stdlib/stringLabels.ml +++ b/stdlib/stringLabels.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stringLabels.ml 6054 2004-01-03 22:08:38Z doligez $ *) +(* $Id$ *) (* Module [StringLabels]: labelled String module *) diff --git a/stdlib/stringLabels.mli b/stdlib/stringLabels.mli index 3e16254c..9cbee708 100644 --- a/stdlib/stringLabels.mli +++ b/stdlib/stringLabels.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stringLabels.mli 7805 2007-01-22 08:06:09Z garrigue $ *) +(* $Id$ *) (** String operations. *) diff --git a/stdlib/sys.mli b/stdlib/sys.mli index eb1db4bf..c88e8812 100644 --- a/stdlib/sys.mli +++ b/stdlib/sys.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: sys.mli 7927 2007-02-26 14:21:57Z xleroy $ *) +(* $Id$ *) (** System interface. *) diff --git a/stdlib/sys.mlp b/stdlib/sys.mlp index 03e2b91f..b58ca0bb 100644 --- a/stdlib/sys.mlp +++ b/stdlib/sys.mlp @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: sys.mlp 7927 2007-02-26 14:21:57Z xleroy $ *) +(* $Id$ *) (* WARNING: sys.ml is generated from sys.mlp. DO NOT EDIT sys.ml or your changes will be lost. diff --git a/stdlib/weak.ml b/stdlib/weak.ml index 4799c74c..4adacd8e 100644 --- a/stdlib/weak.ml +++ b/stdlib/weak.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: weak.ml 8823 2008-02-29 14:21:22Z doligez $ *) +(* $Id$ *) (** Weak array operations *) diff --git a/stdlib/weak.mli b/stdlib/weak.mli index fdc561f2..33f4bf1d 100644 --- a/stdlib/weak.mli +++ b/stdlib/weak.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: weak.mli 9130 2008-11-13 10:39:46Z doligez $ *) +(* $Id$ *) (** Arrays of weak pointers and hash tables of weak pointers. *) @@ -24,7 +24,7 @@ type 'a t the value is not used any more (through normal pointers) by the program. Note that finalisation functions are run after the weak pointers are erased. - + A weak pointer is said to be full if it points to a value, empty if the value was erased by the GC. diff --git a/test/.cvsignore b/test/.cvsignore new file mode 100644 index 00000000..66d34d73 --- /dev/null +++ b/test/.cvsignore @@ -0,0 +1,2 @@ +*.byt +*.out diff --git a/test/.depend b/test/.depend new file mode 100644 index 00000000..ac5de61e --- /dev/null +++ b/test/.depend @@ -0,0 +1,28 @@ +KB/equations.cmi: KB/terms.cmi +KB/kb.cmi: KB/equations.cmi KB/terms.cmi +KB/orderings.cmi: KB/terms.cmi +KB/equations.cmo: KB/equations.cmi KB/terms.cmi +KB/equations.cmx: KB/equations.cmi KB/terms.cmx +KB/kb.cmo: KB/kb.cmi KB/equations.cmi KB/terms.cmi +KB/kb.cmx: KB/kb.cmi KB/equations.cmx KB/terms.cmx +KB/kbmain.cmo: KB/kb.cmi KB/orderings.cmi KB/equations.cmi KB/terms.cmi +KB/kbmain.cmx: KB/kb.cmx KB/orderings.cmx KB/equations.cmx KB/terms.cmx +KB/orderings.cmo: KB/orderings.cmi KB/terms.cmi +KB/orderings.cmx: KB/orderings.cmi KB/terms.cmx +KB/terms.cmo: KB/terms.cmi +KB/terms.cmx: KB/terms.cmi +Lex/grammar.cmi: Lex/syntax.cmo +Lex/gram_aux.cmo: Lex/syntax.cmo +Lex/gram_aux.cmx: Lex/syntax.cmx +Lex/grammar.cmo: Lex/grammar.cmi Lex/gram_aux.cmo Lex/syntax.cmo +Lex/grammar.cmx: Lex/grammar.cmi Lex/gram_aux.cmx Lex/syntax.cmx +Lex/lexgen.cmo: Lex/syntax.cmo +Lex/lexgen.cmx: Lex/syntax.cmx +Lex/main.cmo: Lex/lexgen.cmo Lex/output.cmo Lex/grammar.cmi \ + Lex/scanner.cmo Lex/syntax.cmo Lex/scan_aux.cmo +Lex/main.cmx: Lex/lexgen.cmx Lex/output.cmx Lex/grammar.cmx \ + Lex/scanner.cmx Lex/syntax.cmx Lex/scan_aux.cmx +Lex/output.cmo: Lex/syntax.cmo +Lex/output.cmx: Lex/syntax.cmx +Lex/scanner.cmo: Lex/syntax.cmo Lex/scan_aux.cmo Lex/grammar.cmi +Lex/scanner.cmx: Lex/syntax.cmx Lex/scan_aux.cmx Lex/grammar.cmx diff --git a/otherlibs/num/test/test_bng.c b/test/test_bng.c similarity index 100% rename from otherlibs/num/test/test_bng.c rename to test/test_bng.c diff --git a/testlabl/.cvsignore b/testlabl/.cvsignore new file mode 100644 index 00000000..4c57147b --- /dev/null +++ b/testlabl/.cvsignore @@ -0,0 +1 @@ +*.out *.out2 \ No newline at end of file diff --git a/testlabl/coerce.diffs b/testlabl/coerce.diffs new file mode 100644 index 00000000..e90e1fc9 --- /dev/null +++ b/testlabl/coerce.diffs @@ -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/testlabl/dirs_multimatch b/testlabl/dirs_multimatch new file mode 100644 index 00000000..b4495146 --- /dev/null +++ b/testlabl/dirs_multimatch @@ -0,0 +1 @@ +parsing typing bytecomp driver toplevel \ No newline at end of file diff --git a/testlabl/dirs_poly b/testlabl/dirs_poly new file mode 100644 index 00000000..3aec606e --- /dev/null +++ b/testlabl/dirs_poly @@ -0,0 +1 @@ +bytecomp byterun driver parsing stdlib tools toplevel typing utils otherlibs/labltk/browser/searchpos.ml diff --git a/testlabl/els.ml b/testlabl/els.ml new file mode 100644 index 00000000..fdd292d6 --- /dev/null +++ b/testlabl/els.ml @@ -0,0 +1,92 @@ +(* Adapted from: An Expressive Language of Signatures + by Norman Ramsey, Kathleen Fisher and Paul Govereau *) + +module type VALUE = sig + type value (* a Lua value *) + type state (* the state of a Lua interpreter *) + type usert (* a user-defined value *) +end + +module type CORE0 = sig + module V : VALUE + val setglobal : V.state -> string -> V.value -> unit + (* five more functions common to core and evaluator *) +end + +module type CORE = sig + include CORE0 + val apply : V.value -> V.state -> V.value list -> V.value + (* apply function f in state s to list of args *) +end + +module type AST = sig + module Value : VALUE + type chunk + type program + val get_value : chunk -> Value.value +end + +module type EVALUATOR = sig + module Value : VALUE + module Ast : (AST with module Value := Value) + type state = Value.state + type value = Value.value + exception Error of string + val compile : Ast.program -> string + include CORE0 with module V := Value +end + +module type PARSER = sig + type chunk + val parse : string -> chunk +end + +module type INTERP = sig + include EVALUATOR + module Parser : PARSER with type chunk = Ast.chunk + val dostring : state -> string -> value list + val mk : unit -> state +end + +module type USERTYPE = sig + type t + val eq : t -> t -> bool + val to_string : t -> string +end + +module type TYPEVIEW = sig + type combined + type t + val map : (combined -> t) * (t -> combined) +end + +module type COMBINED_COMMON = sig + module T : sig type t end + module TV1 : TYPEVIEW with type combined := T.t + module TV2 : TYPEVIEW with type combined := T.t +end + +module type COMBINED_TYPE = sig + module T : USERTYPE + include COMBINED_COMMON with module T := T +end + +module type BARECODE = sig + type state + val init : state -> unit +end + +module USERCODE(X : TYPEVIEW) = struct + module type F = + functor (C : CORE with type V.usert = X.combined) -> + BARECODE with type state := C.V.state +end + +module Weapon = struct type t end + +module type WEAPON_LIB = sig + type t = Weapon.t + module T : USERTYPE with type t = t + module Make : + functor (TV : TYPEVIEW with type t = t) -> USERCODE(TV).F +end diff --git a/testlabl/fixedtypes.ml b/testlabl/fixedtypes.ml new file mode 100644 index 00000000..a7d7ca4a --- /dev/null +++ b/testlabl/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/testlabl/marshal_objects.diffs b/testlabl/marshal_objects.diffs new file mode 100644 index 00000000..bb9b4dd7 --- /dev/null +++ b/testlabl/marshal_objects.diffs @@ -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/testlabl/multimatch.diffs b/testlabl/multimatch.diffs new file mode 100644 index 00000000..6eb34b72 --- /dev/null +++ b/testlabl/multimatch.diffs @@ -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 + %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 "@[`%s%t%a@]" l pr_of (print_typlist print_out_type " &") +- tyl ++ and pr_tp ppf (t1,t2) = ++ fprintf ppf "@[%a =@ %a@]" ++ print_out_type t1 ++ print_out_type t2 ++ in ++ fprintf ppf "@[`%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 "@[Reither(%b,@,%a,@,%b,@,@[<1>ref%t@])@]" c +- raw_type_list tl m ++ | Reither (c,tl,m,tpl,e) -> ++ fprintf ppf "@[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/testlabl/multimatch.ml b/testlabl/multimatch.ml new file mode 100644 index 00000000..7c9aa73f --- /dev/null +++ b/testlabl/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/testlabl/newlabels.ps b/testlabl/newlabels.ps new file mode 100644 index 00000000..01eac194 --- /dev/null +++ b/testlabl/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 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 109 D I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmsy8 8 3 +/Fd 3 93 df 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 78 D<03F8E00FFEE01FFFE03C07E07801E0F001E0E000E0 +E000E0E000E0E000007000007800003F80001FF80007FF00007FC00007E00000F0000070 +000038000038600038E00038E00038E00070F000F0FE01E0FFFFC0EFFF80E1FE00151E7E +9D1A> 83 D<7FFFFEFFFFFEFFFFFEE0380EE0380EE0380EE0380E003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380003FF8003FF8003FF80171E7F9D1A> I 91 D 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 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 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 68 D<01FE0207FF861F01FE3C007E7C001E78000E78000EF80006F80006FC0006 +FC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FE00007F +00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF80 +18227DA11F> 83 D<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003 +F80180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F8 +00000003F800000003F800000003F800000003F800000003F800000003F800000003F800 +000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 +0003F800000003F800000003F800000003F800000003F8000001FFFFF00001FFFFF00022 +227EA127> I<0FFC003FFF807E07C07E03E07E01E07E01F03C01F00001F00001F0003FF0 +03FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F +18167E951B> 97 D 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 108 +D I I<00FE0007FFC00F83E01E00F03E00F87C00 +7C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00 +F81F01F00F83E007FFC000FE0017167E951C> I I<0FF3003FFF00781F00600700E00300E00300F00300FC00007F +E0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EF +FC00C7F00011167E9516> 115 D<01800001800001800001800003800003800007800007 +80000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000 +F80011207F9F16> I I 120 D I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fj cmsy10 12 15 +/Fj 15 107 df 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 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 I 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 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 61 D<07E01838201C400E800FF00FF00FF00F000F000E001C00380030006000C000C0 +00800080018001000100010001000100010000000000000000000000038007C007C007C0 +038010237DA217> 63 D<0001800000018000000180000003C0000003C0000003C00000 +05E0000005E0000009F0000008F0000008F00000107800001078000010780000203C0000 +203C0000203C0000401E0000401E0000C01F0000800F0000800F0001FFFF800100078001 +000780020003C0020003C0020003C0040001E0040001E0040001E0080000F01C0000F03E +0001F8FF800FFF20237EA225> 65 D I<0007E0100038183000E0063001C00170038000F007 +0000F00E0000701E0000701C0000303C0000303C0000307C0000107800001078000010F8 +000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800000078 +0000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001 +C0010000E0020000381C000007E0001C247DA223> I I 70 D<0007F008003C0C1800E0021801C0 +01B8038000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800 +000878000008F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800 +1FFF780000F8780000787C0000783C0000783C0000781E0000781E0000780F0000780700 +0078038000B801C000B800E00318003C0C080007F00020247DA226> I I I 75 +D I +78 D<000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03C +0000783C0000787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF8 +00003EF800003EF800003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C +0000783E0000F81E0000F00F0001E00F0001E0078003C003C0078000E00E0000783C0000 +0FE0001F247DA226> I I 82 D<03F0200C0C601802603001E07000E0600060E00060E000 +60E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003F +C00007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000 +C0F000C0C80180C6070081FC0014247DA21B> I<7FFFFFF8780780786007801840078008 +4007800840078008C007800C800780048007800480078004800780040007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000 +00078000000FC00001FFFE001E227EA123> I 86 D I 91 D 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 I I I I<3FFFC0380380300780200700600E +00401C00403C0040380000700000E00001E00001C0000380400700400F00400E00C01C00 +80380080780180700780FFFF8012157F9416> I 124 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fl cmbx12 14.4 19 +/Fl 19 118 df<00007FE0030007FFFC07001FFFFF0F007FF00F9F00FF0001FF01FC0000 +FF03F800007F07F000003F0FE000001F1FC000001F1FC000000F3F8000000F3F80000007 +7F800000077F800000077F00000000FF00000000FF00000000FF00000000FF00000000FF +00000000FF00000000FF00000000FF00000000FF000000007F000000007F800000007F80 +0000073F800000073F800000071FC00000071FC000000E0FE000000E07F000001C03F800 +003C01FC00007800FF0001F0007FF007C0001FFFFF800007FFFE0000007FF00028297CA8 +31> 67 D +76 D<0000FFC00000000FFFFC0000003F807F000000FE001FC00001F80007E00003F000 +03F00007E00001F8000FE00001FC001FC00000FE001FC00000FE003F8000007F003F8000 +007F007F8000007F807F0000003F807F0000003F807F0000003F80FF0000003FC0FF0000 +003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000 +003FC0FF0000003FC0FF0000003FC07F0000003F807F8000007F807F8000007F803F8000 +007F003F8000007F001FC00000FE001FC00000FE000FE00001FC0007F00003F80003F800 +07F00001FC000FE00000FE001FC000003FC0FF0000000FFFFC00000000FFC000002A297C +A833> 79 D 86 D<03FF80000FFFF0001F01FC003F80FE003F807F003F803F003F803F +801F003F8000003F8000003F8000003F8000003F80003FFF8001FC3F800FE03F801F803F +803F003F807E003F80FC003F80FC003F80FC003F80FC003F80FC005F807E00DF803F839F +FC1FFE0FFC03FC03FC1E1B7E9A21> 97 D I<00007FF000007FF000007FF0000007F0000007F0000007 +F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007 +F0003F87F001FFF7F007F03FF00FC00FF01F8007F03F0007F03F0007F07E0007F07E0007 +F07E0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007 +F07E0007F07E0007F03F0007F03F0007F01F800FF00FC01FF007E07FFF01FFE7FF007F87 +FF202A7EA925> 100 D<003FC00001FFF00003E07C000F803E001F801F001F001F003F00 +0F807E000F807E000FC07E000FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000FE00 +0000FE0000007E0000007E0000007F0000003F0001C01F0001C00F80038007C0070003F0 +1E0000FFFC00003FE0001A1B7E9A1F> I<0007F8003FFC007E3E01FC7F03F87F03F07F07 +F07F07F03E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007 +F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007 +F00007F00007F00007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF8018 +2A7EA915> I +104 D<07000F801FC03FE03FE03FE01FC00F8007000000000000000000000000000000FF +E0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7EAA12> I 108 D 110 D<003FE00001FFFC0003F07E000FC01F801F80 +0FC03F0007E03F0007E07E0003F07E0003F07E0003F0FE0003F8FE0003F8FE0003F8FE00 +03F8FE0003F8FE0003F8FE0003F8FE0003F87E0003F07E0003F03F0007E03F0007E01F80 +0FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22> I I 114 D<03FE300FFFF03E03F078 +00F07000F0F00070F00070F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800 +FFF80007FC0000FCE0007CE0003CF0003CF00038F80038FC0070FF01E0E7FFC0C1FF0016 +1B7E9A1B> I<00E00000E00000E00000E00001E00001E00001E00003E00003E00007E000 +0FE0001FFFE0FFFFE0FFFFE00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 +0FE0000FE0000FE0000FE0000FE0000FE0700FE0700FE0700FE0700FE0700FE0700FE070 +07F0E003F0C001FF80007F0014267FA51A> I 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 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 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() 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() 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() 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() 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/testlabl/objvariant.diffs b/testlabl/objvariant.diffs new file mode 100644 index 00000000..75deb24c --- /dev/null +++ b/testlabl/objvariant.diffs @@ -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@[@[%a@]%a ]@]" (if non_gen then "_" else "") ++ fprintf ppf "%s[%s@[@[%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/testlabl/objvariant.ml b/testlabl/objvariant.ml new file mode 100644 index 00000000..3233e03c --- /dev/null +++ b/testlabl/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/testlabl/printers.ml b/testlabl/printers.ml new file mode 100644 index 00000000..c80c42d6 --- /dev/null +++ b/testlabl/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/testlabl/sigsubst.ml b/testlabl/sigsubst.ml new file mode 100644 index 00000000..ffddfdfc --- /dev/null +++ b/testlabl/sigsubst.ml @@ -0,0 +1,33 @@ +module type Printable = sig + type t + val print : Format.formatter -> t -> unit +end +module type Comparable = sig + type t + val compare : t -> t -> int +end +module type PrintableComparable = sig + type t + include Printable with type t := t + include Comparable with type t := t +end +module type PrintableComparable2 = sig + include Printable + include Comparable with type t := t +end + +module type S = sig type t val f : t -> t end +module type S' = S with type t := int + +module type S = sig type 'a t val map : ('a -> 'b) -> 'a t -> 'b t end +module type S1 = S with type 'a t := 'a list +module type S2 = sig + type 'a dict = (string * 'a) list + include S with type 'a t := 'a dict +end + + +module type S = + sig module T : sig type exp type arg end val f : T.exp -> T.arg end +module M = struct type exp = string type arg = int end +module type S' = S with module T := M diff --git a/testlabl/tests.ml b/testlabl/tests.ml new file mode 100644 index 00000000..c39d152f --- /dev/null +++ b/testlabl/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/testlabl/valvirt.diffs b/testlabl/valvirt.diffs new file mode 100644 index 00000000..b8b17ef5 --- /dev/null +++ b/testlabl/valvirt.diffs @@ -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 overriden \ + 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 overriden.\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 overriden method\n\ ++ \032 M/m enable/disable overriden 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 overriden 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 overriden 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/testlabl/varunion.ml b/testlabl/varunion.ml new file mode 100644 index 00000000..30a410f2 --- /dev/null +++ b/testlabl/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/testsuite/.svnignore b/testsuite/.svnignore new file mode 100644 index 00000000..93feea3b --- /dev/null +++ b/testsuite/.svnignore @@ -0,0 +1,9 @@ +# svn propset -R svn:ignore -F .svnignore . +# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +_log +*.so +*.a +*.result +*.byte +*.native +program diff --git a/testsuite/Makefile b/testsuite/Makefile new file mode 100644 index 00000000..a9e4b6c6 --- /dev/null +++ b/testsuite/Makefile @@ -0,0 +1,59 @@ +# $Id$ + +BASEDIR=${PWD} + +default: + @echo "Available targets:" + @echo " all launches all tests" + @echo " list FILE=f launches the tests referenced in file f (one path per line)" + @echo " one DIR=p launches the tests located in path p" + @echo " lib builds library modules" + @echo " clean deletes generated files" + @echo " report prints the report for the last execution, if any" + +all: + @for dir in tests/*; do \ + $(MAKE) one DIR=$$dir; \ + done 2>&1 | tee _log + @$(MAKE) report + +list: + @if [ -z $(FILE) ]; then echo "No value set for variable 'FILE'."; exit 1; fi + @if [ ! -f $(FILE) ]; then echo "File '$(FILE)' does not exist."; exit 1; fi + @while read LINE; do \ + $(MAKE) one DIR=$$LINE; \ + done < $(FILE) 2>&1 | tee _log + @$(MAKE) report + +one: lib + @if [ -z $(DIR) ]; then echo "No value set for variable 'DIR'."; exit 1; fi + @if [ ! -d $(DIR) ]; then echo "Directory '$(DIR)' does not exist."; exit 1; fi + @echo "Running tests from '$$DIR' ..." + @(cd $(DIR) && $(MAKE) BASEDIR=$(BASEDIR) && cd ../..) + +lib: FORCE + @(cd lib && $(MAKE) -s BASEDIR=$(BASEDIR) && cd ..) + +clean: FORCE + @(cd lib && $(MAKE) BASEDIR=$(BASEDIR) clean && cd ..) + @for file in tests/*; do \ + if [ -d $$file ]; then \ + (cd $$file && $(MAKE) BASEDIR=$(BASEDIR) clean && cd ../..); \ + fi \ + done + @for file in interactive/*; do \ + if [ -d $$file ]; then \ + (cd $$file && $(MAKE) BASEDIR=$(BASEDIR) clean && cd ../..); \ + fi \ + done + +report: FORCE + @if [ ! -f _log ]; then echo "No '_log' file."; exit 1; fi + @echo '' + @echo 'Summary:' + @echo ' ' `grep 'passed$$' _log | wc -l` 'test(s) passed' + @echo ' ' `grep 'failed$$' _log | wc -l` 'test(s) failed' + @echo ' ' `grep '^Error' _log | wc -l` 'compilation error(s)' + @echo ' ' `grep '^Warning' _log | wc -l` 'compilation warning(s)' + +FORCE: diff --git a/testsuite/interactive/lib-gc/Makefile b/testsuite/interactive/lib-gc/Makefile new file mode 100644 index 00000000..4eb07e7e --- /dev/null +++ b/testsuite/interactive/lib-gc/Makefile @@ -0,0 +1,10 @@ +default: + @$(OCAMLC) -o program.byte alloc.ml + @./program.byte + @$(OCAMLOPT) -o program.native alloc.ml + @./program.native + +clean: defaultclean + @rm -fr program.* + +include ../../makefiles/Makefile.common diff --git a/testsuite/interactive/lib-gc/alloc.ml b/testsuite/interactive/lib-gc/alloc.ml new file mode 100644 index 00000000..4f607fb2 --- /dev/null +++ b/testsuite/interactive/lib-gc/alloc.ml @@ -0,0 +1,51 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: alloc.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + +(* Random allocation test *) + +(* + Allocate arrays of strings, of random sizes in [0..1000[, and put them + into an array of 32768. Replace a randomly-selected array with a new + random-length array. Reiterate ad infinitum. +*) + +let l = 32768;; +let m = 1000;; + +let ar = Array.create l "";; + +Random.init 1234;; + +let compact_flag = ref false;; + +let main () = + while true do + for i = 1 to 100000 do + ar.(Random.int l) <- String.create (Random.int m); + done; + if !compact_flag then Gc.compact () else Gc.full_major (); + print_newline (); + Gc.print_stat stdout; + flush stdout; + done +;; + +let argspecs = [ + "-c", Arg.Set compact_flag, "do heap compactions"; +];; + +Arg.parse argspecs (fun _ -> ()) "Usage: alloc [-c]";; + +main ();; + diff --git a/testsuite/interactive/lib-gc/alloc.result b/testsuite/interactive/lib-gc/alloc.result new file mode 100644 index 00000000..9503b34c --- /dev/null +++ b/testsuite/interactive/lib-gc/alloc.result @@ -0,0 +1,544 @@ + +minor_words: 6410964 +promoted_words: 6332175 +major_words: 6393661 +minor_collections: 196 +major_collections: 14 +heap_words: 3936256 +heap_chunks: 31 +top_heap_words: 3936256 +live_words: 2034808 +live_blocks: 31786 +free_words: 1901339 +free_blocks: 16531 +largest_free: 1357 +fragments: 109 +compactions: 0 + +minor_words: 12805330 +promoted_words: 12664909 +major_words: 12739763 +minor_collections: 391 +major_collections: 21 +heap_words: 4571136 +heap_chunks: 36 +top_heap_words: 4571136 +live_words: 2126718 +live_blocks: 33282 +free_words: 2444325 +free_blocks: 19124 +largest_free: 1824 +fragments: 93 +compactions: 0 + +minor_words: 19215544 +promoted_words: 18998176 +major_words: 19100845 +minor_collections: 586 +major_collections: 28 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2135891 +live_blocks: 33344 +free_words: 2562126 +free_blocks: 19238 +largest_free: 1405 +fragments: 95 +compactions: 0 + +minor_words: 25638028 +promoted_words: 25361252 +major_words: 25472205 +minor_collections: 782 +major_collections: 35 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2137378 +live_blocks: 33350 +free_words: 2560637 +free_blocks: 19112 +largest_free: 1634 +fragments: 97 +compactions: 0 + +minor_words: 32062298 +promoted_words: 31721945 +major_words: 31842628 +minor_collections: 978 +major_collections: 41 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2145462 +live_blocks: 33351 +free_words: 2552521 +free_blocks: 19013 +largest_free: 1999 +fragments: 129 +compactions: 0 + +minor_words: 38449694 +promoted_words: 38049841 +major_words: 38176354 +minor_collections: 1173 +major_collections: 48 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2125014 +live_blocks: 33351 +free_words: 2572992 +free_blocks: 19080 +largest_free: 1525 +fragments: 106 +compactions: 0 + +minor_words: 44846324 +promoted_words: 44379560 +major_words: 44521194 +minor_collections: 1368 +major_collections: 55 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2136556 +live_blocks: 33351 +free_words: 2561444 +free_blocks: 19191 +largest_free: 1760 +fragments: 112 +compactions: 0 + +minor_words: 51240537 +promoted_words: 50707711 +major_words: 50862160 +minor_collections: 1563 +major_collections: 61 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2136623 +live_blocks: 33351 +free_words: 2561383 +free_blocks: 18967 +largest_free: 1526 +fragments: 106 +compactions: 0 + +minor_words: 57628061 +promoted_words: 57038039 +major_words: 57197286 +minor_collections: 1758 +major_collections: 68 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2133895 +live_blocks: 33351 +free_words: 2564119 +free_blocks: 19273 +largest_free: 1793 +fragments: 98 +compactions: 0 + +minor_words: 64028127 +promoted_words: 63367620 +major_words: 63545093 +minor_collections: 1953 +major_collections: 74 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2138085 +live_blocks: 33351 +free_words: 2559920 +free_blocks: 19111 +largest_free: 1800 +fragments: 107 +compactions: 0 + +minor_words: 70438812 +promoted_words: 69698963 +major_words: 69904882 +minor_collections: 2148 +major_collections: 80 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2131008 +live_blocks: 33351 +free_words: 2566995 +free_blocks: 19079 +largest_free: 1451 +fragments: 109 +compactions: 0 + +minor_words: 76852923 +promoted_words: 76032234 +major_words: 76270123 +minor_collections: 2343 +major_collections: 86 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2135699 +live_blocks: 33351 +free_words: 2562313 +free_blocks: 19201 +largest_free: 2056 +fragments: 100 +compactions: 0 + +minor_words: 83248665 +promoted_words: 82362663 +major_words: 82613979 +minor_collections: 2538 +major_collections: 92 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2126387 +live_blocks: 33351 +free_words: 2571625 +free_blocks: 19099 +largest_free: 1498 +fragments: 100 +compactions: 0 + +minor_words: 89636938 +promoted_words: 88694885 +major_words: 88952817 +minor_collections: 2733 +major_collections: 99 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2136754 +live_blocks: 33351 +free_words: 2561246 +free_blocks: 19220 +largest_free: 1697 +fragments: 112 +compactions: 0 + +minor_words: 96030388 +promoted_words: 95026453 +major_words: 95296004 +minor_collections: 2928 +major_collections: 106 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2126039 +live_blocks: 33351 +free_words: 2571956 +free_blocks: 19250 +largest_free: 1593 +fragments: 117 +compactions: 0 + +minor_words: 102436652 +promoted_words: 101356198 +major_words: 101649957 +minor_collections: 3123 +major_collections: 113 +heap_words: 4698112 +heap_chunks: 37 +top_heap_words: 4698112 +live_words: 2140261 +live_blocks: 33351 +free_words: 2557747 +free_blocks: 19192 +largest_free: 1731 +fragments: 104 +compactions: 0 + +minor_words: 108832359 +promoted_words: 107686065 +major_words: 107994506 +minor_collections: 3318 +major_collections: 119 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2124817 +live_blocks: 33351 +free_words: 2700160 +free_blocks: 19149 +largest_free: 1617 +fragments: 111 +compactions: 0 + +minor_words: 115220373 +promoted_words: 114018413 +major_words: 114333086 +minor_collections: 3513 +major_collections: 125 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2124190 +live_blocks: 33351 +free_words: 2700795 +free_blocks: 19303 +largest_free: 1567 +fragments: 103 +compactions: 0 + +minor_words: 121628396 +promoted_words: 120347328 +major_words: 120688494 +minor_collections: 3708 +major_collections: 131 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2133563 +live_blocks: 33351 +free_words: 2691408 +free_blocks: 19134 +largest_free: 2129 +fragments: 117 +compactions: 0 + +minor_words: 128038304 +promoted_words: 126675491 +major_words: 127045570 +minor_collections: 3903 +major_collections: 137 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2135379 +live_blocks: 33351 +free_words: 2689601 +free_blocks: 19345 +largest_free: 1699 +fragments: 108 +compactions: 0 + +minor_words: 134429672 +promoted_words: 133007487 +major_words: 133387404 +minor_collections: 4098 +major_collections: 143 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2127333 +live_blocks: 33351 +free_words: 2697647 +free_blocks: 19276 +largest_free: 1758 +fragments: 108 +compactions: 0 + +minor_words: 140831438 +promoted_words: 139333508 +major_words: 139733383 +minor_collections: 4293 +major_collections: 149 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2145113 +live_blocks: 33351 +free_words: 2679876 +free_blocks: 19365 +largest_free: 1650 +fragments: 99 +compactions: 0 + +minor_words: 147229656 +promoted_words: 145661743 +major_words: 146077858 +minor_collections: 4488 +major_collections: 155 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2132556 +live_blocks: 33351 +free_words: 2692441 +free_blocks: 19150 +largest_free: 1431 +fragments: 91 +compactions: 0 + +minor_words: 153646155 +promoted_words: 152024536 +major_words: 152442636 +minor_collections: 4684 +major_collections: 161 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2130394 +live_blocks: 33351 +free_words: 2694592 +free_blocks: 19164 +largest_free: 1288 +fragments: 102 +compactions: 0 + +minor_words: 160038986 +promoted_words: 158352855 +major_words: 158781961 +minor_collections: 4879 +major_collections: 167 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2131838 +live_blocks: 33351 +free_words: 2693140 +free_blocks: 19355 +largest_free: 1741 +fragments: 110 +compactions: 0 + +minor_words: 166458940 +promoted_words: 164714552 +major_words: 165149249 +minor_collections: 5075 +major_collections: 173 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2146731 +live_blocks: 33351 +free_words: 2678258 +free_blocks: 19338 +largest_free: 1951 +fragments: 99 +compactions: 0 + +minor_words: 172869183 +promoted_words: 171044208 +major_words: 171507681 +minor_collections: 5270 +major_collections: 179 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2130620 +live_blocks: 33351 +free_words: 2694346 +free_blocks: 19355 +largest_free: 1716 +fragments: 122 +compactions: 0 + +minor_words: 179276123 +promoted_words: 177371439 +major_words: 177859651 +minor_collections: 5465 +major_collections: 185 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2141174 +live_blocks: 33351 +free_words: 2683827 +free_blocks: 19340 +largest_free: 1707 +fragments: 87 +compactions: 0 + +minor_words: 185681086 +promoted_words: 183702557 +major_words: 184213391 +minor_collections: 5660 +major_collections: 191 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2133699 +live_blocks: 33351 +free_words: 2691284 +free_blocks: 19303 +largest_free: 1557 +fragments: 105 +compactions: 0 + +minor_words: 192087937 +promoted_words: 190033229 +major_words: 190568763 +minor_collections: 5855 +major_collections: 197 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2133162 +live_blocks: 33351 +free_words: 2691831 +free_blocks: 19299 +largest_free: 1561 +fragments: 95 +compactions: 0 + +minor_words: 198496824 +promoted_words: 196364203 +major_words: 196926470 +minor_collections: 6050 +major_collections: 203 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2129841 +live_blocks: 33351 +free_words: 2695139 +free_blocks: 19163 +largest_free: 1653 +fragments: 108 +compactions: 0 + +minor_words: 204889797 +promoted_words: 202693452 +major_words: 203267275 +minor_collections: 6245 +major_collections: 209 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2130715 +live_blocks: 33351 +free_words: 2694271 +free_blocks: 19257 +largest_free: 1491 +fragments: 102 +compactions: 0 + +minor_words: 211268811 +promoted_words: 208990042 +major_words: 209593734 +minor_collections: 6439 +major_collections: 215 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2128683 +live_blocks: 33351 +free_words: 2696320 +free_blocks: 19306 +largest_free: 1789 +fragments: 85 +compactions: 0 + +minor_words: 217673548 +promoted_words: 215319820 +major_words: 215946607 +minor_collections: 6634 +major_collections: 221 +heap_words: 4825088 +heap_chunks: 38 +top_heap_words: 4825088 +live_words: 2134523 +live_blocks: 33351 +free_words: 2690457 +free_blocks: 19391 +largest_free: 1845 +fragments: 108 +compactions: 0 diff --git a/testsuite/interactive/lib-graph-2/Makefile b/testsuite/interactive/lib-graph-2/Makefile new file mode 100644 index 00000000..354953bf --- /dev/null +++ b/testsuite/interactive/lib-graph-2/Makefile @@ -0,0 +1,7 @@ +MODULES= +MAIN_MODULE=graph_test +ADD_COMPFLAGS= +LIBRARIES=graphics + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/interactive/lib-graph-2/graph_test.ml b/testsuite/interactive/lib-graph-2/graph_test.ml new file mode 100644 index 00000000..217e2fa5 --- /dev/null +++ b/testsuite/interactive/lib-graph-2/graph_test.ml @@ -0,0 +1,288 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Pierre Weis, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2000 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. *) +(* *) +(***********************************************************************) + +(* graph_test.ml : tests various drawing and filling primitives of the + Graphics library. *) + +(* To run this example just load this file into a suitable toplevel. + Alternatively execute + ocamlc graphics.cma graph_test.ml *) + +open Graphics;; + +auto_synchronize false;; +display_mode false;; +remember_mode true;; + +let sz = 450;; + +open_graph (Printf.sprintf " %ix%i" sz sz);; + +(* To be defined for older versions of O'Caml + Lineto, moveto and draw_rect. + +let rlineto x y = + let xc, yc = current_point () in + lineto (x + xc) (y + yc);; + +let rmoveto x y = + let xc, yc = current_point () in + moveto (x + xc) (y + yc);; + +let draw_rect x y w h = + let x0, y0 = current_point () in + moveto x y; + rlineto w 0; + rlineto 0 h; + rlineto (- w) 0; + rlineto 0 (-h); + moveto x0 y0;; +*) + +(* A set of points. *) + +set_color foreground;; + +let dashes y = + for i = 1 to 100 do + plot y (2 * i); + plot y (3 * i); + plot y (4 * i); + done;; + +dashes 3;; + +set_line_width 20;; +dashes (sz - 20);; + +(* Drawing chars *) + +draw_char 'C'; +draw_char 'a'; +draw_char 'm'; +draw_char 'l';; + +(* More and more red enlarging squares *) +moveto 10 10;; +set_line_width 5;; + +let carre c = + rlineto 0 c; + rlineto c 0; + rlineto 0 (- c); + rlineto (- c) 0;; + +for i = 1 to 10 do + moveto (10 * i) (10 * i); + set_color (rgb (155 + 10 * i) 0 0); + carre (10 * i) +done;; + +(* Blue squares in arithmetic progression *) +moveto 10 210;; +set_color blue;; +set_line_width 1;; + +for i = 1 to 10 do + carre (10 * i) +done;; + +(* Tiny circles filled or not *) +rmoveto 0 120;; +(* Must not change the current point *) +fill_circle 20 190 10;; +set_color green;; +rlineto 0 10;; +rmoveto 50 10;; +let x, y = current_point () in +(* Must not change the current point *) +draw_circle x y 20;; +set_color black;; +rlineto 0 20;; + +(* Cyan rectangles as a kind of graphical representation *) +set_color cyan;; + +let lw = 15;; +set_line_width lw;; +let go_caption l = moveto 210 (130 - lw + l);; +let go_legend () = go_caption (- 3 * lw);; + +go_caption 0;; +fill_rect 210 130 5 10;; +fill_rect 220 130 10 20;; +fill_rect 235 130 15 40;; +fill_rect 255 130 20 80;; +fill_rect 280 130 25 160;; +(* A green rectangle below the graph. *) +set_color green;; +rlineto 50 0;; + +(* A black frame for each of our rectangles *) +set_color black;; +set_line_width (lw / 4);; + +draw_rect 210 130 5 10;; +draw_rect 220 130 10 20;; +draw_rect 235 130 15 40;; +draw_rect 255 130 20 80;; +draw_rect 280 130 25 160;; + +(* A black rectangle after the green one, below the graph. *) +set_line_width lw;; +rlineto 50 0;; + +(* Write a text in yellow on a blue background. *) +(* x = 210, y = 70 *) +go_legend ();; +set_text_size 10;; +set_color (rgb 150 100 250);; +let x,y = current_point () in +fill_rect x (y - 5) (8 * 20) 25;; +set_color yellow;; +go_legend ();; +draw_string "Graphics (Caml)";; + +(* Pie parts in different colors. *) +let draw_green_string s = set_color green; draw_string s;; +let draw_red_string s = set_color red; draw_string s;; + +moveto 120 210;; +set_color red;; +fill_arc 150 260 25 25 60 300; +draw_green_string "A "; +draw_red_string "red"; +draw_green_string " pie."; + +set_text_size 5; +moveto 180 240; +draw_red_string "A "; draw_green_string "green"; draw_red_string " slice.";; +set_color green; +fill_arc 200 260 25 25 0 60; +set_color black; +set_line_width 2; +draw_arc 200 260 27 27 0 60;; + +(* Should do nothing since this is a line *) +set_color red;; +fill_poly [| (40, 10); (150, 70); (150, 10); (40, 10) |];; +set_color blue;; + +(* Drawing polygones. *) +(* Redefining the draw_poly primitive for the usual library. *) +let draw_poly v = + let l = Array.length v in + if l > 0 then begin + let x0, y0 = current_point () in + let p0 = v.(0) in + let x, y = p0 in moveto x y; + for i = 1 to l - 1 do + let x, y = v.(i) in lineto x y + done; + lineto x y; + moveto x0 y0 + end;; + +draw_poly [| (150, 10); (150, 70); (260, 10); (150, 10) |];; + +(* Filling polygones. *) +(* Two equilateral triangles, one red and one blue, and their inside + filled in black. *) +let equi x y l = + [| (x - l / 2, y); + (x, y + int_of_float (float_of_int l *. (sqrt 3.0 /. 2.0))); + (x + l / 2, y) |];; + +set_color black;; +fill_poly (Array.append (equi 300 20 40) (equi 300 44 (- 40)));; + +set_line_width 1;; +set_color cyan;; +draw_poly (equi 300 20 40);; +set_color red;; +draw_poly (equi 300 44 (- 40));; + +(* Drawing and filling ellipses. *) +let x, y = current_point () in +rlineto 10 10; moveto x y; + +moveto 395 100;; + +let x, y = current_point () in +fill_ellipse x y 25 15;; + +set_color (rgb 0xFF 0x00 0xFF);; +rmoveto 0 (- 50);; + +let x, y = current_point () in +fill_ellipse x y 15 30;; + +rmoveto (- 45) 0;; +let x, y = current_point () in +draw_ellipse x y 25 10;; + +(* Drawing and filling arcs. *) + +let draw_arc_ellipse x y r1 r2 = + set_color green; + draw_arc x y r1 r2 60 120; + set_color black; + draw_arc x y r1 r2 120 420;; + +set_line_width 3;; + +let draw_arc_ellipses x y r1 r2 = + let step = 5 in + for i = 0 to (r1 - step) / (2 * step) do + for j = 0 to (r2 - step) / (2 * step) do + draw_arc_ellipse x y (3 * i * step) (3 * j * step) + done + done;; + +draw_arc_ellipses 20 128 15 50;; + +let fill_arc_ellipse x y r1 r2 c1 c2 = + set_color c1; + fill_arc x y r1 r2 60 120; + set_color c2; + fill_arc x y r1 r2 120 420;; + +let fill_arc_ellipses x y r1 r2 = + let step = 3 in + let c1 = ref black + and c2 = ref yellow in + let exchange r1 r2 = let tmp = !r1 in r1 := !r2; r2 := tmp in + for i = r1 / (2 * step) downto 10 do + for j = r2 / (2 * step) downto 30 do + exchange c1 c2; + fill_arc_ellipse x y (3 * i) (3 * j) !c1 !c2 + done + done;; + +fill_arc_ellipses 400 240 150 200;; + + +synchronize ();; + +(* transparent color drawing *) +set_color transp;; +draw_circle 400 240 50;; +draw_circle 400 240 40;; +draw_circle 400 240 30;; +(* try to go back a normal color *) +set_color red;; +draw_circle 400 240 20;; + +synchronize ();; + +ignore (wait_next_event [Key_pressed]) diff --git a/testsuite/interactive/lib-graph-2/graph_test.reference b/testsuite/interactive/lib-graph-2/graph_test.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/interactive/lib-graph-3/Makefile b/testsuite/interactive/lib-graph-3/Makefile new file mode 100644 index 00000000..295f4789 --- /dev/null +++ b/testsuite/interactive/lib-graph-3/Makefile @@ -0,0 +1,7 @@ +MODULES= +MAIN_MODULE=sorts +ADD_COMPFLAGS=-thread +LIBRARIES=unix threads graphics + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/interactive/lib-graph-3/sorts.ml b/testsuite/interactive/lib-graph-3/sorts.ml new file mode 100644 index 00000000..abc8dc1b --- /dev/null +++ b/testsuite/interactive/lib-graph-3/sorts.ml @@ -0,0 +1,228 @@ +(* Animation of sorting algorithms. *) + +open Graphics + +(* Information on a given sorting process *) + +type graphic_context = + { array: int array; (* Data to sort *) + x0: int; (* X coordinate, lower left corner *) + y0: int; (* Y coordinate, lower left corner *) + width: int; (* Width in pixels *) + height: int; (* Height in pixels *) + nelts: int; (* Number of elements in the array *) + maxval: int; (* Max val in the array + 1 *) + rad: int (* Dimension of the rectangles *) + } + +(* Array assignment and exchange with screen update *) + +let screen_mutex = Mutex.create() + +let draw gc i v = + fill_rect (gc.x0 + (gc.width * i) / gc.nelts) + (gc.y0 + (gc.height * v) / gc.maxval) + gc.rad gc.rad + +let assign gc i v = + Mutex.lock screen_mutex; + set_color background; draw gc i gc.array.(i); + set_color foreground; draw gc i v; + gc.array.(i) <- v; + Mutex.unlock screen_mutex + +let exchange gc i j = + let val_i = gc.array.(i) in + assign gc i gc.array.(j); + assign gc j val_i + +(* Construction of a graphic context *) + +let initialize name array maxval x y w h = + let (_, label_height) = text_size name in + let rad = (w - 2) / (Array.length array) - 1 in + let gc = + { array = Array.copy array; + x0 = x + 1; (* Leave one pixel left for Y axis *) + y0 = y + 1; (* Leave one pixel below for X axis *) + width = w - 2; (* 1 pixel left, 1 pixel right *) + height = h - 1 - label_height - rad; + nelts = Array.length array; + maxval = maxval; + rad = rad } in + moveto (gc.x0 - 1) (gc.y0 + gc.height); + lineto (gc.x0 - 1) (gc.y0 - 1); + lineto (gc.x0 + gc.width) (gc.y0 - 1); + moveto (gc.x0 - 1) (gc.y0 + gc.height); + draw_string name; + for i = 0 to Array.length array - 1 do + draw gc i array.(i) + done; + gc + +(* Main animation function *) + +let display functs nelts maxval = + let a = Array.create nelts 0 in + for i = 0 to nelts - 1 do + a.(i) <- Random.int maxval + done; + let num_finished = ref 0 in + let lock_finished = Mutex.create() in + let cond_finished = Condition.create() in + for i = 0 to Array.length functs - 1 do + let (name, funct, x, y, w, h) = functs.(i) in + let gc = initialize name a maxval x y w h in + Thread.create + (fun () -> + funct gc; + Mutex.lock lock_finished; + incr num_finished; + Mutex.unlock lock_finished; + Condition.signal cond_finished) + () + done; + Mutex.lock lock_finished; + while !num_finished < Array.length functs do + Condition.wait cond_finished lock_finished + done; + Mutex.unlock lock_finished; + read_key() + +(***** + let delay = ref 0 in + try + while true do + let gc = Queue.take q in + begin match gc.action with + Finished -> () + | Pause f -> + gc.action <- f (); + for i = 0 to !delay do () done; + Queue.add gc q + end; + if key_pressed() then begin + match read_key() with + 'q'|'Q' -> + raise Exit + | '0'..'9' as c -> + delay := (Char.code c - 48) * 500 + | _ -> + () + end + done + with Exit -> () + | Queue.Empty -> read_key(); () +*****) + +(* The sorting functions. *) + +(* Bubble sort *) + +let bubble_sort gc = + let ordered = ref false in + while not !ordered do + ordered := true; + for i = 0 to Array.length gc.array - 2 do + if gc.array.(i+1) < gc.array.(i) then begin + exchange gc i (i+1); + ordered := false + end + done + done + +(* Insertion sort *) + +let insertion_sort gc = + for i = 1 to Array.length gc.array - 1 do + let val_i = gc.array.(i) in + let j = ref (i - 1) in + while !j >= 0 && val_i < gc.array.(!j) do + assign gc (!j + 1) gc.array.(!j); + decr j + done; + assign gc (!j + 1) val_i + done + +(* Selection sort *) + +let selection_sort gc = + for i = 0 to Array.length gc.array - 1 do + let min = ref i in + for j = i+1 to Array.length gc.array - 1 do + if gc.array.(j) < gc.array.(!min) then min := j + done; + exchange gc i !min + done + +(* Quick sort *) + +let quick_sort gc = + let rec quick lo hi = + if lo < hi then begin + let i = ref lo in + let j = ref hi in + let pivot = gc.array.(hi) in + while !i < !j do + while !i < hi && gc.array.(!i) <= pivot do incr i done; + while !j > lo && gc.array.(!j) >= pivot do decr j done; + if !i < !j then exchange gc !i !j + done; + exchange gc !i hi; + quick lo (!i-1); + quick (!i+1) hi + end + in quick 0 (Array.length gc.array - 1) + +(* Merge sort *) + +let merge_sort gc = + let rec merge i l1 l2 = + match (l1, l2) with + ([], []) -> + () + | ([], v2::r2) -> + assign gc i v2; merge (i+1) l1 r2 + | (v1::r1, []) -> + assign gc i v1; merge (i+1) r1 l2 + | (v1::r1, v2::r2) -> + if v1 < v2 + then begin assign gc i v1; merge (i+1) r1 l2 end + else begin assign gc i v2; merge (i+1) l1 r2 end in + let rec msort start len = + if len < 2 then () else begin + let m = len / 2 in + msort start m; + msort (start+m) (len-m); + merge start + (Array.to_list (Array.sub gc.array start m)) + (Array.to_list (Array.sub gc.array (start+m) (len-m))) + end in + msort 0 (Array.length gc.array) + +(* Main program *) + +let animate() = + open_graph ""; + moveto 0 0; draw_string "Press a key to start..."; + let seed = ref 0 in + while not (key_pressed()) do incr seed done; + read_key(); + Random.init !seed; + clear_graph(); + let prompt = "0: fastest ... 9: slowest, press 'q' to quit" in + moveto 0 0; draw_string prompt; + let (_, h) = text_size prompt in + let sx = size_x() / 2 and sy = (size_y() - h) / 3 in + display [| "Bubble", bubble_sort, 0, h, sx, sy; + "Insertion", insertion_sort, 0, h+sy, sx, sy; + "Selection", selection_sort, 0, h+2*sy, sx, sy; + "Quicksort", quick_sort, sx, h, sx, sy; + (** "Heapsort", heap_sort, sx, h+sy, sx, sy; **) + "Mergesort", merge_sort, sx, h+2*sy, sx, sy |] + 100 1000; + close_graph() + +let _ = if !Sys.interactive then () else begin animate(); exit 0 end + +;; diff --git a/testsuite/interactive/lib-graph-3/sorts.reference b/testsuite/interactive/lib-graph-3/sorts.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/interactive/lib-graph/Makefile b/testsuite/interactive/lib-graph/Makefile new file mode 100644 index 00000000..de2c9e86 --- /dev/null +++ b/testsuite/interactive/lib-graph/Makefile @@ -0,0 +1,7 @@ +MODULES= +MAIN_MODULE=graph_example +ADD_COMPFLAGS= +LIBRARIES=graphics + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/interactive/lib-graph/graph_example.ml b/testsuite/interactive/lib-graph/graph_example.ml new file mode 100644 index 00000000..6fbe988c --- /dev/null +++ b/testsuite/interactive/lib-graph/graph_example.ml @@ -0,0 +1,131 @@ +(* To run this example: + ******************** + 1. Select all the text in this window. + 2. Drag it to the toplevel window. + 3. Watch the colors. + 4. Drag the mouse over the graphics window and click here and there. + 5. Type any key to the graphics window to stop the program. +*) + +open Graphics;; +open_graph " 480x270";; + +let xr = size_x () / 2 - 30 +and yr = size_y () / 2 - 26 +and xg = size_x () / 2 + 30 +and yg = size_y () / 2 - 26 +and xb = size_x () / 2 +and yb = size_y () / 2 + 26 +;; + +let point x y = + let dr = (x-xr)*(x-xr) + (y-yr)*(y-yr) + and dg = (x-xg)*(x-xg) + (y-yg)*(y-yg) + and db = (x-xb)*(x-xb) + (y-yb)*(y-yb) + in + if dr > dg && dr > db then set_color (rgb 255 (255*dg/dr) (255*db/dr)) + else if dg > db then set_color (rgb (255*dr/dg) 255 (255*db/dg)) + else set_color (rgb (255*dr/db) (255*dg/db) 255); + fill_rect x y 2 2; +;; + +for y = (size_y () - 1) / 2 downto 0 do + for x = 0 to (size_x () - 1) / 2 do + point (2*x) (2*y); + done +done +;; + +let n = 0x000000 +and w = 0xFFFFFF +and b = 0xFFCC99 +and y = 0xFFFF00 +and o = 0xCC9966 +and v = 0x00BB00 +and g = 0x888888 +and c = 0xDDDDDD +and t = transp +;; + +let caml = make_image [| + [|t;t;t;t;t;t;t;t;t;t;t;n;n;n;n;n;n;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;|]; + [|t;t;t;t;t;t;t;t;t;t;n;n;n;n;n;n;n;n;n;t;t;t;t;t;t;t;t;t;t;t;t;t;|]; + [|t;t;t;t;t;t;t;t;n;n;n;n;n;n;n;n;n;n;n;n;t;t;t;t;t;t;t;t;t;t;t;t;|]; + [|n;n;n;n;n;n;t;n;n;n;n;n;b;b;b;b;b;b;b;n;n;t;t;t;t;t;n;n;n;n;n;t;|]; + [|n;o;o;o;o;o;n;n;n;n;b;b;b;b;b;b;b;b;b;b;b;n;n;n;n;n;n;n;n;n;n;t;|]; + [|n;o;o;o;o;o;o;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;t;|]; + [|n;o;o;o;o;o;o;o;n;n;n;g;g;g;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;t;t;|]; + [|n;n;o;o;o;o;o;o;o;n;n;n;c;c;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;t;t;|]; + [|t;n;n;o;o;o;o;o;o;o;n;n;n;c;n;n;n;n;n;n;n;b;b;n;n;n;n;n;n;t;t;t;|]; + [|t;t;n;n;n;o;o;o;o;o;o;n;n;n;n;n;n;n;n;n;b;b;b;b;n;n;n;n;t;t;t;t;|]; + [|t;t;t;t;n;n;o;o;o;o;o;o;n;n;n;n;n;n;n;n;b;b;b;b;b;b;n;n;t;t;t;t;|]; + [|t;t;t;t;t;n;n;o;o;o;o;o;o;n;n;n;n;n;n;o;o;b;b;b;b;b;b;n;n;t;t;t;|]; + [|t;t;t;t;t;n;n;o;o;o;o;o;o;b;b;b;b;b;n;n;o;o;b;b;b;b;b;b;n;n;t;t;|]; + [|t;t;t;t;n;n;n;o;o;o;o;o;b;b;b;b;b;b;b;n;n;o;o;b;b;b;b;b;b;n;n;t;|]; + [|t;t;t;t;n;n;n;o;o;o;o;b;b;b;b;b;b;b;b;b;n;n;o;o;b;b;b;b;b;b;n;n;|]; + [|t;t;t;t;n;n;n;o;o;o;o;b;b;b;b;b;n;n;b;b;b;n;n;o;o;b;b;b;b;b;n;n;|]; + [|t;t;t;t;n;n;n;o;o;o;o;b;b;b;b;b;n;n;b;b;b;b;n;n;o;o;b;o;b;b;n;n;|]; + [|t;t;t;t;n;n;n;o;o;o;o;b;b;b;b;b;n;n;b;b;b;b;b;n;n;o;o;o;o;o;n;n;|]; + [|t;t;t;t;n;n;n;o;o;o;o;b;b;b;b;b;n;n;b;b;b;b;b;b;n;n;o;o;o;o;n;n;|]; + [|t;t;t;t;n;n;n;o;o;o;o;o;b;b;b;b;n;n;b;b;b;b;b;b;b;n;n;o;o;n;n;n;|]; + [|t;t;t;t;n;n;n;n;o;o;o;o;o;b;b;b;n;n;n;b;b;b;b;b;b;b;n;n;o;n;b;n;|]; + [|t;t;t;t;t;n;n;n;o;o;o;o;o;o;b;b;n;n;n;b;b;b;b;b;b;b;b;n;n;n;b;n;|]; + [|t;t;t;t;t;t;n;n;o;o;o;o;o;o;o;y;v;y;n;b;b;b;b;b;b;b;b;n;n;b;b;n;|]; + [|t;t;t;t;t;t;t;n;o;o;o;o;o;v;y;o;o;n;n;n;b;b;b;b;b;b;b;n;n;b;b;n;|]; + [|t;t;t;t;t;t;t;n;o;o;o;y;v;o;o;o;o;n;n;n;n;b;b;b;b;b;b;n;n;b;b;n;|]; + [|t;t;t;t;t;t;n;n;o;v;y;o;y;o;o;o;o;o;o;n;n;n;b;b;b;b;b;n;n;b;b;n;|]; + [|t;t;t;t;t;t;n;o;y;y;o;o;v;o;o;o;o;o;o;o;n;n;n;b;b;b;n;n;n;b;n;t;|]; + [|t;t;t;t;t;n;n;v;o;v;o;o;o;o;o;o;o;o;o;o;o;n;n;n;b;n;n;n;n;b;n;t;|]; + [|t;t;t;t;t;n;v;o;o;v;o;o;o;o;o;o;o;o;o;o;o;o;n;n;n;n;n;n;n;n;t;t;|]; + [|t;t;t;t;n;n;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;n;n;n;n;n;n;t;t;t;t;t;|]; + [|t;t;t;t;n;o;o;o;o;o;o;o;o;o;o;o;o;o;o;o;n;n;t;t;t;t;t;t;t;t;t;t;|]; + [|t;t;t;t;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;t;t;t;t;t;t;t;t;t;t;t;|]; +|];; + +(* +let x = ref 0 and y = ref 0;; +let bg = get_image !x !y 32 32;; +while true do + let st = wait_next_event [Mouse_motion; Button_down] in + if not st.button then draw_image bg !x !y; + x := st.mouse_x; + y := st.mouse_y; + blit_image bg !x !y; + draw_image caml !x !y; +done;; +*) +set_color (rgb 0 0 0); +remember_mode false; +try while true do + let st = wait_next_event [Mouse_motion; Button_down; Key_pressed] in + synchronize (); + if st.keypressed then raise Exit; + if st.button then begin + remember_mode true; + draw_image caml st.mouse_x st.mouse_y; + remember_mode false; + end; + let x = st.mouse_x + 16 and y = st.mouse_y + 16 in + + moveto 0 y; + lineto (x - 25) y; + moveto 10000 y; + lineto (x + 25) y; + + moveto x 0; + lineto x (y - 25); + moveto x 10000; + lineto x (y + 25); + + draw_image caml st.mouse_x st.mouse_y; +done with Exit -> () +;; + +(* To run this example: + ******************** + 1. Select all the text in this window. + 2. Drag it to the toplevel window. + 3. Watch the colors. + 4. Drag the mouse over the graphics window and click here and there. + 5. Type any key to the graphics window to stop the program. +*) diff --git a/testsuite/interactive/lib-graph/graph_example.reference b/testsuite/interactive/lib-graph/graph_example.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/interactive/lib-signals/Makefile b/testsuite/interactive/lib-signals/Makefile new file mode 100644 index 00000000..445f9ac7 --- /dev/null +++ b/testsuite/interactive/lib-signals/Makefile @@ -0,0 +1,10 @@ +default: + @$(OCAMLC) -o program.byte signals.ml + @./program.byte + @$(OCAMLOPT) -o program.native signals.ml + @./program.native + +clean: defaultclean + @rm -fr program.* + +include ../../makefiles/Makefile.common diff --git a/testsuite/interactive/lib-signals/signals.ml b/testsuite/interactive/lib-signals/signals.ml new file mode 100644 index 00000000..8a5c4e0c --- /dev/null +++ b/testsuite/interactive/lib-signals/signals.ml @@ -0,0 +1,32 @@ +let rec tak (x, y, z) = + if x > y then tak(tak (x-1, y, z), tak (y-1, z, x), tak (z-1, x, y)) + else z + +let break_handler _ = + print_string "Thank you for pressing ctrl-C."; print_newline(); + print_string "Allocating a bit..."; flush stdout; + ignore (tak(18,12,6)); print_string "done."; print_newline() + +let stop_handler _ = + print_string "Thank you for pressing ctrl-Z."; print_newline(); + print_string "Now raising an exception..."; print_newline(); + raise Exit + +let _ = + ignore (Sys.signal Sys.sigint (Sys.Signal_handle break_handler)); + ignore (Sys.signal Sys.sigtstp (Sys.Signal_handle stop_handler)); + begin try + print_string "Computing like crazy..."; print_newline(); + for i = 1 to 1000 do ignore (tak(18,12,6)) done; + print_string "Reading on input..."; print_newline(); + for i = 1 to 5 do + try + let s = read_line () in + print_string ">> "; print_string s; print_newline() + with Exit -> + print_string "Got Exit, continuing."; print_newline() + done + with Exit -> + print_string "Got Exit, exiting."; print_newline() + end; + exit 0 diff --git a/testsuite/lib/Makefile b/testsuite/lib/Makefile new file mode 100644 index 00000000..52b50207 --- /dev/null +++ b/testsuite/lib/Makefile @@ -0,0 +1,7 @@ +# $Id$ + +compile: testing.cmi testing.cmo testing.cmx + +clean: defaultclean + +include ../makefiles/Makefile.common diff --git a/testsuite/lib/testing.ml b/testsuite/lib/testing.ml new file mode 100644 index 00000000..55da6f6d --- /dev/null +++ b/testsuite/lib/testing.ml @@ -0,0 +1,96 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Pierre Weis, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2006 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: testing.ml,v 1.1 2006/01/12 12:52:14 weis Exp $ *) + +(* Testing auxilliaries. *) + +open Scanf;; + +let all_tests_ok = ref true;; + +let finish () = + match !all_tests_ok with + | true -> + print_endline "\nAll tests succeeded." + | _ -> + print_endline "\n\n********* Test suite failed. ***********\n";; + +at_exit finish;; + +let test_num = ref (-1);; + +let print_test_number () = + print_int !test_num; print_string " "; flush stdout;; + +let next_test () = + incr test_num; + print_test_number ();; + +let print_test_fail () = + all_tests_ok := false; + print_string + (Printf.sprintf "\n********* Test number %i failed ***********\n" + !test_num);; + +let print_failure_test_fail () = + all_tests_ok := false; + print_string + (Printf.sprintf + "\n********* Failure Test number %i incorrectly failed ***********\n" + !test_num);; + +let print_failure_test_succeed () = + all_tests_ok := false; + print_string + (Printf.sprintf + "\n********* Failure Test number %i failed to fail ***********\n" + !test_num);; + +let test b = + next_test (); + if not b then print_test_fail ();; + +(* Applies f to x and checks that the evaluation indeed + raises an exception that verifies the predicate [pred]. *) +let test_raises_exc_p pred f x = + next_test (); + try + ignore (f x); + print_failure_test_succeed (); + false + with + | x -> + pred x || (print_failure_test_fail (); false);; + +(* Applies f to x and checks that the evaluation indeed + raises some exception. *) +let test_raises_some_exc f = test_raises_exc_p (fun _ -> true) f;; +let test_raises_this_exc exc = test_raises_exc_p (fun x -> x = exc);; + +(* Applies f to x and checks that the evaluation indeed + raises exception Failure s. *) + +let test_raises_this_failure s f x = + test_raises_exc_p (fun x -> x = Failure s) f x;; + +(* Applies f to x and checks that the evaluation indeed + raises the exception Failure. *) +let test_raises_some_failure f x = + test_raises_exc_p (function Failure _ -> true | _ -> false) f x;; + +let failure_test f x s = test_raises_this_failure s f x;; +let any_failure_test = test_raises_some_failure;; + +let scan_failure_test f x = + test_raises_exc_p (function Scan_failure _ -> true | _ -> false) f x;; + diff --git a/testsuite/lib/testing.mli b/testsuite/lib/testing.mli new file mode 100644 index 00000000..c3880f08 --- /dev/null +++ b/testsuite/lib/testing.mli @@ -0,0 +1,34 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Pierre Weis, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2006 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: testing.mli,v 1.1 2006/01/12 12:52:14 weis Exp $ *) + +(* Testing auxilliaries. *) + +val test : bool -> unit;; +(** [test e] tests that [e] evaluates to [true]. *) +val failure_test : ('a -> 'b) -> 'a -> string -> bool;; +(** [failure_test f x s] tests that [f x] raises the exception [Failure s]. *) + +val test_raises_some_exc : ('a -> 'b) -> 'a -> bool;; +(** [test_raises_some_exc f x] tests that [f x] raises an exception. *) + +val test_raises_this_exc : exn -> ('a -> 'b) -> 'a -> bool;; +(** [test_raises_this_exc exc f x] tests that [f x] + raises the exception [exc]. *) + +val test_raises_exc_p : (exn -> bool) -> ('a -> 'b) -> 'a -> bool;; +(** [test_raises_exc_p p f x] tests that [f x] raises an exception that + verifies predicate [p]. *) + +val scan_failure_test : ('a -> 'b) -> 'a -> bool;; +(** [scan_failure_test f x] tests that [f x] raises [Scanf.Scan_failure]. *) diff --git a/testsuite/makefiles/Makefile.common b/testsuite/makefiles/Makefile.common new file mode 100644 index 00000000..1ee9bc8e --- /dev/null +++ b/testsuite/makefiles/Makefile.common @@ -0,0 +1,66 @@ +# $Id$ + +TOPDIR=$(BASEDIR)/.. + +include $(TOPDIR)/config/Makefile + +BOOTDIR=$(TOPDIR)/boot +OCAMLRUN=$(BOOTDIR)/ocamlrun$(EXE) +OCAML=$(OCAMLRUN) $(TOPDIR)/ocaml$(EXE) +OCAMLC=$(OCAMLRUN) $(TOPDIR)/ocamlc$(EXE) +OCAMLOPT=$(OCAMLRUN) $(TOPDIR)/ocamlopt$(EXE) +OCAMLDOC=$(OCAMLRUN) $(TOPDIR)/ocamldoc/ocamldoc$(EXE) +OCAMLLEX=$(OCAMLRUN) $(TOPDIR)/lex/ocamllex$(EXE) +OCAMLMKLIB=$(OCAMLRUN) $(TOPDIR)/tools/ocamlmklib$(EXE) +OCAMLYACC=$(TOPDIR)/yacc/ocamlyacc$(EXE) +OCAMLBUILD=$(TOPDIR)/_build/ocamlbuild/ocamlbuild.native +DUMPOBJ=$(OCAMLRUN) $(TOPDIR)/tool/dumpobj$(EXE) +COMPFLAGS= +FORTRAN_COMPILER=/sw/bin/gcc +FORTRAN_LIBRARY=/sw/lib/gcc4.3/lib/libgfortran.a + +defaultclean: + @rm -f *.cmo *.cmi *.cmx *.cma *.cmxa *.cmxs *.$(O) *.$(SO) *.$(A) + @for dsym in *.dSYM; do \ + if [ -d $$dsym ]; then \ + rm -fr $$dsym; \ + fi \ + done + +.SUFFIXES: +.SUFFIXES: .mli .ml .mly .mll .cmi .cmo .cmx .cmm .cmxa .s .S .o .so + +.mli.cmi: + @$(OCAMLC) -c $(COMPFLAGS) $(ADD_COMPFLAGS) $< + +.ml.cmi: + @$(OCAMLC) -c $(COMPFLAGS) $(ADD_COMPFLAGS) $< + +.ml.cmo: + @if [ -f $ /dev/null + +.mll.ml: + @$(OCAMLLEX) -q $< > /dev/null + +.cmm.o: + @$(OCAMLRUN) ./codegen $*.cmm > $*.s + @$(AS) $(ASFLAGS) -o $*.o $*.s + +.S.o: + @$(ASPP) $(ASPPFLAGS) -DSYS_$(SYSTEM) -o $*.o $*.S + +.s.o: + @$(ASPP) $(ASPPFLAGS) -DSYS_$(SYSTEM) -o $*.o $*.s diff --git a/testsuite/makefiles/Makefile.okbad b/testsuite/makefiles/Makefile.okbad new file mode 100644 index 00000000..833cfab3 --- /dev/null +++ b/testsuite/makefiles/Makefile.okbad @@ -0,0 +1,19 @@ +# $Id$ + +default: compile + +compile: + @for file in *.ml; do \ + printf " ... testing '$$file'"; \ + if [ `echo $$file | grep bad` ]; then \ + $(OCAMLC) -c -w a $$file 2> /dev/null && (echo " => failed" && exit 1) || echo " => passed"; \ + else \ + test -f `basename $$file ml`mli && $(OCAMLC) -c -w a `basename $$file ml`mli; \ + $(OCAMLC) -c -w a $$file 2> /dev/null || (echo " => failed" && exit 1); \ + test -f `basename $$file ml`reference && $(OCAMLC) `basename $$file ml`cmo && ./a.out > `basename $$file ml`result && (diff -q `basename $$file ml`reference `basename $$file ml`result || (echo " => failed" && exit 1)); \ + echo " => passed"; \ + fi; \ + done + +clean: defaultclean + @rm -f ./a.out *.cm* *.result diff --git a/testsuite/makefiles/Makefile.one b/testsuite/makefiles/Makefile.one new file mode 100644 index 00000000..081b3691 --- /dev/null +++ b/testsuite/makefiles/Makefile.one @@ -0,0 +1,36 @@ +# $Id$ + +CMI_FILES=$(patsubst %,%.cmi,$(MODULES)) +CMO_FILES=$(patsubst %,%.cmo,$(MODULES)) +CMX_FILES=$(patsubst %,%.cmx,$(MODULES)) +CMA_FILES=$(patsubst %,%.cma,$(LIBRARIES)) +CMXA_FILES=$(patsubst %,%.cmxa,$(LIBRARIES)) +ML_FILES=$(patsubst %,%.ml,$(LEX_MODULES) $(YACC_MODULES)) +O_FILES=$(patsubst %,%.$(O),$(C_FILES)) + +GENERATED_SOURCES=$(patsubst %,%.ml,$(LEX_MODULES)) $(patsubst %,%.ml,$(YACC_MODULES)) $(patsubst %,%.mli,$(YACC_MODULES)) + +ifdef C_FILES +ADD_CFLAGS+=-custom +endif + +default: compile run + +compile: $(ML_FILES) $(CMO_FILES) $(CMX_FILES) $(MAIN_MODULE).cmo $(MAIN_MODULE).cmx + @for file in $(C_FILES); do \ + $(NATIVECC) $(NATIVECCCOMPOPTS) -c -I$(TOPDIR)/byterun $$file.c; \ + done; + @$(OCAMLC) $(ADD_COMPFLAGS) $(ADD_CFLAGS) -o program.byte $(O_FILES) $(CMA_FILES) $(CMO_FILES) $(patsubst %,%.cmo,$(ADD_MODULES)) $(MAIN_MODULE).cmo + @$(OCAMLOPT) $(ADD_COMPFLAGS) -o program.native $(O_FILES) $(CMXA_FILES) $(CMX_FILES) $(patsubst %,%.cmx,$(ADD_MODULES)) $(MAIN_MODULE).cmx + +run: + @printf " ... testing with ocamlc" + @./program.byte $(EXEC_ARGS) > $(MAIN_MODULE).result || (echo " => failed" && exit 1) + @diff -q $(MAIN_MODULE).reference $(MAIN_MODULE).result > /dev/null || (echo " => failed" && exit 1) + @printf " ocamlopt" + @./program.native $(EXEC_ARGS) > $(MAIN_MODULE).result || (echo " => failed" && exit 1) + @diff -q $(MAIN_MODULE).reference $(MAIN_MODULE).result > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + +clean: defaultclean + @rm -f *.result ./program.* $(GENERATED_SOURCES) $(O_FILES) diff --git a/testsuite/makefiles/Makefile.several b/testsuite/makefiles/Makefile.several new file mode 100644 index 00000000..2e298226 --- /dev/null +++ b/testsuite/makefiles/Makefile.several @@ -0,0 +1,51 @@ +# $Id$ + +CC=$(NATIVECC) $(NATIVECCCOMPOPTS) +FC=$(FORTAN_COMPILER) +CMO_FILES=$(patsubst %,%.cmo,$(MODULES)) +CMX_FILES=$(patsubst %,%.cmx,$(MODULES)) +CMA_FILES=$(patsubst %,%.cma,$(LIBRARIES)) +CMXA_FILES=$(patsubst %,%.cmxa,$(LIBRARIES)) +O_FILES=$(patsubst %,%.$(O),$(C_FILES) $(F_FILES)) +ifdef C_FILES +ADD_CFLAGS+=-custom +endif +ifdef F_FILES +ADD_CFLAGS+=$(FORTRAN_LIBRARY) +ADD_OPTFLAGS+=$(FORTRAN_LIBRARY) +endif + +run-all: + @for file in $(C_FILES); do \ + $(CC) -c -I$(PREFIX)/lib/ocaml/caml $$file.c; \ + done; + @for file in $(F_FILES); do \ + $(FORTRAN_COMPILER) -c -I$(PREFIX)/lib/ocaml/caml $$file.f; \ + done; + @for file in *.ml; do \ + printf " ... testing '$$file':"; \ + $(MAKE) run-file DESC=ocamlc COMP='$(OCAMLC)' COMPFLAGS='$(ADD_COMPFLAGS) $(ADD_CFLAGS) $(O_FILES) -w a $(CMA_FILES) -I ../../lib $(CMO_FILES)' FILE=$$file PROGRAM_ARGS=$(PROGRAM_ARGS) && \ + $(MAKE) run-file DESC=ocamlopt COMP=$(PREFIX)/bin/ocamlopt COMPFLAGS='$(ADD_COMPFLAGS) $(ADD_OPTFLAGS) $(O_FILES) -w a $(CMXA_FILES) -I ../../lib $(CMX_FILES)' FILE=$$file PROGRAM_ARGS=$(PROGRAM_ARGS) && \ + if [ ! -z $(UNSAFE) ]; then \ + $(MAKE) run-file DESC=ocamlc-unsafe COMP=$(PREFIX)/bin/ocamlc COMPFLAGS='-w a -unsafe -I ../../li $(CMO_FILES)' FILE=$$file && \ + $(MAKE) run-file DESC=ocamlopt-unsafe COMP=$(PREFIX)/bin/ocamlopt COMPFLAGS='-w a -unsafe -I ../../lib $(CMX_FILES)' FILE=$$file; \ + fi && \ + echo " => passed"; \ + done; + +run-file: + @printf " $(DESC)" + @$(COMP) $(COMPFLAGS) $(FILE) -o program + @if [ -f `basename $(FILE) ml`runner ]; then \ + sh `basename $(FILE) ml`runner; \ + else \ + ./program $(PROGRAM_ARGS) > `basename $(FILE) ml`result; \ + fi + @if [ -f `basename $(FILE) ml`checker ]; then \ + sh `basename $(FILE) ml`checker; \ + else \ + diff -q `basename $(FILE) ml`reference `basename $(FILE) ml`result > /dev/null || (echo " => failed" && exit 1); \ + fi + +clean: defaultclean + @rm -f *.result ./program diff --git a/testsuite/makefiles/Makefile.toplevel b/testsuite/makefiles/Makefile.toplevel new file mode 100644 index 00000000..2302b196 --- /dev/null +++ b/testsuite/makefiles/Makefile.toplevel @@ -0,0 +1,16 @@ +# $Id$ + +default: + @for file in *.ml; do \ + $(OCAML) < $$file 2>&1 | grep -v '^ Objective Caml version' > $$file.result; \ + if [ -f $$file.principal.reference ]; then \ + $(OCAML) -principal < $$file 2>&1 | grep -v '^ Objective Caml version' > $$file.principal.result; \ + fi; \ + done + @for file in *.reference; do \ + printf " ... testing '$$file':"; \ + diff -q $$file `basename $$file reference`result || (echo " => failed" && exit 1) && echo " => passed"; \ + done + +clean: defaultclean + @rm -f *.result diff --git a/testsuite/tests/asmcomp/Makefile b/testsuite/tests/asmcomp/Makefile new file mode 100644 index 00000000..c81a55c0 --- /dev/null +++ b/testsuite/tests/asmcomp/Makefile @@ -0,0 +1,144 @@ +CC=$(NATIVECC) +CFLAGS=$(NATIVECCCOMPOPTS) -g + +INCLUDES=\ + -I $(TOPDIR)/utils \ + -I $(TOPDIR)/typing \ + -I $(TOPDIR)/bytecomp \ + -I $(TOPDIR)/asmcomp + +OTHEROBJS=\ + $(TOPDIR)/utils/misc.cmo \ + $(TOPDIR)/utils/tbl.cmo \ + $(TOPDIR)/utils/config.cmo \ + $(TOPDIR)/utils/clflags.cmo \ + $(TOPDIR)/utils/terminfo.cmo \ + $(TOPDIR)/utils/ccomp.cmo \ + $(TOPDIR)/utils/warnings.cmo \ + $(TOPDIR)/utils/consistbl.cmo \ + $(TOPDIR)/parsing/linenum.cmo \ + $(TOPDIR)/parsing/location.cmo \ + $(TOPDIR)/parsing/longident.cmo \ + $(TOPDIR)/parsing/syntaxerr.cmo \ + $(TOPDIR)/parsing/parser.cmo \ + $(TOPDIR)/parsing/lexer.cmo \ + $(TOPDIR)/parsing/parse.cmo \ + $(TOPDIR)/parsing/printast.cmo \ + $(TOPDIR)/typing/unused_var.cmo \ + $(TOPDIR)/typing/ident.cmo \ + $(TOPDIR)/typing/path.cmo \ + $(TOPDIR)/typing/primitive.cmo \ + $(TOPDIR)/typing/types.cmo \ + $(TOPDIR)/typing/btype.cmo \ + $(TOPDIR)/typing/oprint.cmo \ + $(TOPDIR)/typing/subst.cmo \ + $(TOPDIR)/typing/predef.cmo \ + $(TOPDIR)/typing/datarepr.cmo \ + $(TOPDIR)/typing/env.cmo \ + $(TOPDIR)/typing/typedtree.cmo \ + $(TOPDIR)/typing/ctype.cmo \ + $(TOPDIR)/typing/printtyp.cmo \ + $(TOPDIR)/typing/includeclass.cmo \ + $(TOPDIR)/typing/mtype.cmo \ + $(TOPDIR)/typing/includecore.cmo \ + $(TOPDIR)/typing/includemod.cmo \ + $(TOPDIR)/typing/parmatch.cmo \ + $(TOPDIR)/typing/typetexp.cmo \ + $(TOPDIR)/typing/stypes.cmo \ + $(TOPDIR)/typing/typecore.cmo \ + $(TOPDIR)/typing/typedecl.cmo \ + $(TOPDIR)/typing/typeclass.cmo \ + $(TOPDIR)/typing/typemod.cmo \ + $(TOPDIR)/bytecomp/lambda.cmo \ + $(TOPDIR)/bytecomp/printlambda.cmo \ + $(TOPDIR)/bytecomp/typeopt.cmo \ + $(TOPDIR)/bytecomp/switch.cmo \ + $(TOPDIR)/bytecomp/matching.cmo \ + $(TOPDIR)/bytecomp/translobj.cmo \ + $(TOPDIR)/bytecomp/translcore.cmo \ + $(TOPDIR)/bytecomp/translclass.cmo \ + $(TOPDIR)/bytecomp/translmod.cmo \ + $(TOPDIR)/bytecomp/simplif.cmo \ + $(TOPDIR)/bytecomp/runtimedef.cmo \ + $(TOPDIR)/asmcomp/arch.cmo \ + $(TOPDIR)/asmcomp/debuginfo.cmo \ + $(TOPDIR)/asmcomp/cmm.cmo \ + $(TOPDIR)/asmcomp/printcmm.cmo \ + $(TOPDIR)/asmcomp/reg.cmo \ + $(TOPDIR)/asmcomp/mach.cmo \ + $(TOPDIR)/asmcomp/proc.cmo \ + $(TOPDIR)/asmcomp/clambda.cmo \ + $(TOPDIR)/asmcomp/compilenv.cmo \ + $(TOPDIR)/asmcomp/closure.cmo \ + $(TOPDIR)/asmcomp/cmmgen.cmo \ + $(TOPDIR)/asmcomp/printmach.cmo \ + $(TOPDIR)/asmcomp/selectgen.cmo \ + $(TOPDIR)/asmcomp/selection.cmo \ + $(TOPDIR)/asmcomp/comballoc.cmo \ + $(TOPDIR)/asmcomp/liveness.cmo \ + $(TOPDIR)/asmcomp/spill.cmo \ + $(TOPDIR)/asmcomp/split.cmo \ + $(TOPDIR)/asmcomp/interf.cmo \ + $(TOPDIR)/asmcomp/coloring.cmo \ + $(TOPDIR)/asmcomp/reloadgen.cmo \ + $(TOPDIR)/asmcomp/reload.cmo \ + $(TOPDIR)/asmcomp/printlinear.cmo \ + $(TOPDIR)/asmcomp/linearize.cmo \ + $(TOPDIR)/asmcomp/schedgen.cmo \ + $(TOPDIR)/asmcomp/scheduling.cmo \ + $(TOPDIR)/asmcomp/emitaux.cmo \ + $(TOPDIR)/asmcomp/emit.cmo \ + $(TOPDIR)/asmcomp/asmgen.cmo + +OBJS=parsecmmaux.cmo parsecmm.cmo lexcmm.cmo + +ADD_COMPFLAGS=$(INCLUDES) -g + +default: arch codegen tests + +codegen: parsecmm.ml lexcmm.ml $(patsubst %.cmo,%.cmi,$(OBJS)) $(OBJS) main.cmo + @$(OCAMLC) $(LINKFLAGS) -o codegen $(OTHEROBJS) $(OBJS) main.cmo + +parsecmm.mli parsecmm.ml: parsecmm.mly + @$(OCAMLYACC) -q parsecmm.mly + +lexcmm.ml: lexcmm.mll + @$(OCAMLLEX) -q lexcmm.mll + +CASES=fib tak quicksort quicksort2 soli \ + arith checkbound tagged-fib tagged-integr tagged-quicksort tagged-tak +ARGS_fib=-DINT_INT -DFUN=fib main.c +ARGS_tak=-DUNIT_INT -DFUN=takmain main.c +ARGS_quicksort=-DSORT -DFUN=quicksort main.c +ARGS_quicksort2=-DSORT -DFUN=quicksort main.c +ARGS_soli=-DUNIT_INT -DFUN=solitaire main.c +ARGS_integr=-DINT_FLOAT -DFUN=test main.c +ARGS_arith=mainarith.c +ARGS_checkbound=-DCHECKBOUND main.c +ARGS_tagged-fib=-DINT_INT -DFUN=fib main.c +ARGS_tagged-integr=-DINT_FLOAT -DFUN=test main.c +ARGS_tagged-quicksort=-DSORT -DFUN=quicksort main.c +ARGS_tagged-tak=-DUNIT_INT -DFUN=takmain main.c + +tests: $(patsubst %,%.o,$(CASES)) + @for c in $(CASES); do \ + printf " ... testing '$$c':"; \ + $(MAKE) one CC="$(CC) $(CFLAGS)" NAME=$$c; \ + done + +one: + @$(CC) -o $(NAME).out $(ARGS_$(NAME)) $(NAME).o $(ARCH).o || (echo " => failed" && exit 1) + @echo " => passed" + +clean: defaultclean + @rm -f ./codegen *.out + @rm -f parsecmm.ml parsecmm.mli lexcmm.ml + @rm -f $(patsubst %,%.s,$(CASES)) + +power.o: power-$(SYSTEM).o + @cp power-$(SYSTEM).o power.o + + +include ../../makefiles/Makefile.common + +arch: $(ARCH).o diff --git a/testsuite/tests/asmcomp/alpha.S b/testsuite/tests/asmcomp/alpha.S new file mode 100644 index 00000000..66bf73f2 --- /dev/null +++ b/testsuite/tests/asmcomp/alpha.S @@ -0,0 +1,62 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: alpha.S 2638 1999-11-29 19:04:56Z doligez $ */ + + .globl call_gen_code + .ent call_gen_code + +call_gen_code: + lda $sp, -80($sp) + stq $26, 0($sp) + stq $9, 8($sp) + stq $10, 16($sp) + stq $11, 24($sp) + stq $12, 32($sp) + stt $f2, 40($sp) + stt $f3, 48($sp) + stt $f4, 56($sp) + stt $f5, 64($sp) + mov $16, $27 + mov $17, $16 + mov $18, $17 + mov $19, $18 + mov $20, $19 + jsr ($27) + ldq $26, 0($sp) + ldq $9, 8($sp) + ldq $10, 16($sp) + ldq $11, 24($sp) + ldq $12, 32($sp) + ldt $f2, 40($sp) + ldt $f3, 48($sp) + ldt $f4, 56($sp) + ldt $f5, 64($sp) + lda $sp, 80($sp) + ret ($26) + + .end call_gen_code + + .globl caml_c_call + .ent caml_c_call +caml_c_call: + lda $sp, -16($sp) + stq $26, 0($sp) + stq $gp, 8($sp) + mov $25, $27 + jsr ($25) + ldq $26, 0($sp) + ldq $gp, 8($sp) + lda $sp, 16($sp) + ret ($26) + + .end caml_c_call diff --git a/testsuite/tests/asmcomp/amd64.S b/testsuite/tests/asmcomp/amd64.S new file mode 100644 index 00000000..e40fecf7 --- /dev/null +++ b/testsuite/tests/asmcomp/amd64.S @@ -0,0 +1,63 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* */ +/* Copyright 2000 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: amd64.S 5634 2003-06-30 08:28:48Z xleroy $ */ + +#ifdef SYS_macosx +#define ALIGN 4 +#else +#define ALIGN 16 +#endif + + .globl _call_gen_code + .align ALIGN +_call_gen_code: + pushq %rbx + pushq %rbp + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + movq %rdi, %r10 + movq %rsi, %rax + movq %rdx, %rbx + movq %rcx, %rdi + movq %r8, %rsi + call *%r10 + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbp + popq %rbx + ret + + .globl caml_c_call + .align ALIGN +caml_c_call: + jmp *%rax + +#ifdef SYS_macosx + .literal16 +#else + .section .rodata.cst8,"aM",@progbits,8 +#endif + .globl _caml_negf_mask + .align ALIGN +_caml_negf_mask: + .quad 0x8000000000000000, 0 + .globl _caml_absf_mask + .align ALIGN +_caml_absf_mask: + .quad 0x7FFFFFFFFFFFFFFF, 0 + + .comm young_limit, 8 diff --git a/testsuite/tests/asmcomp/arith.cmm b/testsuite/tests/asmcomp/arith.cmm new file mode 100644 index 00000000..77257c3c --- /dev/null +++ b/testsuite/tests/asmcomp/arith.cmm @@ -0,0 +1,222 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: arith.cmm 3218 2000-06-29 11:45:24Z xleroy $ *) + +(* Regression test for arithmetic instructions *) + +(function "testarith" () + (let r "R" + (let d "D" + (let x (load int "X") + (let y (load int "Y") + (let f (load float "F") + (let g (load float "G") + (addraset r 0 0) + (addraset r 1 1) + (addraset r 2 -1) + (addraset r 3 256) + (addraset r 4 65536) + (addraset r 5 16777216) + (addraset r 6 -256) + (addraset r 7 -65536) + (addraset r 8 -16777216) + + (addraset r 9 (+ x y)) + (addraset r 10 (+ x 1)) + (addraset r 11 (+ x -1)) + + (addraset r 12 (+a "R" 8)) + (addraset r 13 (+a "R" y)) + + (addraset r 14 (- x y)) + (addraset r 15 (- x 1)) + (addraset r 16 (- x -1)) + + (addraset r 17 (-a "R" 8)) + (addraset r 18 (-a "R" y)) + + (addraset r 19 ( * x 2)) + (addraset r 20 ( * 2 x)) + (addraset r 21 ( * x 16)) + (addraset r 22 ( * 16 x)) + (addraset r 23 ( * x 12345)) + (addraset r 24 ( * 12345 x)) + (addraset r 25 ( * x y)) + + (addraset r 26 (/ x 2)) + (addraset r 27 (/ x 16)) + (addraset r 28 (/ x 7)) + (addraset r 29 (if (!= y 0) (/ x y) 0)) + + (addraset r 30 (mod x 2)) + (addraset r 31 (mod x 16)) + (addraset r 32 (if (!= y 0) (mod x y) 0)) + + (addraset r 33 (and x y)) + (addraset r 34 (and x 3)) + (addraset r 35 (and 3 x)) + + (addraset r 36 (or x y)) + (addraset r 37 (or x 3)) + (addraset r 38 (or 3 x)) + + (addraset r 39 (xor x y)) + (addraset r 40 (xor x 3)) + (addraset r 41 (xor 3 x)) + + (addraset r 42 (<< x y)) + (addraset r 43 (<< x 1)) + (addraset r 44 (<< x 8)) + + (addraset r 45 (>>u x y)) + (addraset r 46 (>>u x 1)) + (addraset r 47 (>>u x 8)) + + (addraset r 48 (>>s x y)) + (addraset r 49 (>>s x 1)) + (addraset r 50 (>>s x 8)) + + (addraset r 51 (== x y)) + (addraset r 52 (!= x y)) + (addraset r 53 (< x y)) + (addraset r 54 (> x y)) + (addraset r 55 (<= x y)) + (addraset r 56 (>= x y)) + (addraset r 57 (== x 1)) + (addraset r 58 (!= x 1)) + (addraset r 59 (< x 1)) + (addraset r 60 (> x 1)) + (addraset r 61 (<= x 1)) + (addraset r 62 (>= x 1)) + + (addraset r 63 (==a x y)) + (addraset r 64 (!=a x y)) + (addraset r 65 (a x y)) + (addraset r 67 (<=a x y)) + (addraset r 68 (>=a x y)) + (addraset r 69 (==a x 1)) + (addraset r 70 (!=a x 1)) + (addraset r 71 (a x 1)) + (addraset r 73 (<=a x 1)) + (addraset r 74 (>=a x 1)) + + (addraset r 75 (+ x (<< y 1))) + (addraset r 76 (+ x (<< y 2))) + (addraset r 77 (+ x (<< y 3))) + (addraset r 78 (- x (<< y 1))) + (addraset r 79 (- x (<< y 2))) + (addraset r 80 (- x (<< y 3))) + + (floataset d 0 0.0) + (floataset d 1 1.0) + (floataset d 2 -1.0) + (floataset d 3 (+f f g)) + (floataset d 4 (-f f g)) + (floataset d 5 ( *f f g)) + (floataset d 6 (/f f g)) + + (floataset d 7 (+f f (+f g 1.0))) + (floataset d 8 (-f f (+f g 1.0))) + (floataset d 9 ( *f f (+f g 1.0))) + (floataset d 10 (/f f (+f g 1.0))) + + (floataset d 11 (+f (+f f 1.0) g)) + (floataset d 12 (-f (+f f 1.0) g)) + (floataset d 13 ( *f (+f f 1.0) g)) + (floataset d 14 (/f (+f f 1.0) g)) + + (floataset d 15 (+f (+f f 1.0) (+f g 1.0))) + (floataset d 16 (-f (+f f 1.0) (+f g 1.0))) + (floataset d 17 ( *f (+f f 1.0) (+f g 1.0))) + (floataset d 18 (/f (+f f 1.0) (+f g 1.0))) + + (addraset r 81 (==f f g)) + (addraset r 82 (!=f f g)) + (addraset r 83 (f f g)) + (addraset r 85 (<=f f g)) + (addraset r 86 (>=f f g)) + + (floataset d 19 (floatofint x)) + (addraset r 87 (intoffloat f)) + + (if (and (>= x 0) (< x y)) + (seq (checkbound y x) (addraset r 88 1)) + (addraset r 88 0)) + + (if (< 0 y) + (seq (checkbound y 0) (addraset r 89 1)) + (addraset r 89 0)) + + (if (< 5 y) + (seq (checkbound y 5) (addraset r 90 1)) + (addraset r 90 0)) + + (addraset r 91 (let res 1 (if (==f f g) [] (assign res 0)) res)) + (addraset r 92 (let res 1 (if (!=f f g) [] (assign res 0)) res)) + (addraset r 93 (let res 1 (if (f f g) [] (assign res 0)) res)) + (addraset r 95 (let res 1 (if (<=f f g) [] (assign res 0)) res)) + (addraset r 96 (let res 1 (if (>=f f g) [] (assign res 0)) res)) + + (addraset r 97 (==f (+f f 1.0) (+f g 1.0))) + (addraset r 98 (!=f (+f f 1.0) (+f g 1.0))) + (addraset r 99 (f (+f f 1.0) (+f g 1.0))) + (addraset r 101 (<=f (+f f 1.0) (+f g 1.0))) + (addraset r 102 (>=f (+f f 1.0) (+f g 1.0))) + + (addraset r 103 (==f f (+f g 1.0))) + (addraset r 104 (!=f f (+f g 1.0))) + (addraset r 105 (f f (+f g 1.0))) + (addraset r 107 (<=f f (+f g 1.0))) + (addraset r 108 (>=f f (+f g 1.0))) + + (addraset r 109 (==f (+f f 1.0) g)) + (addraset r 110 (!=f (+f f 1.0) g)) + (addraset r 111 (f (+f f 1.0) g)) + (addraset r 113 (<=f (+f f 1.0) g)) + (addraset r 114 (>=f (+f f 1.0) g)) + + (floataset d 20 (+f (floatofint x) 1.0)) + (addraset r 115 (intoffloat (+f f 1.0))) + + (floataset d 21 (+f f (load float "G"))) + (floataset d 22 (+f (load float "G") f)) + (floataset d 23 (-f f (load float "G"))) + (floataset d 24 (-f (load float "G") f)) + (floataset d 25 ( *f f (load float "G"))) + (floataset d 26 ( *f (load float "G") f)) + (floataset d 27 (/f f (load float "G"))) + (floataset d 28 (/f (load float "G") f)) + + (floataset d 29 (+f ( *f f 2.0) (load float "G"))) + (floataset d 30 (+f (load float "G") ( *f f 2.0))) + (floataset d 31 (-f ( *f f 2.0) (load float "G"))) + (floataset d 32 (-f (load float "G") ( *f f 2.0))) + (floataset d 33 ( *f ( +f f 2.0) (load float "G"))) + (floataset d 34 ( *f (load float "G") ( +f f 2.0))) + (floataset d 35 (/f ( *f f 2.0) (load float "G"))) + (floataset d 36 (/f (load float "G") ( *f f 2.0))) + + (floataset d 37 (-f f)) + (floataset d 38 (absf f)) + +))))))) + + + diff --git a/testsuite/tests/asmcomp/arm.S b/testsuite/tests/asmcomp/arm.S new file mode 100644 index 00000000..06970951 --- /dev/null +++ b/testsuite/tests/asmcomp/arm.S @@ -0,0 +1,40 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* */ +/* Copyright 1998 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: arm.S 9212 2009-03-31 09:46:08Z xleroy $ */ + + .text + + .global call_gen_code + .type call_gen_code, %function + .align 0 +call_gen_code: + mov ip, sp + stmfd sp!, {r4, r5, r6, r7, r8, r9, fp, ip, lr, pc} + sub fp, ip, #4 + @ r0 is function to call + @ r1, r2, r3 are arguments 1, 2, 3 + mov r4, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + mov lr, pc + mov pc, r4 + ldmea fp, {r4, r5, r6, r7, r8, r9, fp, sp, pc} + + .global caml_c_call + .type caml_c_call, %function + .align 0 +caml_c_call: + @ function to call is in r10 + mov pc, r10 + diff --git a/testsuite/tests/asmcomp/checkbound.cmm b/testsuite/tests/asmcomp/checkbound.cmm new file mode 100644 index 00000000..a1277c95 --- /dev/null +++ b/testsuite/tests/asmcomp/checkbound.cmm @@ -0,0 +1,21 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: checkbound.cmm 2553 1999-11-17 18:59:06Z xleroy $ *) + +(function "checkbound2" (x: int y: int) + (checkbound x y)) + +(function "checkbound1" (x: int) + (checkbound x 2)) + + diff --git a/testsuite/tests/asmcomp/fib.cmm b/testsuite/tests/asmcomp/fib.cmm new file mode 100644 index 00000000..e71a9027 --- /dev/null +++ b/testsuite/tests/asmcomp/fib.cmm @@ -0,0 +1,19 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: fib.cmm 2553 1999-11-17 18:59:06Z xleroy $ *) + +(function "fib" (n: int) + (if (< n 2) + 1 + (+ (app "fib" (- n 1) int) + (app "fib" (- n 2) int)))) diff --git a/testsuite/tests/asmcomp/hppa.S b/testsuite/tests/asmcomp/hppa.S new file mode 100644 index 00000000..31fff9df --- /dev/null +++ b/testsuite/tests/asmcomp/hppa.S @@ -0,0 +1,162 @@ +;********************************************************************* +;* * +;* Objective Caml * +;* * +;* Xavier Leroy, 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 Q Public License version 1.0. * +;* * +;********************************************************************* + +; $Id: hppa.S 2553 1999-11-17 18:59:06Z xleroy $ +; Must be preprocessed by cpp + +#ifdef SYS_hpux +#define G(x) x +#define CODESPACE .code +#define CODE_ALIGN 4 +#define EXPORT_CODE(x) .export x, entry, priv_lev=3 +#define STARTPROC .proc ! .callinfo frame=0, no_calls ! .entry +#define ENDPROC .exit ! .procend +#endif + +#ifdef SYS_nextstep +#define G(x) _##x +#define CODESPACE .text +#define CODE_ALIGN 2 +#define EXPORT_CODE(x) .globl x +#define STARTPROC +#define ENDPROC +#endif + +#ifdef SYS_hpux + .space $PRIVATE$ + .subspa $DATA$,quad=1,align=8,access=31 + .subspa $BSS$,quad=1,align=8,access=31,zero,sort=82 + .space $TEXT$ + .subspa $LIT$,quad=0,align=8,access=44 + .subspa $CODE$,quad=0,align=8,access=44,code_only + .import $global$, data + .import $$dyncall, millicode +#endif + + CODESPACE + .align CODE_ALIGN + EXPORT_CODE(G(call_gen_code)) +G(call_gen_code): + STARTPROC + stw %r2,-20(%r30) + ldo 256(%r30), %r30 +; Save the callee-save registers + ldo -32(%r30), %r1 + stws,ma %r3, -4(%r1) + stws,ma %r4, -4(%r1) + stws,ma %r5, -4(%r1) + stws,ma %r6, -4(%r1) + stws,ma %r7, -4(%r1) + stws,ma %r8, -4(%r1) + stws,ma %r9, -4(%r1) + stws,ma %r10, -4(%r1) + stws,ma %r11, -4(%r1) + stws,ma %r12, -4(%r1) + stws,ma %r13, -4(%r1) + stws,ma %r14, -4(%r1) + stws,ma %r15, -4(%r1) + stws,ma %r16, -4(%r1) + stws,ma %r17, -4(%r1) + stws,ma %r18, -4(%r1) + fstds,ma %fr12, -8(%r1) + fstds,ma %fr13, -8(%r1) + fstds,ma %fr14, -8(%r1) + fstds,ma %fr15, -8(%r1) + fstds,ma %fr16, -8(%r1) + fstds,ma %fr17, -8(%r1) + fstds,ma %fr18, -8(%r1) + fstds,ma %fr19, -8(%r1) + fstds,ma %fr20, -8(%r1) + fstds,ma %fr21, -8(%r1) + fstds,ma %fr22, -8(%r1) + fstds,ma %fr23, -8(%r1) + fstds,ma %fr24, -8(%r1) + fstds,ma %fr25, -8(%r1) + fstds,ma %fr26, -8(%r1) + fstds,ma %fr27, -8(%r1) + fstds,ma %fr28, -8(%r1) + fstds,ma %fr29, -8(%r1) + fstds,ma %fr30, -8(%r1) + fstds,ma %fr31, -8(%r1) + +; Shuffle the arguments and call + copy %r26, %r22 + copy %r25, %r26 + copy %r24, %r25 + copy %r23, %r24 + fcpy,dbl %fr5, %fr4 +#ifdef SYS_hpux + bl $$dyncall, %r2 + nop +#else + ble 0(4, %r22) + copy %r31, %r2 +#endif +; Shuffle the results + copy %r26, %r28 +; Restore the callee-save registers + ldo -32(%r30), %r1 + ldws,ma -4(%r1), %r3 + ldws,ma -4(%r1), %r4 + ldws,ma -4(%r1), %r5 + ldws,ma -4(%r1), %r6 + ldws,ma -4(%r1), %r7 + ldws,ma -4(%r1), %r8 + ldws,ma -4(%r1), %r9 + ldws,ma -4(%r1), %r10 + ldws,ma -4(%r1), %r11 + ldws,ma -4(%r1), %r12 + ldws,ma -4(%r1), %r13 + ldws,ma -4(%r1), %r14 + ldws,ma -4(%r1), %r15 + ldws,ma -4(%r1), %r16 + ldws,ma -4(%r1), %r17 + ldws,ma -4(%r1), %r18 + fldds,ma -8(%r1), %fr12 + fldds,ma -8(%r1), %fr13 + fldds,ma -8(%r1), %fr14 + fldds,ma -8(%r1), %fr15 + fldds,ma -8(%r1), %fr16 + fldds,ma -8(%r1), %fr17 + fldds,ma -8(%r1), %fr18 + fldds,ma -8(%r1), %fr19 + fldds,ma -8(%r1), %fr20 + fldds,ma -8(%r1), %fr21 + fldds,ma -8(%r1), %fr22 + fldds,ma -8(%r1), %fr23 + fldds,ma -8(%r1), %fr24 + fldds,ma -8(%r1), %fr25 + fldds,ma -8(%r1), %fr26 + fldds,ma -8(%r1), %fr27 + fldds,ma -8(%r1), %fr28 + fldds,ma -8(%r1), %fr29 + fldds,ma -8(%r1), %fr30 + fldds,ma -8(%r1), %fr31 + + ldo -256(%r30), %r30 + ldw -20(%r30), %r2 + bv 0(%r2) + nop + ENDPROC + + .align CODE_ALIGN + EXPORT_CODE(caml_c_call) +G(caml_c_call): + STARTPROC +#ifdef SYS_hpux + bl $$dyncall, %r0 + nop +#else + bv 0(%r22) + nop +#endif + ENDPROC diff --git a/testsuite/tests/asmcomp/i386.S b/testsuite/tests/asmcomp/i386.S new file mode 100644 index 00000000..079eca17 --- /dev/null +++ b/testsuite/tests/asmcomp/i386.S @@ -0,0 +1,56 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: i386.S 2553 1999-11-17 18:59:06Z xleroy $ */ + +/* Linux with ELF binaries does not prefix identifiers with _. + Linux with a.out binaries, FreeBSD, and NextStep do. */ + +#ifdef SYS_linux_elf +#define G(x) x +#define FUNCTION_ALIGN 16 +#else +#define G(x) _##x +#define FUNCTION_ALIGN 4 +#endif + + .globl G(call_gen_code) + .align FUNCTION_ALIGN +G(call_gen_code): + pushl %ebp + movl %esp,%ebp + pushl %ebx + pushl %esi + pushl %edi + movl 12(%ebp),%eax + movl 16(%ebp),%ebx + movl 20(%ebp),%ecx + movl 24(%ebp),%edx + call *8(%ebp) + popl %edi + popl %esi + popl %ebx + popl %ebp + ret + + .globl G(caml_c_call) + .align FUNCTION_ALIGN +G(caml_c_call): + ffree %st(0) + ffree %st(1) + ffree %st(2) + ffree %st(3) + jmp *%eax + + .comm G(caml_exception_pointer), 4 + .comm G(young_ptr), 4 + .comm G(young_start), 4 diff --git a/testsuite/tests/asmcomp/i386nt.asm b/testsuite/tests/asmcomp/i386nt.asm new file mode 100644 index 00000000..0ad52475 --- /dev/null +++ b/testsuite/tests/asmcomp/i386nt.asm @@ -0,0 +1,67 @@ +;********************************************************************* +; +; Objective Caml +; +; Xavier Leroy, 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 Q Public License version 1.0. +; +;********************************************************************* + +; $Id: i386nt.asm 2553 1999-11-17 18:59:06Z xleroy $ + + .386 + .MODEL FLAT + + .CODE + PUBLIC _call_gen_code + ALIGN 4 +_call_gen_code: + push ebp + mov ebp, esp + push ebx + push esi + push edi + mov eax, [ebp+12] + mov ebx, [ebp+16] + mov ecx, [ebp+20] + mov edx, [ebp+24] + call DWORD PTR [ebp+8] + pop edi + pop esi + pop ebx + pop ebp + ret + + PUBLIC _caml_c_call + ALIGN 4 +_caml_c_call: + ffree st(0) + ffree st(1) + ffree st(2) + ffree st(3) + jmp eax + + PUBLIC _caml_call_gc + PUBLIC _caml_alloc + PUBLIC _caml_alloc1 + PUBLIC _caml_alloc2 + PUBLIC _caml_alloc3 +_caml_call_gc: +_caml_alloc: +_caml_alloc1: +_caml_alloc2: +_caml_alloc3: + int 3 + + .DATA + PUBLIC _caml_exception_pointer +_caml_exception_pointer dword 0 + PUBLIC _young_ptr +_young_ptr dword 0 + PUBLIC _young_limit +_young_limit dword 0 + + END diff --git a/testsuite/tests/asmcomp/ia64.S b/testsuite/tests/asmcomp/ia64.S new file mode 100644 index 00000000..49de1b19 --- /dev/null +++ b/testsuite/tests/asmcomp/ia64.S @@ -0,0 +1,118 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: ia64.S 3573 2001-07-12 12:54:24Z doligez $ */ + +#define ST8OFF(a,b,d) st8 [a] = b, d +#define LD8OFF(a,b,d) ld8 a = [b], d +#define STFDOFF(a,b,d) stfd [a] = b, d +#define LDFDOFF(a,b,d) ldfd a = [b], d +#define STFSPILLOFF(a,b,d) stf.spill [a] = b, d +#define LDFFILLOFF(a,b,d) ldf.fill a = [b], d + + .text + .align 16 + + .global call_gen_code# + .proc call_gen_code# + +call_gen_code: + /* Allocate 64 "out" registers (for the Caml code) and no locals */ + alloc r3 = ar.pfs, 0, 0, 64, 0 + + /* Save PFS, return address and GP on stack */ + add sp = -368, sp ;; + add r2 = 16, sp ;; + ST8OFF(r2,r3,8) ;; + mov r3 = b0 ;; + ST8OFF(r2,r3,8) ;; + ST8OFF(r2,gp,8) ;; + + /* Save predicates on stack */ + mov r3 = pr ;; + st8 [r2] = r3 + + /* Save callee-save floating-point registers on stack */ + add r2 = 48, sp + add r3 = 64, sp ;; + STFSPILLOFF(r2,f2,16) ;; + STFSPILLOFF(r3,f3,16) ;; + STFSPILLOFF(r2,f4,16) ;; + STFSPILLOFF(r3,f5,16) ;; + STFSPILLOFF(r2,f16,16) ;; + STFSPILLOFF(r3,f17,16) ;; + STFSPILLOFF(r2,f18,16) ;; + STFSPILLOFF(r3,f19,16) ;; + STFSPILLOFF(r2,f20,16) ;; + STFSPILLOFF(r3,f21,16) ;; + STFSPILLOFF(r2,f22,16) ;; + STFSPILLOFF(r3,f23,16) ;; + STFSPILLOFF(r2,f24,16) ;; + STFSPILLOFF(r3,f25,16) ;; + STFSPILLOFF(r2,f26,16) ;; + STFSPILLOFF(r3,f27,16) ;; + STFSPILLOFF(r2,f28,16) ;; + STFSPILLOFF(r3,f29,16) ;; + STFSPILLOFF(r2,f30,16) ;; + STFSPILLOFF(r3,f31,16) ;; + + /* Recover entry point and gp from the function pointer in in0 */ + LD8OFF(r2,r32,8) ;; + ld8 r3 = [r32] ;; + mov b6 = r2 + mov gp = r3 ;; + + /* Shift arguments r33 ... r35 to r32 ... r34 */ + mov r32 = r33 + mov r33 = r34 + mov r34 = r35 + + /* Do the call */ + br.call.sptk b0 = b6 ;; + + /* Restore the saved floating-point registers */ + add r2 = 48, sp + add r3 = 64, sp ;; + LDFFILLOFF(f2,r2,16) ;; + LDFFILLOFF(f3,r3,16) ;; + LDFFILLOFF(f4,r2,16) ;; + LDFFILLOFF(f5,r3,16) ;; + LDFFILLOFF(f16,r2,16) ;; + LDFFILLOFF(f17,r3,16) ;; + LDFFILLOFF(f18,r2,16) ;; + LDFFILLOFF(f19,r3,16) ;; + LDFFILLOFF(f20,r2,16) ;; + LDFFILLOFF(f21,r3,16) ;; + LDFFILLOFF(f22,r2,16) ;; + LDFFILLOFF(f23,r3,16) ;; + LDFFILLOFF(f24,r2,16) ;; + LDFFILLOFF(f25,r3,16) ;; + LDFFILLOFF(f26,r2,16) ;; + LDFFILLOFF(f27,r3,16) ;; + LDFFILLOFF(f28,r2,16) ;; + LDFFILLOFF(f29,r3,16) ;; + LDFFILLOFF(f30,r2,16) ;; + LDFFILLOFF(f31,r3,16) ;; + + /* Restore gp, predicates and return */ + add r2 = 16, sp ;; + LD8OFF(r3,r2,8) ;; + mov ar.pfs = r3 + LD8OFF(r3,r2,8) ;; + mov b0 = r3 + LD8OFF(gp,r2,8) ;; + LD8OFF(r3,r2,8) ;; + mov pr = r3, -1 + + br.ret.sptk.many b0 ;; + + .endp call_gen_code# diff --git a/testsuite/tests/asmcomp/integr.cmm b/testsuite/tests/asmcomp/integr.cmm new file mode 100644 index 00000000..84a01d46 --- /dev/null +++ b/testsuite/tests/asmcomp/integr.cmm @@ -0,0 +1,30 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: integr.cmm 3218 2000-06-29 11:45:24Z xleroy $ *) + +(function "square" (x: float) + ( *f x x)) + +(function "integr" (f: addr low: float high: float n: int) + (let (h (/f (-f high low) (floatofint n)) + x low + s 0.0 + i n) + (while (> i 0) + (assign s (+f s (app f x float))) + (assign x (+f x h)) + (assign i (- i 1))) + ( *f s h))) + +(function "test" (n: int) + (app "integr" "square" 0.0 1.0 n float)) diff --git a/testsuite/tests/asmcomp/lexcmm.mli b/testsuite/tests/asmcomp/lexcmm.mli new file mode 100644 index 00000000..9ebc36b5 --- /dev/null +++ b/testsuite/tests/asmcomp/lexcmm.mli @@ -0,0 +1,24 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: lexcmm.mli 2553 1999-11-17 18:59:06Z xleroy $ *) + +val token: Lexing.lexbuf -> Parsecmm.token + +type error = + Illegal_character + | Unterminated_comment + | Unterminated_string + +exception Error of error + +val report_error: Lexing.lexbuf -> error -> unit diff --git a/testsuite/tests/asmcomp/lexcmm.mll b/testsuite/tests/asmcomp/lexcmm.mll new file mode 100644 index 00000000..a9d17dd3 --- /dev/null +++ b/testsuite/tests/asmcomp/lexcmm.mll @@ -0,0 +1,228 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: lexcmm.mll 3211 2000-06-25 19:54:50Z xleroy $ *) + +{ +open Parsecmm + +type error = + Illegal_character + | Unterminated_comment + | Unterminated_string + +exception Error of error + +(* For nested comments *) + +let comment_depth = ref 0 + +(* The table of keywords *) + +let keyword_table = + Misc.create_hashtable 149 [ + "absf", ABSF; + "addr", ADDR; + "align", ALIGN; + "alloc", ALLOC; + "and", AND; + "app", APPLY; + "assign", ASSIGN; + "byte", BYTE; + "case", CASE; + "catch", CATCH; + "checkbound", CHECKBOUND; + "exit", EXIT; + "extcall", EXTCALL; + "float", FLOAT; + "float32", FLOAT32; + "float64", FLOAT64; + "floatofint", FLOATOFINT; + "function", FUNCTION; + "half", HALF; + "if", IF; + "int", INT; + "int32", INT32; + "intoffloat", INTOFFLOAT; + "string", KSTRING; + "let", LET; + "load", LOAD; + "mod", MODI; + "or", OR; + "proj", PROJ; + "raise", RAISE; + "seq", SEQ; + "signed", SIGNED; + "skip", SKIP; + "store", STORE; + "switch", SWITCH; + "try", TRY; + "unit", UNIT; + "unsigned", UNSIGNED; + "while", WHILE; + "with", WITH; + "xor", XOR; + "addraref", ADDRAREF; + "intaref", INTAREF; + "floataref", FLOATAREF; + "addraset", ADDRASET; + "intaset", INTASET; + "floataset", FLOATASET +] + +(* To buffer string literals *) + +let initial_string_buffer = String.create 256 +let string_buff = ref initial_string_buffer +let string_index = ref 0 + +let reset_string_buffer () = + string_buff := initial_string_buffer; + string_index := 0 + +let store_string_char c = + if !string_index >= String.length (!string_buff) then begin + let new_buff = String.create (String.length (!string_buff) * 2) in + String.blit (!string_buff) 0 new_buff 0 (String.length (!string_buff)); + string_buff := new_buff + end; + String.unsafe_set (!string_buff) (!string_index) c; + incr string_index + +let get_stored_string () = + let s = String.sub (!string_buff) 0 (!string_index) in + string_buff := initial_string_buffer; + s + +(* To translate escape sequences *) + +let char_for_backslash = function + 'n' -> '\010' + | 'r' -> '\013' + | 'b' -> '\008' + | 't' -> '\009' + | c -> c + +let char_for_decimal_code lexbuf i = + Char.chr(100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) + + 10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) + + (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48)) + +(* Error report *) + +let report_error lexbuf msg = + prerr_string "Lexical error around character "; + prerr_int (Lexing.lexeme_start lexbuf); + match msg with + Illegal_character -> + prerr_string ": illegal character" + | Unterminated_comment -> + prerr_string ": unterminated comment" + | Unterminated_string -> + prerr_string ": unterminated string" + +} + +rule token = parse + [' ' '\010' '\013' '\009' '\012'] + + { token lexbuf } + | "+a" { ADDA } + | "+f" { ADDF } + | "+" { ADDI } + | ">>s" { ASR } + | ":" { COLON } + | "/f" { DIVF } + | "/" { DIVI } + | eof { EOF } + | "==a" { EQA } + | "==f" { EQF } + | "==" { EQI } + | ">=a" { GEA } + | ">=f" { GEF } + | ">=" { GEI } + | ">a" { GTA } + | ">f" { GTF } + | ">" { GTI } + | "[" { LBRACKET } + | "<=a" { LEA } + | "<=f" { LEF } + | "<=" { LEI } + | "(" { LPAREN } + | "<<" { LSL } + | ">>u" { LSR } + | " + IDENT s } + | "\"" + { reset_string_buffer(); + string lexbuf; + STRING (get_stored_string()) } + | "(*" + { comment_depth := 1; + comment lexbuf; + token lexbuf } + | _ { raise(Error(Illegal_character)) } + +and comment = parse + "(*" + { comment_depth := succ !comment_depth; comment lexbuf } + | "*)" + { comment_depth := pred !comment_depth; + if !comment_depth > 0 then comment lexbuf } + | eof + { raise (Error(Unterminated_comment)) } + | _ + { comment lexbuf } + +and string = parse + '"' + { () } + | '\\' [' ' '\010' '\013' '\009' '\026' '\012'] + + { string lexbuf } + | '\\' ['\\' '"' 'n' 't' 'b' 'r'] + { store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); + string lexbuf } + | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] + { store_string_char(char_for_decimal_code lexbuf 1); + string lexbuf } + | eof + { raise (Error(Unterminated_string)) } + | _ + { store_string_char(Lexing.lexeme_char lexbuf 0); + string lexbuf } diff --git a/testsuite/tests/asmcomp/m68k.S b/testsuite/tests/asmcomp/m68k.S new file mode 100644 index 00000000..8905da1b --- /dev/null +++ b/testsuite/tests/asmcomp/m68k.S @@ -0,0 +1,59 @@ +|*********************************************************************** +|* * +|* Objective Caml * +|* * +|* Xavier Leroy, 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 Q Public License version 1.0. * +|* * +|*********************************************************************** + +| $Id: m68k.S 2553 1999-11-17 18:59:06Z xleroy $ + +| call_gen_code is used with the following types: +| unit -> int +| int -> int +| int -> double +| int * int * address -> void +| int * int -> void +| unit -> unit +| Hence arg1 -> d0, arg2 -> d1, arg3 -> a0, +| and we need a special case for int -> double + + .text + .globl _call_gen_code +_call_gen_code: + link a6, #0 + movem d2-d7/a2-a6, a7@- + fmovem fp2-fp7, a7@- + movel a6@(8), a1 + movel a6@(12), d0 + movel a6@(16), d1 + movel a6@(20), a0 + jsr a1@ + fmovem a7@+, fp2-fp7 + movem a7@+, d2-d7/a2-a6 + unlk a6 + rts + + .globl _call_gen_code_float +_call_gen_code_float: + link a6, #0 + moveml d2-d7/a2-a6, a7@- + fmovem fp2-fp7, a7@- + movel a6@(8), a1 + movel a6@(12), d0 + jsr a1@ + fmoved fp0, a7@- + movel a7@+, d0 + movel a7@+, d1 + fmovem a7@+, fp2-fp7 + moveml a7@+, d2-d7/a2-a6 + unlk a6 + rts + + .globl _caml_c_call +_caml_c_call: + jmp a0@ diff --git a/testsuite/tests/asmcomp/main.c b/testsuite/tests/asmcomp/main.c new file mode 100644 index 00000000..7f0e7174 --- /dev/null +++ b/testsuite/tests/asmcomp/main.c @@ -0,0 +1,127 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: main.c 9212 2009-03-31 09:46:08Z xleroy $ */ + +#include +#include +#include +#include + +void caml_ml_array_bound_error(void) +{ + fprintf(stderr, "Fatal error: out-of-bound access in array or string\n"); + exit(2); +} + +void print_string(char * s) +{ + fputs(s, stdout); +} + +void printf_int(char * fmt, int arg) +{ + printf(fmt, arg); +} + +#ifdef SORT + +int cmpint(const void * i, const void * j) +{ + long vi = *((long *) i); + long vj = *((long *) j); + if (vi == vj) return 0; + if (vi < vj) return -1; + return 1; +} + +#endif + +int main(int argc, char **argv) +{ +#ifdef UNIT_INT + { extern int FUN(); + extern int call_gen_code(); + printf("%d\n", call_gen_code(FUN)); + } +#else + if (argc < 2) { + fprintf(stderr, "Usage: %s [int arg]\n", argv[0]); + exit(2); + } +#ifdef INT_INT + { extern int FUN(); + extern int call_gen_code(); + printf("%d\n", call_gen_code(FUN, atoi(argv[1]))); + } +#endif +#ifdef INT_FLOAT + { extern double FUN(); +#ifdef __mc68020__ +#define call_gen_code call_gen_code_float +#endif + extern double call_gen_code(); + printf("%f\n", call_gen_code(FUN, atoi(argv[1]))); + } +#endif +#ifdef SORT + { extern void FUN(); + extern void call_gen_code(); + long n; + long * a, * b; + long i; + + srand(argc >= 3 ? atoi(argv[2]) : time((time_t *) 0)); + n = atoi(argv[1]); + a = (long *) malloc(n * sizeof(long)); + for (i = 0 ; i < n; i++) a[i] = rand() & 0xFFF; +#ifdef DEBUG + for (i = 0; i < n; i++) printf("%ld ", a[i]); printf("\n"); +#endif + b = (long *) malloc(n * sizeof(long)); + for (i = 0; i < n; i++) b[i] = a[i]; + call_gen_code(FUN, 0, n-1, a); +#ifdef DEBUG + for (i = 0; i < n; i++) printf("%ld ", a[i]); printf("\n"); +#endif + qsort(b, n, sizeof(long), cmpint); + for (i = 0; i < n; i++) { + if (a[i] != b[i]) { printf("Bug!\n"); return 2; } + } + printf("OK\n"); + } +#endif +#endif +#ifdef CHECKBOUND + { extern void checkbound1(), checkbound2(); + extern void call_gen_code(); + long x, y; + x = atoi(argv[1]); + if (argc >= 3) { + y = atoi(argv[2]); + if ((unsigned long) x < (unsigned long) y) + printf("Should not trap\n"); + else + printf("Should trap\n"); + call_gen_code(checkbound2, y, x); + } else { + if (2 < (unsigned long) x) + printf("Should not trap\n"); + else + printf("Should trap\n"); + call_gen_code(checkbound1, x); + } + printf("OK\n"); + } +#endif + return 0; +} diff --git a/testsuite/tests/asmcomp/main.ml b/testsuite/tests/asmcomp/main.ml new file mode 100644 index 00000000..7017c35d --- /dev/null +++ b/testsuite/tests/asmcomp/main.ml @@ -0,0 +1,60 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: main.ml 3229 2000-07-07 14:09:23Z xleroy $ *) + +open Clflags + +let compile_file filename = + Compilenv.reset "test"; + Emit.begin_assembly(); + let ic = open_in filename in + let lb = Lexing.from_channel ic in + try + while true do + Asmgen.compile_phrase Format.std_formatter (Parsecmm.phrase Lexcmm.token lb) + done + with + End_of_file -> + close_in ic; Emit.end_assembly() + | Lexcmm.Error msg -> + close_in ic; Lexcmm.report_error lb msg + | Parsing.Parse_error -> + close_in ic; + prerr_string "Syntax error near character "; + prerr_int (Lexing.lexeme_start lb); + prerr_newline() + | Parsecmmaux.Error msg -> + close_in ic; Parsecmmaux.report_error msg + | x -> + close_in ic; raise x + +let usage = "Usage: codegen \noptions are:" + +let main() = + Arg.parse [ + "-dcmm", Arg.Set dump_cmm, ""; + "-dsel", Arg.Set dump_selection, ""; + "-dlive", Arg.Unit(fun () -> dump_live := true; + Printmach.print_live := true), ""; + "-dspill", Arg.Set dump_spill, ""; + "-dsplit", Arg.Set dump_split, ""; + "-dinterf", Arg.Set dump_interf, ""; + "-dprefer", Arg.Set dump_prefer, ""; + "-dalloc", Arg.Set dump_regalloc, ""; + "-dreload", Arg.Set dump_reload, ""; + "-dscheduling", Arg.Set dump_scheduling, ""; + "-dlinear", Arg.Set dump_linear, "" + ] compile_file usage + +let _ = (*Printexc.catch*) main (); exit 0 + diff --git a/testsuite/tests/asmcomp/mainarith.c b/testsuite/tests/asmcomp/mainarith.c new file mode 100644 index 00000000..efa48ba0 --- /dev/null +++ b/testsuite/tests/asmcomp/mainarith.c @@ -0,0 +1,307 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: mainarith.c 9212 2009-03-31 09:46:08Z xleroy $ */ + +#include +#include +#include +#include +#include + +void caml_ml_array_bound_error(void) +{ + fprintf(stderr, "Fatal error: out-of-bound access in array or string\n"); + exit(2); +} + +long R[200]; +double D[40]; +long X, Y; +double F, G; + +#define INTTEST(arg,res) \ + { long result = (res); \ + if (arg != result) \ + printf("Failed test \"%s == %s\" for X=%ld and Y=%ld: result %ld, expected %ld\n", \ + #arg, #res, X, Y, arg, result); \ + } +#define INTFLOATTEST(arg,res) \ + { long result = (res); \ + if (arg != result) \ + printf("Failed test \"%s == %s\" for F=%.15g and G=%.15g: result %ld, expected %ld\n", \ + #arg, #res, F, G, arg, result); \ + } +#define FLOATTEST(arg,res) \ + { double result = (res); \ + if (arg < result || arg > result) \ + printf("Failed test \"%s == %s\" for F=%.15g and G=%.15g: result %.15g, expected %.15g\n", \ + #arg, #res, F, G, arg, result); \ + } +#define FLOATINTTEST(arg,res) \ + { double result = (res); \ + if (arg < result || arg > result) \ + printf("Failed test \"%s == %s\" for X=%ld and Y=%ld: result %.15g, expected %.15g\n", \ + #arg, #res, X, Y, arg, result); \ + } + +extern void call_gen_code(); +extern void testarith(); + +void do_test(void) +{ + call_gen_code(testarith); + + INTTEST(R[0], 0); + INTTEST(R[1], 1); + INTTEST(R[2], -1); + INTTEST(R[3], 256); + INTTEST(R[4], 65536); + INTTEST(R[5], 16777216); + INTTEST(R[6], -256); + INTTEST(R[7], -65536); + INTTEST(R[8], -16777216); + + INTTEST(R[9], (X + Y)); + INTTEST(R[10], (X + 1)); + INTTEST(R[11], (X + -1)); + + INTTEST(R[12], ((long) ((char *)R + 8))); + INTTEST(R[13], ((long) ((char *)R + Y))); + + INTTEST(R[14], (X - Y)); + INTTEST(R[15], (X - 1)); + INTTEST(R[16], (X - -1)); + + INTTEST(R[17], ((long) ((char *)R - 8))); + INTTEST(R[18], ((long) ((char *)R - Y))); + + INTTEST(R[19], (X * 2)); + INTTEST(R[20], (2 * X)); + INTTEST(R[21], (X * 16)); + INTTEST(R[22], (16 * X)); + INTTEST(R[23], (X * 12345)); + INTTEST(R[24], (12345 * X)); + INTTEST(R[25], (X * Y)); + + INTTEST(R[26], (X / 2)); + INTTEST(R[27], (X / 16)); + INTTEST(R[28], (X / 7)); + INTTEST(R[29], (Y != 0 ? X / Y : 0)); + + INTTEST(R[30], (X % 2)); + INTTEST(R[31], (X % 16)); + INTTEST(R[32], (Y != 0 ? X % Y : 0)); + + INTTEST(R[33], (X & Y)); + INTTEST(R[34], (X & 3)); + INTTEST(R[35], (3 & X)); + + INTTEST(R[36], (X | Y)); + INTTEST(R[37], (X | 3)); + INTTEST(R[38], (3 | X)); + + INTTEST(R[39], (X ^ Y)); + INTTEST(R[40], (X ^ 3)); + INTTEST(R[41], (3 ^ X)); + + INTTEST(R[42], (X << Y)); + INTTEST(R[43], (X << 1)); + INTTEST(R[44], (X << 8)); + + INTTEST(R[45], ((unsigned long) X >> Y)); + INTTEST(R[46], ((unsigned long) X >> 1)); + INTTEST(R[47], ((unsigned long) X >> 8)); + + INTTEST(R[48], (X >> Y)); + INTTEST(R[49], (X >> 1)); + INTTEST(R[50], (X >> 8)); + + INTTEST(R[51], (X == Y)); + INTTEST(R[52], (X != Y)); + INTTEST(R[53], (X < Y)); + INTTEST(R[54], (X > Y)); + INTTEST(R[55], (X <= Y)); + INTTEST(R[56], (X >= Y)); + INTTEST(R[57], (X == 1)); + INTTEST(R[58], (X != 1)); + INTTEST(R[59], (X < 1)); + INTTEST(R[60], (X > 1)); + INTTEST(R[61], (X <= 1)); + INTTEST(R[62], (X >= 1)); + + INTTEST(R[63], ((char *)X == (char *)Y)); + INTTEST(R[64], ((char *)X != (char *)Y)); + INTTEST(R[65], ((char *)X < (char *)Y)); + INTTEST(R[66], ((char *)X > (char *)Y)); + INTTEST(R[67], ((char *)X <= (char *)Y)); + INTTEST(R[68], ((char *)X >= (char *)Y)); + INTTEST(R[69], ((char *)X == (char *)1)); + INTTEST(R[70], ((char *)X != (char *)1)); + INTTEST(R[71], ((char *)X < (char *)1)); + INTTEST(R[72], ((char *)X > (char *)1)); + INTTEST(R[73], ((char *)X <= (char *)1)); + INTTEST(R[74], ((char *)X >= (char *)1)); + + INTTEST(R[75], (X + (Y << 1))); + INTTEST(R[76], (X + (Y << 2))); + INTTEST(R[77], (X + (Y << 3))); + INTTEST(R[78], (X - (Y << 1))); + INTTEST(R[79], (X - (Y << 2))); + INTTEST(R[80], (X - (Y << 3))); + + FLOATTEST(D[0], 0.0); + FLOATTEST(D[1], 1.0); + FLOATTEST(D[2], -1.0); + FLOATTEST(D[3], (F + G)); + FLOATTEST(D[4], (F - G)); + FLOATTEST(D[5], (F * G)); + FLOATTEST(D[6], F / G); + + FLOATTEST(D[7], (F + (G + 1.0))); + FLOATTEST(D[8], (F - (G + 1.0))); + FLOATTEST(D[9], (F * (G + 1.0))); + FLOATTEST(D[10], F / (G + 1.0)); + + FLOATTEST(D[11], ((F + 1.0) + G)); + FLOATTEST(D[12], ((F + 1.0) - G)); + FLOATTEST(D[13], ((F + 1.0) * G)); + FLOATTEST(D[14], (F + 1.0) / G); + + FLOATTEST(D[15], ((F + 1.0) + (G + 1.0))); + FLOATTEST(D[16], ((F + 1.0) - (G + 1.0))); + FLOATTEST(D[17], ((F + 1.0) * (G + 1.0))); + FLOATTEST(D[18], (F + 1.0) / (G + 1.0)); + + INTFLOATTEST(R[81], (F == G)); + INTFLOATTEST(R[82], (F != G)); + INTFLOATTEST(R[83], (F < G)); + INTFLOATTEST(R[84], (F > G)); + INTFLOATTEST(R[85], (F <= G)); + INTFLOATTEST(R[86], (F >= G)); + + FLOATINTTEST(D[19], (double) X); + INTFLOATTEST(R[87], (long) F); + + INTTEST(R[88], (X >= 0) && (X < Y)); + INTTEST(R[89], (0 < Y)); + INTTEST(R[90], (5 < Y)); + + INTFLOATTEST(R[91], (F == G)); + INTFLOATTEST(R[92], (F != G)); + INTFLOATTEST(R[93], (F < G)); + INTFLOATTEST(R[94], (F > G)); + INTFLOATTEST(R[95], (F <= G)); + INTFLOATTEST(R[96], (F >= G)); + + INTFLOATTEST(R[97], (F + 1.0 == G + 1.0)); + INTFLOATTEST(R[98], (F + 1.0 != G + 1.0)); + INTFLOATTEST(R[99], (F + 1.0 < G + 1.0)); + INTFLOATTEST(R[100], (F + 1.0 > G + 1.0)); + INTFLOATTEST(R[101], (F + 1.0 <= G + 1.0)); + INTFLOATTEST(R[102], (F + 1.0 >= G + 1.0)); + + INTFLOATTEST(R[103], (F == G + 1.0)); + INTFLOATTEST(R[104], (F != G + 1.0)); + INTFLOATTEST(R[105], (F < G + 1.0)); + INTFLOATTEST(R[106], (F > G + 1.0)); + INTFLOATTEST(R[107], (F <= G + 1.0)); + INTFLOATTEST(R[108], (F >= G + 1.0)); + + INTFLOATTEST(R[109], (F + 1.0 == G)); + INTFLOATTEST(R[110], (F + 1.0 != G)); + INTFLOATTEST(R[111], (F + 1.0 < G)); + INTFLOATTEST(R[112], (F + 1.0 > G)); + INTFLOATTEST(R[113], (F + 1.0 <= G)); + INTFLOATTEST(R[114], (F + 1.0 >= G)); + + FLOATINTTEST(D[20], ((double) X) + 1.0); + INTFLOATTEST(R[115], (long)(F + 1.0)); + + FLOATTEST(D[21], F + G); + FLOATTEST(D[22], G + F); + FLOATTEST(D[23], F - G); + FLOATTEST(D[24], G - F); + FLOATTEST(D[25], F * G); + FLOATTEST(D[26], G * F); + FLOATTEST(D[27], F / G); + FLOATTEST(D[28], G / F); + + FLOATTEST(D[29], (F * 2.0) + G); + FLOATTEST(D[30], G + (F * 2.0)); + FLOATTEST(D[31], (F * 2.0) - G); + FLOATTEST(D[32], G - (F * 2.0)); + FLOATTEST(D[33], (F + 2.0) * G); + FLOATTEST(D[34], G * (F + 2.0)); + FLOATTEST(D[35], (F * 2.0) / G); + FLOATTEST(D[36], G / (F * 2.0)); + + FLOATTEST(D[37], - F); + FLOATTEST(D[38], fabs(F)); +} + +#ifdef __i386__ +#ifdef __FreeBSD__ +#include +#endif +#endif + +void init_ieee_floats(void) +{ +#ifdef __i386__ +#ifdef __FreeBSD__ + fpsetmask(0); +#endif +#endif +} + +int main(int argc, char **argv) +{ + double weird[4]; + + init_ieee_floats(); + + if (argc >= 5) { + X = atoi(argv[1]); + Y = atoi(argv[2]); + sscanf(argv[3], "%lf", &F); + sscanf(argv[4], "%lf", &G); + do_test(); + return 0; + } + for(Y = -2; Y <= 2; Y++) { + for (X = -2; X <= 2; X++) { + F = X; G = Y; do_test(); + } + } + if (!(argc >= 2 && strcmp(argv[1], "noinf"))) { + weird[0] = 0.0; + weird[1] = 1.0 / weird[0]; /* +infty */ + weird[2] = -1.0 / weird[0]; /* -infty */ + weird[3] = 0.0 / weird[0]; /* NaN */ + for (X = 0; X < 4; X++) { + for (Y = 0; Y < 4; Y++) { + F = weird[X]; G = weird[Y]; do_test(); + } + } + } + while(1) { + X = (rand() & 0x1FFFFFFF) - 0x10000000; + Y = (rand() & 0x1FFFFFFF) - 0x10000000; + F = X / 1e3; + G = Y / 1e3; + do_test(); + printf("."); fflush(stdout); + } + return 0; +} + diff --git a/testsuite/tests/asmcomp/mips.s b/testsuite/tests/asmcomp/mips.s new file mode 100644 index 00000000..d8e93565 --- /dev/null +++ b/testsuite/tests/asmcomp/mips.s @@ -0,0 +1,71 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: mips.s 2638 1999-11-29 19:04:56Z doligez $ */ + + .globl call_gen_code + .ent call_gen_code +call_gen_code: + subu $sp, $sp, 0x90 + sd $31, 0x88($sp) + /* Save all callee-save registers */ + sd $16, 0x0($sp) + sd $17, 0x8($sp) + sd $18, 0x10($sp) + sd $19, 0x18($sp) + sd $20, 0x20($sp) + sd $21, 0x28($sp) + sd $22, 0x30($sp) + sd $23, 0x38($sp) + sd $30, 0x40($sp) + s.d $f20, 0x48($sp) + s.d $f22, 0x50($sp) + s.d $f24, 0x58($sp) + s.d $f26, 0x60($sp) + s.d $f28, 0x68($sp) + s.d $f30, 0x70($sp) + /* Shuffle arguments */ + move $8, $5 + move $9, $6 + move $10, $7 + move $25, $4 + jal $4 + /* Restore registers */ + ld $31, 0x88($sp) + ld $16, 0x0($sp) + ld $17, 0x8($sp) + ld $18, 0x10($sp) + ld $19, 0x18($sp) + ld $20, 0x20($sp) + ld $21, 0x28($sp) + ld $22, 0x30($sp) + ld $23, 0x38($sp) + ld $30, 0x40($sp) + l.d $f20, 0x48($sp) + l.d $f22, 0x50($sp) + l.d $f24, 0x58($sp) + l.d $f26, 0x60($sp) + l.d $f28, 0x68($sp) + l.d $f30, 0x70($sp) + addu $sp, $sp, 0x90 + j $31 + + .end call_gen_code + +/* Call a C function */ + + .globl caml_c_call + .ent caml_c_call +caml_c_call: + move $25, $24 + j $24 + .end caml_c_call diff --git a/testsuite/tests/asmcomp/parsecmm.mly b/testsuite/tests/asmcomp/parsecmm.mly new file mode 100644 index 00000000..6ed2f8ff --- /dev/null +++ b/testsuite/tests/asmcomp/parsecmm.mly @@ -0,0 +1,327 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: parsecmm.mly 9212 2009-03-31 09:46:08Z xleroy $ */ + +/* A simple parser for C-- */ + +%{ +open Cmm +open Parsecmmaux + +let rec make_letdef def body = + match def with + [] -> body + | (id, def) :: rem -> + unbind_ident id; + Clet(id, def, make_letdef rem body) + +let make_switch n selector caselist = + let index = Array.create n 0 in + let casev = Array.of_list caselist in + let actv = Array.create (Array.length casev) (Cexit(0,[])) in + for i = 0 to Array.length casev - 1 do + let (posl, e) = casev.(i) in + List.iter (fun pos -> index.(pos) <- i) posl; + actv.(i) <- e + done; + Cswitch(selector, index, actv) + +let access_array base numelt size = + match numelt with + Cconst_int 0 -> base + | Cconst_int n -> Cop(Cadda, [base; Cconst_int(n * size)]) + | _ -> Cop(Cadda, [base; + Cop(Clsl, [numelt; Cconst_int(Misc.log2 size)])]) + +%} + +%token ABSF +%token ADDA +%token ADDF +%token ADDI +%token ADDR +%token ALIGN +%token ALLOC +%token AND +%token APPLY +%token ASR +%token ASSIGN +%token BYTE +%token CASE +%token CATCH +%token CHECKBOUND +%token COLON +%token DIVF +%token DIVI +%token EOF +%token EQA +%token EQF +%token EQI +%token EXIT +%token EXTCALL +%token FLOAT +%token FLOAT32 +%token FLOAT64 +%token FLOATCONST +%token FLOATOFINT +%token FUNCTION +%token GEA +%token GEF +%token GEI +%token GTA +%token GTF +%token GTI +%token HALF +%token IDENT +%token IF +%token INT +%token INT32 +%token INTCONST +%token INTOFFLOAT +%token KSTRING +%token LBRACKET +%token LEA +%token LEF +%token LEI +%token LET +%token LOAD +%token LPAREN +%token LSL +%token LSR +%token LTA +%token LTF +%token LTI +%token MODI +%token MULF +%token MULI +%token NEA +%token NEF +%token NEI +%token OR +%token POINTER +%token PROJ +%token RAISE +%token RBRACKET +%token RPAREN +%token SEQ +%token SIGNED +%token SKIP +%token STAR +%token STORE +%token STRING +%token SUBA +%token SUBF +%token SUBI +%token SWITCH +%token TRY +%token UNIT +%token UNSIGNED +%token WHILE +%token WITH +%token XOR +%token ADDRAREF +%token INTAREF +%token FLOATAREF +%token ADDRASET +%token INTASET +%token FLOATASET + +%start phrase +%type phrase + +%% + +phrase: + fundecl { Cfunction $1 } + | datadecl { Cdata $1 } + | EOF { raise End_of_file } +; +fundecl: + LPAREN FUNCTION STRING LPAREN params RPAREN sequence RPAREN + { List.iter (fun (id, ty) -> unbind_ident id) $5; + {fun_name = $3; fun_args = $5; fun_body = $7; fun_fast = true} } +; +params: + oneparam params { $1 :: $2 } + | /**/ { [] } +; +oneparam: + IDENT COLON machtype { (bind_ident $1, $3) } +; +machtype: + UNIT { [||] } + | componentlist { Array.of_list(List.rev $1) } +; +component: + ADDR { Addr } + | INT { Int } + | FLOAT { Float } +; +componentlist: + component { [$1] } + | componentlist STAR component { $3 :: $1 } +; +expr: + INTCONST { Cconst_int $1 } + | FLOATCONST { Cconst_float $1 } + | STRING { Cconst_symbol $1 } + | POINTER { Cconst_pointer $1 } + | IDENT { Cvar(find_ident $1) } + | LBRACKET RBRACKET { Ctuple [] } + | LPAREN LET letdef sequence RPAREN { make_letdef $3 $4 } + | LPAREN ASSIGN IDENT expr RPAREN { Cassign(find_ident $3, $4) } + | LPAREN APPLY expr exprlist machtype RPAREN + { Cop(Capply($5, Debuginfo.none), $3 :: List.rev $4) } + | LPAREN EXTCALL STRING exprlist machtype RPAREN + { Cop(Cextcall($3, $5, false, Debuginfo.none), List.rev $4) } + | LPAREN SUBF expr RPAREN { Cop(Cnegf, [$3]) } + | LPAREN SUBF expr expr RPAREN { Cop(Csubf, [$3; $4]) } + | LPAREN unaryop expr RPAREN { Cop($2, [$3]) } + | LPAREN binaryop expr expr RPAREN { Cop($2, [$3; $4]) } + | LPAREN SEQ sequence RPAREN { $3 } + | LPAREN IF expr expr expr RPAREN { Cifthenelse($3, $4, $5) } + | LPAREN SWITCH INTCONST expr caselist RPAREN { make_switch $3 $4 $5 } + | LPAREN WHILE expr sequence RPAREN + { let body = + match $3 with + Cconst_int x when x <> 0 -> $4 + | _ -> Cifthenelse($3, $4, (Cexit(0,[]))) in + Ccatch(0, [], Cloop body, Ctuple []) } + | LPAREN CATCH sequence WITH sequence RPAREN { Ccatch(0, [], $3, $5) } + | EXIT { Cexit(0,[]) } + | LPAREN TRY sequence WITH bind_ident sequence RPAREN + { unbind_ident $5; Ctrywith($3, $5, $6) } + | LPAREN ADDRAREF expr expr RPAREN + { Cop(Cload Word, [access_array $3 $4 Arch.size_addr]) } + | LPAREN INTAREF expr expr RPAREN + { Cop(Cload Word, [access_array $3 $4 Arch.size_int]) } + | LPAREN FLOATAREF expr expr RPAREN + { Cop(Cload Double_u, [access_array $3 $4 Arch.size_float]) } + | LPAREN ADDRASET expr expr expr RPAREN + { Cop(Cstore Word, [access_array $3 $4 Arch.size_addr; $5]) } + | LPAREN INTASET expr expr expr RPAREN + { Cop(Cstore Word, [access_array $3 $4 Arch.size_int; $5]) } + | LPAREN FLOATASET expr expr expr RPAREN + { Cop(Cstore Double_u, [access_array $3 $4 Arch.size_float; $5]) } +; +exprlist: + exprlist expr { $2 :: $1 } + | /**/ { [] } +; +letdef: + oneletdef { [$1] } + | LPAREN letdefmult RPAREN { $2 } +; +letdefmult: + /**/ { [] } + | oneletdef letdefmult { $1 :: $2 } +; +oneletdef: + IDENT expr { (bind_ident $1, $2) } +; +chunk: + UNSIGNED BYTE { Byte_unsigned } + | SIGNED BYTE { Byte_signed } + | UNSIGNED HALF { Sixteen_unsigned } + | SIGNED HALF { Sixteen_signed } + | UNSIGNED INT32 { Thirtytwo_unsigned } + | SIGNED INT32 { Thirtytwo_signed } + | INT { Word } + | ADDR { Word } + | FLOAT32 { Single } + | FLOAT64 { Double } + | FLOAT { Double_u } + +; +unaryop: + LOAD chunk { Cload $2 } + | ALLOC { Calloc } + | FLOATOFINT { Cfloatofint } + | INTOFFLOAT { Cintoffloat } + | RAISE { Craise Debuginfo.none } + | ABSF { Cabsf } +; +binaryop: + STORE chunk { Cstore $2 } + | ADDI { Caddi } + | SUBI { Csubi } + | MULI { Cmuli } + | DIVI { Cdivi } + | MODI { Cmodi } + | AND { Cand } + | OR { Cor } + | XOR { Cxor } + | LSL { Clsl } + | LSR { Clsr } + | ASR { Casr } + | EQI { Ccmpi Ceq } + | NEI { Ccmpi Cne } + | LTI { Ccmpi Clt } + | LEI { Ccmpi Cle } + | GTI { Ccmpi Cgt } + | GEI { Ccmpi Cge } + | ADDA { Cadda } + | SUBA { Csuba } + | EQA { Ccmpa Ceq } + | NEA { Ccmpa Cne } + | LTA { Ccmpa Clt } + | LEA { Ccmpa Cle } + | GTA { Ccmpa Cgt } + | GEA { Ccmpa Cge } + | ADDF { Caddf } + | MULF { Cmulf } + | DIVF { Cdivf } + | EQF { Ccmpf Ceq } + | NEF { Ccmpf Cne } + | LTF { Ccmpf Clt } + | LEF { Ccmpf Cle } + | GTF { Ccmpf Cgt } + | GEF { Ccmpf Cge } + | CHECKBOUND { Ccheckbound Debuginfo.none } +; +sequence: + expr sequence { Csequence($1, $2) } + | expr { $1 } +; +caselist: + onecase sequence caselist { ($1, $2) :: $3 } + | /**/ { [] } +; +onecase: + CASE INTCONST COLON onecase { $2 :: $4 } + | CASE INTCONST COLON { [$2] } +; +bind_ident: + IDENT { bind_ident $1 } +; +datadecl: + LPAREN datalist RPAREN { List.rev $2 } +; +datalist: + datalist dataitem { $2 :: $1 } + | /**/ { [] } +; +dataitem: + STRING COLON { Cdefine_symbol $1 } + | INTCONST COLON { Cdefine_label $1 } + | BYTE INTCONST { Cint8 $2 } + | HALF INTCONST { Cint16 $2 } + | INT INTCONST { Cint(Nativeint.of_int $2) } + | FLOAT FLOATCONST { Cdouble $2 } + | ADDR STRING { Csymbol_address $2 } + | ADDR INTCONST { Clabel_address $2 } + | KSTRING STRING { Cstring $2 } + | SKIP INTCONST { Cskip $2 } + | ALIGN INTCONST { Calign $2 } +; + diff --git a/testsuite/tests/asmcomp/parsecmmaux.ml b/testsuite/tests/asmcomp/parsecmmaux.ml new file mode 100644 index 00000000..a87432e4 --- /dev/null +++ b/testsuite/tests/asmcomp/parsecmmaux.ml @@ -0,0 +1,40 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: parsecmmaux.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + +(* Auxiliary functions for parsing *) + +type error = + Unbound of string + +exception Error of error + +let tbl_ident = (Hashtbl.create 57 : (string, Ident.t) Hashtbl.t) + +let bind_ident s = + let id = Ident.create s in + Hashtbl.add tbl_ident s id; + id + +let find_ident s = + try + Hashtbl.find tbl_ident s + with Not_found -> + raise(Error(Unbound s)) + +let unbind_ident id = + Hashtbl.remove tbl_ident (Ident.name id) + +let report_error = function + Unbound s -> + prerr_string "Unbound identifier "; prerr_string s; prerr_endline "." diff --git a/testsuite/tests/asmcomp/parsecmmaux.mli b/testsuite/tests/asmcomp/parsecmmaux.mli new file mode 100644 index 00000000..941ebcb4 --- /dev/null +++ b/testsuite/tests/asmcomp/parsecmmaux.mli @@ -0,0 +1,26 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: parsecmmaux.mli 2553 1999-11-17 18:59:06Z xleroy $ *) + +(* Auxiliary functions for parsing *) + +val bind_ident: string -> Ident.t +val find_ident: string -> Ident.t +val unbind_ident: Ident.t -> unit + +type error = + Unbound of string + +exception Error of error + +val report_error: error -> unit diff --git a/testsuite/tests/asmcomp/power-aix.S b/testsuite/tests/asmcomp/power-aix.S new file mode 100644 index 00000000..ea153083 --- /dev/null +++ b/testsuite/tests/asmcomp/power-aix.S @@ -0,0 +1,152 @@ +#********************************************************************* +#* * +#* Objective Caml * +#* * +#* Xavier Leroy, 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 Q Public License version 1.0. * +#* * +#********************************************************************* + +# $Id: power-aix.S 3042 2000-04-05 18:30:22Z doligez $ + + .csect .text[PR] + + .globl .call_gen_code +.call_gen_code: +# Save return address + mflr 0 + stw 0, 8(1) +# Save all callee-save registers + stw 13,-76(1) + stw 14,-72(1) + stw 15,-68(1) + stw 16,-64(1) + stw 17,-60(1) + stw 18,-56(1) + stw 19,-52(1) + stw 20,-48(1) + stw 21,-44(1) + stw 22,-40(1) + stw 23,-36(1) + stw 24,-32(1) + stw 25,-28(1) + stw 26,-24(1) + stw 27,-20(1) + stw 28,-16(1) + stw 29,-12(1) + stw 30,-8(1) + stw 31,-4(1) + stfd 14, -224(1) + stfd 15, -216(1) + stfd 16, -208(1) + stfd 17, -200(1) + stfd 18, -192(1) + stfd 19, -184(1) + stfd 20, -176(1) + stfd 21, -168(1) + stfd 22, -160(1) + stfd 23, -152(1) + stfd 24, -144(1) + stfd 25, -136(1) + stfd 26, -128(1) + stfd 27, -120(1) + stfd 28, -112(1) + stfd 29, -104(1) + stfd 30, -96(1) + stfd 31, -88(1) +# Allocate and link stack frame + stwu 1, -280(1) +# Save global pointer + stw 2, 20(1) +# Load code to call + lwz 0, 0(3) + lwz 2, 4(3) + mtlr 0 +# Shuffle arguments + mr 3, 4 + mr 4, 5 + mr 5, 6 + mr 6, 7 +# Call the function + blrl +# Restore global pointer + lwz 2, 20(1) +# Deallocate stack frame + addic 1, 1, 280 +# Restore callee-save registers + lwz 13,-76(1) + lwz 14,-72(1) + lwz 15,-68(1) + lwz 16,-64(1) + lwz 17,-60(1) + lwz 18,-56(1) + lwz 19,-52(1) + lwz 20,-48(1) + lwz 21,-44(1) + lwz 22,-40(1) + lwz 23,-36(1) + lwz 24,-32(1) + lwz 25,-28(1) + lwz 26,-24(1) + lwz 27,-20(1) + lwz 28,-16(1) + lwz 29,-12(1) + lwz 30,-8(1) + lwz 31,-4(1) + lfd 14, -224(1) + lfd 15, -216(1) + lfd 16, -208(1) + lfd 17, -200(1) + lfd 18, -192(1) + lfd 19, -184(1) + lfd 20, -176(1) + lfd 21, -168(1) + lfd 22, -160(1) + lfd 23, -152(1) + lfd 24, -144(1) + lfd 25, -136(1) + lfd 26, -128(1) + lfd 27, -120(1) + lfd 28, -112(1) + lfd 29, -104(1) + lfd 30, -96(1) + lfd 31, -88(1) +# Reload return address + lwz 0, 8(1) + mtlr 0 +# Return + blr + + .globl .caml_c_call +.caml_c_call: +# Preserve RTOC and return address in callee-save registers +# The C function will preserve them, and the Caml code does not +# expect them to be preserved +# Return address is in 25, RTOC is in 26 + mflr 25 + mr 26, 2 +# Call desired function (descriptor in r11) + lwz 0, 0(11) + lwz 2, 4(11) + mtlr 0 + blrl +# Restore return address and RTOC + mtlr 25 + mr 2, 26 +# Return to caller + blr + +# Function closures + + .globl call_gen_code + .csect call_gen_code[DS] +call_gen_code: + .long .call_gen_code, TOC[tc0], 0 + + .globl caml_c_call + .csect caml_c_call[DS] +caml_c_call: + .long .caml_c_call, TOC[tc0], 0 diff --git a/testsuite/tests/asmcomp/power-elf.S b/testsuite/tests/asmcomp/power-elf.S new file mode 100644 index 00000000..c7ddeef7 --- /dev/null +++ b/testsuite/tests/asmcomp/power-elf.S @@ -0,0 +1,131 @@ +/*********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/*********************************************************************/ + +/* $Id: power-elf.S 2553 1999-11-17 18:59:06Z xleroy $ */ + +/* Save and restore all callee-save registers */ +/* GPR 14 at sp+16 ... GPR 31 at sp+84 + FPR 14 at sp+92 ... FPR 31 at sp+228 */ + +#define Save_callee_save \ + addic 11, 1, 16-4; \ + stwu 14, 4(11); \ + stwu 15, 4(11); \ + stwu 16, 4(11); \ + stwu 17, 4(11); \ + stwu 18, 4(11); \ + stwu 19, 4(11); \ + stwu 20, 4(11); \ + stwu 21, 4(11); \ + stwu 22, 4(11); \ + stwu 23, 4(11); \ + stwu 24, 4(11); \ + stwu 25, 4(11); \ + stwu 26, 4(11); \ + stwu 27, 4(11); \ + stwu 28, 4(11); \ + stwu 29, 4(11); \ + stwu 30, 4(11); \ + stwu 31, 4(11); \ + stfdu 14, 8(11); \ + stfdu 15, 8(11); \ + stfdu 16, 8(11); \ + stfdu 17, 8(11); \ + stfdu 18, 8(11); \ + stfdu 19, 8(11); \ + stfdu 20, 8(11); \ + stfdu 21, 8(11); \ + stfdu 22, 8(11); \ + stfdu 23, 8(11); \ + stfdu 24, 8(11); \ + stfdu 25, 8(11); \ + stfdu 26, 8(11); \ + stfdu 27, 8(11); \ + stfdu 28, 8(11); \ + stfdu 29, 8(11); \ + stfdu 30, 8(11); \ + stfdu 31, 8(11) + +#define Restore_callee_save \ + addic 11, 1, 16-4; \ + lwzu 14, 4(11); \ + lwzu 15, 4(11); \ + lwzu 16, 4(11); \ + lwzu 17, 4(11); \ + lwzu 18, 4(11); \ + lwzu 19, 4(11); \ + lwzu 20, 4(11); \ + lwzu 21, 4(11); \ + lwzu 22, 4(11); \ + lwzu 23, 4(11); \ + lwzu 24, 4(11); \ + lwzu 25, 4(11); \ + lwzu 26, 4(11); \ + lwzu 27, 4(11); \ + lwzu 28, 4(11); \ + lwzu 29, 4(11); \ + lwzu 30, 4(11); \ + lwzu 31, 4(11); \ + lfdu 14, 8(11); \ + lfdu 15, 8(11); \ + lfdu 16, 8(11); \ + lfdu 17, 8(11); \ + lfdu 18, 8(11); \ + lfdu 19, 8(11); \ + lfdu 20, 8(11); \ + lfdu 21, 8(11); \ + lfdu 22, 8(11); \ + lfdu 23, 8(11); \ + lfdu 24, 8(11); \ + lfdu 25, 8(11); \ + lfdu 26, 8(11); \ + lfdu 27, 8(11); \ + lfdu 28, 8(11); \ + lfdu 29, 8(11); \ + lfdu 30, 8(11); \ + lfdu 31, 8(11) + + .section ".text" + + .globl call_gen_code + .type call_gen_code, @function +call_gen_code: + /* Allocate and link stack frame */ + stwu 1, -256(1) + /* Save return address */ + mflr 0 + stw 0, 256+4(1) + /* Save all callee-save registers */ + Save_callee_save + /* Shuffle arguments */ + mtlr 3 + mr 3, 4 + mr 4, 5 + mr 5, 6 + mr 6, 7 + /* Call the function */ + blrl + /* Restore callee-save registers */ + Restore_callee_save + /* Reload return address */ + lwz 0, 256+4(1) + mtlr 0 + /* Return */ + addi 1, 1, 256 + blr + + .globl caml_c_call + .type caml_c_call, @function +caml_c_call: + /* Jump to C function (address in 11) */ + mtctr 11 + bctr diff --git a/testsuite/tests/asmcomp/power-rhapsody.S b/testsuite/tests/asmcomp/power-rhapsody.S new file mode 100644 index 00000000..a9b8044b --- /dev/null +++ b/testsuite/tests/asmcomp/power-rhapsody.S @@ -0,0 +1,129 @@ +/*********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/*********************************************************************/ + +/* $Id: power-rhapsody.S 2553 1999-11-17 18:59:06Z xleroy $ */ + +/* Save and restore all callee-save registers */ +/* GPR 14 at sp+16 ... GPR 31 at sp+84 + FPR 14 at sp+92 ... FPR 31 at sp+228 */ + +#define Save_callee_save \ + addic r11, r1, 16-4; \ + stwu r14, 4(r11); \ + stwu r15, 4(r11); \ + stwu r16, 4(r11); \ + stwu r17, 4(r11); \ + stwu r18, 4(r11); \ + stwu r19, 4(r11); \ + stwu r20, 4(r11); \ + stwu r21, 4(r11); \ + stwu r22, 4(r11); \ + stwu r23, 4(r11); \ + stwu r24, 4(r11); \ + stwu r25, 4(r11); \ + stwu r26, 4(r11); \ + stwu r27, 4(r11); \ + stwu r28, 4(r11); \ + stwu r29, 4(r11); \ + stwu r30, 4(r11); \ + stwu r31, 4(r11); \ + stfdu f14, 8(r11); \ + stfdu f15, 8(r11); \ + stfdu f16, 8(r11); \ + stfdu f17, 8(r11); \ + stfdu f18, 8(r11); \ + stfdu f19, 8(r11); \ + stfdu f20, 8(r11); \ + stfdu f21, 8(r11); \ + stfdu f22, 8(r11); \ + stfdu f23, 8(r11); \ + stfdu f24, 8(r11); \ + stfdu f25, 8(r11); \ + stfdu f26, 8(r11); \ + stfdu f27, 8(r11); \ + stfdu f28, 8(r11); \ + stfdu f29, 8(r11); \ + stfdu f30, 8(r11); \ + stfdu f31, 8(r11) + +#define Restore_callee_save \ + addic r11, r1, 16-4; \ + lwzu r14, 4(r11); \ + lwzu r15, 4(r11); \ + lwzu r16, 4(r11); \ + lwzu r17, 4(r11); \ + lwzu r18, 4(r11); \ + lwzu r19, 4(r11); \ + lwzu r20, 4(r11); \ + lwzu r21, 4(r11); \ + lwzu r22, 4(r11); \ + lwzu r23, 4(r11); \ + lwzu r24, 4(r11); \ + lwzu r25, 4(r11); \ + lwzu r26, 4(r11); \ + lwzu r27, 4(r11); \ + lwzu r28, 4(r11); \ + lwzu r29, 4(r11); \ + lwzu r30, 4(r11); \ + lwzu r31, 4(r11); \ + lfdu f14, 8(r11); \ + lfdu f15, 8(r11); \ + lfdu f16, 8(r11); \ + lfdu f17, 8(r11); \ + lfdu f18, 8(r11); \ + lfdu f19, 8(r11); \ + lfdu f20, 8(r11); \ + lfdu f21, 8(r11); \ + lfdu f22, 8(r11); \ + lfdu f23, 8(r11); \ + lfdu f24, 8(r11); \ + lfdu f25, 8(r11); \ + lfdu f26, 8(r11); \ + lfdu f27, 8(r11); \ + lfdu f28, 8(r11); \ + lfdu f29, 8(r11); \ + lfdu f30, 8(r11); \ + lfdu f31, 8(r11) + + .text + + .globl _call_gen_code +_call_gen_code: + /* Allocate and link stack frame */ + stwu r1, -256(r1) + /* Save return address */ + mflr r0 + stw r0, 256+4(r1) + /* Save all callee-save registers */ + Save_callee_save + /* Shuffle arguments */ + mtlr r3 + mr r3, r4 + mr r4, r5 + mr r5, r6 + mr r6, r7 + /* Call the function */ + blrl + /* Restore callee-save registers */ + Restore_callee_save + /* Reload return address */ + lwz r0, 256+4(r1) + mtlr r0 + /* Return */ + addi r1, r1, 256 + blr + + .globl _caml_c_call +_caml_c_call: + /* Jump to C function (address in 11) */ + mtctr r11 + bctr diff --git a/testsuite/tests/asmcomp/quicksort.cmm b/testsuite/tests/asmcomp/quicksort.cmm new file mode 100644 index 00000000..043e607f --- /dev/null +++ b/testsuite/tests/asmcomp/quicksort.cmm @@ -0,0 +1,43 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: quicksort.cmm 3211 2000-06-25 19:54:50Z xleroy $ *) + +(function "quicksort" (lo: int hi: int a: addr) + (if (< lo hi) + (let (i lo + j hi + pivot (addraref a hi)) + (while (< i j) + (catch + (while 1 + (if (>= i hi) exit []) + (if (> (addraref a i) pivot) exit []) + (assign i (+ i 1))) + with []) + (catch + (while 1 + (if (<= j lo) exit []) + (if (< (addraref a j) pivot) exit []) + (assign j (- j 1))) + with []) + (if (< i j) + (let temp (addraref a i) + (addraset a i (addraref a j)) + (addraset a j temp)) + [])) + (let temp (addraref a i) + (addraset a i (addraref a hi)) + (addraset a hi temp)) + (app "quicksort" lo (- i 1) a unit) + (app "quicksort" (+ i 1) hi a unit)) + [])) diff --git a/testsuite/tests/asmcomp/quicksort2.cmm b/testsuite/tests/asmcomp/quicksort2.cmm new file mode 100644 index 00000000..4d80cd58 --- /dev/null +++ b/testsuite/tests/asmcomp/quicksort2.cmm @@ -0,0 +1,49 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: quicksort2.cmm 3218 2000-06-29 11:45:24Z xleroy $ *) + +(function "cmp" (i: int j: int) + (- i j)) + +(function "quick" (lo: int hi: int a: addr cmp: addr) + (if (< lo hi) + (let (i lo + j hi + pivot (intaref a hi)) + (while (< i j) + (catch + (while 1 + (if (>= i hi) exit []) + (if (> (app cmp (intaref a i) pivot int) 0) exit []) + (assign i (+ i 1))) + with []) + (catch + (while 1 + (if (<= j lo) exit []) + (if (< (app cmp (intaref a j) pivot int) 0) exit []) + (assign j (- j 1))) + with []) + (if (< i j) + (let temp (intaref a i) + (intaset a i (intaref a j)) + (intaset a j temp)) + [])) + (let temp (intaref a i) + (intaset a i (intaref a hi)) + (intaset a hi temp)) + (app "quick" lo (- i 1) a cmp unit) + (app "quick" (+ i 1) hi a cmp unit)) + [])) + +(function "quicksort" (lo: int hi: int a: addr) + (app "quick" lo hi a "cmp" unit)) diff --git a/testsuite/tests/asmcomp/soli.cmm b/testsuite/tests/asmcomp/soli.cmm new file mode 100644 index 00000000..4716e4f2 --- /dev/null +++ b/testsuite/tests/asmcomp/soli.cmm @@ -0,0 +1,109 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: soli.cmm 5634 2003-06-30 08:28:48Z xleroy $ *) + +("d1": int 0 int 1 + "d2": int 1 int 0 + "d3": int 0 int -1 + "d4": int -1 int 0 + "dir": addr "d1" addr "d2" addr "d3" addr "d4") + +("counter": int 0) + +(* Out = 0 Empty = 1 Peg = 2 *) + +("line0": int 0 int 0 int 0 int 0 int 0 int 0 int 0 int 0 int 0 + "line1": int 0 int 0 int 0 int 2 int 2 int 2 int 0 int 0 int 0 + "line2": int 0 int 0 int 0 int 2 int 2 int 2 int 0 int 0 int 0 + "line3": int 0 int 2 int 2 int 2 int 2 int 2 int 2 int 2 int 0 + "line4": int 0 int 2 int 2 int 2 int 1 int 2 int 2 int 2 int 0 + "line5": int 0 int 2 int 2 int 2 int 2 int 2 int 2 int 2 int 0 + "line6": int 0 int 0 int 0 int 2 int 2 int 2 int 0 int 0 int 0 + "line7": int 0 int 0 int 0 int 2 int 2 int 2 int 0 int 0 int 0 + "line8": int 0 int 0 int 0 int 0 int 0 int 0 int 0 int 0 int 0 + "board": addr "line0" addr "line1" addr "line2" addr "line3" + addr "line4" addr "line5" addr "line6" addr "line7" addr "line8") + +("format": string "%d\n\000") + +(function "solve" (m: int) + (store int "counter" (+ (load int "counter") 1)) + (if (== m 31) + (== (intaref (addraref "board" 4) 4) 2) + (try + (if (== (mod (load int "counter") 500) 0) + (extcall "printf_int" "format" (load int "counter") unit) + []) + (let i 1 + (while (<= i 7) + (let j 1 + (while (<= j 7) + (if (== (intaref (addraref "board" i) j) 2) + (seq + (let k 0 + (while (<= k 3) + (let (d1 (intaref (addraref "dir" k) 0) + d2 (intaref (addraref "dir" k) 1) + i1 (+ i d1) + i2 (+ i1 d1) + j1 (+ j d2) + j2 (+ j1 d2)) + (if (== (intaref (addraref "board" i1) j1) 2) + (if (== (intaref (addraref "board" i2) j2) 1) + (seq + (intaset (addraref "board" i) j 1) + (intaset (addraref "board" i1) j1 1) + (intaset (addraref "board" i2) j2 2) + (if (app "solve" (+ m 1) int) + (raise 0a) + []) + (intaset (addraref "board" i) j 2) + (intaset (addraref "board" i1) j1 2) + (intaset (addraref "board" i2) j2 1)) + []) + [])) + (assign k (+ k 1))))) + []) + (assign j (+ j 1)))) + (assign i (+ i 1)))) + 0 + with bucket + 1))) + +("format_out": string ".\000") +("format_empty": string " \000") +("format_peg": string "$\000") +("format_newline": string "\n\000") + +(function "print_board" () + (let i 0 + (while (< i 9) + (let j 0 + (while (< j 9) + (switch 3 (intaref (addraref "board" i) j) + case 0: + (extcall "print_string" "format_out" unit) + case 1: + (extcall "print_string" "format_empty" unit) + case 2: + (extcall "print_string" "format_peg" unit)) + (assign j (+ j 1)))) + (extcall "print_string" "format_newline" unit) + (assign i (+ i 1))))) + +(function "solitaire" () + (seq + (if (app "solve" 0 int) + (app "print_board" [] unit) + []) + 0)) diff --git a/testsuite/tests/asmcomp/sparc.S b/testsuite/tests/asmcomp/sparc.S new file mode 100644 index 00000000..54d81c1c --- /dev/null +++ b/testsuite/tests/asmcomp/sparc.S @@ -0,0 +1,41 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: sparc.S 2553 1999-11-17 18:59:06Z xleroy $ */ + +#ifndef SYS_solaris +#define Call_gen_code _call_gen_code +#define Caml_c_call _caml_c_call +#else +#define Call_gen_code call_gen_code +#define Caml_c_call caml_c_call +#endif + + .global Call_gen_code +Call_gen_code: + save %sp, -96, %sp + mov %i0, %l0 + mov %i1, %i0 + mov %i2, %i1 + mov %i3, %i2 + mov %i4, %i3 + mov %i5, %i4 + call %l0 + nop + mov %o0, %i0 + ret + restore + + .global Caml_c_call +Caml_c_call: + jmp %g4 + nop diff --git a/testsuite/tests/asmcomp/tagged-fib.cmm b/testsuite/tests/asmcomp/tagged-fib.cmm new file mode 100644 index 00000000..04869792 --- /dev/null +++ b/testsuite/tests/asmcomp/tagged-fib.cmm @@ -0,0 +1,19 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: tagged-fib.cmm 2553 1999-11-17 18:59:06Z xleroy $ *) + +(function "fib" (n: int) + (if (< n 5) + 3 + (- (+ (app "fib" (- n 2) int) (app "fib" (- n 4) int)) 1))) + diff --git a/testsuite/tests/asmcomp/tagged-integr.cmm b/testsuite/tests/asmcomp/tagged-integr.cmm new file mode 100644 index 00000000..054c78d7 --- /dev/null +++ b/testsuite/tests/asmcomp/tagged-integr.cmm @@ -0,0 +1,45 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: tagged-integr.cmm 3229 2000-07-07 14:09:23Z xleroy $ *) + +("res_square": skip 8) +("h": skip 8) +("x": skip 8) +("s": skip 8) +("res_integr": skip 8) + +(function "square" (x: addr) + (let r "res_square" + (store float r ( *f (load float x) (load float x))) + r)) + +(function "integr" (f: addr low: addr high: addr n: int) + (let (h "h" x "x" s "s" i n) + (store float h (/f (-f (load float high) (load float low)) (floatofint n))) + (store float x (load float low)) + (store float s 0.0) + (while (> i 0) + (store float s (+f (load float s) (load float (app f x addr)))) + (store float x (+f (load float x) (load float h))) + (assign i (- i 1))) + (store float "res_integr" ( *f (load float s) (load float h))) + "res_integr")) + +("low": skip 8) +("hi": skip 8) + +(function "test" (n: int) + (store float "low" 0.0) + (store float "hi" 1.0) + (load float (app "integr" "square" "low" "hi" n addr))) + diff --git a/testsuite/tests/asmcomp/tagged-quicksort.cmm b/testsuite/tests/asmcomp/tagged-quicksort.cmm new file mode 100644 index 00000000..6b74753e --- /dev/null +++ b/testsuite/tests/asmcomp/tagged-quicksort.cmm @@ -0,0 +1,46 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: tagged-quicksort.cmm 3218 2000-06-29 11:45:24Z xleroy $ *) + +(function "quick" (lo: int hi: int a: addr) + (if (< lo hi) + (let (i lo + j hi + pivot (addraref a (>>s hi 1))) + (while (< i j) + (catch + (while 1 + (if (>= i hi) exit []) + (if (> (addraref a (>>s i 1)) pivot) exit []) + (assign i (+ i 2))) + with []) + (catch + (while 1 + (if (<= j lo) exit []) + (if (< (addraref a (>>s j 1)) pivot) exit []) + (assign j (- j 2))) + with []) + (if (< i j) + (let temp (addraref a (>>s i 1)) + (addraset a (>>s i 1) (addraref a (>>s j 1))) + (addraset a (>>s j 1) temp)) + [])) + (let temp (addraref a (>>s i 1)) + (addraset a (>>s i 1) (addraref a (>>s hi 1))) + (addraset a (>>s hi 1) temp)) + (app "quick" lo (- i 2) a unit) + (app "quick" (+ i 2) hi a unit)) + [])) + +(function "quicksort" (lo: int hi: int a: addr) + (app "quick" (+ (<< lo 1) 1) (+ (<< hi 1) 1) a unit)) diff --git a/testsuite/tests/asmcomp/tagged-tak.cmm b/testsuite/tests/asmcomp/tagged-tak.cmm new file mode 100644 index 00000000..5e04b739 --- /dev/null +++ b/testsuite/tests/asmcomp/tagged-tak.cmm @@ -0,0 +1,23 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: tagged-tak.cmm 3229 2000-07-07 14:09:23Z xleroy $ *) + +(function "tak" (x:int y:int z:int) + (if (> x y) + (app "tak" (app "tak" (- x 2) y z int) + (app "tak" (- y 2) z x int) + (app "tak" (- z 2) x y int) int) + z)) + +(function "takmain" (dummy: int) + (app "tak" 37 25 13 int)) diff --git a/testsuite/tests/asmcomp/tak.cmm b/testsuite/tests/asmcomp/tak.cmm new file mode 100644 index 00000000..de236fc8 --- /dev/null +++ b/testsuite/tests/asmcomp/tak.cmm @@ -0,0 +1,23 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: tak.cmm 3211 2000-06-25 19:54:50Z xleroy $ *) + +(function "tak" (x:int y:int z:int) + (if (> x y) + (app "tak" (app "tak" (- x 1) y z int) + (app "tak" (- y 1) z x int) + (app "tak" (- z 1) x y int) int) + z)) + +(function "takmain" (dummy: int) + (app "tak" 18 12 6 int)) diff --git a/testsuite/tests/backtrace/Makefile b/testsuite/tests/backtrace/Makefile new file mode 100644 index 00000000..68d042af --- /dev/null +++ b/testsuite/tests/backtrace/Makefile @@ -0,0 +1,16 @@ +EXECNAME=./program + +run-all: + @for file in *.ml; do \ + $(OCAMLC) -g -o $(EXECNAME) $$file; \ + for arg in a b c d ''; do \ + printf " ... testing '$$file' (with argument '$$arg'):"; \ + OCAMLRUNPARAM=b=1 $(EXECNAME) $$arg > `basename $$file ml`$$arg.result 2>&1; \ + diff -q `basename $$file ml`$$arg.reference `basename $$file ml`$$arg.result > /dev/null && echo " => passed" || (echo " => failed" && exit 1); \ + done; \ + done + +clean: defaultclean + @rm -f *.result $(EXECNAME) + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/backtrace/backtrace..reference b/testsuite/tests/backtrace/backtrace..reference new file mode 100644 index 00000000..dfff0dc6 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace..reference @@ -0,0 +1,2 @@ +Fatal error: exception Invalid_argument("index out of bounds") +Raised by primitive operation at file "backtrace.ml", line 17, characters 12-24 diff --git a/testsuite/tests/backtrace/backtrace.a.reference b/testsuite/tests/backtrace/backtrace.a.reference new file mode 100644 index 00000000..78981922 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace.a.reference @@ -0,0 +1 @@ +a diff --git a/testsuite/tests/backtrace/backtrace.b.reference b/testsuite/tests/backtrace/backtrace.b.reference new file mode 100644 index 00000000..fb580cf1 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace.b.reference @@ -0,0 +1,11 @@ +b +Fatal error: exception Backtrace.Error("b") +Raised at file "backtrace.ml", line 6, characters 21-32 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 10, characters 4-11 +Re-raised at file "backtrace.ml", line 12, characters 68-71 +Called from file "backtrace.ml", line 17, characters 9-25 diff --git a/testsuite/tests/backtrace/backtrace.c.reference b/testsuite/tests/backtrace/backtrace.c.reference new file mode 100644 index 00000000..84532734 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace.c.reference @@ -0,0 +1,3 @@ +Fatal error: exception Backtrace.Error("c") +Raised at file "backtrace.ml", line 13, characters 26-37 +Called from file "backtrace.ml", line 17, characters 9-25 diff --git a/testsuite/tests/backtrace/backtrace.d.reference b/testsuite/tests/backtrace/backtrace.d.reference new file mode 100644 index 00000000..6e8605bf --- /dev/null +++ b/testsuite/tests/backtrace/backtrace.d.reference @@ -0,0 +1,9 @@ +Fatal error: exception Backtrace.Error("d") +Raised at file "backtrace.ml", line 6, characters 21-32 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 6, characters 42-53 +Called from file "backtrace.ml", line 10, characters 4-11 +Called from file "backtrace.ml", line 17, characters 9-25 diff --git a/testsuite/tests/backtrace/backtrace.ml b/testsuite/tests/backtrace/backtrace.ml new file mode 100644 index 00000000..d8755710 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace.ml @@ -0,0 +1,17 @@ +(* A test for stack backtraces *) + +exception Error of string + +let rec f msg n = + if n = 0 then raise(Error msg) else 1 + f msg (n-1) + +let g msg = + try + f msg 5 + with Error "a" -> print_string "a"; print_newline(); 0 + | Error "b" as exn -> print_string "b"; print_newline(); raise exn + | Error "c" -> raise (Error "c") + +let _ = + Printexc.record_backtrace true; + ignore (g Sys.argv.(1)) diff --git a/testsuite/tests/backtrace/backtrace2..reference b/testsuite/tests/backtrace/backtrace2..reference new file mode 100644 index 00000000..91ede5f3 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace2..reference @@ -0,0 +1,27 @@ +a +No exception +b +Uncaught exception Backtrace2.Error("b") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Re-raised at file "backtrace2.ml", line 12, characters 68-71 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("c") +Raised at file "backtrace2.ml", line 13, characters 26-37 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("d") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Invalid_argument("index out of bounds") +Raised by primitive operation at file "backtrace2.ml", line 17, characters 14-22 diff --git a/testsuite/tests/backtrace/backtrace2.a.reference b/testsuite/tests/backtrace/backtrace2.a.reference new file mode 100644 index 00000000..91ede5f3 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace2.a.reference @@ -0,0 +1,27 @@ +a +No exception +b +Uncaught exception Backtrace2.Error("b") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Re-raised at file "backtrace2.ml", line 12, characters 68-71 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("c") +Raised at file "backtrace2.ml", line 13, characters 26-37 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("d") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Invalid_argument("index out of bounds") +Raised by primitive operation at file "backtrace2.ml", line 17, characters 14-22 diff --git a/testsuite/tests/backtrace/backtrace2.b.reference b/testsuite/tests/backtrace/backtrace2.b.reference new file mode 100644 index 00000000..91ede5f3 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace2.b.reference @@ -0,0 +1,27 @@ +a +No exception +b +Uncaught exception Backtrace2.Error("b") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Re-raised at file "backtrace2.ml", line 12, characters 68-71 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("c") +Raised at file "backtrace2.ml", line 13, characters 26-37 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("d") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Invalid_argument("index out of bounds") +Raised by primitive operation at file "backtrace2.ml", line 17, characters 14-22 diff --git a/testsuite/tests/backtrace/backtrace2.c.reference b/testsuite/tests/backtrace/backtrace2.c.reference new file mode 100644 index 00000000..91ede5f3 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace2.c.reference @@ -0,0 +1,27 @@ +a +No exception +b +Uncaught exception Backtrace2.Error("b") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Re-raised at file "backtrace2.ml", line 12, characters 68-71 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("c") +Raised at file "backtrace2.ml", line 13, characters 26-37 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("d") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Invalid_argument("index out of bounds") +Raised by primitive operation at file "backtrace2.ml", line 17, characters 14-22 diff --git a/testsuite/tests/backtrace/backtrace2.d.reference b/testsuite/tests/backtrace/backtrace2.d.reference new file mode 100644 index 00000000..91ede5f3 --- /dev/null +++ b/testsuite/tests/backtrace/backtrace2.d.reference @@ -0,0 +1,27 @@ +a +No exception +b +Uncaught exception Backtrace2.Error("b") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Re-raised at file "backtrace2.ml", line 12, characters 68-71 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("c") +Raised at file "backtrace2.ml", line 13, characters 26-37 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Backtrace2.Error("d") +Raised at file "backtrace2.ml", line 6, characters 21-32 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 6, characters 42-53 +Called from file "backtrace2.ml", line 10, characters 4-11 +Called from file "backtrace2.ml", line 17, characters 11-23 +Uncaught exception Invalid_argument("index out of bounds") +Raised by primitive operation at file "backtrace2.ml", line 17, characters 14-22 diff --git a/testsuite/tests/backtrace/backtrace2.ml b/testsuite/tests/backtrace/backtrace2.ml new file mode 100644 index 00000000..1f969b2a --- /dev/null +++ b/testsuite/tests/backtrace/backtrace2.ml @@ -0,0 +1,28 @@ +(* A test for stack backtraces *) + +exception Error of string + +let rec f msg n = + if n = 0 then raise(Error msg) else 1 + f msg (n-1) + +let g msg = + try + f msg 5 + with Error "a" -> print_string "a"; print_newline(); 0 + | Error "b" as exn -> print_string "b"; print_newline(); raise exn + | Error "c" -> raise (Error "c") + +let run args = + try + ignore (g args.(0)); print_string "No exception\n" + with exn -> + Printf.printf "Uncaught exception %s\n" (Printexc.to_string exn); + Printexc.print_backtrace stdout + +let _ = + Printexc.record_backtrace true; + run [| "a" |]; + run [| "b" |]; + run [| "c" |]; + run [| "d" |]; + run [| |] diff --git a/testsuite/tests/basic-float/Makefile b/testsuite/tests/basic-float/Makefile new file mode 100644 index 00000000..627ed788 --- /dev/null +++ b/testsuite/tests/basic-float/Makefile @@ -0,0 +1,5 @@ +MODULES=float_record +MAIN_MODULE=tfloat_record + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-float/float_record.ml b/testsuite/tests/basic-float/float_record.ml new file mode 100644 index 00000000..98d5323e --- /dev/null +++ b/testsuite/tests/basic-float/float_record.ml @@ -0,0 +1,7 @@ +type t = float;; + +let make f = f;; + +let from t = t;; + +type s = {f : t};; diff --git a/testsuite/tests/basic-float/float_record.mli b/testsuite/tests/basic-float/float_record.mli new file mode 100644 index 00000000..4e5970e3 --- /dev/null +++ b/testsuite/tests/basic-float/float_record.mli @@ -0,0 +1,6 @@ +type t = private float;; + +val make : float -> t;; +val from : t -> float;; + +type s = {f : t};; diff --git a/testsuite/tests/basic-float/tfloat_record.ml b/testsuite/tests/basic-float/tfloat_record.ml new file mode 100644 index 00000000..4d197f5d --- /dev/null +++ b/testsuite/tests/basic-float/tfloat_record.ml @@ -0,0 +1,5 @@ +let s = { Float_record.f = Float_record.make 1.0 };; + +print_float (Float_record.from s.Float_record.f);; +print_newline ();; + diff --git a/testsuite/tests/basic-float/tfloat_record.reference b/testsuite/tests/basic-float/tfloat_record.reference new file mode 100644 index 00000000..d54c6b66 --- /dev/null +++ b/testsuite/tests/basic-float/tfloat_record.reference @@ -0,0 +1 @@ +1. diff --git a/testsuite/tests/basic-io-2/Makefile b/testsuite/tests/basic-io-2/Makefile new file mode 100644 index 00000000..74b861e7 --- /dev/null +++ b/testsuite/tests/basic-io-2/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=io +EXEC_ARGS=io.ml + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-io-2/io.ml b/testsuite/tests/basic-io-2/io.ml new file mode 100644 index 00000000..f843e708 --- /dev/null +++ b/testsuite/tests/basic-io-2/io.ml @@ -0,0 +1,103 @@ +(* Test a file copy function *) + +let test msg funct f1 f2 = + print_string msg; print_newline(); + funct f1 f2; + if Sys.command ("cmp " ^ f1 ^ " " ^ f2) = 0 + then print_string "passed" + else print_string "FAILED"; + print_newline() + +(* File copy with constant-sized chunks *) + +let copy_file sz infile ofile = + let ic = open_in infile in + let oc = open_out ofile in + let buffer = String.create sz in + let rec copy () = + let n = input ic buffer 0 sz in + if n = 0 then () else begin + output oc buffer 0 n; + copy () + end in + copy(); + close_in ic; + close_out oc + +(* File copy with random-sized chunks *) + +let copy_random sz infile ofile = + let ic = open_in infile in + let oc = open_out ofile in + let buffer = String.create sz in + let rec copy () = + let s = 1 + Random.int sz in + let n = input ic buffer 0 s in + if n = 0 then () else begin + output oc buffer 0 n; + copy () + end in + copy(); + close_in ic; + close_out oc + +(* File copy line per line *) + +let copy_line infile ofile = + let ic = open_in infile in + let oc = open_out ofile in + try + while true do + output_string oc (input_line ic); output_char oc '\n' + done + with End_of_file -> + close_in ic; + close_out oc + +(* Backward copy, with lots of seeks *) + +let copy_seek chunksize infile ofile = + let ic = open_in_bin infile in + let oc = open_out_bin ofile in + let size = in_channel_length ic in + let buffer = String.create chunksize in + for i = (size - 1) / chunksize downto 0 do + seek_in ic (i * chunksize); + seek_out oc (i * chunksize); + let n = input ic buffer 0 chunksize in + output oc buffer 0 n + done; + close_in ic; + close_out oc + +(* Create long lines of text *) + +let make_lines ofile = + let oc = open_out ofile in + for i = 1 to 256 do + output_string oc (String.make (i*64) '.'); output_char oc '\n' + done; + close_out oc + +(* The test *) + +let _ = + let src = Sys.argv.(1) in + let testio = Filename.temp_file "testio" "" in + let lines = Filename.temp_file "lines" "" in + test "16-byte chunks" (copy_file 16) src testio; + test "256-byte chunks" (copy_file 256) src testio; + test "4096-byte chunks" (copy_file 4096) src testio; + test "65536-byte chunks" (copy_file 65536) src testio; + test "19-byte chunks" (copy_file 19) src testio; + test "263-byte chunks" (copy_file 263) src testio; + test "4011-byte chunks" (copy_file 4011) src testio; + test "0...8192 byte chunks" (copy_random 8192) src testio; + test "line per line, short lines" copy_line "/etc/hosts" testio; + make_lines lines; + test "line per line, short and long lines" copy_line lines testio; + test "backwards, 4096-byte chunks" (copy_seek 4096) src testio; + test "backwards, 64-byte chunks" (copy_seek 64) src testio; + Sys.remove lines; + Sys.remove testio; + exit 0 diff --git a/testsuite/tests/basic-io-2/io.reference b/testsuite/tests/basic-io-2/io.reference new file mode 100644 index 00000000..06740020 --- /dev/null +++ b/testsuite/tests/basic-io-2/io.reference @@ -0,0 +1,24 @@ +16-byte chunks +passed +256-byte chunks +passed +4096-byte chunks +passed +65536-byte chunks +passed +19-byte chunks +passed +263-byte chunks +passed +4011-byte chunks +passed +0...8192 byte chunks +passed +line per line, short lines +passed +line per line, short and long lines +passed +backwards, 4096-byte chunks +passed +backwards, 64-byte chunks +passed diff --git a/testsuite/tests/basic-io/Makefile b/testsuite/tests/basic-io/Makefile new file mode 100644 index 00000000..9d645bed --- /dev/null +++ b/testsuite/tests/basic-io/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=wc +EXEC_ARGS=wc.ml + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-io/wc.ml b/testsuite/tests/basic-io/wc.ml new file mode 100644 index 00000000..dbe46d9a --- /dev/null +++ b/testsuite/tests/basic-io/wc.ml @@ -0,0 +1,54 @@ +(* Counts characters, lines and words in one or several files. *) + +let chars = ref 0 +and words = ref 0 +and lines = ref 0 + +type state = Inside_word | Outside_word + +let count_channel in_channel = + let rec count status = + let c = input_char in_channel in + incr chars; + match c with + '\n' -> + incr lines; count Outside_word + | ' ' | '\t' -> + count Outside_word + | _ -> + if status = Outside_word then begin incr words; () end; + count Inside_word + in + try + count Outside_word + with End_of_file -> + () + +let count_file name = + let ic = open_in name in + count_channel ic; + close_in ic + +let print_result () = + print_int !chars; print_string " characters, "; + print_int !words; print_string " words, "; + print_int !lines; print_string " lines"; + print_newline() + +let count name = + count_file name; + print_result () + +let _ = +try + if Array.length Sys.argv <= 1 then + count_channel stdin (* No command-line arguments *) + else + for i = 1 to Array.length Sys.argv - 1 do + count_file Sys.argv.(i) + done; + print_result () +with Sys_error s -> + print_string "I/O error: "; + print_string s; + print_newline() diff --git a/testsuite/tests/basic-io/wc.reference b/testsuite/tests/basic-io/wc.reference new file mode 100644 index 00000000..f7a25047 --- /dev/null +++ b/testsuite/tests/basic-io/wc.reference @@ -0,0 +1 @@ +1198 characters, 178 words, 54 lines diff --git a/testsuite/tests/basic-manyargs/Makefile b/testsuite/tests/basic-manyargs/Makefile new file mode 100644 index 00000000..47674589 --- /dev/null +++ b/testsuite/tests/basic-manyargs/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=manyargs +C_FILES=manyargsprim + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-manyargs/manyargs.ml b/testsuite/tests/basic-manyargs/manyargs.ml new file mode 100644 index 00000000..70c8662c --- /dev/null +++ b/testsuite/tests/basic-manyargs/manyargs.ml @@ -0,0 +1,42 @@ +let manyargs a b c d e f g h i j k l m n o = + print_string "a = "; print_int a; print_newline(); + print_string "b = "; print_int b; print_newline(); + print_string "c = "; print_int c; print_newline(); + print_string "d = "; print_int d; print_newline(); + print_string "e = "; print_int e; print_newline(); + print_string "f = "; print_int f; print_newline(); + print_string "g = "; print_int g; print_newline(); + print_string "h = "; print_int h; print_newline(); + print_string "i = "; print_int i; print_newline(); + print_string "j = "; print_int j; print_newline(); + print_string "k = "; print_int k; print_newline(); + print_string "l = "; print_int l; print_newline(); + print_string "m = "; print_int m; print_newline(); + print_string "n = "; print_int n; print_newline(); + print_string "o = "; print_int o; print_newline(); + print_string "---"; print_newline() + +let manyargs_tail1 a b c d e f g h i j k l m n o = + print_string "tail1:\n"; + manyargs a b c d e f g h i j k l m n o + +let manyargs_tail2 a b = + print_string "tail2:\n"; + manyargs a b a b a b a b a b a b a b a + +let manyargs_tail3 a b c d e f g h i j k l m n o = + print_string "tail3:\n"; + print_string "o = "; print_int o; print_newline(); + print_string "---"; print_newline() + +let _ = + manyargs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; + manyargs_tail1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; + manyargs_tail2 0 1; + manyargs_tail3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + +external manyargs_ext: int -> int -> int -> int -> int -> int -> int -> int -> int -> int -> int -> int = "manyargs_argv" "manyargs" + +let _ = + print_string "external:\n"; flush stdout; + manyargs_ext 1 2 3 4 5 6 7 8 9 10 11 diff --git a/testsuite/tests/basic-manyargs/manyargs.reference b/testsuite/tests/basic-manyargs/manyargs.reference new file mode 100644 index 00000000..24e9d3df --- /dev/null +++ b/testsuite/tests/basic-manyargs/manyargs.reference @@ -0,0 +1,65 @@ +a = 1 +b = 2 +c = 3 +d = 4 +e = 5 +f = 6 +g = 7 +h = 8 +i = 9 +j = 10 +k = 11 +l = 12 +m = 13 +n = 14 +o = 15 +--- +tail1: +a = 1 +b = 2 +c = 3 +d = 4 +e = 5 +f = 6 +g = 7 +h = 8 +i = 9 +j = 10 +k = 11 +l = 12 +m = 13 +n = 14 +o = 15 +--- +tail2: +a = 0 +b = 1 +c = 0 +d = 1 +e = 0 +f = 1 +g = 0 +h = 1 +i = 0 +j = 1 +k = 0 +l = 1 +m = 0 +n = 1 +o = 0 +--- +tail3: +o = 15 +--- +external: +a = 1 +b = 2 +c = 3 +d = 4 +e = 5 +f = 6 +g = 7 +h = 8 +i = 9 +j = 10 +k = 11 diff --git a/testsuite/tests/basic-manyargs/manyargsprim.c b/testsuite/tests/basic-manyargs/manyargsprim.c new file mode 100644 index 00000000..fb715c6b --- /dev/null +++ b/testsuite/tests/basic-manyargs/manyargsprim.c @@ -0,0 +1,25 @@ +#include "mlvalues.h" +#include "stdio.h" + +value manyargs(value a, value b, value c, value d, value e, value f, + value g, value h, value i, value j, value k) +{ + printf("a = %d\n", Int_val(a)); + printf("b = %d\n", Int_val(b)); + printf("c = %d\n", Int_val(c)); + printf("d = %d\n", Int_val(d)); + printf("e = %d\n", Int_val(e)); + printf("f = %d\n", Int_val(f)); + printf("g = %d\n", Int_val(g)); + printf("h = %d\n", Int_val(h)); + printf("i = %d\n", Int_val(i)); + printf("j = %d\n", Int_val(j)); + printf("k = %d\n", Int_val(k)); + return Val_unit; +} + +value manyargs_argv(value *argv, int argc) +{ + return manyargs(argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); +} diff --git a/testsuite/tests/basic-more/Makefile b/testsuite/tests/basic-more/Makefile new file mode 100644 index 00000000..18f9c9b2 --- /dev/null +++ b/testsuite/tests/basic-more/Makefile @@ -0,0 +1,4 @@ +MODULES=testing + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-more/bounds.ml b/testsuite/tests/basic-more/bounds.ml new file mode 100644 index 00000000..7fe52a1f --- /dev/null +++ b/testsuite/tests/basic-more/bounds.ml @@ -0,0 +1,28 @@ +(* Test bound checks with ocamlopt *) + +let a = [| 0; 1; 2 |] + +let trail = ref [] + +let test n = + let result = + try + trail := n :: !trail; ignore a.(n); "doesn't fail" + with Invalid_argument s -> + (* Check well-formedness of s *) + if String.length s = 19 + && s = "index out of bounds" + then "fails" + else "bad Invalid_argument" + | _ -> "bad exception" + in + print_int n; print_string ": "; print_string result; print_newline() + +let _ = + test 0; test 1; test 2; test 3; test 4; test (-1); + Gc.full_major(); + print_string "Trail:"; + List.iter (fun n -> print_string " "; print_int n) !trail; + print_newline() + + diff --git a/testsuite/tests/basic-more/bounds.reference b/testsuite/tests/basic-more/bounds.reference new file mode 100644 index 00000000..5d34a602 --- /dev/null +++ b/testsuite/tests/basic-more/bounds.reference @@ -0,0 +1,9 @@ +0: doesn't fail +1: doesn't fail +2: doesn't fail +3: fails +4: fails +-1: fails +Trail: -1 4 3 2 1 0 + +All tests succeeded. diff --git a/testsuite/tests/basic-more/morematch.ml b/testsuite/tests/basic-more/morematch.ml new file mode 100644 index 00000000..e45234d0 --- /dev/null +++ b/testsuite/tests/basic-more/morematch.ml @@ -0,0 +1,1170 @@ +(**************************************************************) +(* This suite tests the pattern-matching compiler *) +(* it should just compile and run. *) +(* While compiling the following messages are normal: *) +(**************************************************************) + +(* +File "morematch.ml", line 38, characters 10-93: +Warning: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +0 +File "morematch.ml", line 376, characters 2-15: +Warning: this match case is unused. +File "morematch.ml", line 443, characters 2-7: +Warning: this match case is unused. +*) + +let test msg f arg r = + if f arg <> r then begin + prerr_endline msg ; + failwith "Malaise" + end +;; + +type t = A | B | C | D | E | F + ;; + +let f x = match x with +| A | B | C -> 1 +| D | E -> 2 +| F -> 3;; + +test "un" f C 1 ; +test "un" f D 2 ; +test "un" f F 3 ; () +;; + +let g x = match x with + 1 -> 1 +| 2 -> 2 +| 3 -> 3 +| 4 | 5 -> 4 +| 6 -> 5 +| 7 | 8 -> 6 +| 9 -> 7 +| _ -> assert false +;; + +test "deux" g 5 4 ; +test "deux" g 6 5 ; +test "deux" g 9 7 ; () +;; + + +let g x = match x with + 1 -> 1 +| 2 -> 2 +| 3 -> 3 +| 4 | 5 -> 4 +| 6 -> 5 +| 7 | 8 -> 6 +| 9 -> 7 +| _ -> 8;; + +test "trois" g 10 8 +;; + +let g x= match x with + 1 -> 1 +| 2 -> 2 +| 3 -> 3 +| 4 | 5 -> 4 +| 6 -> 5 +| 4|5|7 -> 100 +| 7 | 8 -> 6 +| 9 -> 7 +| _ -> 8;; +test "quatre" g 4 4 ; +test "quatre" g 7 100 ; () +;; + +(* +File "morematch.ml", line 73, characters 2-5: +Warning U: this sub-pattern is unused. +File "morematch.ml", line 74, characters 2-3: +Warning U: this sub-pattern is unused. +*) + +let h x = + match x with + (1,1) -> 1 +| (2|3), 1 -> 2 +| 2,(2|3) -> 3 +| (4,4) -> 5 +| _ -> 100 +;; + +test "cinq" h (2,2) 3 ; +test "cinq" h (2,1) 2 ; +test "cinq" h (2,4) 100 ; () +;; + +(* idem hh (2,5) *) + +let hh x = match x with +| 1,1 -> 1 +| 2,1 -> 2 +| (2|3),(1|2|3|4) -> 3 +| 2,5 -> 4 +| (4,4) -> 5 +| _ -> 100 +;; + +let hhh x = match x with +| 1,1 -> 1 +| (2|3),1 -> 2 +| 2,2 -> 3 +| _ -> 100 +;; + +let h x = + match x with + (1,1) -> 1 +| 3,1 -> 2 +| 2,(2|3) -> 3 +| (4,4) -> 5 +| _ -> 100 +;; + +let h x = match x with + 1 -> 1 +| 2|3 -> 2 +| 4 -> 4 +| 5 -> 5 +| 6|7 -> 6 +| 8 -> 8 +| _ -> 100 +;; +let f x = match x with +| ((1|2),(3|4))|((3|4),(1|2)) -> 1 +| (3,(5|6)) -> 2 +| _ -> 3 +;; + +test "six" f (1,3) 1 ; +test "six" f (3,2) 1 ; +test "six" f (3,5) 2 ; +test "six" f (3,7) 3 ; () +;; + +type tt = {a : bool list ; b : bool} + +let f = function + | {a=([]|[true])} -> 1 + | {a=false::_}|{b=(true|false)} -> 2 +;; + +test "sept" f {a=[] ; b = true} 1 ; +test "sept" f {a=[true] ; b = false} 1 ; +test "sept" f {a=[false ; true] ; b = true} 2 ; +test "sept" f {a=[false] ; b = false} 2 ; () +;; + +let f = function + | (([]|[true]),_) -> 1 + | (false::_,_)|(_,(true|false)) -> 2 +;; + +test "huit" f ([],true) 1 ; +test "huit" f ([true],false) 1 ; +test "huit" f ([false ; true], true) 2 ; +test "huit" f ([false], false) 2 ; () +;; + + +let split_cases = function + | `Nil | `Cons _ as x -> `A x + | `Snoc _ as x -> `B x +;; + +test "oubli" split_cases `Nil (`A `Nil); +test "oubli" split_cases (`Cons 1) (`A (`Cons 1)); +test "oubli" split_cases (`Snoc 1) (`B (`Snoc 1)) ; () +;; + +type t1 = A of int | B of int +let f1 = function + | (A x | B x) -> x +;; + +test "neuf" f1 (A 1) 1 ; +test "neuf" f1 (B 1) 1 ; +;; + +type coucou = A of int | B of int * int | C +;; + + +let g = function + | (A x | B (_,x)) -> x + | C -> 0 +;; + + +test "dix" g (A 1) 1 ; +test "dix" g (B (1,2)) 2 ; +;; + + + +let h = function + | ([x]|[1 ; x ]|[1 ; 2 ; x]) -> x + | _ -> 0 +;; + +test "encore" h [1] 1 ; +test "encore" h [1;2] 2 ; +test "encore" h [1;2;3] 3 ; +test "encore" h [0 ; 0] 0 ; () +;; + +let f = function +| (x,(0 as y)) | (y,x) -> y-x +;; + +test "foo1" f (1,0) (-1); +test "foo1" f (1,2) (-1) +;; + + +let f = function (([]|[_]) as x)|(_::([] as x))|(_::_::x) -> x +;; + +test "zob" f [] [] ; +test "zob" f [1] [1] ; +test "zob" f [1;2;3] [3] +;; + + +type zob = A | B | C | D of zob * int | E of zob * zob + +let rec f = function + | (A | B | C) -> A + | D (x,i) -> D (f x,i) + | E (x,_) -> D (f x,0) +;; + + +test "fin" f B A ; +test "fin" f (D (C,1)) (D (A,1)) ; +test "fin" f (E (C,A)) (D (A,0)) ; () +;; + +type length = + Char of int | Pixel of int | Percent of int | No of string | Default + +let length = function + | Char n -> n | Pixel n -> n + | _ -> 0 +;; + +test "length" length (Char 10) 10 ; +test "length" length (Pixel 20) 20 ; +test "length" length Default 0 ; +test "length" length (Percent 100) 0 ; () +;; + +let length2 = function + | Char n -> n | Percent n -> n + | _ -> 0 +;; + +test "length2" length2 (Char 10) 10 ; +test "length2" length2 (Pixel 20) 0 ; +test "length2" length2 Default 0 ; +test "length2" length2(Percent 100) 100 ; () +;; + +let length3 = function + | Char _ | No _ -> true + | _ -> false +;; + +test "length3" length3 (Char 10) true ; +test "length3" length3 (No "") true ; +test "length3" length3 (Pixel 20) false ; +test "length3" length3 Default false ; +test "length3" length3(Percent 100) false ; () +;; + +type hevea = A | B | C + +let h x = match x with +| A -> 1 +| B|C -> 2 +;; + +test "hevea" h A 1 ; +test "hevea" h B 2 ; +test "hevea" h B 2 ; () +;; +type lambda = + Lvar of int + | Lconst of int + | Lapply of lambda * lambda list + | Lfunction of bool * int list * lambda + | Llet of bool * int * lambda * lambda + | Lletrec of (int * lambda) list * lambda + | Lprim of string * lambda list + | Lswitch of lambda * lambda_switch + | Lstaticfail + | Lcatch of lambda * lambda + | Lstaticraise of int * lambda list + | Lstaticcatch of lambda * (int * int list) * lambda + | Ltrywith of lambda * int * lambda + | Lifthenelse of lambda * lambda * lambda + | Lsequence of lambda * lambda + | Lwhile of lambda * lambda + | Lfor of int * lambda * lambda * bool * lambda + | Lassign of int * lambda + | Lsend of lambda * lambda * lambda list + | Levent of lambda * lambda_event + | Lifused of int * lambda +and lambda_switch = + { sw_numconsts: int; (* Number of integer cases *) + sw_consts: (int * lambda) list; (* Integer cases *) + sw_numblocks: int; (* Number of tag block cases *) + sw_blocks: (int * lambda) list; (* Tag block cases *) + sw_checked: bool ; (* True if bound checks needed *) + sw_nofail: bool} (* True if should not fail *) +and lambda_event = + { lev_loc: int; + lev_kind: bool ; + lev_repr: int ref option; + lev_env: int list } + +let rec approx_present v l = true + +let rec lower_bind v arg lam = match lam with +| Lifthenelse (cond, ifso, ifnot) -> 1 +| Lswitch (ls,({sw_consts=[i,act] ; sw_blocks = []} as _sw)) + when not (approx_present v ls) -> 2 +| Lswitch (ls,({sw_consts=[] ; sw_blocks = [i,act]} as _sw)) + when not (approx_present v ls) -> 3 +| Llet (true , vv, lv, l) -> 4 +| _ -> 5 +;; + +test "lower_bind" (lower_bind 0 0) (Llet (true,0, Lvar 1, Lvar 2)) 4 ; +test "lower_bind" (lower_bind 0 0) (Lvar 0) 5 ; +test "lower_bind" (lower_bind 0 0) (Lifthenelse (Lvar 0, Lvar 1, Lvar 2)) 1 +;; + + +type field_kind = + Fvar of field_kind option ref + | Fpresent + | Fabsent + +let unify_kind (k1, k2) = match k1, k2 with + (Fvar r, (Fvar _ | Fpresent)) -> 1 + | (Fpresent, Fvar r) -> 2 + | (Fpresent, Fpresent) -> 3 + | _ -> 4 + + +let r = ref (Some Fpresent) +;; + +test "unify" unify_kind (Fvar r, Fpresent) 1 ; +test "unify" unify_kind (Fvar r, Fvar r) 1 ; +test "unify" unify_kind (Fvar r, Fabsent) 4 ; +test "unify" unify_kind (Fpresent, Fvar r) 2 ; +test "unify" unify_kind (Fpresent, Fpresent) 3 ; +test "unify" unify_kind (Fabsent, Fpresent) 4 ; () +;; + + +type youyou = A | B | C | D of youyou + +let foo (k1, k2) = match k1,k2 with +| D _, (A|D _) -> 1 +| (A|B),D _ -> 2 +| C,_ -> 3 +| _, (A|B|C) -> 4 +;; + +test "foo2" foo (D A,A) 1 ; +test "foo2" foo (D A,B) 4 ; +test "foo2" foo (A,A) 4 ; () +;; + +type yaya = A | B +;; + +let yaya = function +| A,_,_ -> 1 +| _,A,_ -> 2 +| B,B,_ -> 3 +| A,_,(100|103) -> 5 +;; + +test "yaya" yaya (A,A,0) 1 ; +test "yaya" yaya (B,A,0) 2 ; +test "yaya" yaya (B,B,100) 3 ; () +;; + +(* +let yoyo = function +| [],_,_ -> 1 +| _,[],_ -> 2 +| _::_,_::_,_ -> 3 +| [],_,(100|103|104) -> 5 +| [],_,(100|103) -> 6 +| [],_,(1000|1001|1002|20000) -> 7 +;; + +test "yoyo" yoyo ([],[],0) 1 ; +test "yoyo" yoyo ([1],[],0) 2 ; +test "yoyo" yoyo ([1],[1],100) 3 ; () +;; + +let youyou = function + | (100|103|104) -> 1 + | (100|103|101) -> 2 + | (1000|1001|1002|20000) -> 3 + | _ -> -1 +;; + +test "youyou" youyou 100 1 ; +test "youyou" youyou 101 2 ; +test "youyou" youyou 1000 3 +;; +*) +type autre = + | C | D | E of autre | F of autre * autre | H of autre | I | J | K of string + +let rec autre = function +| C,_,_ -> 1 +| _,C,_ -> 2 +| D,D,_ -> 3 +| (D|F (_,_)|H _|K _),_,_ -> 4 +| (_, (D|I|E _|F (_, _)|H _|K _), _) -> 8 +| (J,J,((C|D) as x |E x|F (_,x))) | (J,_,((C|J) as x)) -> autre (x,x,x) +| (J, J, (I|H _|K _)) -> 9 +| I,_,_ -> 6 +| E _,_,_ -> 7 +;; +(* +File "morematch.ml", line 437, characters 43-44: +Warning U: this sub-pattern is unused. +*) +test "autre" autre (J,J,F (D,D)) 3 ; +test "autre" autre (J,J,D) 3 ; +test "autre" autre (J,J,I) 9 ; +test "autre" autre (H I,I,I) 4 ; +test "autre" autre (J,J,H I) 9 ; () +;; + + +type youpi = YA | YB | YC +and hola = X | Y | Z | T of hola | U of hola | V of hola + +let xyz = function +| YA,_,_ -> 1 +| _,YA,_ -> 2 +| YB,YB,_ -> 3 +| ((YB|YC), (YB|YC), (X|Y|Z|V _|T _)) -> 6 +| _,_,(X|U _) -> 8 +| _,_,Y -> 5 +;; +(* +File "morematch.ml", line 459, characters 7-8: +Warning U: this sub-pattern is unused. +File "morematch.ml", line 460, characters 2-7: +Warning U: this match case is unused. +*) +test "xyz" xyz (YC,YC,X) 6 ; +test "xyz" xyz (YC,YB,U X) 8 ; +test "xyz" xyz (YB,YC,X) 6 ; () +;; + + +(* Ce test est pour le compilo lui-meme *) +let eq (x,y) = x=y +;; + +test "eq" eq ("coucou", "coucou") true ; () +;; + +(* Test des gardes, non trivial *) + +let is_none = function + | None -> true + | _ -> false + +let garde x = match x with +| (Some _, _) when is_none (snd x) -> 1 +| (Some (pc, _), Some pc') when pc = pc' -> 2 +| _ -> 3 +;; + +test "garde" garde (Some (1,1),None) 1 ; +test "garde" garde (Some (1,1),Some 1) 2 ; +test "garde" garde (Some (2,1),Some 1) 3 ; () +;; + +let orstring = function + | ("A"|"B"|"C") -> 2 + | "D" -> 3 + | _ -> 4 +;; + +test "orstring" orstring "A" 2 ; +test "orstring" orstring "B" 2 ; +test "orstring" orstring "C" 2 ; +test "orstring" orstring "D" 3 ; +test "orstring" orstring "E" 4 ; () +;; + +type var_t = [`Variant of [ `Some of string | `None | `Foo] ] + +let crash (pat:var_t) = + match pat with + | `Variant (`Some tag) -> tag + | `Variant (`None) -> "none" + | _ -> "foo" + +;; + +test "crash" crash (`Variant `None) "none" ; +test "crash" crash (`Variant (`Some "coucou")) "coucou" ; +test "crash" crash (`Variant (`Foo)) "foo" ; () +;; + +let flatgarde c = +let x,y = c in +match x,y with +| (1,2)|(2,3) when y=2 -> 1 +| (1,_)|(_,3) -> 2 +| _ -> 3 +;; + +test "flatgarde" flatgarde (1,2) 1 ; +test "flatgarde" flatgarde (1,3) 2 ; +test "flatgarde" flatgarde (2,3) 2 ; +test "flatgarde" flatgarde (2,4) 3 ; () +;; + + +(* Les bugs de jerome *) +type f = + | ABSENT + | FILE + | SYMLINK + | DIRECTORY + +type r = + | Unchanged + | Deleted + | Modified + | PropsChanged + | Created + +let replicaContent2shortString rc = + let (typ, status) = rc in + match typ, status with + _, Unchanged -> " " + | ABSENT, Deleted -> "deleted " + | FILE, Created -> "new file" + | FILE, Modified -> "changed " + | FILE, PropsChanged -> "props " + | SYMLINK, Created -> "new link" + | SYMLINK, Modified -> "chgd lnk" + | DIRECTORY, Created -> "new dir " + | DIRECTORY, Modified -> "chgd dir" + | DIRECTORY, PropsChanged -> "props " + (* Cases that can't happen... *) + + | ABSENT, (Created | Modified | PropsChanged) + | SYMLINK, PropsChanged + | (FILE|SYMLINK|DIRECTORY), Deleted + -> "assert false" +;; + + +test "jerome_constr" + replicaContent2shortString (ABSENT, Unchanged) " " ; +test "jerome_constr" + replicaContent2shortString (ABSENT, Deleted) "deleted " ; +test "jerome_constr" + replicaContent2shortString (FILE, Modified) "changed " ; +test "jerome_constr" + replicaContent2shortString (DIRECTORY, PropsChanged) "props " ; +test "jerome_constr" + replicaContent2shortString (FILE, Deleted) "assert false" ; +test "jerome_constr" + replicaContent2shortString (SYMLINK, Deleted) "assert false" ; +test "jerome_constr" + replicaContent2shortString (SYMLINK, PropsChanged) "assert false" ; +test "jerome_constr" + replicaContent2shortString (DIRECTORY, Deleted) "assert false" ; +test "jerome_constr" + replicaContent2shortString (ABSENT, Created) "assert false" ; +test "jerome_constr" + replicaContent2shortString (ABSENT, Modified) "assert false" ; +test "jerome_constr" + replicaContent2shortString (ABSENT, PropsChanged) "assert false" ; +;; + + +let replicaContent2shortString rc = + let (typ, status) = rc in + match typ, status with + _, `Unchanged -> " " + | `ABSENT, `Deleted -> "deleted " + | `FILE, `Created -> "new file" + | `FILE, `Modified -> "changed " + | `FILE, `PropsChanged -> "props " + | `SYMLINK, `Created -> "new link" + | `SYMLINK, `Modified -> "chgd lnk" + | `DIRECTORY, `Created -> "new dir " + | `DIRECTORY, `Modified -> "chgd dir" + | `DIRECTORY, `PropsChanged -> "props " + (* Cases that can't happen... *) + + | `ABSENT, (`Created | `Modified | `PropsChanged) + | `SYMLINK, `PropsChanged + | (`FILE|`SYMLINK|`DIRECTORY), `Deleted + -> "assert false" +;; + + +test "jerome_variant" + replicaContent2shortString (`ABSENT, `Unchanged) " " ; +test "jerome_variant" + replicaContent2shortString (`ABSENT, `Deleted) "deleted " ; +test "jerome_variant" + replicaContent2shortString (`FILE, `Modified) "changed " ; +test "jerome_variant" + replicaContent2shortString (`DIRECTORY, `PropsChanged) "props " ; +test "jerome_variant" + replicaContent2shortString (`FILE, `Deleted) "assert false" ; +test "jerome_variant" + replicaContent2shortString (`SYMLINK, `Deleted) "assert false" ; +test "jerome_variant" + replicaContent2shortString (`SYMLINK, `PropsChanged) "assert false" ; +test "jerome_variant" + replicaContent2shortString (`DIRECTORY, `Deleted) "assert false" ; +test "jerome_variant" + replicaContent2shortString (`ABSENT, `Created) "assert false" ; +test "jerome_variant" + replicaContent2shortString (`ABSENT, `Modified) "assert false" ; +test "jerome_variant" + replicaContent2shortString (`ABSENT, `PropsChanged) "assert false" ; +;; + +(* bug 319 *) + +type ab = A of int | B of int +type cd = C | D + +let ohl = function + | (A (p) | B (p)), C -> p + | (A (p) | B (p)), D -> p +;; + +test "ohl" ohl (A 0,C) 0 ; +test "ohl" ohl (B 0,D) 0 ; () +;; + +(* bug 324 *) +type pottier = + | A + | B +;; + +let pottier x = + match x with + | (( (A, 1) | (B, 2)),A) -> false + | _ -> true +;; + +test "pottier" pottier ((B,2),A) false ; +test "pottier" pottier ((B,2),B) true ; +test "pottier" pottier ((A,2),A) true ; () +;; + +(* bug 325 in bytecode compiler *) +let coquery q = match q with +| y,0,([modu;defs]| [defs;modu;_]) -> y+defs-modu +| _ -> 0 +;; + +test "coquery" coquery (1,0,[1 ; 2 ; 3]) 0 ; +test "coquery" coquery (1,0,[1 ; 2]) 2 ; () +;; + +(* + Two other variable in or-pat tests +*) +type vars = A of int | B of (int * int) | C +;; + + +let vars1 = function + | (A x | B (_,x)) -> x + | C -> 0 +;; + +test "vars1" vars1 (A 1) 1 ; +test "vars1" vars1 (B (1,2)) 2 ; () +;; + +let vars2 = function + | ([x]|[1 ; x ]|[1 ; 2 ; x]) -> x + | _ -> 0 +;; + +test"vars2" vars2 [1] 1 ; +test"vars2" vars2 [1;2] 2 ; +test"vars2" vars2 [1;2;3] 3 ; +test"vars2" vars2 [0 ; 0] 0 ; () +;; + +(* Bug 342 *) +type eber = {x:int; y: int; z:bool} + +let eber = function + | {x=a; z=true} + | {y=a; z=false} -> a +;; + +test "eber" eber {x=0 ; y=1 ; z=true} 0 ; +test "eber" eber {x=1 ; y=0 ; z=false} 0 ; () +;; + + +(* Enchainement des test d'intervalle *) + +let escaped = function + | '"' | '\\' | '\n' | '\t' -> 2 + | c -> 1 +;; + +test "escaped" escaped '"' 2 ; +test "escaped" escaped '\\' 2 ; +test "escaped" escaped '\n' 2 ; +test "escaped" escaped '\t' 2 ; +test "escaped" escaped '\000' 1 ; +test "escaped" escaped ' ' 1 ; +test "escaped" escaped '\000' 1 ; +test "escaped" escaped '[' 1 ; +test "escaped" escaped ']' 1 ; +test "escaped" escaped '!' 1 ; +test "escaped" escaped '#' 1 ; +() +;; + +(* For compilation speed (due to J. Garigue) *) +exception Unknown_Reply of int + +type command_reply = + RPL_TRYAGAIN + | RPL_TRACEEND + | RPL_TRACELOG + | RPL_ADMINEMAIL + | RPL_ADMINLOC2 + | RPL_ADMINLOC1 + | RPL_ADMINME + | RPL_LUSERME + | RPL_LUSERCHANNELS + | RPL_LUSERUNKNOWN + | RPL_LUSEROP + | RPL_LUSERCLIENT + | RPL_STATSDLINE + | RPL_STATSDEBUG + | RPL_STATSDEFINE + | RPL_STATSBLINE + | RPL_STATSPING + | RPL_STATSSLINE + | RPL_STATSHLINE + | RPL_STATSOLINE + | RPL_STATSUPTIME + | RPL_STATSLLINE + | RPL_STATSVLINE + | RPL_SERVLISTEND + | RPL_SERVLIST + | RPL_SERVICE + | RPL_ENDOFSERVICES + | RPL_SERVICEINFO + | RPL_UMODEIS + | RPL_ENDOFSTATS + | RPL_STATSYLINE + | RPL_STATSQLINE + | RPL_STATSKLINE + | RPL_STATSILINE + | RPL_STATSNLINE + | RPL_STATSCLINE + | RPL_STATSCOMMANDS + | RPL_STATSLINKINFO + | RPL_TRACERECONNECT + | RPL_TRACECLASS + | RPL_TRACENEWTYPE + | RPL_TRACESERVICE + | RPL_TRACESERVER + | RPL_TRACEUSER + | RPL_TRACEOPERATOR + | RPL_TRACEUNKNOWN + | RPL_TRACEHANDSHAKE + | RPL_TRACECONNECTING + | RPL_TRACELINK + | RPL_NOUSERS + | RPL_ENDOFUSERS + | RPL_USERS + | RPL_USERSSTART + | RPL_TIME + | RPL_NOTOPERANYMORE + | RPL_MYPORTIS + | RPL_YOURESERVICE + | RPL_REHASHING + | RPL_YOUREOPER + | RPL_ENDOFMOTD + | RPL_MOTDSTART + | RPL_ENDOFINFO + | RPL_INFOSTART + | RPL_MOTD + | RPL_INFO + | RPL_ENDOFBANLIST + | RPL_BANLIST + | RPL_ENDOFLINKS + | RPL_LINKS + | RPL_CLOSEEND + | RPL_CLOSING + | RPL_KILLDONE + | RPL_ENDOFNAMES + | RPL_NAMREPLY + | RPL_ENDOFWHO + | RPL_WHOREPLY + | RPL_VERSION + | RPL_SUMMONING + | RPL_INVITING + | RPL_TOPIC + | RPL_NOTOPIC + | RPL_CHANNELMODEIS + | RPL_LISTEND + | RPL_LIST + | RPL_LISTSTART + | RPL_WHOISCHANNELS + | RPL_ENDOFWHOIS + | RPL_WHOISIDLE + | RPL_WHOISCHANOP + | RPL_ENDOFWHOWAS + | RPL_WHOWASUSER + | RPL_WHOISOPERATOR + | RPL_WHOISSERVER + | RPL_WHOISUSER + | RPL_NOWAWAY + | RPL_UNAWAY + | RPL_TEXT + | RPL_ISON + | RPL_USERHOST + | RPL_AWAY + | RPL_NONE + +let get_command_reply n = +match n with + 263 -> RPL_TRYAGAIN + | 319 -> RPL_WHOISCHANNELS + | 318 -> RPL_ENDOFWHOIS + | 317 -> RPL_WHOISIDLE + | 316 -> RPL_WHOISCHANOP + | 369 -> RPL_ENDOFWHOWAS + | 314 -> RPL_WHOWASUSER + | 313 -> RPL_WHOISOPERATOR + | 312 -> RPL_WHOISSERVER + | 311 -> RPL_WHOISUSER + | 262 -> RPL_TRACEEND + | 261 -> RPL_TRACELOG + | 259 -> RPL_ADMINEMAIL + | 258 -> RPL_ADMINLOC2 + | 257 -> RPL_ADMINLOC1 + | 256 -> RPL_ADMINME + | 255 -> RPL_LUSERME + | 254 -> RPL_LUSERCHANNELS + | 253 -> RPL_LUSERUNKNOWN + | 252 -> RPL_LUSEROP + | 251 -> RPL_LUSERCLIENT + | 250 -> RPL_STATSDLINE + | 249 -> RPL_STATSDEBUG + | 248 -> RPL_STATSDEFINE + | 247 -> RPL_STATSBLINE + | 246 -> RPL_STATSPING + | 245 -> RPL_STATSSLINE + | 244 -> RPL_STATSHLINE + | 243 -> RPL_STATSOLINE + | 242 -> RPL_STATSUPTIME + | 241 -> RPL_STATSLLINE + | 240 -> RPL_STATSVLINE + | 235 -> RPL_SERVLISTEND + | 234 -> RPL_SERVLIST + | 233 -> RPL_SERVICE + | 232 -> RPL_ENDOFSERVICES + | 231 -> RPL_SERVICEINFO + | 221 -> RPL_UMODEIS + | 219 -> RPL_ENDOFSTATS + | 218 -> RPL_STATSYLINE + | 217 -> RPL_STATSQLINE + | 216 -> RPL_STATSKLINE + | 215 -> RPL_STATSILINE + | 214 -> RPL_STATSNLINE + | 213 -> RPL_STATSCLINE + | 212 -> RPL_STATSCOMMANDS + | 211 -> RPL_STATSLINKINFO + | 210 -> RPL_TRACERECONNECT + | 209 -> RPL_TRACECLASS + | 208 -> RPL_TRACENEWTYPE + | 207 -> RPL_TRACESERVICE + | 206 -> RPL_TRACESERVER + | 205 -> RPL_TRACEUSER + | 204 -> RPL_TRACEOPERATOR + | 203 -> RPL_TRACEUNKNOWN + | 202 -> RPL_TRACEHANDSHAKE + | 201 -> RPL_TRACECONNECTING + | 200 -> RPL_TRACELINK + | 395 -> RPL_NOUSERS + | 394 -> RPL_ENDOFUSERS + | 393 -> RPL_USERS + | 392 -> RPL_USERSSTART + | 391 -> RPL_TIME + | 385 -> RPL_NOTOPERANYMORE + | 384 -> RPL_MYPORTIS + | 383 -> RPL_YOURESERVICE + | 382 -> RPL_REHASHING + | 381 -> RPL_YOUREOPER + | 376 -> RPL_ENDOFMOTD + | 375 -> RPL_MOTDSTART + | 374 -> RPL_ENDOFINFO + | 373 -> RPL_INFOSTART + | 372 -> RPL_MOTD + | 371 -> RPL_INFO + | 368 -> RPL_ENDOFBANLIST + | 367 -> RPL_BANLIST + | 365 -> RPL_ENDOFLINKS + | 364 -> RPL_LINKS + | 363 -> RPL_CLOSEEND + | 362 -> RPL_CLOSING + | 361 -> RPL_KILLDONE + | 366 -> RPL_ENDOFNAMES + | 353 -> RPL_NAMREPLY + | 315 -> RPL_ENDOFWHO + | 352 -> RPL_WHOREPLY + | 351 -> RPL_VERSION + | 342 -> RPL_SUMMONING + | 341 -> RPL_INVITING + | 332 -> RPL_TOPIC + | 331 -> RPL_NOTOPIC + | 324 -> RPL_CHANNELMODEIS + | 323 -> RPL_LISTEND + | 322 -> RPL_LIST + | 321 -> RPL_LISTSTART + | 306 -> RPL_NOWAWAY + | 305 -> RPL_UNAWAY + | 304 -> RPL_TEXT + | 303 -> RPL_ISON + | 302 -> RPL_USERHOST + | 301 -> RPL_AWAY + | 300 -> RPL_NONE + | _ -> raise (Unknown_Reply n) + +(* Bug 454 *) +type habert_a= + | A of habert_c + | B of habert_c + +and habert_c= {lvar:int; lassoc: habert_c;lnb:int} + + +let habert=function + | (A {lnb=i}|B {lnb=i}) when i=0 -> 1 + | A {lassoc=({lnb=j});lnb=i} -> 2 + | _ -> 3 +;; + +let rec ex0 = {lvar=0 ; lnb=0 ; lassoc=ex1} +and ex1 = {lvar=1 ; lnb=1 ; lassoc=ex0} in + +test "habert" habert (A ex0) 1 ; +test "habert" habert (B ex0) 1 ; +test "habert" habert (A ex1) 2 ; +test "habert" habert (B ex1) 3 ; + +(* Problems with interval test in arithmetic mod 2^31, bug #359 *) +(* From manuel Fahndrich *) + +type type_expr = [ + | `TTuple of type_expr list + | `TConstr of type_expr list + | `TVar of string + | `TVariant of string list + | `TBlock of int + | `TCopy of type_expr + ] + +and recurs_type_expr = [ + | `TTuple of type_expr list + | `TConstr of type_expr list + | `TVariant of string list + ] + + +let rec maf te = + match te with + | `TCopy te -> 1 + | `TVar _ -> 2 + | `TBlock _ -> 2 + | #recurs_type_expr as desc -> + + let te = + (match desc with + `TTuple tl -> + 4 + | `TConstr tl -> + 5 + | `TVariant (row) -> + 6 + ) + in + + te +;; + +let base = `TBlock 0 +;; + +test "maf" maf (`TCopy base) 1 ; +test "maf" maf (`TVar "test") 2 ; +test "maf" maf (`TBlock 0) 2 ; +test "maf" maf (`TTuple []) 4 ; +test "maf" maf (`TConstr []) 5 ; +test "maf" maf (`TVariant []) 6 +;; + +(* PR#1310 + Using ``get_args'' in place or an ad-hoc ``matcher'' function for tuples. + Has made the compiler [3.05] to fail. +*) +type t_seb = Uin | Uout +;; + +let rec seb = function + | ((i, Uin) | (i, Uout)), Uout -> 1 + | ((j, Uin) | (j, Uout)), Uin -> 2 +;; + +test "seb" seb ((0,Uin),Uout) 1 ; +test "seb" seb ((0,Uout),Uin) 2 ; +() +;; + +(* Talk with Jacques + - type 'b is still open ?? + - better case generation, accept intervals of size 1 when ok_inter is + false (in Switch) +*) + +(* +File "morematch.ml", line 1060, characters 8-65: +Warning: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +A `D +*) +type ('a, 'b) t_j = A of 'a | B of 'b * 'a | C + +let f = function + | A (`A|`C) -> 0 + | B (`B,`D) -> 1 + | C -> 2 + +let g x = try f x with Match_failure _ -> 3 + +let _ = + test "jacques" g (A `A) 0 ; + test "jacques" g (A `C) 0 ; + test "jacques" g (B (`B,`D)) 1 ; + test "jacaues" g C 2 ; +(* test "jacques" g (B (`A,`D)) 3 ; (* type incorrect expected behavior ? *)*) + () + +(* + Compilation bug, segfault, because of incorrect compilation + of unused match case .. -> "11" +*) + +type t_l = A | B + +let f = function + | _, _, _, _, _, _, _, _, _, _, _, _, _, B, _, _ -> "0" + | _, _, _, B, A, _, _, _, _, _, _, _, _, _, _, _ -> "1" + | _, _, _, B, _, A, _, _, A, _, _, _, _, _, _, _ -> "2" + | _, _, _, _, _, _, _, _, _, _, B, A, _, A, _, _ -> "3" + | _, _, _, _, _, _, _, B, _, _, _, _, B, _, A, A -> "4" + | A, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ -> "5" + | _, _, _, _, _, _, _, B, _, B, _, _, _, _, _, _ -> "6" + | _, B, _, _, _, _, _, _, _, _, _, _, _, _, _, _ -> "7" + | _, A, A, _, A, _, B, _, _, _, _, _, _, _, _, B -> "8" + | _, _, _, _, B, _, _, _, _, _, _, _, _, _, B, _ -> "9" + | _, _, _, _, _, _, _, _, _, _, _, B, _, _, _, _ -> "10" + | _, _, _, _, _, A, _, _, _, _, B, _, _, _, _, _ -> "11" + | B, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ -> "12" + | _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ -> "13" + +(* +File "morematch.ml", line 1094, characters 5-51: +Warning: this match case is unused. +File "morematch.ml", line 1096, characters 5-51: +Warning: this match case is unused. +*) +let _ = + test "luc" f (B, A, A, A, A, A, A, A, A, A, A, B, A, A, A, A) "10" ; + test "luc" f (B, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A) "12" ; + () + +(* + By Gilles Peskine, compilation raised some assert false i make_failactionneg +*) + +type bg = [ + | `False + | `True + ] + +type vg = [ + | `A + | `B + | `U of int + | `V of int + ] + +type tg = { + v : vg; + x : bg; + } + +let predg x = true + +let rec gilles o = match o with + | {v = (`U data | `V data); x = `False} when predg o -> 1 + | {v = (`A|`B) ; x = `False} + | {v = (`U _ | `V _); x = `False} + | {v = _ ; x = `True} + -> 2 + +(* + Match in trywith should always have a default case +*) + +exception Found of string * int +exception Error of string + + +let lucexn e = + try + try raise e with Error msg -> msg + with Found (s,r) -> s^string_of_int r + +let () = + test "lucexn1" lucexn (Error "coucou") "coucou" ; + test "lucexn2" lucexn (Found ("int: ",0)) "int: 0" ; + () diff --git a/testsuite/tests/basic-more/morematch.reference b/testsuite/tests/basic-more/morematch.reference new file mode 100644 index 00000000..197c9280 --- /dev/null +++ b/testsuite/tests/basic-more/morematch.reference @@ -0,0 +1,2 @@ + +All tests succeeded. diff --git a/testsuite/tests/basic-more/tbuffer.ml b/testsuite/tests/basic-more/tbuffer.ml new file mode 100644 index 00000000..d48268db --- /dev/null +++ b/testsuite/tests/basic-more/tbuffer.ml @@ -0,0 +1,27 @@ +(* Dummy substitute function. *) + +open Testing;; +open Buffer;; + +let identity s = s;; + +let b = Buffer.create 100;; + +(* Pattern with a '\\' character in it. *) +let pat0 = "\\\\a" in +let n0 = String.length pat0 in + +Buffer.add_substitute b identity pat0; + +test (String.length (Buffer.contents b) = n0) +;; + +(* Pattern with a '\\' character at the end. *) +let pat1 = "b\\" in +let n1 = String.length pat1 in + +Buffer.clear b; +Buffer.add_substitute b identity pat1; +test (String.length (Buffer.contents b) = n1) +;; + diff --git a/testsuite/tests/basic-more/tbuffer.reference b/testsuite/tests/basic-more/tbuffer.reference new file mode 100644 index 00000000..e41ae649 --- /dev/null +++ b/testsuite/tests/basic-more/tbuffer.reference @@ -0,0 +1,2 @@ +0 1 +All tests succeeded. diff --git a/testsuite/tests/basic-more/testrandom.ml b/testsuite/tests/basic-more/testrandom.ml new file mode 100644 index 00000000..150d4088 --- /dev/null +++ b/testsuite/tests/basic-more/testrandom.ml @@ -0,0 +1,13 @@ +open Random + +let _ = + for i = 0 to 20 do + print_float (float 1000.); print_char ' ' + done; + print_newline (); print_newline (); + for i = 0 to 20 do + print_int (int 1000); print_char ' ' + done + +let _ = exit 0 + diff --git a/testsuite/tests/basic-more/testrandom.reference b/testsuite/tests/basic-more/testrandom.reference new file mode 100644 index 00000000..f063674d --- /dev/null +++ b/testsuite/tests/basic-more/testrandom.reference @@ -0,0 +1,4 @@ +270.251355065 597.822945853 287.052171181 625.315015859 241.029649126 559.742196387 932.074421229 756.637587326 360.006556146 987.177314953 190.217751234 758.516786217 59.8488223602 328.350439075 172.627051105 944.543207513 629.424106752 868.196647048 174.382120878 78.1259713643 34.3270777955 + +683 782 740 270 835 136 791 168 324 222 156 835 328 636 233 153 671 69 95 357 92 +All tests succeeded. diff --git a/testsuite/tests/basic-more/tformat.ml b/testsuite/tests/basic-more/tformat.ml new file mode 100644 index 00000000..afad5297 --- /dev/null +++ b/testsuite/tests/basic-more/tformat.ml @@ -0,0 +1,33 @@ +(*************************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Pierre Weis, projet Estime, INRIA Rocquencourt *) +(* *) +(* Copyright 2009 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(*************************************************************************) + +(* $Id: tformat.ml 9270 2009-05-20 11:52:42Z doligez $ + +A testbed file for the module Format. + +*) + +open Testing;; + +open Format;; + +(* BR#4769 *) +let test0 () = + let b = Buffer.create 10 in + let msg = "Hello world!" in + Format.bprintf b "%s" msg; + let s = Buffer.contents b in + s = msg +;; + +test (test0 ()) +;; diff --git a/testsuite/tests/basic-more/tformat.reference b/testsuite/tests/basic-more/tformat.reference new file mode 100644 index 00000000..11742326 --- /dev/null +++ b/testsuite/tests/basic-more/tformat.reference @@ -0,0 +1,2 @@ +0 +All tests succeeded. diff --git a/testsuite/tests/basic-more/tprintf.ml b/testsuite/tests/basic-more/tprintf.ml new file mode 100644 index 00000000..518859da --- /dev/null +++ b/testsuite/tests/basic-more/tprintf.ml @@ -0,0 +1,72 @@ +open Testing;; + +open Printf;; + +(* Padding floating point numbers. + Testing * width specifications. *) +let test0 () = + sprintf "%.0f" 1.0 = "1" && + sprintf "%.0f." 1.7 = "2." && + sprintf "%.1f." 1.0 = "1.0." && + sprintf "%0.1f." 12.0 = "12.0." && + sprintf "%3.1f." 12.0 = "12.0." && + sprintf "%5.1f." 12.0 = " 12.0." && + sprintf "%10.1f." 12.0 = " 12.0." && + sprintf "%010.1f." 12.0 = "00000012.0." && + sprintf "% 10.1f." 12.0 = " 12.0." && + sprintf "%+10.1f." 12.0 = " +12.0." && + sprintf "%+10.1f." (-12.0) = " -12.0." && + + sprintf "%010.5f." 12.0 = "0012.00000." && + sprintf "%010.0f." 12.0 = "0000000012." && + sprintf "% 10.0f." 12.0 = " 12." && + + sprintf "%0.1f." 12.0 = "12.0." && + sprintf "%10.1f." 1.001 = " 1.0." && + sprintf "%05.1f." 1.001 = "001.0." +;; + +test (test0 ());; + +(* Padding integers (cf bug 3955). + Testing * width specifications. *) +let test1 () = + sprintf "%d\n" 1 = "1\n" && + sprintf "%05d\n" 1 = "00001\n" && + sprintf "%*d\n" 5 1 = " 1\n" && + sprintf "%0*d\n" 5 1 = "00001\n";; + +test (test1 ());; + +(* FIXME: when positional specification will be OK. *) +let test2 () = true +(* sprintf "%1$d\n" 5 1 = " 1\n" && + sprintf "%01$d\n" 5 1 = "00001\n" *);; + +test (test2 ());; + +(* Testing meta format string printing. *) +let test3 () = +sprintf "%{toto %s titi.\n%}" "Bonjour %s." = "%s" && +sprintf "%{%d%s%}" "kk%dkk%s\n" = "%i%s";; +test (test3 ());; + +(* Testing meta format string arguments. *) +let test4 () = + sprintf "%(%s%)" "Bonjour %s" "toto" = "Bonjour toto" && + sprintf "%(%s%)" "Bonjour %s." "vous" = "Bonjour vous." && + sprintf "%(%s%)" "Hello %s." "you" = "Hello you." +;; + +test (test4 ());; + +let test5 () = + sprintf "%(toto %s titi.\n%)" + "Bonjour %s." "vous" = "Bonjour vous." && + sprintf "%(toto %s titi.\n%).\n" + "Bonjour %s" "toto" = "Bonjour toto.\n" && + sprintf "%(toto %s titi.\n%)%s\n" + "Bonjour %s." "toto" " Ça va?" = "Bonjour toto. Ça va?\n" +;; + +test (test5 ());; diff --git a/testsuite/tests/basic-more/tprintf.reference b/testsuite/tests/basic-more/tprintf.reference new file mode 100644 index 00000000..d804a0b8 --- /dev/null +++ b/testsuite/tests/basic-more/tprintf.reference @@ -0,0 +1,2 @@ +0 1 2 3 4 5 +All tests succeeded. diff --git a/testsuite/tests/basic-multdef/Makefile b/testsuite/tests/basic-multdef/Makefile new file mode 100644 index 00000000..79660b57 --- /dev/null +++ b/testsuite/tests/basic-multdef/Makefile @@ -0,0 +1,5 @@ +MODULES=multdef +MAIN_MODULE=usemultdef + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-multdef/multdef.ml b/testsuite/tests/basic-multdef/multdef.ml new file mode 100644 index 00000000..46869c45 --- /dev/null +++ b/testsuite/tests/basic-multdef/multdef.ml @@ -0,0 +1,2 @@ +let f x = x + 1 +external g : string -> int = "caml_int_of_string" diff --git a/testsuite/tests/basic-multdef/multdef.mli b/testsuite/tests/basic-multdef/multdef.mli new file mode 100644 index 00000000..8d67a548 --- /dev/null +++ b/testsuite/tests/basic-multdef/multdef.mli @@ -0,0 +1,3 @@ +val f : int -> int +val f : int -> int +val g : string -> int diff --git a/testsuite/tests/basic-multdef/usemultdef.ml b/testsuite/tests/basic-multdef/usemultdef.ml new file mode 100644 index 00000000..2bccabb6 --- /dev/null +++ b/testsuite/tests/basic-multdef/usemultdef.ml @@ -0,0 +1 @@ +let _ = print_int(Multdef.f 1); print_newline(); exit 0 diff --git a/testsuite/tests/basic-multdef/usemultdef.reference b/testsuite/tests/basic-multdef/usemultdef.reference new file mode 100644 index 00000000..0cfbf088 --- /dev/null +++ b/testsuite/tests/basic-multdef/usemultdef.reference @@ -0,0 +1 @@ +2 diff --git a/testsuite/tests/basic-private/Makefile b/testsuite/tests/basic-private/Makefile new file mode 100644 index 00000000..99475d0f --- /dev/null +++ b/testsuite/tests/basic-private/Makefile @@ -0,0 +1,5 @@ +MODULES=length +MAIN_MODULE=tlength + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic-private/length.ml b/testsuite/tests/basic-private/length.ml new file mode 100644 index 00000000..945d05d1 --- /dev/null +++ b/testsuite/tests/basic-private/length.ml @@ -0,0 +1,16 @@ +(* $Id: length.ml 8482 2007-11-06 21:06:18Z weis $ + +A testbed file for private type abbreviation definitions. + +We define a Length module to implement positive integers. + +*) + +type t = int;; + +let make x = + if x >= 0 then x else + failwith (Printf.sprintf "cannot build negative length : %i" x) +;; + +external from : t -> int = "%identity";; diff --git a/testsuite/tests/basic-private/length.mli b/testsuite/tests/basic-private/length.mli new file mode 100644 index 00000000..2215ec8f --- /dev/null +++ b/testsuite/tests/basic-private/length.mli @@ -0,0 +1,13 @@ +(* $Id: length.mli 8482 2007-11-06 21:06:18Z weis $ + +A testbed file for private type abbreviation definitions. + +We define a Length module to implement positive integers. + +*) + +type t = private int;; + +val make : int -> t;; + +external from : t -> int = "%identity";; diff --git a/testsuite/tests/basic-private/tlength.ml b/testsuite/tests/basic-private/tlength.ml new file mode 100644 index 00000000..a428e207 --- /dev/null +++ b/testsuite/tests/basic-private/tlength.ml @@ -0,0 +1,23 @@ +(* $Id: tlength.ml 8482 2007-11-06 21:06:18Z weis $ + +A testbed file for private type abbreviation definitions. + +We test the Length module that implements positive integers. + +*) + +(* We can build a null length. *) +let l = Length.make 0;; + + +(* We cannot build a negative length. *) +try ignore (Length.make (-1)); assert false with +| Failure _ -> () +;; + + +(* We can build a positive length. *) +let l3 = Length.make 3 in + +(* and use the associated injection and projection functions. *) +Length.make (Length.from l3 + Length.from l3);; diff --git a/testsuite/tests/basic-private/tlength.reference b/testsuite/tests/basic-private/tlength.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/basic/Makefile b/testsuite/tests/basic/Makefile new file mode 100644 index 00000000..a226dd11 --- /dev/null +++ b/testsuite/tests/basic/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/basic/arrays.ml b/testsuite/tests/basic/arrays.ml new file mode 100644 index 00000000..bbe8be32 --- /dev/null +++ b/testsuite/tests/basic/arrays.ml @@ -0,0 +1,86 @@ +let bigarray n = [| +n+0; n+1; n+2; n+3; n+4; n+5; n+6; n+7; n+8; n+9; n+10; n+11; n+12; +n+13; n+14; n+15; n+16; n+17; n+18; n+19; n+20; n+21; n+22; n+23; +n+24; n+25; n+26; n+27; n+28; n+29; n+30; n+31; n+32; n+33; n+34; +n+35; n+36; n+37; n+38; n+39; n+40; n+41; n+42; n+43; n+44; n+45; +n+46; n+47; n+48; n+49; n+50; n+51; n+52; n+53; n+54; n+55; n+56; +n+57; n+58; n+59; n+60; n+61; n+62; n+63; n+64; n+65; n+66; n+67; +n+68; n+69; n+70; n+71; n+72; n+73; n+74; n+75; n+76; n+77; n+78; +n+79; n+80; n+81; n+82; n+83; n+84; n+85; n+86; n+87; n+88; n+89; +n+90; n+91; n+92; n+93; n+94; n+95; n+96; n+97; n+98; n+99; n+100; +n+101; n+102; n+103; n+104; n+105; n+106; n+107; n+108; n+109; n+110; +n+111; n+112; n+113; n+114; n+115; n+116; n+117; n+118; n+119; n+120; +n+121; n+122; n+123; n+124; n+125; n+126; n+127; n+128; n+129; n+130; +n+131; n+132; n+133; n+134; n+135; n+136; n+137; n+138; n+139; n+140; +n+141; n+142; n+143; n+144; n+145; n+146; n+147; n+148; n+149; n+150; +n+151; n+152; n+153; n+154; n+155; n+156; n+157; n+158; n+159; n+160; +n+161; n+162; n+163; n+164; n+165; n+166; n+167; n+168; n+169; n+170; +n+171; n+172; n+173; n+174; n+175; n+176; n+177; n+178; n+179; n+180; +n+181; n+182; n+183; n+184; n+185; n+186; n+187; n+188; n+189; n+190; +n+191; n+192; n+193; n+194; n+195; n+196; n+197; n+198; n+199; n+200; +n+201; n+202; n+203; n+204; n+205; n+206; n+207; n+208; n+209; n+210; +n+211; n+212; n+213; n+214; n+215; n+216; n+217; n+218; n+219; n+220; +n+221; n+222; n+223; n+224; n+225; n+226; n+227; n+228; n+229; n+230; +n+231; n+232; n+233; n+234; n+235; n+236; n+237; n+238; n+239; n+240; +n+241; n+242; n+243; n+244; n+245; n+246; n+247; n+248; n+249; n+250; +n+251; n+252; n+253; n+254; n+255; n+256; n+257; n+258; n+259; n+260; +n+261; n+262; n+263; n+264; n+265; n+266; n+267; n+268; n+269; n+270; +n+271; n+272; n+273; n+274; n+275; n+276; n+277; n+278; n+279; n+280; +n+281; n+282; n+283; n+284; n+285; n+286; n+287; n+288; n+289; n+290; +n+291; n+292; n+293; n+294; n+295; n+296; n+297; n+298; n+299 +|] + +let test1 () = + let a = bigarray 12345 in + Gc.full_major(); + for i = 0 to Array.length a - 1 do + if a.(i) <> 12345 + i then print_string "Test1: error\n" + done + +let testcopy a = + Array.copy a = a + +let test2 () = + if not (testcopy [|1;2;3;4;5|]) then + print_string "Test2: failed on int array\n"; + if not (testcopy [|1.2;2.3;3.4;4.5|]) then + print_string "Test2: failed on float array\n"; + if not (testcopy [|"un"; "deux"; "trois"|]) then + print_string "Test2: failed on string array\n" + +module AbstractFloat = + (struct + type t = float + let to_float x = x + let from_float x = x + end : + sig + type t + val to_float: t -> float + val from_float: float -> t + end) + +let test3 () = + let t1 = AbstractFloat.from_float 1.0 + and t2 = AbstractFloat.from_float 2.0 + and t3 = AbstractFloat.from_float 3.0 in + let v = [|t1;t2;t3|] in + let w = Array.create 2 t1 in + let u = Array.copy v in + if not (AbstractFloat.to_float v.(0) = 1.0 && + AbstractFloat.to_float v.(1) = 2.0 && + AbstractFloat.to_float v.(2) = 3.0) then + print_string "Test3: failed on v\n"; + if not (AbstractFloat.to_float w.(0) = 1.0 && + AbstractFloat.to_float w.(1) = 1.0) then + print_string "Test3: failed on w\n"; + if not (AbstractFloat.to_float u.(0) = 1.0 && + AbstractFloat.to_float u.(1) = 2.0 && + AbstractFloat.to_float u.(2) = 3.0) then + print_string "Test3: failed on u\n" + +let _ = + test1(); + test2(); + test3(); + exit 0 diff --git a/testsuite/tests/basic/arrays.reference b/testsuite/tests/basic/arrays.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/basic/bigints.ml b/testsuite/tests/basic/bigints.ml new file mode 100644 index 00000000..0b101ffa --- /dev/null +++ b/testsuite/tests/basic/bigints.ml @@ -0,0 +1,12 @@ +let _ = + print_int 1000000000; print_newline(); + print_int 10000000000; print_newline(); + print_int 100000000000; print_newline(); + print_int 1000000000000; print_newline(); + print_int 10000000000000; print_newline(); + print_int 100000000000000; print_newline(); + print_int 1000000000000000; print_newline(); + print_int 10000000000000000; print_newline(); + print_int 100000000000000000; print_newline(); + print_int 1000000000000000000; print_newline() + diff --git a/testsuite/tests/basic/bigints.reference b/testsuite/tests/basic/bigints.reference new file mode 100644 index 00000000..512fd476 --- /dev/null +++ b/testsuite/tests/basic/bigints.reference @@ -0,0 +1,10 @@ +1000000000 +10000000000 +100000000000 +1000000000000 +10000000000000 +100000000000000 +1000000000000000 +10000000000000000 +100000000000000000 +1000000000000000000 diff --git a/testsuite/tests/basic/boxedints.ml b/testsuite/tests/basic/boxedints.ml new file mode 100644 index 00000000..19574a1a --- /dev/null +++ b/testsuite/tests/basic/boxedints.ml @@ -0,0 +1,577 @@ +(* Test the types nativeint, int32, int64 *) + +open Printf + +let error_occurred = ref false + +let function_tested = ref "" + +let testing_function s = + function_tested := s; + print_newline(); + print_string s; + print_newline() + +let test test_number answer correct_answer = + flush stdout; + flush stderr; + if answer <> correct_answer then begin + eprintf "*** Bad result (%s, test %d)\n" !function_tested test_number; + flush stderr; + error_occurred := true + end else begin + printf " %d..." test_number + end + +(***** Tests on 32 bit arithmetic *****) + +module type TESTSIG = sig + type t + module Ops : sig + val neg: t -> t + val add: t -> t -> t + val sub: t -> t -> t + val mul: t -> t -> t + val div: t -> t -> t + val rem: t -> t -> t + val logand: t -> t -> t + val logor: t -> t -> t + val logxor: t -> t -> t + val shift_left: t -> int -> t + val shift_right: t -> int -> t + val shift_right_logical: t -> int -> t + val of_int: int -> t + val to_int: t -> int + val of_float: float -> t + val to_float: t -> float + val zero: t + val one: t + val minus_one: t + val min_int: t + val max_int: t + val format : string -> t -> string + val to_string: t -> string + val of_string: string -> t + end + val testcomp: t -> t -> bool*bool*bool*bool*bool*bool*int + val skip_float_tests: bool +end + +module Test32(M: TESTSIG) = +struct + open M + open Ops + + let _ = + testing_function "of_int, to_int"; + test 1 (to_int (of_int 0)) 0; + test 2 (to_int (of_int 123)) 123; + test 3 (to_int (of_int (-456))) (-456); + test 4 (to_int (of_int 0x3FFFFFFF)) 0x3FFFFFFF; + test 5 (to_int (of_int (-0x40000000))) (-0x40000000); + + testing_function "of_string"; + test 1 (of_string "0") (of_int 0); + test 2 (of_string "123") (of_int 123); + test 3 (of_string "-456") (of_int (-456)); + test 4 (of_string "123456789") (of_int 123456789); + test 5 (of_string "0xABCDEF") (of_int 0xABCDEF); + test 6 (of_string "-0o1234567012") (of_int (- 0o1234567012)); + test 7 (of_string "0b01010111111000001100") + (of_int 0b01010111111000001100); + test 8 (of_string "0x7FFFFFFF") max_int; + test 9 (of_string "-0x80000000") min_int; + test 10 (of_string "0x80000000") min_int; + test 11 (of_string "0xFFFFFFFF") minus_one; + + testing_function "to_string, format"; + List.iter (fun (n, s) -> test n (to_string (of_string s)) s) + [1, "0"; 2, "123"; 3, "-456"; 4, "1234567890"; + 5, "1073741824"; 6, "2147483647"; 7, "-2147483648"]; + List.iter (fun (n, s) -> test n (format "0x%X" (of_string s)) s) + [8, "0x0"; 9, "0x123"; 10, "0xABCDEF"; 11, "0x12345678"; + 12, "0x7FFFFFFF"; 13, "0x80000000"; 14, "0xFFFFFFFF"]; + test 15 (to_string max_int) "2147483647"; + test 16 (to_string min_int) "-2147483648"; + test 17 (to_string zero) "0"; + test 18 (to_string one) "1"; + test 19 (to_string minus_one) "-1"; + + testing_function "neg"; + test 1 (neg (of_int 0)) (of_int 0); + test 2 (neg (of_int 123)) (of_int (-123)); + test 3 (neg (of_int (-456))) (of_int 456); + test 4 (neg (of_int 123456789)) (of_int (-123456789)); + test 5 (neg max_int) (of_string "-0x7FFFFFFF"); + test 6 (neg min_int) min_int; + + testing_function "add"; + test 1 (add (of_int 0) (of_int 0)) (of_int 0); + test 2 (add (of_int 123) (of_int 0)) (of_int 123); + test 3 (add (of_int 0) (of_int 456)) (of_int 456); + test 4 (add (of_int 123) (of_int 456)) (of_int 579); + test 5 (add (of_int (-123)) (of_int 456)) (of_int 333); + test 6 (add (of_int 123) (of_int (-456))) (of_int (-333)); + test 7 (add (of_int (-123)) (of_int (-456))) (of_int (-579)); + test 8 (add (of_string "0x12345678") (of_string "0x9ABCDEF")) + (of_string "0x1be02467"); + test 9 (add max_int max_int) (of_int (-2)); + test 10 (add min_int min_int) zero; + test 11 (add max_int one) min_int; + test 12 (add min_int minus_one) max_int; + test 13 (add max_int min_int) minus_one; + + testing_function "sub"; + test 1 (sub (of_int 0) (of_int 0)) (of_int 0); + test 2 (sub (of_int 123) (of_int 0)) (of_int 123); + test 3 (sub (of_int 0) (of_int 456)) (of_int (-456)); + test 4 (sub (of_int 123) (of_int 456)) (of_int (-333)); + test 5 (sub (of_int (-123)) (of_int 456)) (of_int (-579)); + test 6 (sub (of_int 123) (of_int (-456))) (of_int 579); + test 7 (sub (of_int (-123)) (of_int (-456))) (of_int 333); + test 8 (sub (of_string "0x12345678") (of_string "0x9ABCDEF")) + (of_string "0x8888889"); + test 9 (sub max_int min_int) minus_one; + test 10 (sub min_int max_int) one; + test 11 (sub min_int one) max_int; + test 12 (sub max_int minus_one) min_int; + + testing_function "mul"; + test 1 (mul (of_int 0) (of_int 0)) (of_int 0); + test 2 (mul (of_int 123) (of_int 0)) (of_int 0); + test 3 (mul (of_int 0) (of_int (-456))) (of_int 0); + test 4 (mul (of_int 123) (of_int 1)) (of_int 123); + test 5 (mul (of_int 1) (of_int (-456))) (of_int (-456)); + test 6 (mul (of_int 123) (of_int (-1))) (of_int (-123)); + test 7 (mul (of_int (-1)) (of_int (-456))) (of_int 456); + test 8 (mul (of_int 123) (of_int 456)) (of_int 56088); + test 9 (mul (of_int (-123)) (of_int 456)) (of_int (-56088)); + test 10 (mul (of_int 123) (of_int (-456))) (of_int (-56088)); + test 11 (mul (of_int (-123)) (of_int (-456))) (of_int 56088); + test 12 (mul (of_string "0x12345678") (of_string "0x9ABCDEF")) + (of_string "0xe242d208"); + test 13 (mul max_int max_int) one; + + testing_function "div"; + List.iter + (fun (n, a, b) -> test n (div (of_int a) (of_int b)) (of_int (a / b))) + [1, 0, 2; + 2, 123, 1; + 3, -123, 1; + 4, 123, -1; + 5, -123, -1; + 6, 127531236, 365; + 7, 16384, 256; + 8, -127531236, 365; + 9, 127531236, -365; + 10, 1234567, 12345678; + 11, 1234567, -12345678]; + + testing_function "mod"; + List.iter + (fun (n, a, b) -> test n (rem (of_int a) (of_int b)) (of_int (a mod b))) + [1, 0, 2; + 2, 123, 1; + 3, -123, 1; + 4, 123, -1; + 5, -123, -1; + 6, 127531236, 365; + 7, 16384, 256; + 8, -127531236, 365; + 9, 127531236, -365; + 10, 1234567, 12345678; + 11, 1234567, -12345678]; + + testing_function "and"; + List.iter + (fun (n, a, b, c) -> test n (logand (of_string a) (of_string b)) + (of_string c)) + [1, "0x12345678", "0x9abcdef0", "0x12345670"; + 2, "0x12345678", "0x0fedcba9", "0x2244228"; + 3, "0xFFFFFFFF", "0x12345678", "0x12345678"; + 4, "0", "0x12345678", "0"; + 5, "0x55555555", "0xAAAAAAAA", "0"]; + + testing_function "or"; + List.iter + (fun (n, a, b, c) -> test n (logor (of_string a) (of_string b)) + (of_string c)) + [1, "0x12345678", "0x9abcdef0", "0x9abcdef8"; + 2, "0x12345678", "0x0fedcba9", "0x1ffddff9"; + 3, "0xFFFFFFFF", "0x12345678", "0xFFFFFFFF"; + 4, "0", "0x12345678", "0x12345678"; + 5, "0x55555555", "0xAAAAAAAA", "0xFFFFFFFF"]; + + testing_function "xor"; + List.iter + (fun (n, a, b, c) -> test n (logxor (of_string a) (of_string b)) + (of_string c)) + [1, "0x12345678", "0x9abcdef0", "0x88888888"; + 2, "0x12345678", "0x0fedcba9", "0x1dd99dd1"; + 3, "0xFFFFFFFF", "0x12345678", "0xedcba987"; + 4, "0", "0x12345678", "0x12345678"; + 5, "0x55555555", "0xAAAAAAAA", "0xFFFFFFFF"]; + + testing_function "shift_left"; + List.iter + (fun (n, a, b, c) -> test n (shift_left (of_string a) b) (of_string c)) + [1, "1", 1, "2"; + 2, "1", 2, "4"; + 3, "1", 4, "0x10"; + 4, "1", 30, "0x40000000"; + 5, "1", 31, "0x80000000"; + 6, "0x16236", 7, "0xb11b00"; + 7, "0x10", 27, "0x80000000"; + 8, "0x10", 28, "0"]; + + testing_function "shift_right"; + List.iter + (fun (n, a, b, c) -> test n (shift_right (of_string a) b) (of_string c)) + [1, "2", 1, "1"; + 2, "4", 2, "1"; + 3, "0x10", 4, "1"; + 4, "0x40000000", 10, "0x100000"; + 5, "0x80000000", 31, "-1"; + 6, "0xb11b00", 7, "0x16236"; + 7, "-0xb11b00", 7, "-90678"]; + + testing_function "shift_right_logical"; + List.iter + (fun (n, a, b, c) -> test n (shift_right_logical (of_string a) b) + (of_string c)) + [1, "2", 1, "1"; + 2, "4", 2, "1"; + 3, "0x10", 4, "1"; + 4, "0x40000000", 10, "0x100000"; + 5, "0x80000000", 31, "1"; + 6, "0xb11b00", 7, "0x16236"; + 7, "-0xb11b00", 7, "0x1fe9dca"]; + + if not (skip_float_tests) then begin + testing_function "of_float"; + test 1 (of_float 0.0) (of_int 0); + test 2 (of_float 123.0) (of_int 123); + test 3 (of_float 123.456) (of_int 123); + test 4 (of_float 123.999) (of_int 123); + test 5 (of_float (-456.0)) (of_int (-456)); + test 6 (of_float (-456.123)) (of_int (-456)); + test 7 (of_float (-456.789)) (of_int (-456)); + + testing_function "to_float"; + test 1 (to_float (of_int 0)) 0.0; + test 2 (to_float (of_int 123)) 123.0; + test 3 (to_float (of_int (-456))) (-456.0); + test 4 (to_float (of_int 0x3FFFFFFF)) 1073741823.0; + test 5 (to_float (of_int (-0x40000000))) (-1073741824.0) + end; + + testing_function "Comparisons"; + test 1 (testcomp (of_int 0) (of_int 0)) + (true,false,false,false,true,true,0); + test 2 (testcomp (of_int 1234567) (of_int 1234567)) + (true,false,false,false,true,true,0); + test 3 (testcomp (of_int 0) (of_int 1)) + (false,true,true,false,true,false,-1); + test 4 (testcomp (of_int (-1)) (of_int 0)) + (false,true,true,false,true,false,-1); + test 5 (testcomp (of_int 1) (of_int 0)) + (false,true,false,true,false,true,1); + test 6 (testcomp (of_int 0) (of_int (-1))) + (false,true,false,true,false,true,1); + test 7 (testcomp max_int min_int) + (false,true,false,true,false,true,1); + + () +end + +(********* Tests on 64-bit arithmetic ***********) + +module Test64(M: TESTSIG) = +struct + open M + open Ops + + let _ = + testing_function "of_int, to_int"; + test 1 (to_int (of_int 0)) 0; + test 2 (to_int (of_int 123)) 123; + test 3 (to_int (of_int (-456))) (-456); + test 4 (to_int (of_int 0x3FFFFFFF)) 0x3FFFFFFF; + test 5 (to_int (of_int (-0x40000000))) (-0x40000000); + + testing_function "of_string"; + test 1 (of_string "0") (of_int 0); + test 2 (of_string "123") (of_int 123); + test 3 (of_string "-456") (of_int (-456)); + test 4 (of_string "123456789") (of_int 123456789); + test 5 (of_string "0xABCDEF") (of_int 0xABCDEF); + test 6 (of_string "-0o1234567012") (of_int (- 0o1234567012)); + test 7 (of_string "0b01010111111000001100") + (of_int 0b01010111111000001100); + test 8 (of_string "0x7FFFFFFFFFFFFFFF") max_int; + test 9 (of_string "-0x8000000000000000") min_int; + test 10 (of_string "0x8000000000000000") min_int; + test 11 (of_string "0xFFFFFFFFFFFFFFFF") minus_one; + + testing_function "to_string, format"; + List.iter (fun (n, s) -> test n (to_string (of_string s)) s) + [1, "0"; 2, "123"; 3, "-456"; 4, "1234567890"; + 5, "1234567890123456789"; + 6, "9223372036854775807"; + 7, "-9223372036854775808"]; + List.iter (fun (n, s) -> test n ("0x" ^ format "%X" (of_string s)) s) + [8, "0x0"; 9, "0x123"; 10, "0xABCDEF"; 11, "0x1234567812345678"; + 12, "0x7FFFFFFFFFFFFFFF"; 13, "0x8000000000000000"; + 14, "0xFFFFFFFFFFFFFFFF"]; + test 15 (to_string max_int) "9223372036854775807"; + test 16 (to_string min_int) "-9223372036854775808"; + test 17 (to_string zero) "0"; + test 18 (to_string one) "1"; + test 19 (to_string minus_one) "-1"; + + testing_function "neg"; + test 1 (neg (of_int 0)) (of_int 0); + test 2 (neg (of_int 123)) (of_int (-123)); + test 3 (neg (of_int (-456))) (of_int 456); + test 4 (neg (of_int 123456789)) (of_int (-123456789)); + test 5 (neg max_int) (of_string "-0x7FFFFFFFFFFFFFFF"); + test 6 (neg min_int) min_int; + + testing_function "add"; + test 1 (add (of_int 0) (of_int 0)) (of_int 0); + test 2 (add (of_int 123) (of_int 0)) (of_int 123); + test 3 (add (of_int 0) (of_int 456)) (of_int 456); + test 4 (add (of_int 123) (of_int 456)) (of_int 579); + test 5 (add (of_int (-123)) (of_int 456)) (of_int 333); + test 6 (add (of_int 123) (of_int (-456))) (of_int (-333)); + test 7 (add (of_int (-123)) (of_int (-456))) (of_int (-579)); + test 8 (add (of_string "0x1234567812345678") + (of_string "0x9ABCDEF09ABCDEF")) + (of_string "0x1be024671be02467"); + test 9 (add max_int max_int) (of_int (-2)); + test 10 (add min_int min_int) zero; + test 11 (add max_int one) min_int; + test 12 (add min_int minus_one) max_int; + test 13 (add max_int min_int) minus_one; + + testing_function "sub"; + test 1 (sub (of_int 0) (of_int 0)) (of_int 0); + test 2 (sub (of_int 123) (of_int 0)) (of_int 123); + test 3 (sub (of_int 0) (of_int 456)) (of_int (-456)); + test 4 (sub (of_int 123) (of_int 456)) (of_int (-333)); + test 5 (sub (of_int (-123)) (of_int 456)) (of_int (-579)); + test 6 (sub (of_int 123) (of_int (-456))) (of_int 579); + test 7 (sub (of_int (-123)) (of_int (-456))) (of_int 333); + test 8 (sub (of_string "0x1234567812345678") + (of_string "0x9ABCDEF09ABCDEF")) + (of_string "0x888888908888889"); + test 9 (sub max_int min_int) minus_one; + test 10 (sub min_int max_int) one; + test 11 (sub min_int one) max_int; + test 12 (sub max_int minus_one) min_int; + + testing_function "mul"; + test 1 (mul (of_int 0) (of_int 0)) (of_int 0); + test 2 (mul (of_int 123) (of_int 0)) (of_int 0); + test 3 (mul (of_int 0) (of_int (-456))) (of_int 0); + test 4 (mul (of_int 123) (of_int 1)) (of_int 123); + test 5 (mul (of_int 1) (of_int (-456))) (of_int (-456)); + test 6 (mul (of_int 123) (of_int (-1))) (of_int (-123)); + test 7 (mul (of_int (-1)) (of_int (-456))) (of_int 456); + test 8 (mul (of_int 123) (of_int 456)) (of_int 56088); + test 9 (mul (of_int (-123)) (of_int 456)) (of_int (-56088)); + test 10 (mul (of_int 123) (of_int (-456))) (of_int (-56088)); + test 11 (mul (of_int (-123)) (of_int (-456))) (of_int 56088); + test 12 (mul (of_string "0x12345678") (of_string "0x9ABCDEF")) + (of_string "0xb00ea4e242d208"); + test 13 (mul max_int max_int) one; + + testing_function "div"; + List.iter + (fun (n, a, b) -> test n (div (of_int a) (of_int b)) (of_int (a / b))) + [1, 0, 2; + 2, 123, 1; + 3, -123, 1; + 4, 123, -1; + 5, -123, -1; + 6, 127531236, 365; + 7, 16384, 256; + 8, -127531236, 365; + 9, 127531236, -365; + 10, 1234567, 12345678; + 11, 1234567, -12345678]; + + testing_function "mod"; + List.iter + (fun (n, a, b) -> test n (rem (of_int a) (of_int b)) (of_int (a mod b))) + [1, 0, 2; + 2, 123, 1; + 3, -123, 1; + 4, 123, -1; + 5, -123, -1; + 6, 127531236, 365; + 7, 16384, 256; + 8, -127531236, 365; + 9, 127531236, -365; + 10, 1234567, 12345678; + 11, 1234567, -12345678]; + + testing_function "and"; + List.iter + (fun (n, a, b, c) -> test n (logand (of_string a) (of_string b)) + (of_string c)) + [1, "0x1234567812345678", "0x9abcdef09abcdef0", "0x1234567012345670"; + 2, "0x1234567812345678", "0x0fedcba90fedcba9", "0x224422802244228"; + 3, "0xFFFFFFFFFFFFFFFF", "0x1234000012345678", "0x1234000012345678"; + 4, "0", "0x1234567812345678", "0"; + 5, "0x5555555555555555", "0xAAAAAAAAAAAAAAAA", "0"]; + + testing_function "or"; + List.iter + (fun (n, a, b, c) -> test n (logor (of_string a) (of_string b)) + (of_string c)) + [1, "0x1234567812345678", "0x9abcdef09abcdef0", "0x9abcdef89abcdef8"; + 2, "0x1234567812345678", "0x0fedcba90fedcba9", "0x1ffddff91ffddff9"; + 3, "0xFFFFFFFFFFFFFFFF", "0x12345678", "0xFFFFFFFFFFFFFFFF"; + 4, "0", "0x1234567812340000", "0x1234567812340000"; + 5, "0x5555555555555555", "0xAAAAAAAAAAAAAAAA", "0xFFFFFFFFFFFFFFFF"]; + + testing_function "xor"; + List.iter + (fun (n, a, b, c) -> test n (logxor (of_string a) (of_string b)) + (of_string c)) + [1, "0x1234567812345678", "0x9abcdef09abcdef0", "0x8888888888888888"; + 2, "0x1234567812345678", "0x0fedcba90fedcba9", "0x1dd99dd11dd99dd1"; + 3, "0xFFFFFFFFFFFFFFFF", "0x123456789ABCDEF", "0xfedcba9876543210"; + 4, "0", "0x1234567812340000", "0x1234567812340000"; + 5, "0x5555555555555555", "0xAAAAAAAAAAAAAAAA", "0xFFFFFFFFFFFFFFFF"]; + + testing_function "shift_left"; + List.iter + (fun (n, a, b, c) -> test n (shift_left (of_string a) b) (of_string c)) + [1, "1", 1, "2"; + 2, "1", 2, "4"; + 3, "1", 4, "0x10"; + 4, "1", 62, "0x4000000000000000"; + 5, "1", 63, "0x8000000000000000"; + 6, "0x16236ABD45673", 7, "0xb11b55ea2b3980"; + 7, "0x10", 59, "0x8000000000000000"; + 8, "0x10", 60, "0"]; + + testing_function "shift_right"; + List.iter + (fun (n, a, b, c) -> test n (shift_right (of_string a) b) (of_string c)) + [1, "2", 1, "1"; + 2, "4", 2, "1"; + 3, "0x10", 4, "1"; + 4, "0x40000000", 10, "0x100000"; + 5, "0x8000000000000000", 63, "-1"; + 6, "0xb11b55ea2b3980", 7, "0x16236ABD45673"; + 7, "-0xb11b55ea2b3980", 7, "-389461927286387"]; + + testing_function "shift_right_logical"; + List.iter + (fun (n, a, b, c) -> test n (shift_right_logical (of_string a) b) + (of_string c)) + [1, "2", 1, "1"; + 2, "4", 2, "1"; + 3, "0x10", 4, "1"; + 4, "0x40000000", 10, "0x100000"; + 5, "0x8000000000000000", 63, "1"; + 6, "0xb11b55ea2b3980", 7, "0x16236ABD45673"; + 7, "-0xb11b55ea2b3980", 7, "0x1fe9dc9542ba98d"]; + + testing_function "Comparisons"; + test 1 (testcomp (of_int 0) (of_int 0)) + (true,false,false,false,true,true,0); + test 2 (testcomp (of_int 1234567) (of_int 1234567)) + (true,false,false,false,true,true,0); + test 3 (testcomp (of_int 0) (of_int 1)) + (false,true,true,false,true,false,-1); + test 4 (testcomp (of_int (-1)) (of_int 0)) + (false,true,true,false,true,false,-1); + test 5 (testcomp (of_int 1) (of_int 0)) + (false,true,false,true,false,true,1); + test 6 (testcomp (of_int 0) (of_int (-1))) + (false,true,false,true,false,true,1); + test 7 (testcomp max_int min_int) + (false,true,false,true,false,true,1); + + () +end + +(******** The test proper **********) + +let testcomp_int32 (a : int32) (b : int32) = + (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b) +let testcomp_int64 (a : int64) (b : int64) = + (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b) +let testcomp_nativeint (a : nativeint) (b : nativeint) = + (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b) + +let _ = + testing_function "-------- Int32 --------"; + let module A = Test32(struct type t = int32 + module Ops = Int32 + let testcomp = testcomp_int32 + let skip_float_tests = false end) in + print_newline(); testing_function "-------- Int64 --------"; + let module B = Test64(struct type t = int64 + module Ops = Int64 + let testcomp = testcomp_int64 + let skip_float_tests = false end) in + print_newline(); testing_function "-------- Nativeint --------"; + begin match Sys.word_size with + 32 -> + let module C = + Test32(struct type t = nativeint + module Ops = Nativeint + let testcomp = testcomp_nativeint + let skip_float_tests = true end) + in () + | 64 -> + let module C = + Test64(struct type t = nativeint + module Ops = Nativeint + let testcomp = testcomp_nativeint + let skip_float_tests = true end) + in () + | _ -> + assert false + end; + print_newline(); testing_function "--------- Conversions -----------"; + testing_function "nativeint of/to int32"; + test 1 (Nativeint.of_int32 (Int32.of_string "0x12345678")) + (Nativeint.of_string "0x12345678"); + test 2 (Nativeint.to_int32 (Nativeint.of_string "0x12345678")) + (Int32.of_string "0x12345678"); + if Sys.word_size = 64 then + test 3 (Nativeint.to_int32 (Nativeint.of_string "0x123456789ABCDEF0")) + (Int32.of_string "0x9ABCDEF0") + else + test 3 0 0; (* placeholder to have the same output on both 32-bit and 64-bit *) + testing_function "int64 of/to int32"; + test 1 (Int64.of_int32 (Int32.of_string "-0x12345678")) + (Int64.of_string "-0x12345678"); + test 2 (Int64.to_int32 (Int64.of_string "-0x12345678")) + (Int32.of_string "-0x12345678"); + test 3 (Int64.to_int32 (Int64.of_string "0x123456789ABCDEF0")) + (Int32.of_string "0x9ABCDEF0"); + testing_function "int64 of/to nativeint"; + test 1 (Int64.of_nativeint (Nativeint.of_string "0x12345678")) + (Int64.of_string "0x12345678"); + test 2 (Int64.to_nativeint (Int64.of_string "-0x12345678")) + (Nativeint.of_string "-0x12345678"); + test 3 (Int64.to_nativeint (Int64.of_string "0x123456789ABCDEF0")) + (if Sys.word_size = 64 + then Nativeint.of_string "0x123456789ABCDEF0" + else Nativeint.of_string "0x9ABCDEF0") + +(********* End of test *********) + +let _ = + print_newline(); + if !error_occurred then begin + prerr_endline "************* TEST FAILED ****************"; exit 2 + end else + exit 0 diff --git a/testsuite/tests/basic/boxedints.reference b/testsuite/tests/basic/boxedints.reference new file mode 100644 index 00000000..fe08bb2b --- /dev/null +++ b/testsuite/tests/basic/boxedints.reference @@ -0,0 +1,118 @@ + +-------- Int32 -------- + +of_int, to_int + 1... 2... 3... 4... 5... +of_string + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +to_string, format + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... +neg + 1... 2... 3... 4... 5... 6... +add + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +sub + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... +mul + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +div + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +mod + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +and + 1... 2... 3... 4... 5... +or + 1... 2... 3... 4... 5... +xor + 1... 2... 3... 4... 5... +shift_left + 1... 2... 3... 4... 5... 6... 7... 8... +shift_right + 1... 2... 3... 4... 5... 6... 7... +shift_right_logical + 1... 2... 3... 4... 5... 6... 7... +of_float + 1... 2... 3... 4... 5... 6... 7... +to_float + 1... 2... 3... 4... 5... +Comparisons + 1... 2... 3... 4... 5... 6... 7... + +-------- Int64 -------- + +of_int, to_int + 1... 2... 3... 4... 5... +of_string + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +to_string, format + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... +neg + 1... 2... 3... 4... 5... 6... +add + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +sub + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... +mul + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +div + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +mod + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +and + 1... 2... 3... 4... 5... +or + 1... 2... 3... 4... 5... +xor + 1... 2... 3... 4... 5... +shift_left + 1... 2... 3... 4... 5... 6... 7... 8... +shift_right + 1... 2... 3... 4... 5... 6... 7... +shift_right_logical + 1... 2... 3... 4... 5... 6... 7... +Comparisons + 1... 2... 3... 4... 5... 6... 7... + +-------- Nativeint -------- + +of_int, to_int + 1... 2... 3... 4... 5... +of_string + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +to_string, format + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... +neg + 1... 2... 3... 4... 5... 6... +add + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +sub + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... +mul + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +div + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +mod + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... +and + 1... 2... 3... 4... 5... +or + 1... 2... 3... 4... 5... +xor + 1... 2... 3... 4... 5... +shift_left + 1... 2... 3... 4... 5... 6... 7... 8... +shift_right + 1... 2... 3... 4... 5... 6... 7... +shift_right_logical + 1... 2... 3... 4... 5... 6... 7... +Comparisons + 1... 2... 3... 4... 5... 6... 7... + +--------- Conversions ----------- + +nativeint of/to int32 + 1... 2... 3... +int64 of/to int32 + 1... 2... 3... +int64 of/to nativeint + 1... 2... 3... diff --git a/testsuite/tests/basic/equality.ml b/testsuite/tests/basic/equality.ml new file mode 100644 index 00000000..133a3fe1 --- /dev/null +++ b/testsuite/tests/basic/equality.ml @@ -0,0 +1,80 @@ +let test n check res = + print_string "Test "; print_int n; + if check res then print_string " passed.\n" else print_string " FAILED.\n"; + flush stderr + +let eq0 = function 0 -> true | _ -> false +let eqm1 = function -1 -> true | _ -> false +let eq1 = function 1 -> true | _ -> false +let eqtrue (b:bool) = b +let eqftffff = + function (false,true,false,false,false,false) -> true | _ -> false + +let x = [1;2;3] + +let f x = 1 :: 2 :: 3 :: x + +let mklist len = + let l = ref [] in + for i = 1 to len do l := i :: !l done; + !l + +type tree = Dummy | Leaf | Node of tree * tree + +let rec mktree depth = + if depth <= 0 then Leaf else Node(mktree(depth - 1), mktree(depth - 1)) + +type 'a leftlist = Nil | Cons of 'a leftlist * 'a + +let mkleftlist len = + let l = ref Nil in + for i = 1 to len do l := Cons(!l, i) done; + !l + +let _ = + test 1 eq0 (compare 0 0); + test 2 eqm1 (compare 0 1); + test 3 eq1 (compare 1 0); + test 4 eq0 (compare max_int max_int); + test 5 eqm1 (compare min_int max_int); + test 6 eq1 (compare max_int min_int); + test 7 eq0 (compare "foo" "foo"); + test 8 eqm1 (compare "foo" "zorglub"); + test 9 eqm1 (compare "abcdef" "foo"); + test 10 eqm1 (compare "abcdefghij" "abcdefghijkl"); + test 11 eq1 (compare "abcdefghij" "abcdefghi"); + test 12 eq0 (compare (0,1) (0,1)); + test 13 eqm1 (compare (0,1) (0,2)); + test 14 eqm1 (compare (0,1) (1,0)); + test 15 eq1 (compare (0,1) (0,0)); + test 16 eq1 (compare (1,0) (0,1)); + test 17 eq0 (compare 0.0 0.0); + test 18 eqm1 (compare 0.0 1.0); + test 19 eqm1 (compare (-1.0) 0.0); + test 20 eq0 (compare [| 0.0; 1.0; 2.0 |] [| 0.0; 1.0; 2.0 |]); + test 21 eqm1 (compare [| 0.0; 1.0; 2.0 |] [| 0.0; 1.0; 3.0 |]); + test 22 eq1 (compare [| 0.0; 5.0; 2.0 |] [| 0.0; 1.0; 2.0 |]); + test 23 eq0 (compare [1;2;3;4] [1;2;3;4]); + test 24 eqm1 (compare [1;2;3;4] [1;2;5;6]); + test 25 eqm1 (compare [1;2;3;4] [1;2;3;4;5]); + test 26 eq1 (compare [1;2;3;4] [1;2;3]); + test 27 eq1 (compare [1;2;3;4] [1;2;0;4]); + test 28 eq0 (compare (mklist 1000) (mklist 1000)); + test 29 eq0 (compare (mkleftlist 1000) (mkleftlist 1000)); + test 30 eq0 (compare (mktree 12) (mktree 12)); + test 31 eqtrue (x = f []); + test 32 eqtrue (stdout <> stderr); + test 33 eqm1 (compare nan 0.0); + test 34 eqm1 (compare nan neg_infinity); + test 35 eq0 (compare nan nan); + test 36 eqm1 (compare (0.0, nan) (0.0, 0.0)); + test 37 eqm1 (compare (0.0, nan) (0.0, neg_infinity)); + test 38 eq0 (compare (nan, 0.0) (nan, 0.0)); + let cmpgen x y = (x=y, x<>y, xy, x>=y) in + let cmpfloat (x:float) (y:float) = (x=y, x<>y, xy, x>=y) in + test 39 eqftffff (cmpgen nan nan); + test 40 eqftffff (cmpgen nan 0.0); + test 41 eqftffff (cmpfloat nan nan); + test 42 eqftffff (cmpfloat nan 0.0); + test 43 eqtrue ([||] = [||]) + diff --git a/testsuite/tests/basic/equality.reference b/testsuite/tests/basic/equality.reference new file mode 100644 index 00000000..1d5f1401 --- /dev/null +++ b/testsuite/tests/basic/equality.reference @@ -0,0 +1,43 @@ +Test 1 passed. +Test 2 passed. +Test 3 passed. +Test 4 passed. +Test 5 passed. +Test 6 passed. +Test 7 passed. +Test 8 passed. +Test 9 passed. +Test 10 passed. +Test 11 passed. +Test 12 passed. +Test 13 passed. +Test 14 passed. +Test 15 passed. +Test 16 passed. +Test 17 passed. +Test 18 passed. +Test 19 passed. +Test 20 passed. +Test 21 passed. +Test 22 passed. +Test 23 passed. +Test 24 passed. +Test 25 passed. +Test 26 passed. +Test 27 passed. +Test 28 passed. +Test 29 passed. +Test 30 passed. +Test 31 passed. +Test 32 passed. +Test 33 passed. +Test 34 passed. +Test 35 passed. +Test 36 passed. +Test 37 passed. +Test 38 passed. +Test 39 passed. +Test 40 passed. +Test 41 passed. +Test 42 passed. +Test 43 passed. diff --git a/testsuite/tests/basic/float.ml b/testsuite/tests/basic/float.ml new file mode 100644 index 00000000..9ebabbc4 --- /dev/null +++ b/testsuite/tests/basic/float.ml @@ -0,0 +1 @@ +Printf.printf "1./.0. = %f\n" (1.0 /. 0.0);; diff --git a/testsuite/tests/basic/float.reference b/testsuite/tests/basic/float.reference new file mode 100644 index 00000000..3e7bab44 --- /dev/null +++ b/testsuite/tests/basic/float.reference @@ -0,0 +1 @@ +1./.0. = inf diff --git a/testsuite/tests/basic/includestruct.ml b/testsuite/tests/basic/includestruct.ml new file mode 100644 index 00000000..182272c1 --- /dev/null +++ b/testsuite/tests/basic/includestruct.ml @@ -0,0 +1,92 @@ +(* Test for "include " inside structures *) + +module A = + struct + type t = int + let x = (1 : t) + let y = (2 : t) + let f (z : t) = (x + z : t) + end + +module B = + struct + include A + type u = t * t + let p = ((x, y) : u) + let g ((x, y) : u) = ((f x, f y) : u) + end + +let _ = + let print_pair (x,y) = + print_int x; print_string ", "; print_int y; print_newline() in + print_pair B.p; + print_pair (B.g B.p); + print_pair (B.g (123, 456)) + +module H = + struct + include A + let f (z : t) = (x - 1 : t) + end + +let _ = + print_int (H.f H.x); print_newline() + +module C = + struct + include (A : sig type t val f : t -> int val x : t end) + let z = f x + end + +let _ = + print_int C.z; print_newline(); + print_int (C.f C.x); print_newline() + +(* Toplevel inclusion *) + +include A + +let _ = + print_int x; print_newline(); + print_int (f y); print_newline() + +(* With a functor *) + +module F(X: sig end) = + struct + let _ = print_string "F is called"; print_newline() + type t = A | B of int + let print_t = function A -> print_string "A" + | B x -> print_int x + end + +module D = + struct + include F(struct end) + let test() = print_t A; print_newline(); print_t (B 42); print_newline() + end + +let _ = + D.test(); + D.print_t D.A; print_newline(); D.print_t (D.B 42); print_newline() + +(* Exceptions and classes *) + +module E = + struct + exception Exn of string + class c = object method m = 1 end + end + +module G = + struct + include E + let _ = + begin try raise (Exn "foo") with Exn s -> print_string s end; + print_int ((new c)#m); print_newline() + end + +let _ = + begin try raise (G.Exn "foo") with G.Exn s -> print_string s end; + print_int ((new G.c)#m); print_newline() + diff --git a/testsuite/tests/basic/includestruct.reference b/testsuite/tests/basic/includestruct.reference new file mode 100644 index 00000000..a7756837 --- /dev/null +++ b/testsuite/tests/basic/includestruct.reference @@ -0,0 +1,15 @@ +1, 2 +2, 3 +124, 457 +0 +2 +2 +1 +3 +F is called +A +42 +A +42 +foo1 +foo1 diff --git a/testsuite/tests/basic/patmatch.ml b/testsuite/tests/basic/patmatch.ml new file mode 100644 index 00000000..3101f333 --- /dev/null +++ b/testsuite/tests/basic/patmatch.ml @@ -0,0 +1,79 @@ +(* Tests for matchings on integers and characters *) + +(* Dense integer switch *) + +let f = function 1 -> 1 | 2 -> 2 | 3 -> 3 | 4 -> 4 | 5 -> 5 | 6 -> 6 | _ -> 0 + +(* Sparse integer switch *) + +let g = function 303 -> 1 | 401 -> 2 | _ -> 0 + +(* Very sparse integer switch *) + +let iszero = function 0 -> true | _ -> false + +(* Simple matching on characters *) + +let h = function + 'a' -> "a" + | 'e' -> "e" + | 'i' -> "i" + | 'o' -> "o" + | 'u' -> "u" + | _ -> "?" + +(* Matching with orpats *) + +let k = function + ' ' | '\t' | '\n' | '\r' -> "blk" + | 'A'..'Z' | 'a'..'z' | '\192'..'\255' -> "letr" + | '0'..'9' -> "dig" + | '!'|'%'|'&'|'$'|'#'|'+'|'/'|':'|'<'|'='|'>'|'?'|'@'|'\\'| + '~'|'^'|'|'|'*' -> "oper" + | _ -> "othr" + +(* Matching on arrays *) + +let p = function [| x |] -> x | _ -> assert false + +let q = function [| x |] -> x | _ -> 0 + +let r = function [| x |] -> x | _ -> 0.0 + +let l = function + [||] -> 0 + | [|x|] -> x + 1 + | [|x;y|] -> x + y + | [|x;y;z|] -> x + y + z + | _ -> assert false + +(* The test *) + +open Printf + +let _ = + for i = -5 to 10 do printf "f(%d) = %d\n" i (f i) done; + List.iter (fun i -> printf "g(%d) = %d\n" i (g i)) + [0;300;303;305;400;401;402;999]; + for i = -2 to 2 do printf "iszero(%d) = %B\n" i (iszero i) done; + for i = 97 to 126 do + let c = Char.chr i in + printf "h(%c) = %s\n" c (h c) + done; + for i = 0 to 255 do + let c = Char.chr i in + printf "k(%s) = %s\t" (Char.escaped c) (k c) + done; + printf "\n"; + printf "p([|\"hello\"|]) = %s\n" (p [|"hello"|]); + printf "p([|1.0|]) = %f\n" (p [|1.0|]); + printf "q([|2|]) = %d\n" (q [|2|]); + printf "r([|3.0|]) = %f\n" (r [|3.0|]); + printf "l([||]) = %d\n" (l [||]); + printf "l([|1|]) = %d\n" (l [|1|]); + printf "l([|2;3|]) = %d\n" (l [|2;3|]); + printf "l([|4;5;6|]) = %d\n" (l [|4;5;6|]); + exit 0 + + + diff --git a/testsuite/tests/basic/patmatch.reference b/testsuite/tests/basic/patmatch.reference new file mode 100644 index 00000000..7a35b130 --- /dev/null +++ b/testsuite/tests/basic/patmatch.reference @@ -0,0 +1,68 @@ +f(-5) = 0 +f(-4) = 0 +f(-3) = 0 +f(-2) = 0 +f(-1) = 0 +f(0) = 0 +f(1) = 1 +f(2) = 2 +f(3) = 3 +f(4) = 4 +f(5) = 5 +f(6) = 6 +f(7) = 0 +f(8) = 0 +f(9) = 0 +f(10) = 0 +g(0) = 0 +g(300) = 0 +g(303) = 1 +g(305) = 0 +g(400) = 0 +g(401) = 2 +g(402) = 0 +g(999) = 0 +iszero(-2) = false +iszero(-1) = false +iszero(0) = true +iszero(1) = false +iszero(2) = false +h(a) = a +h(b) = ? +h(c) = ? +h(d) = ? +h(e) = e +h(f) = ? +h(g) = ? +h(h) = ? +h(i) = i +h(j) = ? +h(k) = ? +h(l) = ? +h(m) = ? +h(n) = ? +h(o) = o +h(p) = ? +h(q) = ? +h(r) = ? +h(s) = ? +h(t) = ? +h(u) = u +h(v) = ? +h(w) = ? +h(x) = ? +h(y) = ? +h(z) = ? +h({) = ? +h(|) = ? +h(}) = ? +h(~) = ? +k(\000) = othr k(\001) = othr k(\002) = othr k(\003) = othr k(\004) = othr k(\005) = othr k(\006) = othr k(\007) = othr k(\b) = othr k(\t) = blk k(\n) = blk k(\011) = othr k(\012) = othr k(\r) = blk k(\014) = othr k(\015) = othr k(\016) = othr k(\017) = othr k(\018) = othr k(\019) = othr k(\020) = othr k(\021) = othr k(\022) = othr k(\023) = othr k(\024) = othr k(\025) = othr k(\026) = othr k(\027) = othr k(\028) = othr k(\029) = othr k(\030) = othr k(\031) = othr k( ) = blk k(!) = oper k(") = othr k(#) = oper k($) = oper k(%) = oper k(&) = oper k(\') = othr k(() = othr k()) = othr k(*) = oper k(+) = oper k(,) = othr k(-) = othr k(.) = othr k(/) = oper k(0) = dig k(1) = dig k(2) = dig k(3) = dig k(4) = dig k(5) = dig k(6) = dig k(7) = dig k(8) = dig k(9) = dig k(:) = oper k(;) = othr k(<) = oper k(=) = oper k(>) = oper k(?) = oper k(@) = oper k(A) = letr k(B) = letr k(C) = letr k(D) = letr k(E) = letr k(F) = letr k(G) = letr k(H) = letr k(I) = letr k(J) = letr k(K) = letr k(L) = letr k(M) = letr k(N) = letr k(O) = letr k(P) = letr k(Q) = letr k(R) = letr k(S) = letr k(T) = letr k(U) = letr k(V) = letr k(W) = letr k(X) = letr k(Y) = letr k(Z) = letr k([) = othr k(\\) = oper k(]) = othr k(^) = oper k(_) = othr k(`) = othr k(a) = letr k(b) = letr k(c) = letr k(d) = letr k(e) = letr k(f) = letr k(g) = letr k(h) = letr k(i) = letr k(j) = letr k(k) = letr k(l) = letr k(m) = letr k(n) = letr k(o) = letr k(p) = letr k(q) = letr k(r) = letr k(s) = letr k(t) = letr k(u) = letr k(v) = letr k(w) = letr k(x) = letr k(y) = letr k(z) = letr k({) = othr k(|) = oper k(}) = othr k(~) = oper k(\127) = othr k(\128) = othr k(\129) = othr k(\130) = othr k(\131) = othr k(\132) = othr k(\133) = othr k(\134) = othr k(\135) = othr k(\136) = othr k(\137) = othr k(\138) = othr k(\139) = othr k(\140) = othr k(\141) = othr k(\142) = othr k(\143) = othr k(\144) = othr k(\145) = othr k(\146) = othr k(\147) = othr k(\148) = othr k(\149) = othr k(\150) = othr k(\151) = othr k(\152) = othr k(\153) = othr k(\154) = othr k(\155) = othr k(\156) = othr k(\157) = othr k(\158) = othr k(\159) = othr k( ) = othr k(¡) = othr k(¢) = othr k(£) = othr k(¤) = othr k(¥) = othr k(¦) = othr k(§) = othr k(¨) = othr k(©) = othr k(ª) = othr k(«) = othr k(¬) = othr k(­) = othr k(®) = othr k(¯) = othr k(°) = othr k(±) = othr k(²) = othr k(³) = othr k(´) = othr k(µ) = othr k(¶) = othr k(·) = othr k(¸) = othr k(¹) = othr k(º) = othr k(») = othr k(¼) = othr k(½) = othr k(¾) = othr k(¿) = othr k(À) = letr k(Á) = letr k(Â) = letr k(Ã) = letr k(Ä) = letr k(Å) = letr k(Æ) = letr k(Ç) = letr k(È) = letr k(É) = letr k(Ê) = letr k(Ë) = letr k(Ì) = letr k(Í) = letr k(Î) = letr k(Ï) = letr k(Ð) = letr k(Ñ) = letr k(Ò) = letr k(Ó) = letr k(Ô) = letr k(Õ) = letr k(Ö) = letr k(×) = letr k(Ø) = letr k(Ù) = letr k(Ú) = letr k(Û) = letr k(Ü) = letr k(Ý) = letr k(Þ) = letr k(ß) = letr k(à) = letr k(á) = letr k(â) = letr k(ã) = letr k(ä) = letr k(å) = letr k(æ) = letr k(ç) = letr k(è) = letr k(é) = letr k(ê) = letr k(ë) = letr k(ì) = letr k(í) = letr k(î) = letr k(ï) = letr k(ð) = letr k(ñ) = letr k(ò) = letr k(ó) = letr k(ô) = letr k(õ) = letr k(ö) = letr k(÷) = letr k(ø) = letr k(ù) = letr k(ú) = letr k(û) = letr k(ü) = letr k(ý) = letr k(þ) = letr k(ÿ) = letr +p([|"hello"|]) = hello +p([|1.0|]) = 1.000000 +q([|2|]) = 2 +r([|3.0|]) = 3.000000 +l([||]) = 0 +l([|1|]) = 2 +l([|2;3|]) = 5 +l([|4;5;6|]) = 15 diff --git a/testsuite/tests/basic/recvalues.ml b/testsuite/tests/basic/recvalues.ml new file mode 100644 index 00000000..c00ced82 --- /dev/null +++ b/testsuite/tests/basic/recvalues.ml @@ -0,0 +1,38 @@ +(* Recursive value definitions *) + +let _ = + let rec x = 1 :: x in + if match x with + 1 :: x' -> x == x' + | _ -> false + then print_string "Test 1: passed\n" + else print_string "Test 1: FAILED\n"; + let one = 1 in + let rec y = (one, one+1) :: y in + if match y with + (1,2) :: y' -> y == y' + | _ -> false + then print_string "Test 2: passed\n" + else print_string "Test 2: FAILED\n"; + let rec z = (Gc.minor(); (one, one+1)) :: z in + (* Trash the minor generation *) + for i = 0 to 50000 do ignore (ref 0) done; + if match z with + (1,2) :: z' -> z == z' + | _ -> false + then print_string "Test 3: passed\n" + else print_string "Test 3: FAILED\n"; +;; + +let rec s = "bar" +and idx = 1 +and x1 = let f x = Printf.printf "%s\n" x in f "foo"; s, x4 +and x2 = [| x1; x1 |] +and x3 = (fun () -> fst (x2.(idx))) :: x3 +and x4 = {contents = x3} +;; + +Gc.minor ();; +if (List.hd (!(snd (x2.(0))))) () == s +then print_string "Test 4: passed\n" +else print_string "Test 4: FAILED\n" diff --git a/testsuite/tests/basic/recvalues.reference b/testsuite/tests/basic/recvalues.reference new file mode 100644 index 00000000..ac71fc1d --- /dev/null +++ b/testsuite/tests/basic/recvalues.reference @@ -0,0 +1,5 @@ +Test 1: passed +Test 2: passed +Test 3: passed +foo +Test 4: passed diff --git a/testsuite/tests/basic/sets.ml b/testsuite/tests/basic/sets.ml new file mode 100644 index 00000000..379b9e82 --- /dev/null +++ b/testsuite/tests/basic/sets.ml @@ -0,0 +1,39 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: sets.ml 5183 2002-10-16 09:06:39Z weis $ *) + +module IntSet = Set.Make(struct type t = int let compare x y = x-y end) + +let even = List.fold_right IntSet.add [0; -2; 2; 4; 6; -10] IntSet.empty + +let odd = List.fold_right IntSet.add [9; -7; 5; 1; -3] IntSet.empty + +let _ = + for i = -10 to 10 do + Printf.printf "%d %B %B\n" i (IntSet.mem i even) (IntSet.mem i odd) + done + +module PowerSet(BaseSet: Set.S) + (SetOrd: functor(S: Set.S) -> Set.OrderedType) = + Set.Make(SetOrd(BaseSet)) + +module IntSetSet = PowerSet(IntSet)(functor (S: Set.S) -> S) + +let setofset = List.fold_right IntSetSet.add [even; odd] IntSetSet.empty + +let _ = + List.iter + (fun s -> Printf.printf "%B\n" (IntSetSet.mem s setofset)) + [IntSet.empty; even; odd; IntSet.union even odd] + +let _ = exit 0 diff --git a/testsuite/tests/basic/sets.reference b/testsuite/tests/basic/sets.reference new file mode 100644 index 00000000..2d4ebc24 --- /dev/null +++ b/testsuite/tests/basic/sets.reference @@ -0,0 +1,25 @@ +-10 true false +-9 false false +-8 false false +-7 false true +-6 false false +-5 false false +-4 false false +-3 false true +-2 true false +-1 false false +0 true false +1 false true +2 true false +3 false false +4 true false +5 false true +6 true false +7 false false +8 false false +9 false true +10 false false +false +true +true +false diff --git a/testsuite/tests/basic/tailcalls.ml b/testsuite/tests/basic/tailcalls.ml new file mode 100644 index 00000000..23b73535 --- /dev/null +++ b/testsuite/tests/basic/tailcalls.ml @@ -0,0 +1,28 @@ +let rec tailcall4 a b c d = + if a < 0 + then b + else tailcall4 (a-1) (b+1) (c+2) (d+3) + +let rec tailcall8 a b c d e f g h = + if a < 0 + then b + else tailcall8 (a-1) (b+1) (c+2) (d+3) (e+4) (f+5) (g+6) (h+7) + +let rec tailcall16 a b c d e f g h i j k l m n o p = + if a < 0 + then b + else tailcall16 (a-1) (b+1) (c+2) (d+3) (e+4) (f+5) (g+6) (h+7) + (i+8) (j+9) (k+10) (l+11) (m+12) (n+13) (o+14) (p+15) + +let indtailcall8 fn a b c d e f g h = + fn a b c d e f g h + +let indtailcall16 fn a b c d e f g h i j k l m n o p = + fn a b c d e f g h i j k l m n o p + +let _ = + print_int (tailcall4 10000000 0 0 0); print_newline(); + print_int (tailcall8 10000000 0 0 0 0 0 0 0); print_newline(); + print_int (tailcall16 10000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0); print_newline(); + print_int (indtailcall8 tailcall8 10 0 0 0 0 0 0 0); print_newline(); + print_int (indtailcall16 tailcall16 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0); print_newline() diff --git a/testsuite/tests/basic/tailcalls.reference b/testsuite/tests/basic/tailcalls.reference new file mode 100644 index 00000000..0943aba5 --- /dev/null +++ b/testsuite/tests/basic/tailcalls.reference @@ -0,0 +1,5 @@ +10000001 +10000001 +10000001 +11 +11 diff --git a/testsuite/tests/callback/Makefile b/testsuite/tests/callback/Makefile new file mode 100644 index 00000000..0cec7e63 --- /dev/null +++ b/testsuite/tests/callback/Makefile @@ -0,0 +1,27 @@ +CC=$(NATIVECC) -I $(TOPDIR)/byterun + +default: run-byte run-opt + +common: + @$(CC) -c callbackprim.c + +run-byte: common + @printf " ... testing 'bytecode':" + @$(OCAMLC) -c tcallback.ml + @$(OCAMLC) -o ./program -custom unix.cma callbackprim.$(O) tcallback.cmo + @./program > bytecode.result + @diff -q reference bytecode.result || (echo " => failed" && exit 1) + @echo " => passed" + +run-opt: common + @printf " ... testing 'native':" + @$(OCAMLOPT) -c tcallback.ml + @$(OCAMLOPT) -o ./program unix.cmxa callbackprim.$(O) tcallback.cmx + @./program > native.result + @diff -q reference native.result || (echo " => failed" && exit 1) + @echo " => passed" + +clean: defaultclean + @rm -f *.result ./program + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/callback/callbackprim.c b/testsuite/tests/callback/callbackprim.c new file mode 100644 index 00000000..f1a4ccfa --- /dev/null +++ b/testsuite/tests/callback/callbackprim.c @@ -0,0 +1,54 @@ +#include "mlvalues.h" +#include "memory.h" +#include "callback.h" + +value mycallback1(value fun, value arg) +{ + value res; + res = callback(fun, arg); + return res; +} + +value mycallback2(value fun, value arg1, value arg2) +{ + value res; + res = callback2(fun, arg1, arg2); + return res; +} + +value mycallback3(value fun, value arg1, value arg2, value arg3) +{ + value res; + res = callback3(fun, arg1, arg2, arg3); + return res; +} + +value mycallback4(value fun, value arg1, value arg2, value arg3, value arg4) +{ + value args[4]; + value res; + args[0] = arg1; + args[1] = arg2; + args[2] = arg3; + args[3] = arg4; + res = callbackN(fun, 4, args); + return res; +} + +value mypushroot(value v, value fun, value arg) +{ + Begin_root(v) + callback(fun, arg); + End_roots(); + return v; +} + +value mycamlparam (value v, value fun, value arg) +{ + CAMLparam3 (v, fun, arg); + CAMLlocal2 (x, y); + x = v; + y = callback (fun, arg); + v = x; + CAMLreturn (v); +} diff --git a/testsuite/tests/callback/reference b/testsuite/tests/callback/reference new file mode 100644 index 00000000..b35993aa --- /dev/null +++ b/testsuite/tests/callback/reference @@ -0,0 +1,8 @@ +7 +7 +7 +7 +7 +aaaaa +aaaaa +bbbbb diff --git a/testsuite/tests/callback/tcallback.ml b/testsuite/tests/callback/tcallback.ml new file mode 100644 index 00000000..32914119 --- /dev/null +++ b/testsuite/tests/callback/tcallback.ml @@ -0,0 +1,68 @@ +external mycallback1 : ('a -> 'b) -> 'a -> 'b = "mycallback1" +external mycallback2 : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c = "mycallback2" +external mycallback3 : ('a -> 'b -> 'c -> 'd) -> 'a -> 'b -> 'c -> 'd = "mycallback3" +external mycallback4 : ('a -> 'b -> 'c -> 'd -> 'e) -> 'a -> 'b -> 'c -> 'd -> 'e = "mycallback4" + +let rec tak (x, y, z as _tuple) = + if x > y then tak(tak (x-1, y, z), tak (y-1, z, x), tak (z-1, x, y)) + else z + +let tak2 x (y, z) = tak (x, y, z) + +let tak3 x y z = tak (x, y, z) + +let tak4 x y z u = tak (x, y, z + u) + +let raise_exit () = (raise Exit : unit) + +let trapexit () = + begin try + mycallback1 raise_exit () + with Exit -> + () + end; + tak (18, 12, 6) + +external mypushroot : 'a -> ('b -> 'c) -> 'b -> 'a = "mypushroot" +external mycamlparam : 'a -> ('b -> 'c) -> 'b -> 'a = "mycamlparam" + +let tripwire f = + let s = String.make 5 'a' in + f s trapexit () + +(* Test callbacks performed to handle signals *) + +let sighandler signo = +(* + print_string "Got signal, triggering garbage collection..."; + print_newline(); +*) + (* Thoroughly wipe the minor heap *) + ignore (tak (18, 12, 6)) + +external unix_getpid : unit -> int = "unix_getpid" "noalloc" +external unix_kill : int -> int -> unit = "unix_kill" "noalloc" + +let callbacksig () = + let pid = unix_getpid() in + (* Allocate a block in the minor heap *) + let s = String.make 5 'b' in + (* Send a signal to self. We want s to remain in a register and + not be spilled on the stack, hence we declare unix_kill + "noalloc". *) + unix_kill pid Sys.sigusr1; + (* Allocate some more so that the signal will be tested *) + let u = (s, s) in + fst u + +let _ = + print_int(mycallback1 tak (18, 12, 6)); print_newline(); + print_int(mycallback2 tak2 18 (12, 6)); print_newline(); + print_int(mycallback3 tak3 18 12 6); print_newline(); + print_int(mycallback4 tak4 18 12 3 3); print_newline(); + print_int(trapexit ()); print_newline(); + print_string(tripwire mypushroot); print_newline(); + print_string(tripwire mycamlparam); print_newline(); + Sys.set_signal Sys.sigusr1 (Sys.Signal_handle sighandler); + print_string(callbacksig ()); print_newline() + diff --git a/testsuite/tests/embedded/Makefile b/testsuite/tests/embedded/Makefile new file mode 100644 index 00000000..33b95442 --- /dev/null +++ b/testsuite/tests/embedded/Makefile @@ -0,0 +1,18 @@ +default: compile run + +compile: + @$(OCAMLC) -ccopt -I -ccopt $(TOPDIR)/byterun cmstub.c + @$(OCAMLC) -ccopt -I -ccopt $(TOPDIR)/byterun cmmain.c + @$(OCAMLC) -c cmcaml.ml + @$(OCAMLC) -custom -o program cmstub.o cmcaml.cmo cmmain.o + +run: + @printf " ... testing 'cmmain':" + @./program > program.result + @diff -q program.reference program.result > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + +clean: defaultclean + @rm -f *.result ./program + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/embedded/cmcaml.ml b/testsuite/tests/embedded/cmcaml.ml new file mode 100644 index 00000000..4ebed1e7 --- /dev/null +++ b/testsuite/tests/embedded/cmcaml.ml @@ -0,0 +1,16 @@ +(* Caml part of the code *) + +let rec fib n = + if n < 2 then 1 else fib(n-1) + fib(n-2) + +let format_result n = + let r = "Result = " ^ string_of_int n in + (* Allocate gratuitously to test GC *) + for i = 1 to 1500 do ignore (String.create 256) done; + r + +(* Registration *) + +let _ = + Callback.register "fib" fib; + Callback.register "format_result" format_result diff --git a/testsuite/tests/embedded/cmmain.c b/testsuite/tests/embedded/cmmain.c new file mode 100644 index 00000000..87647ac5 --- /dev/null +++ b/testsuite/tests/embedded/cmmain.c @@ -0,0 +1,22 @@ +/* Main program -- in C */ + +#include +#include +#include + +extern int fib(int n); +extern char * format_result(int n); + +int main(int argc, char ** argv) +{ + printf("Initializing Caml code...\n"); +#ifdef NO_BYTECODE_FILE + caml_startup(argv); +#else + caml_main(argv); +#endif + printf("Back in C code...\n"); + printf("Computing fib(20)...\n"); + printf("%s\n", format_result(fib(20))); + return 0; +} diff --git a/testsuite/tests/embedded/cmstub.c b/testsuite/tests/embedded/cmstub.c new file mode 100644 index 00000000..56cd6944 --- /dev/null +++ b/testsuite/tests/embedded/cmstub.c @@ -0,0 +1,17 @@ +#include +#include +#include + +/* Functions callable directly from C */ + +int fib(int n) +{ + value * fib_closure = caml_named_value("fib"); + return Int_val(callback(*fib_closure, Val_int(n))); +} + +char * format_result(int n) +{ + value * format_result_closure = caml_named_value("format_result"); + return strdup(String_val(callback(*format_result_closure, Val_int(n)))); +} diff --git a/testsuite/tests/embedded/program.reference b/testsuite/tests/embedded/program.reference new file mode 100644 index 00000000..e2752b72 --- /dev/null +++ b/testsuite/tests/embedded/program.reference @@ -0,0 +1,4 @@ +Initializing Caml code... +Back in C code... +Computing fib(20)... +Result = 10946 diff --git a/testsuite/tests/gc-roots/Makefile b/testsuite/tests/gc-roots/Makefile new file mode 100644 index 00000000..71082b9f --- /dev/null +++ b/testsuite/tests/gc-roots/Makefile @@ -0,0 +1,7 @@ +MODULES= +MAIN_MODULE=globroots +C_FILES=globrootsprim +ADD_COMPFLAGS=-w a + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/gc-roots/globroots.ml b/testsuite/tests/gc-roots/globroots.ml new file mode 100644 index 00000000..6d1948d7 --- /dev/null +++ b/testsuite/tests/gc-roots/globroots.ml @@ -0,0 +1,80 @@ +module type GLOBREF = sig + type t + val register: string -> t + val get: t -> string + val set: t -> string -> unit + val remove: t -> unit +end + +module Classic : GLOBREF = struct + type t + external register: string -> t = "gb_classic_register" + external get: t -> string = "gb_get" + external set: t -> string -> unit = "gb_classic_set" + external remove: t -> unit = "gb_classic_remove" +end + +module Generational : GLOBREF = struct + type t + external register: string -> t = "gb_generational_register" + external get: t -> string = "gb_get" + external set: t -> string -> unit = "gb_generational_set" + external remove: t -> unit = "gb_generational_remove" +end + +module Test(G: GLOBREF) = struct + + let size = 1024 + + let vals = Array.init size string_of_int + + let a = Array.init size (fun i -> G.register (string_of_int i)) + + let check () = + for i = 0 to size - 1 do + if G.get a.(i) <> vals.(i) then begin + print_string "Error on "; print_int i; print_string ": "; + print_string (String.escaped (G.get a.(i))); print_newline() + end + done + + let change () = + match Random.int 37 with + | 0 -> + Gc.full_major() + | 1|2|3|4 -> + Gc.minor() + | 5|6|7|8|9|10|11|12 -> (* update with young value *) + let i = Random.int size in + G.set a.(i) (string_of_int i) + | 13|14|15|16|17|18|19|20 -> (* update with old value *) + let i = Random.int size in + G.set a.(i) vals.(i) + | 21|22|23|24|25|26|27|28 -> (* re-register young value *) + let i = Random.int size in + G.remove a.(i); + a.(i) <- G.register (string_of_int i) + | (*29|30|31|32|33|34|35|36*) _ -> (* re-register old value *) + let i = Random.int size in + G.remove a.(i); + a.(i) <- G.register vals.(i) + + let test n = + for i = 1 to n do + change(); + print_string "."; flush stdout + done +end + +module TestClassic = Test(Classic) +module TestGenerational = Test(Generational) + +let _ = + let n = + if Array.length Sys.argv < 2 then 10000 else int_of_string Sys.argv.(1) in + print_string "Non-generational API\n"; + TestClassic.test n; + print_newline(); + print_string "Generational API\n"; + TestGenerational.test n; + print_newline() diff --git a/testsuite/tests/gc-roots/globroots.reference b/testsuite/tests/gc-roots/globroots.reference new file mode 100644 index 00000000..aae90b22 --- /dev/null +++ b/testsuite/tests/gc-roots/globroots.reference @@ -0,0 +1,4 @@ +Non-generational API +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +Generational API +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ diff --git a/testsuite/tests/gc-roots/globrootsprim.c b/testsuite/tests/gc-roots/globrootsprim.c new file mode 100644 index 00000000..f58fff1c --- /dev/null +++ b/testsuite/tests/gc-roots/globrootsprim.c @@ -0,0 +1,56 @@ +/* For testing global root registration */ + +#include "mlvalues.h" +#include "memory.h" +#include "alloc.h" + +struct block { value v; }; + +#define Block_val(v) ((struct block *) (v)) + +value gb_get(value vblock) +{ + return Block_val(vblock)->v; +} + +value gb_classic_register(value v) +{ + struct block * b = stat_alloc(sizeof(struct block)); + b->v = v; + caml_register_global_root(&(b->v)); + return (value) b; +} + +value gb_classic_set(value vblock, value newval) +{ + Block_val(vblock)->v = newval; + return Val_unit; +} + +value gb_classic_remove(value vblock) +{ + caml_remove_global_root(&(Block_val(vblock)->v)); + return Val_unit; +} + +value gb_generational_register(value v) +{ + struct block * b = stat_alloc(sizeof(struct block)); + b->v = v; + caml_register_generational_global_root(&(b->v)); + return (value) b; +} + +value gb_generational_set(value vblock, value newval) +{ + caml_modify_generational_global_root(&(Block_val(vblock)->v), newval); + return Val_unit; +} + +value gb_generational_remove(value vblock) +{ + caml_remove_generational_global_root(&(Block_val(vblock)->v)); + return Val_unit; +} + + diff --git a/testsuite/tests/lib-bigarray-2/Makefile b/testsuite/tests/lib-bigarray-2/Makefile new file mode 100644 index 00000000..74b02913 --- /dev/null +++ b/testsuite/tests/lib-bigarray-2/Makefile @@ -0,0 +1,6 @@ +LIBRARIES=unix bigarray +C_FILES=bigarrfstub +F_FILES=bigarrf + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-bigarray-2/bigarrf.f b/testsuite/tests/lib-bigarray-2/bigarrf.f new file mode 100644 index 00000000..5c2462c2 --- /dev/null +++ b/testsuite/tests/lib-bigarray-2/bigarrf.f @@ -0,0 +1,27 @@ + subroutine filltab() + + integer dimx, dimy + parameter (dimx = 8, dimy = 6) + real ftab(dimx, dimy) + common /ftab/ ftab + integer x, y + + do 100 x = 1, dimx + do 110 y = 1, dimy + ftab(x, y) = x * 100 + y + 110 continue + 100 continue + end + + subroutine printtab(tab, dimx, dimy) + + integer dimx, dimy + real tab(dimx, dimy) + integer x, y + + do 200 x = 1, dimx + print 300, x, (tab(x, y), y = 1, dimy) + 300 format(/1X, I3, 2X, 10F6.1/) + 200 continue + end + diff --git a/testsuite/tests/lib-bigarray-2/bigarrfml.ml b/testsuite/tests/lib-bigarray-2/bigarrfml.ml new file mode 100644 index 00000000..c9156228 --- /dev/null +++ b/testsuite/tests/lib-bigarray-2/bigarrfml.ml @@ -0,0 +1,63 @@ +open Bigarray +open Printf + +(* Test harness *) + +let error_occurred = ref false + +let function_tested = ref "" + +let testing_function s = + function_tested := s; + print_newline(); + print_string s; + print_newline() + +let test test_number answer correct_answer = + flush stdout; + flush stderr; + if answer <> correct_answer then begin + eprintf "*** Bad result (%s, test %d)\n" !function_tested test_number; + flush stderr; + error_occurred := true + end else begin + printf " %d..." test_number + end + +(* External C and Fortran functions *) + +external c_filltab : unit -> (float, float64_elt, c_layout) Array2.t = "c_filltab" +external c_printtab : (float, float64_elt, c_layout) Array2.t -> unit = "c_printtab" +external fortran_filltab : unit -> (float, float32_elt, fortran_layout) Array2.t = "fortran_filltab" +external fortran_printtab : (float, float32_elt, fortran_layout) Array2.t -> unit = "fortran_printtab" + +let _ = + + let make_array2 kind layout ind0 dim1 dim2 fromint = + let a = Array2.create kind layout dim1 dim2 in + for i = ind0 to dim1 - 1 + ind0 do + for j = ind0 to dim2 - 1 + ind0 do + a.{i,j} <- (fromint (i * 1000 + j)) + done + done; + a in + + print_newline(); + testing_function "------ Foreign function interface --------"; + testing_function "Passing an array to C"; + c_printtab (make_array2 float64 c_layout 0 6 8 float); + testing_function "Accessing a C array"; + let a = c_filltab () in + test 1 a.{0,0} 0.0; + test 2 a.{1,0} 100.0; + test 3 a.{0,1} 1.0; + test 4 a.{5,4} 504.0; + testing_function "Passing an array to Fortran"; + fortran_printtab (make_array2 float32 fortran_layout 1 5 4 float); + testing_function "Accessing a Fortran array"; + let a = fortran_filltab () in + test 1 a.{1,1} 101.0; + test 2 a.{2,1} 201.0; + test 3 a.{1,2} 102.0; + test 4 a.{5,4} 504.0; + diff --git a/testsuite/tests/lib-bigarray-2/bigarrfml.reference b/testsuite/tests/lib-bigarray-2/bigarrfml.reference new file mode 100644 index 00000000..8368d5ab --- /dev/null +++ b/testsuite/tests/lib-bigarray-2/bigarrfml.reference @@ -0,0 +1,27 @@ + + +------ Foreign function interface -------- + +Passing an array to C + +Accessing a C array + 1... 2... 3... 4... +Passing an array to Fortran + 0 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 + 1 1000.0 1001.0 1002.0 1003.0 1004.0 1005.0 1006.0 1007.0 + 2 2000.0 2001.0 2002.0 2003.0 2004.0 2005.0 2006.0 2007.0 + 3 3000.0 3001.0 3002.0 3003.0 3004.0 3005.0 3006.0 3007.0 + 4 4000.0 4001.0 4002.0 4003.0 4004.0 4005.0 4006.0 4007.0 + 5 5000.0 5001.0 5002.0 5003.0 5004.0 5005.0 5006.0 5007.0 + +Accessing a Fortran array + 1... 2... 3... 4... + 1 1001.01002.01003.01004.0 + + 2 2001.02002.02003.02004.0 + + 3 3001.03002.03003.03004.0 + + 4 4001.04002.04003.04004.0 + + 5 5001.05002.05003.05004.0 diff --git a/testsuite/tests/lib-bigarray-2/bigarrfstub.c b/testsuite/tests/lib-bigarray-2/bigarrfstub.c new file mode 100644 index 00000000..87bd67b7 --- /dev/null +++ b/testsuite/tests/lib-bigarray-2/bigarrfstub.c @@ -0,0 +1,60 @@ +#include +#include +#include + +extern void filltab_(void); +extern void printtab_(float * data, int * dimx, int * dimy); +extern float ftab_[]; + +#define DIMX 6 +#define DIMY 8 + +double ctab[DIMX][DIMY]; + +void filltab(void) +{ + int x, y; + for (x = 0; x < DIMX; x++) + for (y = 0; y < DIMY; y++) + ctab[x][y] = x * 100 + y; +} + +void printtab(double tab[DIMX][DIMY]) +{ + int x, y; + for (x = 0; x < DIMX; x++) { + printf("%3d", x); + for (y = 0; y < DIMY; y++) + printf(" %6.1f", tab[x][y]); + printf("\n"); + } +} + +value c_filltab(value unit) +{ + filltab(); + return alloc_bigarray_dims(BIGARRAY_FLOAT64 | BIGARRAY_C_LAYOUT, + 2, ctab, DIMX, DIMY); +} + +value c_printtab(value ba) +{ + printtab(Data_bigarray_val(ba)); + return Val_unit; +} + +value fortran_filltab(value unit) +{ + filltab_(); + return alloc_bigarray_dims(BIGARRAY_FLOAT32 | BIGARRAY_FORTRAN_LAYOUT, + 2, ftab_, 8, 6); +} + +value fortran_printtab(value ba) +{ + int dimx = Bigarray_val(ba)->dim[0]; + int dimy = Bigarray_val(ba)->dim[1]; + printtab_(Data_bigarray_val(ba), &dimx, &dimy); + return Val_unit; +} + diff --git a/testsuite/tests/lib-bigarray/Makefile b/testsuite/tests/lib-bigarray/Makefile new file mode 100644 index 00000000..bb5076e7 --- /dev/null +++ b/testsuite/tests/lib-bigarray/Makefile @@ -0,0 +1,4 @@ +LIBRARIES=unix bigarray + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-bigarray/bigarrays.ml b/testsuite/tests/lib-bigarray/bigarrays.ml new file mode 100644 index 00000000..85901400 --- /dev/null +++ b/testsuite/tests/lib-bigarray/bigarrays.ml @@ -0,0 +1,775 @@ +open Bigarray +open Printf +open Complex + +(* Test harness *) + +let error_occurred = ref false + +let function_tested = ref "" + +let testing_function s = + function_tested := s; + print_newline(); + print_string s; + print_newline() + +let test test_number answer correct_answer = + flush stdout; + flush stderr; + if answer <> correct_answer then begin + eprintf "*** Bad result (%s, test %d)\n" !function_tested test_number; + flush stderr; + error_occurred := true + end else begin + printf " %d..." test_number + end + +(* One-dimensional arrays *) + +let _ = + testing_function "------ Array1 --------"; + testing_function "create/set/get"; + let test_setget kind vals = + let rec set a i = function + [] -> () + | (v1, v2) :: tl -> a.{i} <- v1; set a (i+1) tl in + let rec test a i = function + [] -> true + | (v1, v2) :: tl -> a.{i} = v2 && test a (i+1) tl in + let ca = Array1.create kind c_layout (List.length vals) in + let fa = Array1.create kind fortran_layout (List.length vals) in + set ca 0 vals; + set fa 1 vals; + test ca 0 vals && test fa 1 vals in + test 1 true + (test_setget int8_signed + [0, 0; + 123, 123; + -123, -123; + 456, -56; + 0x101, 1]); + test 2 true + (test_setget int8_unsigned + [0, 0; + 123, 123; + -123, 133; + 456, 0xc8; + 0x101, 1]); + test 3 true + (test_setget int16_signed + [0, 0; + 123, 123; + -123, -123; + 31456, 31456; + -31456, -31456; + 65432, -104; + 0x10001, 1]); + test 4 true + (test_setget int16_unsigned + [0, 0; + 123, 123; + -123, 65413; + 31456, 31456; + -31456, 34080; + 65432, 65432; + 0x10001, 1]); + test 5 true + (test_setget int + [0, 0; + 123, 123; + -456, -456; + max_int, max_int; + min_int, min_int; + 0x12345678, 0x12345678; + -0x12345678, -0x12345678]); + test 6 true + (test_setget int32 + [Int32.zero, Int32.zero; + Int32.of_int 123, Int32.of_int 123; + Int32.of_int (-456), Int32.of_int (-456); + Int32.max_int, Int32.max_int; + Int32.min_int, Int32.min_int; + Int32.of_string "0x12345678", Int32.of_string "0x12345678"]); + test 7 true + (test_setget int64 + [Int64.zero, Int64.zero; + Int64.of_int 123, Int64.of_int 123; + Int64.of_int (-456), Int64.of_int (-456); + Int64.max_int, Int64.max_int; + Int64.min_int, Int64.min_int; + Int64.of_string "0x123456789ABCDEF0", + Int64.of_string "0x123456789ABCDEF0"]); + test 8 true + (test_setget nativeint + [Nativeint.zero, Nativeint.zero; + Nativeint.of_int 123, Nativeint.of_int 123; + Nativeint.of_int (-456), Nativeint.of_int (-456); + Nativeint.max_int, Nativeint.max_int; + Nativeint.min_int, Nativeint.min_int; + Nativeint.of_string "0x12345678", + Nativeint.of_string "0x12345678"]); + test 9 true + (test_setget float32 + [0.0, 0.0; + 4.0, 4.0; + -0.5, -0.5; + 655360.0, 655360.0]); + test 10 true + (test_setget float64 + [0.0, 0.0; + 4.0, 4.0; + -0.5, -0.5; + 1.2345678, 1.2345678; + 3.1415e10, 3.1415e10]); + test 11 true + (test_setget complex32 + [Complex.zero, Complex.zero; + Complex.one, Complex.one; + Complex.i, Complex.i; + {im = 0.5; re = -2.0}, {im = 0.5; re = -2.0}]); + test 12 true + (test_setget complex64 + [Complex.zero, Complex.zero; + Complex.one, Complex.one; + Complex.i, Complex.i; + {im=0.5;re= -2.0}, {im=0.5;re= -2.0}; + {im=3.1415;re=1.2345678}, {im=3.1415;re=1.2345678}]); + + let from_list kind vals = + let a = Array1.create kind c_layout (List.length vals) in + let rec set i = function + [] -> () + | hd :: tl -> a.{i} <- hd; set (i+1) tl in + set 0 vals; + a in + let from_list_fortran kind vals = + let a = Array1.create kind fortran_layout (List.length vals) in + let rec set i = function + [] -> () + | hd :: tl -> a.{i} <- hd; set (i+1) tl in + set 1 vals; + a in + + testing_function "set/get (specialized)"; + let a = Array1.create int c_layout 3 in + for i = 0 to 2 do a.{i} <- i done; + for i = 0 to 2 do test (i+1) a.{i} i done; + test 4 true (try ignore a.{3}; false with Invalid_argument _ -> true); + test 5 true (try ignore a.{-1}; false with Invalid_argument _ -> true); + + let b = Array1.create float64 fortran_layout 3 in + for i = 1 to 3 do b.{i} <- float i done; + for i = 1 to 3 do test (5 + i) b.{i} (float i) done; + test 8 true (try ignore b.{4}; false with Invalid_argument _ -> true); + test 9 true (try ignore b.{0}; false with Invalid_argument _ -> true); + + let c = Array1.create complex64 c_layout 3 in + for i = 0 to 2 do c.{i} <- {re=float i; im=0.0} done; + for i = 0 to 2 do test (10 + i) c.{i} {re=float i; im=0.0} done; + test 13 true (try ignore c.{3}; false with Invalid_argument _ -> true); + test 14 true (try ignore c.{-1}; false with Invalid_argument _ -> true); + + let d = Array1.create complex32 fortran_layout 3 in + for i = 1 to 3 do d.{i} <- {re=float i; im=0.0} done; + for i = 1 to 3 do test (14 + i) d.{i} {re=float i; im=0.0} done; + test 18 true (try ignore d.{4}; false with Invalid_argument _ -> true); + test 19 true (try ignore d.{0}; false with Invalid_argument _ -> true); + + testing_function "set/get (unsafe, specialized)"; + let a = Array1.create int c_layout 3 in + for i = 0 to 2 do Array1.unsafe_set a i i done; + for i = 0 to 2 do test (i+1) (Array1.unsafe_get a i) i done; + + let b = Array1.create float64 fortran_layout 3 in + for i = 1 to 3 do Array1.unsafe_set b i (float i) done; + for i = 1 to 3 do test (5 + i) (Array1.unsafe_get b i) (float i) done; + + testing_function "comparisons"; + let normalize_comparison n = + if n = 0 then 0 else if n < 0 then -1 else 1 in + test 1 0 (normalize_comparison (compare + (from_list int8_signed [1;2;3;-4;127;-128]) + (from_list int8_signed [1;2;3;-4;127;-128]))); + test 2 (-1) (normalize_comparison (compare + (from_list int8_signed [1;2;3;-4;127;-128]) + (from_list int8_signed [1;2;3;4;127;-128]))); + test 3 1 (normalize_comparison (compare + (from_list int8_signed [1;2;3;-4;127;-128]) + (from_list int8_signed [1;2;3;-4;42;-128]))); + test 4 (-1) (normalize_comparison (compare + (from_list int8_signed [1;2;3;-4]) + (from_list int8_signed [1;2;3;4;127;-128]))); + test 5 1 (normalize_comparison (compare + (from_list int8_signed [1;2;3;4;127;-128]) + (from_list int8_signed [1;2;3;-4]))); + + test 6 0 (normalize_comparison (compare + (from_list int8_unsigned [1;2;3;-4;127;-128]) + (from_list int8_unsigned [1;2;3;-4;127;-128]))); + test 7 1 (normalize_comparison (compare + (from_list int8_unsigned [1;2;3;-4;127;-128]) + (from_list int8_unsigned [1;2;3;4;127;-128]))); + test 8 1 (normalize_comparison (compare + (from_list int8_unsigned [1;2;3;-4;127;-128]) + (from_list int8_unsigned [1;2;3;-4;42;-128]))); + + test 9 0 (normalize_comparison (compare + (from_list int16_signed [1;2;3;-4;127;-128]) + (from_list int16_signed [1;2;3;-4;127;-128]))); + test 10 (-1) (normalize_comparison (compare + (from_list int16_signed [1;2;3;-4;127;-128]) + (from_list int16_signed [1;2;3;4;127;-128]))); + test 11 1 (normalize_comparison (compare + (from_list int16_signed [1;2;3;-4;127;-128]) + (from_list int16_signed [1;2;3;-4;42;-128]))); + + test 12 0 (normalize_comparison (compare + (from_list int16_unsigned [1;2;3;-4;127;-128]) + (from_list int16_unsigned [1;2;3;-4;127;-128]))); + test 13 (-1) (normalize_comparison (compare + (from_list int16_unsigned [1;2;3;4;127;-128]) + (from_list int16_unsigned [1;2;3;0xFFFF;127;-128]))); + test 14 1 (normalize_comparison (compare + (from_list int16_unsigned [1;2;3;-4;127;-128]) + (from_list int16_unsigned [1;2;3;-4;42;-128]))); + + test 15 0 (normalize_comparison (compare + (from_list int [1;2;3;-4;127;-128]) + (from_list int [1;2;3;-4;127;-128]))); + test 16 (-1) (normalize_comparison (compare + (from_list int [1;2;3;-4;127;-128]) + (from_list int [1;2;3;4;127;-128]))); + test 17 1 (normalize_comparison (compare + (from_list int [1;2;3;-4;127;-128]) + (from_list int [1;2;3;-4;42;-128]))); + + test 18 0 (normalize_comparison (compare + (from_list int32 (List.map Int32.of_int [1;2;3;-4;127;-128])) + (from_list int32 (List.map Int32.of_int [1;2;3;-4;127;-128])))); + test 19 (-1) (normalize_comparison (compare + (from_list int32 (List.map Int32.of_int [1;2;3;-4;127;-128])) + (from_list int32 (List.map Int32.of_int [1;2;3;4;127;-128])))); + test 20 1 (normalize_comparison (compare + (from_list int32 (List.map Int32.of_int [1;2;3;-4;127;-128])) + (from_list int32 (List.map Int32.of_int [1;2;3;-4;42;-128])))); + + test 21 0 (normalize_comparison (compare + (from_list int64 (List.map Int64.of_int [1;2;3;-4;127;-128])) + (from_list int64 (List.map Int64.of_int [1;2;3;-4;127;-128])))); + test 22 (-1) (normalize_comparison (compare + (from_list int64 (List.map Int64.of_int [1;2;3;-4;127;-128])) + (from_list int64 (List.map Int64.of_int [1;2;3;4;127;-128])))); + test 23 1 (normalize_comparison (compare + (from_list int64 (List.map Int64.of_int [1;2;3;-4;127;-128])) + (from_list int64 (List.map Int64.of_int [1;2;3;-4;42;-128])))); + + test 24 0 (normalize_comparison (compare + (from_list nativeint (List.map Nativeint.of_int [1;2;3;-4;127;-128])) + (from_list nativeint (List.map Nativeint.of_int [1;2;3;-4;127;-128])))); + test 25 (-1) (normalize_comparison (compare + (from_list nativeint (List.map Nativeint.of_int [1;2;3;-4;127;-128])) + (from_list nativeint (List.map Nativeint.of_int [1;2;3;4;127;-128])))); + test 26 1 (normalize_comparison (compare + (from_list nativeint (List.map Nativeint.of_int [1;2;3;-4;127;-128])) + (from_list nativeint (List.map Nativeint.of_int [1;2;3;-4;42;-128])))); + + test 27 0 (normalize_comparison (compare + (from_list float32 [0.0; 0.25; -4.0; 3.141592654]) + (from_list float32 [0.0; 0.25; -4.0; 3.141592654]))); + test 28 (-1) (normalize_comparison (compare + (from_list float32 [0.0; 0.25; -4.0]) + (from_list float32 [0.0; 0.25; 3.14159]))); + test 29 1 (normalize_comparison (compare + (from_list float32 [0.0; 2.718; -4.0]) + (from_list float32 [0.0; 0.25; 3.14159]))); + + test 30 0 (normalize_comparison (compare + (from_list float64 [0.0; 0.25; -4.0; 3.141592654]) + (from_list float64 [0.0; 0.25; -4.0; 3.141592654]))); + test 31 (-1) (normalize_comparison (compare + (from_list float64 [0.0; 0.25; -4.0]) + (from_list float64 [0.0; 0.25; 3.14159]))); + test 32 1 (normalize_comparison (compare + (from_list float64 [0.0; 2.718; -4.0]) + (from_list float64 [0.0; 0.25; 3.14159]))); + + test 44 0 (normalize_comparison (compare + (from_list complex32 [Complex.zero; Complex.one; Complex.i]) + (from_list complex32 [Complex.zero; Complex.one; Complex.i]))); + test 45 (-1) (normalize_comparison (compare + (from_list complex32 [Complex.zero; Complex.one; Complex.i]) + (from_list complex32 [Complex.zero; Complex.one; Complex.one]))); + test 46 1 (normalize_comparison (compare + (from_list complex32 [Complex.zero; Complex.one; Complex.one]) + (from_list complex32 [Complex.zero; Complex.one; Complex.i]))); + + test 47 0 (normalize_comparison (compare + (from_list complex64 [Complex.zero; Complex.one; Complex.i]) + (from_list complex64 [Complex.zero; Complex.one; Complex.i]))); + test 48 (-1) (normalize_comparison (compare + (from_list complex64 [Complex.zero; Complex.one; Complex.i]) + (from_list complex64 [Complex.zero; Complex.one; Complex.one]))); + test 49 1 (normalize_comparison (compare + (from_list complex64 [Complex.zero; Complex.one; Complex.one]) + (from_list complex64 [Complex.zero; Complex.one; Complex.i]))); + + testing_function "dim"; + test 1 (Array1.dim (from_list int [1;2;3;4;5])) 5; + test 2 (Array1.dim (from_list_fortran int [1;2;3])) 3; + + testing_function "kind & layout"; + let a = from_list int [1;2;3] in + test 1 (Array1.kind a) int; + test 2 (Array1.layout a) c_layout; + let a = from_list_fortran float32 [1.0;2.0;3.0] in + test 1 (Array1.kind a) float32; + test 2 (Array1.layout a) fortran_layout; + + testing_function "sub"; + let a = from_list int [1;2;3;4;5;6;7;8] in + test 1 (Array1.sub a 2 5) + (from_list int [3;4;5;6;7]); + test 2 (Array1.sub a 0 2) + (from_list int [1;2]); + test 3 (Array1.sub a 0 8) + (from_list int [1;2;3;4;5;6;7;8]); + let a = from_list float64 [1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0] in + test 4 (Array1.sub a 2 5) + (from_list float64 [3.0;4.0;5.0;6.0;7.0]); + test 5 (Array1.sub a 0 2) + (from_list float64 [1.0;2.0]); + test 6 (Array1.sub a 0 8) + (from_list float64 [1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0]); + let a = from_list_fortran float64 [1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0] in + test 7 (Array1.sub a 2 5) + (from_list_fortran float64 [2.0;3.0;4.0;5.0;6.0]); + test 8 (Array1.sub a 1 2) + (from_list_fortran float64 [1.0;2.0]); + test 9 (Array1.sub a 1 8) + (from_list_fortran float64 [1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0]); + Gc.full_major(); (* test GC of proxies *) + + testing_function "blit, fill"; + let test_blit_fill kind data initval ofs len = + let a = from_list kind data in + let b = Array1.create kind c_layout (List.length data) in + Array1.blit a b; + (a = b) && + (Array1.fill (Array1.sub b ofs len) initval; + let rec check i = function + [] -> true + | hd :: tl -> b.{i} = (if i >= ofs && i < ofs + len + then initval else hd) + && check (i+1) tl + in check 0 data) in + test 1 true (test_blit_fill int8_signed [1;2;5;8;-100;127] 7 3 2); + test 2 true (test_blit_fill int8_unsigned [1;2;5;8;-100;212] 7 3 2); + test 3 true (test_blit_fill int16_signed [1;2;5;8;-100;212] 7 3 2); + test 4 true (test_blit_fill int16_unsigned [1;2;5;8;-100;212] 7 3 2); + test 5 true (test_blit_fill int [1;2;5;8;-100;212] 7 3 2); + test 6 true (test_blit_fill int32 (List.map Int32.of_int [1;2;5;8;-100;212]) + (Int32.of_int 7) 3 2); + test 7 true (test_blit_fill int64 (List.map Int64.of_int [1;2;5;8;-100;212]) + (Int64.of_int 7) 3 2); + test 8 true (test_blit_fill nativeint + (List.map Nativeint.of_int [1;2;5;8;-100;212]) + (Nativeint.of_int 7) 3 2); + test 9 true (test_blit_fill float32 [1.0;2.0;0.5;0.125;256.0;512.0] + 0.25 3 2); + test 10 true (test_blit_fill float64 [1.0;2.0;5.0;8.123;-100.456;212e19] + 3.1415 3 2); + test 11 true (test_blit_fill complex32 [Complex.zero; Complex.one; Complex.i] + Complex.i 1 1); + test 12 true (test_blit_fill complex64 [Complex.zero; Complex.one; Complex.i] + Complex.i 1 1); + +(* Bi-dimensional arrays *) + + print_newline(); + testing_function "------ Array2 --------"; + testing_function "create/set/get"; + let make_array2 kind layout ind0 dim1 dim2 fromint = + let a = Array2.create kind layout dim1 dim2 in + for i = ind0 to dim1 - 1 + ind0 do + for j = ind0 to dim2 - 1 + ind0 do + a.{i,j} <- (fromint (i * 1000 + j)) + done + done; + a in + let check_array2 a ind0 dim1 dim2 fromint = + try + for i = ind0 to dim1 - 1 + ind0 do + for j = ind0 to dim2 - 1 + ind0 do + if a.{i,j} <> (fromint (i * 1000 + j)) then raise Exit + done + done; + true + with Exit -> false in + let id x = x in + test 1 true + (check_array2 (make_array2 int16_signed c_layout 0 10 20 id) 0 10 20 id); + test 2 true + (check_array2 (make_array2 int c_layout 0 10 20 id) 0 10 20 id); + test 3 true + (check_array2 (make_array2 int32 c_layout 0 10 20 Int32.of_int) + 0 10 20 Int32.of_int); + test 4 true + (check_array2 (make_array2 float32 c_layout 0 10 20 float) + 0 10 20 float); + test 5 true + (check_array2 (make_array2 float64 c_layout 0 10 20 float) + 0 10 20 float); + test 6 true + (check_array2 (make_array2 int16_signed fortran_layout 1 10 20 id) 1 10 20 id); + test 7 true + (check_array2 (make_array2 int fortran_layout 1 10 20 id) 1 10 20 id); + test 8 true + (check_array2 (make_array2 int32 fortran_layout 1 10 20 Int32.of_int) + 1 10 20 Int32.of_int); + test 9 true + (check_array2 (make_array2 float32 fortran_layout 1 10 20 float) + 1 10 20 float); + test 10 true + (check_array2 (make_array2 float64 fortran_layout 1 10 20 float) + 1 10 20 float); + let makecomplex i = {re = float i; im = float (-i)} in + test 11 true + (check_array2 (make_array2 complex32 c_layout 0 10 20 makecomplex) + 0 10 20 makecomplex); + test 12 true + (check_array2 (make_array2 complex64 c_layout 0 10 20 makecomplex) + 0 10 20 makecomplex); + test 13 true + (check_array2 (make_array2 complex32 fortran_layout 1 10 20 makecomplex) + 1 10 20 makecomplex); + test 14 true + (check_array2 (make_array2 complex64 fortran_layout 1 10 20 makecomplex) + 1 10 20 makecomplex); + + testing_function "set/get (specialized)"; + let a = Array2.create int16_signed c_layout 3 3 in + for i = 0 to 2 do for j = 0 to 2 do a.{i,j} <- i-j done done; + let ok = ref true in + for i = 0 to 2 do + for j = 0 to 2 do if a.{i,j} <> i-j then ok := false done + done; + test 1 true !ok; + test 2 true (try ignore a.{3,0}; false with Invalid_argument _ -> true); + test 3 true (try ignore a.{-1,0}; false with Invalid_argument _ -> true); + test 4 true (try ignore a.{0,3}; false with Invalid_argument _ -> true); + test 5 true (try ignore a.{0,-1}; false with Invalid_argument _ -> true); + + let b = Array2.create float32 fortran_layout 3 3 in + for i = 1 to 3 do for j = 1 to 3 do b.{i,j} <- float(i-j) done done; + let ok = ref true in + for i = 1 to 3 do + for j = 1 to 3 do if b.{i,j} <> float(i-j) then ok := false done + done; + test 6 true !ok; + test 7 true (try ignore b.{4,1}; false with Invalid_argument _ -> true); + test 8 true (try ignore b.{0,1}; false with Invalid_argument _ -> true); + test 9 true (try ignore b.{1,4}; false with Invalid_argument _ -> true); + test 10 true (try ignore b.{1,0}; false with Invalid_argument _ -> true); + + testing_function "set/get (unsafe, specialized)"; + let a = Array2.create int16_signed c_layout 3 3 in + for i = 0 to 2 do for j = 0 to 2 do Array2.unsafe_set a i j (i-j) done done; + let ok = ref true in + for i = 0 to 2 do + for j = 0 to 2 do if Array2.unsafe_get a i j <> i-j then ok := false done + done; + test 1 true !ok; + + let b = Array2.create float32 fortran_layout 3 3 in + for i = 1 to 3 do for j = 1 to 3 do Array2.unsafe_set b i j (float(i-j)) done done; + let ok = ref true in + for i = 1 to 3 do + for j = 1 to 3 do if Array2.unsafe_get b i j <> float(i-j) then ok := false done + done; + test 2 true !ok; + + testing_function "dim"; + let a = (make_array2 int c_layout 0 4 6 id) in + test 1 (Array2.dim1 a) 4; + test 2 (Array2.dim2 a) 6; + let b = (make_array2 int fortran_layout 1 4 6 id) in + test 3 (Array2.dim1 b) 4; + test 4 (Array2.dim2 b) 6; + + testing_function "sub"; + let a = make_array2 int c_layout 0 5 3 id in + let b = Array2.sub_left a 2 2 in + test 1 true + (b.{0,0} = 2000 && + b.{0,1} = 2001 && + b.{0,2} = 2002 && + b.{1,0} = 3000 && + b.{1,1} = 3001 && + b.{1,2} = 3002); + let a = make_array2 int fortran_layout 1 5 3 id in + let b = Array2.sub_right a 2 2 in + test 2 true + (b.{1,1} = 1002 && + b.{1,2} = 1003 && + b.{2,1} = 2002 && + b.{2,2} = 2003 && + b.{3,1} = 3002 && + b.{3,2} = 3003 && + b.{4,1} = 4002 && + b.{4,2} = 4003 && + b.{5,1} = 5002 && + b.{5,2} = 5003); + + testing_function "slice"; + let a = make_array2 int c_layout 0 5 3 id in + test 1 (Array2.slice_left a 0) (from_list int [0;1;2]); + test 2 (Array2.slice_left a 1) (from_list int [1000;1001;1002]); + test 3 (Array2.slice_left a 2) (from_list int [2000;2001;2002]); + test 4 (Array2.slice_left a 3) (from_list int [3000;3001;3002]); + test 5 (Array2.slice_left a 4) (from_list int [4000;4001;4002]); + let a = make_array2 int fortran_layout 1 5 3 id in + test 6 (Array2.slice_right a 1) (from_list_fortran int [1001;2001;3001;4001;5001]); + test 7 (Array2.slice_right a 2) (from_list_fortran int [1002;2002;3002;4002;5002]); + test 8 (Array2.slice_right a 3) (from_list_fortran int [1003;2003;3003;4003;5003]); + +(* Tri-dimensional arrays *) + + print_newline(); + testing_function "------ Array3 --------"; + testing_function "create/set/get"; + let make_array3 kind layout ind0 dim1 dim2 dim3 fromint = + let a = Array3.create kind layout dim1 dim2 dim3 in + for i = ind0 to dim1 - 1 + ind0 do + for j = ind0 to dim2 - 1 + ind0 do + for k = ind0 to dim3 - 1 + ind0 do + a.{i, j, k} <- (fromint (i * 100 + j * 10 + k)) + done + done + done; + a in + let check_array3 a ind0 dim1 dim2 dim3 fromint = + try + for i = ind0 to dim1 - 1 + ind0 do + for j = ind0 to dim2 - 1 + ind0 do + for k = ind0 to dim3 - 1 + ind0 do + if a.{i, j, k} <> (fromint (i * 100 + j * 10 + k)) + then raise Exit + done + done + done; + true + with Exit -> false in + let id x = x in + test 1 true + (check_array3 (make_array3 int16_signed c_layout 0 4 5 6 id) 0 4 5 6 id); + test 2 true + (check_array3 (make_array3 int c_layout 0 4 5 6 id) 0 4 5 6 id); + test 3 true + (check_array3 (make_array3 int32 c_layout 0 4 5 6 Int32.of_int) + 0 4 5 6 Int32.of_int); + test 4 true + (check_array3 (make_array3 float32 c_layout 0 4 5 6 float) + 0 4 5 6 float); + test 5 true + (check_array3 (make_array3 float64 c_layout 0 4 5 6 float) + 0 4 5 6 float); + test 6 true + (check_array3 (make_array3 int16_signed fortran_layout 1 4 5 6 id) 1 4 5 6 id); + test 7 true + (check_array3 (make_array3 int fortran_layout 1 4 5 6 id) 1 4 5 6 id); + test 8 true + (check_array3 (make_array3 int32 fortran_layout 1 4 5 6 Int32.of_int) + 1 4 5 6 Int32.of_int); + test 9 true + (check_array3 (make_array3 float32 fortran_layout 1 4 5 6 float) + 1 4 5 6 float); + test 10 true + (check_array3 (make_array3 float64 fortran_layout 1 4 5 6 float) + 1 4 5 6 float); + test 11 true + (check_array3 (make_array3 complex32 c_layout 0 4 5 6 makecomplex) + 0 4 5 6 makecomplex); + test 12 true + (check_array3 (make_array3 complex64 c_layout 0 4 5 6 makecomplex) + 0 4 5 6 makecomplex); + test 13 true + (check_array3 (make_array3 complex32 fortran_layout 1 4 5 6 makecomplex) + 1 4 5 6 makecomplex); + test 14 true + (check_array3 (make_array3 complex64 fortran_layout 1 4 5 6 makecomplex) + 1 4 5 6 makecomplex); + + + testing_function "set/get (specialized)"; + let a = Array3.create int32 c_layout 2 3 4 in + for i = 0 to 1 do for j = 0 to 2 do for k = 0 to 3 do + a.{i,j,k} <- Int32.of_int((i lsl 4) + (j lsl 2) + k) + done done done; + let ok = ref true in + for i = 0 to 1 do for j = 0 to 2 do for k = 0 to 3 do + if Int32.to_int a.{i,j,k} <> (i lsl 4) + (j lsl 2) + k then ok := false + done done done; + test 1 true !ok; + + let b = Array3.create int64 fortran_layout 2 3 4 in + for i = 1 to 2 do for j = 1 to 3 do for k = 1 to 4 do + b.{i,j,k} <- Int64.of_int((i lsl 4) + (j lsl 2) + k) + done done done; + let ok = ref true in + for i = 1 to 2 do for j = 1 to 3 do for k = 1 to 4 do + if Int64.to_int b.{i,j,k} <> (i lsl 4) + (j lsl 2) + k then ok := false + done done done; + test 2 true !ok; + + testing_function "set/get (unsafe, specialized)"; + let a = Array3.create int32 c_layout 2 3 4 in + for i = 0 to 1 do for j = 0 to 2 do for k = 0 to 3 do + Array3.unsafe_set a i j k (Int32.of_int((i lsl 4) + (j lsl 2) + k)) + done done done; + let ok = ref true in + for i = 0 to 1 do for j = 0 to 2 do for k = 0 to 3 do + if Int32.to_int (Array3.unsafe_get a i j k) <> (i lsl 4) + (j lsl 2) + k then ok := false + done done done; + test 1 true !ok; + + testing_function "dim"; + let a = (make_array3 int c_layout 0 4 5 6 id) in + test 1 (Array3.dim1 a) 4; + test 2 (Array3.dim2 a) 5; + test 3 (Array3.dim3 a) 6; + let b = (make_array3 int fortran_layout 1 4 5 6 id) in + test 4 (Array3.dim1 b) 4; + test 5 (Array3.dim2 b) 5; + test 6 (Array3.dim3 b) 6; + + testing_function "slice1"; + let a = make_array3 int c_layout 0 3 3 3 id in + test 1 (Array3.slice_left_1 a 0 0) (from_list int [0;1;2]); + test 2 (Array3.slice_left_1 a 0 1) (from_list int [10;11;12]); + test 3 (Array3.slice_left_1 a 0 2) (from_list int [20;21;22]); + test 4 (Array3.slice_left_1 a 1 1) (from_list int [110;111;112]); + test 5 (Array3.slice_left_1 a 2 1) (from_list int [210;211;212]); + let a = make_array3 int fortran_layout 1 3 3 3 id in + test 6 (Array3.slice_right_1 a 1 2) (from_list_fortran int [112;212;312]); + test 7 (Array3.slice_right_1 a 3 1) (from_list_fortran int [131;231;331]); + +(* Reshaping *) + print_newline(); + testing_function "------ Reshaping --------"; + testing_function "reshape_1"; + let a = make_array2 int c_layout 0 3 4 id in + let b = make_array2 int fortran_layout 1 3 4 id in + let c = reshape_1 (genarray_of_array2 a) 12 in + test 1 c (from_list int [0;1;2;3;1000;1001;1002;1003;2000;2001;2002;2003]); + let d = reshape_1 (genarray_of_array2 b) 12 in + test 2 d (from_list_fortran int [1001;2001;3001;1002;2002;3002;1003;2003;3003;1004;2004;3004]); + testing_function "reshape_2"; + let c = reshape_2 (genarray_of_array2 a) 4 3 in + test 1 (Array2.slice_left c 0) (from_list int [0;1;2]); + test 2 (Array2.slice_left c 1) (from_list int [3;1000;1001]); + test 3 (Array2.slice_left c 2) (from_list int [1002;1003;2000]); + test 4 (Array2.slice_left c 3) (from_list int [2001;2002;2003]); + let d = reshape_2 (genarray_of_array2 b) 4 3 in + test 5 (Array2.slice_right d 1) (from_list_fortran int [1001;2001;3001;1002]); + test 6 (Array2.slice_right d 2) (from_list_fortran int [2002;3002;1003;2003]); + test 7 (Array2.slice_right d 3) (from_list_fortran int [3003;1004;2004;3004]); + +(* I/O *) + + print_newline(); + testing_function "------ I/O --------"; + testing_function "output_value/input_value"; + let test_structured_io testno value = + let tmp = Filename.temp_file "bigarray" ".data" in + let oc = open_out_bin tmp in + output_value oc value; + close_out oc; + let ic = open_in_bin tmp in + let value' = input_value ic in + close_in ic; + Sys.remove tmp; + test testno value value' in + test_structured_io 1 (from_list int8_signed [1;2;3;-4;127;-128]); + test_structured_io 2 (from_list int16_signed [1;2;3;-4;127;-128]); + test_structured_io 3 (from_list int [1;2;3;-4;127;-128]); + test_structured_io 4 + (from_list int32 (List.map Int32.of_int [1;2;3;-4;127;-128])); + test_structured_io 5 + (from_list int64 (List.map Int64.of_int [1;2;3;-4;127;-128])); + test_structured_io 6 + (from_list nativeint (List.map Nativeint.of_int [1;2;3;-4;127;-128])); + test_structured_io 7 (from_list float32 [0.0; 0.25; -4.0; 3.141592654]); + test_structured_io 8 (from_list float64 [0.0; 0.25; -4.0; 3.141592654]); + test_structured_io 9 (make_array2 int c_layout 0 100 100 id); + test_structured_io 10 (make_array2 float64 fortran_layout 1 200 200 float); + test_structured_io 11 (make_array3 int32 c_layout 0 20 30 40 Int32.of_int); + test_structured_io 12 (make_array3 float32 fortran_layout 1 10 50 100 float); + test_structured_io 13 (make_array2 complex32 c_layout 0 100 100 makecomplex); + test_structured_io 14 (make_array3 complex64 fortran_layout 1 10 20 30 makecomplex); + + testing_function "map_file"; + let mapped_file = Filename.temp_file "bigarray" ".data" in + begin + let fd = + Unix.openfile mapped_file + [Unix.O_RDWR; Unix.O_TRUNC; Unix.O_CREAT] 0o666 in + let a = Array1.map_file fd float64 c_layout true 10000 in + Unix.close fd; + for i = 0 to 9999 do a.{i} <- float i done; + let fd = Unix.openfile mapped_file [Unix.O_RDONLY] 0 in + let b = Array2.map_file fd float64 fortran_layout false 100 (-1) in + Unix.close fd; + let ok = ref true in + for i = 0 to 99 do + for j = 0 to 99 do + if b.{j+1,i+1} <> float (100 * i + j) then ok := false + done + done; + test 1 !ok true; + b.{50,50} <- (-1.0); + let fd = Unix.openfile mapped_file [Unix.O_RDONLY] 0 in + let c = Array2.map_file fd float64 c_layout false (-1) 100 in + Unix.close fd; + let ok = ref true in + for i = 0 to 99 do + for j = 0 to 99 do + if c.{i,j} <> float (100 * i + j) then ok := false + done + done; + test 2 !ok true; + let fd = Unix.openfile mapped_file [Unix.O_RDONLY] 0 in + let c = Array2.map_file fd ~pos:800L float64 c_layout false (-1) 100 in + Unix.close fd; + let ok = ref true in + for i = 1 to 99 do + for j = 0 to 99 do + if c.{i-1,j} <> float (100 * i + j) then ok := false + done + done; + test 3 !ok true; + let fd = Unix.openfile mapped_file [Unix.O_RDONLY] 0 in + let c = Array2.map_file fd ~pos:79200L float64 c_layout false (-1) 100 in + Unix.close fd; + let ok = ref true in + for j = 0 to 99 do + if c.{0,j} <> float (100 * 99 + j) then ok := false + done; + test 4 !ok true + end; + (* Force garbage collection of the mapped bigarrays above, otherwise + Win32 doesn't let us erase the file. Notice the begin...end above + so that the VM doesn't keep stack references to the mapped bigarrays. *) + Gc.full_major(); + Sys.remove mapped_file; + + () + +(********* End of test *********) + +let _ = + print_newline(); + if !error_occurred then begin + prerr_endline "************* TEST FAILED ****************"; exit 2 + end else + exit 0 diff --git a/testsuite/tests/lib-bigarray/bigarrays.reference b/testsuite/tests/lib-bigarray/bigarrays.reference new file mode 100644 index 00000000..bdc7beae --- /dev/null +++ b/testsuite/tests/lib-bigarray/bigarrays.reference @@ -0,0 +1,61 @@ + +------ Array1 -------- + +create/set/get + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... +set/get (specialized) + 1... 2... 3... 4... 5... 6... 7... 8... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... +set/get (unsafe, specialized) + 1... 2... 3... 6... 7... 8... +comparisons + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... 23... 24... 25... 26... 27... 28... 29... 30... 31... 32... 44... 45... 46... 47... 48... 49... +dim + 1... 2... +kind & layout + 1... 2... 1... 2... +sub + 1... 2... 3... 4... 5... 6... 7... 8... 9... +blit, fill + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... + +------ Array2 -------- + +create/set/get + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... +set/get (specialized) + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... +set/get (unsafe, specialized) + 1... 2... +dim + 1... 2... 3... 4... +sub + 1... 2... +slice + 1... 2... 3... 4... 5... 6... 7... 8... + +------ Array3 -------- + +create/set/get + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... +set/get (specialized) + 1... 2... +set/get (unsafe, specialized) + 1... +dim + 1... 2... 3... 4... 5... 6... +slice1 + 1... 2... 3... 4... 5... 6... 7... + +------ Reshaping -------- + +reshape_1 + 1... 2... +reshape_2 + 1... 2... 3... 4... 5... 6... 7... + +------ I/O -------- + +output_value/input_value + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... +map_file + 1... 2... 3... 4... diff --git a/testsuite/tests/lib-bigarray/fftba.ml b/testsuite/tests/lib-bigarray/fftba.ml new file mode 100644 index 00000000..a772876e --- /dev/null +++ b/testsuite/tests/lib-bigarray/fftba.ml @@ -0,0 +1,197 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: fftba.ml 2938 2000-03-10 14:54:41Z xleroy $ *) + +open Bigarray + +let pi = 3.14159265358979323846 + +let tpi = 2.0 *. pi + +let fft (px : (float, float64_elt, c_layout) Array1.t) + (py : (float, float64_elt, c_layout) Array1.t) np = + let i = ref 2 in + let m = ref 1 in + + while (!i < np) do + i := !i + !i; + m := !m + 1 + done; + + let n = !i in + + if n <> np then begin + for i = np+1 to n do + px.{i} <- 0.0; + py.{i} <- 0.0 + done; + print_string "Use "; print_int n; + print_string " point fft"; print_newline() + end; + + let n2 = ref(n+n) in + for k = 1 to !m-1 do + n2 := !n2 / 2; + let n4 = !n2 / 4 in + let e = tpi /. float !n2 in + + for j = 1 to n4 do + let a = e *. float(j - 1) in + let a3 = 3.0 *. a in + let cc1 = cos(a) in + let ss1 = sin(a) in + let cc3 = cos(a3) in + let ss3 = sin(a3) in + let is = ref j in + let id = ref(2 * !n2) in + + while !is < n do + let i0r = ref !is in + while !i0r < n do + let i0 = !i0r in + let i1 = i0 + n4 in + let i2 = i1 + n4 in + let i3 = i2 + n4 in + let r1 = px.{i0} -. px.{i2} in + px.{i0} <- px.{i0} +. px.{i2}; + let r2 = px.{i1} -. px.{i3} in + px.{i1} <- px.{i1} +. px.{i3}; + let s1 = py.{i0} -. py.{i2} in + py.{i0} <- py.{i0} +. py.{i2}; + let s2 = py.{i1} -. py.{i3} in + py.{i1} <- py.{i1} +. py.{i3}; + let s3 = r1 -. s2 in + let r1 = r1 +. s2 in + let s2 = r2 -. s1 in + let r2 = r2 +. s1 in + px.{i2} <- r1*.cc1 -. s2*.ss1; + py.{i2} <- -.s2*.cc1 -. r1*.ss1; + px.{i3} <- s3*.cc3 +. r2*.ss3; + py.{i3} <- r2*.cc3 -. s3*.ss3; + i0r := i0 + !id + done; + is := 2 * !id - !n2 + j; + id := 4 * !id + done + done + done; + +(************************************) +(* Last stage, length=2 butterfly *) +(************************************) + + let is = ref 1 in + let id = ref 4 in + + while !is < n do + let i0r = ref !is in + while !i0r <= n do + let i0 = !i0r in + let i1 = i0 + 1 in + let r1 = px.{i0} in + px.{i0} <- r1 +. px.{i1}; + px.{i1} <- r1 -. px.{i1}; + let r1 = py.{i0} in + py.{i0} <- r1 +. py.{i1}; + py.{i1} <- r1 -. py.{i1}; + i0r := i0 + !id + done; + is := 2 * !id - 1; + id := 4 * !id + done; + +(*************************) +(* Bit reverse counter *) +(*************************) + + let j = ref 1 in + + for i = 1 to n - 1 do + if i < !j then begin + let xt = px.{!j} in + px.{!j} <- px.{i}; + px.{i} <- xt; + let xt = py.{!j} in + py.{!j} <- py.{i}; + py.{i} <- xt + end; + let k = ref(n / 2) in + while !k < !j do + j := !j - !k; + k := !k / 2 + done; + j := !j + !k + done; + + n + + +let test np = + print_int np; print_string "... "; flush stdout; + let enp = float np in + let npm = np / 2 - 1 in + let pxr = Array1.create float64 c_layout (np+2) + and pxi = Array1.create float64 c_layout (np+2) in + let t = pi /. enp in + pxr.{1} <- (enp -. 1.0) *. 0.5; + pxi.{1} <- 0.0; + let n2 = np / 2 in + pxr.{n2+1} <- -0.5; + pxi.{n2+1} <- 0.0; + + for i = 1 to npm do + let j = np - i in + pxr.{i+1} <- -0.5; + pxr.{j+1} <- -0.5; + let z = t *. float i in + let y = -0.5 *. (cos(z)/.sin(z)) in + pxi.{i+1} <- y; + pxi.{j+1} <- -.y + done; +(** + print_newline(); + for i=0 to 15 do Printf.printf "%d %f %f\n" i pxr.{i+1} pxi.{i+1} done; +**) + let _ = fft pxr pxi np in +(** + for i=0 to 15 do Printf.printf "%d %f %f\n" i pxr.{i+1} pxi.{i+1} done; +**) + let zr = ref 0.0 in + let zi = ref 0.0 in + let kr = ref 0 in + let ki = ref 0 in + for i = 0 to np-1 do + let a = abs_float(pxr.{i+1} -. float i) in + if !zr < a then begin + zr := a; + kr := i + end; + let a = abs_float(pxi.{i+1}) in + if !zi < a then begin + zi := a; + ki := i + end + done; +(* + let zm = if abs_float !zr < abs_float !zi then !zi else !zr in + print_float zm; print_newline() +*) + if abs_float !zr <= 1e-9 && abs_float !zi <= 1e-9 + then print_string "ok" + else print_string "ERROR"; + print_newline() + + +let _ = + let np = ref 16 in for i = 1 to 13 do test !np; np := !np*2 done + diff --git a/testsuite/tests/lib-bigarray/fftba.reference b/testsuite/tests/lib-bigarray/fftba.reference new file mode 100644 index 00000000..71017f70 --- /dev/null +++ b/testsuite/tests/lib-bigarray/fftba.reference @@ -0,0 +1,13 @@ +16... ok +32... ok +64... ok +128... ok +256... ok +512... ok +1024... ok +2048... ok +4096... ok +8192... ok +16384... ok +32768... ok +65536... ok diff --git a/testsuite/tests/lib-digest/Makefile b/testsuite/tests/lib-digest/Makefile new file mode 100644 index 00000000..6d222274 --- /dev/null +++ b/testsuite/tests/lib-digest/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=md5 +ADD_COMPFLAGS=-w a + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-digest/md5.ml b/testsuite/tests/lib-digest/md5.ml new file mode 100644 index 00000000..6d4e6e06 --- /dev/null +++ b/testsuite/tests/lib-digest/md5.ml @@ -0,0 +1,221 @@ +(* Test int32 arithmetic and optimizations using the MD5 algorithm *) + +open Printf + +type context = + { buf: string; + mutable pos: int; + mutable a: int32; + mutable b: int32; + mutable c: int32; + mutable d: int32; + mutable bits: int64 } + +let step1 w x y z data s = + let w = + Int32.add (Int32.add w data) + (Int32.logxor z (Int32.logand x (Int32.logxor y z))) in + Int32.add x + (Int32.logor (Int32.shift_left w s) (Int32.shift_right_logical w (32-s))) + +let step2 w x y z data s = + let w = + Int32.add (Int32.add w data) + (Int32.logxor y (Int32.logand z (Int32.logxor x y))) in + Int32.add x + (Int32.logor (Int32.shift_left w s) (Int32.shift_right_logical w (32-s))) + +let step3 w x y z data s = + let w = + Int32.add (Int32.add w data) + (Int32.logxor x (Int32.logxor y z)) in + Int32.add x + (Int32.logor (Int32.shift_left w s) (Int32.shift_right_logical w (32-s))) + +let step4 w x y z data s = + let w = + Int32.add (Int32.add w data) + (Int32.logxor y (Int32.logor x (Int32.logxor z (-1l)))) in + Int32.add x + (Int32.logor (Int32.shift_left w s) (Int32.shift_right_logical w (32-s))) + +let transform ctx data = + let a = ctx.a and b = ctx.b and c = ctx.c and d = ctx.d in + + let a = step1 a b c d (Int32.add data.(0) 0xd76aa478l) 7 in + let d = step1 d a b c (Int32.add data.(1) 0xe8c7b756l) 12 in + let c = step1 c d a b (Int32.add data.(2) 0x242070dbl) 17 in + let b = step1 b c d a (Int32.add data.(3) 0xc1bdceeel) 22 in + let a = step1 a b c d (Int32.add data.(4) 0xf57c0fafl) 7 in + let d = step1 d a b c (Int32.add data.(5) 0x4787c62al) 12 in + let c = step1 c d a b (Int32.add data.(6) 0xa8304613l) 17 in + let b = step1 b c d a (Int32.add data.(7) 0xfd469501l) 22 in + let a = step1 a b c d (Int32.add data.(8) 0x698098d8l) 7 in + let d = step1 d a b c (Int32.add data.(9) 0x8b44f7afl) 12 in + let c = step1 c d a b (Int32.add data.(10) 0xffff5bb1l) 17 in + let b = step1 b c d a (Int32.add data.(11) 0x895cd7bel) 22 in + let a = step1 a b c d (Int32.add data.(12) 0x6b901122l) 7 in + let d = step1 d a b c (Int32.add data.(13) 0xfd987193l) 12 in + let c = step1 c d a b (Int32.add data.(14) 0xa679438el) 17 in + let b = step1 b c d a (Int32.add data.(15) 0x49b40821l) 22 in + + let a = step2 a b c d (Int32.add data.(1) 0xf61e2562l) 5 in + let d = step2 d a b c (Int32.add data.(6) 0xc040b340l) 9 in + let c = step2 c d a b (Int32.add data.(11) 0x265e5a51l) 14 in + let b = step2 b c d a (Int32.add data.(0) 0xe9b6c7aal) 20 in + let a = step2 a b c d (Int32.add data.(5) 0xd62f105dl) 5 in + let d = step2 d a b c (Int32.add data.(10) 0x02441453l) 9 in + let c = step2 c d a b (Int32.add data.(15) 0xd8a1e681l) 14 in + let b = step2 b c d a (Int32.add data.(4) 0xe7d3fbc8l) 20 in + let a = step2 a b c d (Int32.add data.(9) 0x21e1cde6l) 5 in + let d = step2 d a b c (Int32.add data.(14) 0xc33707d6l) 9 in + let c = step2 c d a b (Int32.add data.(3) 0xf4d50d87l) 14 in + let b = step2 b c d a (Int32.add data.(8) 0x455a14edl) 20 in + let a = step2 a b c d (Int32.add data.(13) 0xa9e3e905l) 5 in + let d = step2 d a b c (Int32.add data.(2) 0xfcefa3f8l) 9 in + let c = step2 c d a b (Int32.add data.(7) 0x676f02d9l) 14 in + let b = step2 b c d a (Int32.add data.(12) 0x8d2a4c8al) 20 in + + let a = step3 a b c d (Int32.add data.(5) 0xfffa3942l) 4 in + let d = step3 d a b c (Int32.add data.(8) 0x8771f681l) 11 in + let c = step3 c d a b (Int32.add data.(11) 0x6d9d6122l) 16 in + let b = step3 b c d a (Int32.add data.(14) 0xfde5380cl) 23 in + let a = step3 a b c d (Int32.add data.(1) 0xa4beea44l) 4 in + let d = step3 d a b c (Int32.add data.(4) 0x4bdecfa9l) 11 in + let c = step3 c d a b (Int32.add data.(7) 0xf6bb4b60l) 16 in + let b = step3 b c d a (Int32.add data.(10) 0xbebfbc70l) 23 in + let a = step3 a b c d (Int32.add data.(13) 0x289b7ec6l) 4 in + let d = step3 d a b c (Int32.add data.(0) 0xeaa127fal) 11 in + let c = step3 c d a b (Int32.add data.(3) 0xd4ef3085l) 16 in + let b = step3 b c d a (Int32.add data.(6) 0x04881d05l) 23 in + let a = step3 a b c d (Int32.add data.(9) 0xd9d4d039l) 4 in + let d = step3 d a b c (Int32.add data.(12) 0xe6db99e5l) 11 in + let c = step3 c d a b (Int32.add data.(15) 0x1fa27cf8l) 16 in + let b = step3 b c d a (Int32.add data.(2) 0xc4ac5665l) 23 in + + let a = step4 a b c d (Int32.add data.(0) 0xf4292244l) 6 in + let d = step4 d a b c (Int32.add data.(7) 0x432aff97l) 10 in + let c = step4 c d a b (Int32.add data.(14) 0xab9423a7l) 15 in + let b = step4 b c d a (Int32.add data.(5) 0xfc93a039l) 21 in + let a = step4 a b c d (Int32.add data.(12) 0x655b59c3l) 6 in + let d = step4 d a b c (Int32.add data.(3) 0x8f0ccc92l) 10 in + let c = step4 c d a b (Int32.add data.(10) 0xffeff47dl) 15 in + let b = step4 b c d a (Int32.add data.(1) 0x85845dd1l) 21 in + let a = step4 a b c d (Int32.add data.(8) 0x6fa87e4fl) 6 in + let d = step4 d a b c (Int32.add data.(15) 0xfe2ce6e0l) 10 in + let c = step4 c d a b (Int32.add data.(6) 0xa3014314l) 15 in + let b = step4 b c d a (Int32.add data.(13) 0x4e0811a1l) 21 in + let a = step4 a b c d (Int32.add data.(4) 0xf7537e82l) 6 in + let d = step4 d a b c (Int32.add data.(11) 0xbd3af235l) 10 in + let c = step4 c d a b (Int32.add data.(2) 0x2ad7d2bbl) 15 in + let b = step4 b c d a (Int32.add data.(9) 0xeb86d391l) 21 in + + ctx.a <- Int32.add ctx.a a; + ctx.b <- Int32.add ctx.b b; + ctx.c <- Int32.add ctx.c c; + ctx.d <- Int32.add ctx.d d + +let string_to_data s = + let data = Array.make 16 0l in + for i = 0 to 15 do + let j = i lsl 2 in + data.(i) <- + Int32.logor (Int32.shift_left (Int32.of_int (Char.code s.[j+3])) 24) + (Int32.logor (Int32.shift_left (Int32.of_int (Char.code s.[j+2])) 16) + (Int32.logor (Int32.shift_left (Int32.of_int (Char.code s.[j+1])) 8) + (Int32.of_int (Char.code s.[j])))) + done; + data + +let int32_to_string n s i = + s.[i+3] <- Char.chr (Int32.to_int (Int32.shift_right n 24) land 0xFF); + s.[i+2] <- Char.chr (Int32.to_int (Int32.shift_right n 16) land 0xFF); + s.[i+1] <- Char.chr (Int32.to_int (Int32.shift_right n 8) land 0xFF); + s.[i] <- Char.chr (Int32.to_int n land 0xFF) + +let init () = + { buf = String.create 64; + pos = 0; + a = 0x67452301l; + b = 0xefcdab89l; + c = 0x98badcfel; + d = 0x10325476l; + bits = 0L } + +let update ctx input ofs len = + let rec upd ofs len = + if len <= 0 then () else + if ctx.pos + len < 64 then begin + (* Just buffer the data *) + String.blit input ofs ctx.buf ctx.pos len; + ctx.pos <- ctx.pos + len + end else begin + (* Fill the buffer *) + let len' = 64 - ctx.pos in + if len' > 0 then String.blit input ofs ctx.buf ctx.pos len'; + (* Transform 64 bytes *) + transform ctx (string_to_data ctx.buf); + ctx.pos <- 0; + upd (ofs + len') (len - len') + end in + upd ofs len; + ctx.bits <- Int64.add ctx.bits (Int64.of_int (len lsl 3)) + + +let finish ctx = + let padding = String.make 64 '\000' in + padding.[0] <- '\x80'; + let numbits = ctx.bits in + if ctx.pos < 56 then begin + update ctx padding 0 (56 - ctx.pos) + end else begin + update ctx padding 0 (64 + 56 - ctx.pos) + end; + assert (ctx.pos = 56); + let data = string_to_data ctx.buf in + data.(14) <- (Int64.to_int32 numbits); + data.(15) <- (Int64.to_int32 (Int64.shift_right_logical numbits 32)); + transform ctx data; + let res = String.create 16 in + int32_to_string ctx.a res 0; + int32_to_string ctx.b res 4; + int32_to_string ctx.c res 8; + int32_to_string ctx.d res 12; + res + +let test s = + let ctx = init() in + update ctx s 0 (String.length s); + let res = finish ctx in + let exp = Digest.string s in + let ok = (res = exp) in + if not ok then Printf.printf "Failure for '%s'\n" s; + ok + +let time msg iter fn = + let start = Sys.time() in + for i = 1 to iter do fn () done; + let stop = Sys.time() in + printf "%s: %.2f s\n" msg (stop -. start) + +let _ = + (* Test *) + if test "" + && test "a" + && test "abc" + && test "message digest" + && test "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + then printf "Test vectors passed.\n"; + flush stdout; + (* Benchmark *) + if (Array.length Sys.argv) > 1 && (Sys.argv.(1) = "-benchmark") then begin + let s = String.make 50000 'a' in + let num_iter = 1000 in + time "Caml implementation" num_iter + (fun () -> + let ctx = init() in + update ctx s 0 (String.length s); + ignore (finish ctx)); + time "C implementation" num_iter + (fun () -> ignore (Digest.string s)) + end diff --git a/testsuite/tests/lib-digest/md5.reference b/testsuite/tests/lib-digest/md5.reference new file mode 100644 index 00000000..956ac654 --- /dev/null +++ b/testsuite/tests/lib-digest/md5.reference @@ -0,0 +1 @@ +Test vectors passed. diff --git a/testsuite/tests/lib-dynlink-bytecode/.svnignore b/testsuite/tests/lib-dynlink-bytecode/.svnignore new file mode 100644 index 00000000..125439c7 --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/.svnignore @@ -0,0 +1,6 @@ +main +static +custom +*.a +*.so +*.result diff --git a/testsuite/tests/lib-dynlink-bytecode/Makefile b/testsuite/tests/lib-dynlink-bytecode/Makefile new file mode 100644 index 00000000..33c431b1 --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/Makefile @@ -0,0 +1,36 @@ +default: compile run + +compile: + @for file in stub*.c; do \ + $(OCAMLC) -c $$file; \ + $(OCAMLMKLIB) -o `echo $$file | sed -e 's/stub/plug/' | sed -e 's/\.c//'` `basename $$file c`o; \ + done + @for file in plug*.ml; do \ + $(OCAMLC) -c $$file; \ + $(OCAMLMKLIB) -o `basename $$file .ml` `basename $$file ml`cmo; \ + done + @$(OCAMLC) -c main.ml + @$(OCAMLC) -o main dynlink.cma main.cmo + @$(OCAMLC) -o static -linkall plug1.cma plug2.cma -use-runtime $(PREFIX)/bin/ocamlrun + @$(OCAMLC) -o custom -custom -linkall plug2.cma plug1.cma -I . + +run: + @printf " ... testing 'main'" + @./main plug1.cma plug2.cma > main.result + @diff -q main.reference main.result > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + + @printf " ... testing 'static'" + @./static > static.result + @diff -q static.reference static.result > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + + @printf " ... testing 'custom'" + @./custom > custom.result + @diff -q custom.reference custom.result > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + +clean: defaultclean + @rm -f ./main ./static ./custom *.result + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-dynlink-bytecode/custom.reference b/testsuite/tests/lib-dynlink-bytecode/custom.reference new file mode 100644 index 00000000..f7eeb3ae --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/custom.reference @@ -0,0 +1,5 @@ +ABCDEF +This is stub2, calling stub1: +This is stub1! +Ok! +This is stub1! diff --git a/testsuite/tests/lib-dynlink-bytecode/main.ml b/testsuite/tests/lib-dynlink-bytecode/main.ml new file mode 100644 index 00000000..bd980f10 --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/main.ml @@ -0,0 +1,17 @@ + Dynlink.init (); + Dynlink.allow_unsafe_modules true; + for i = 1 to Array.length Sys.argv - 1 do + let name = Sys.argv.(i) in + Printf.printf "Loading %s\n" name; flush stdout; + try + if name.[0] = '-' + then Dynlink.loadfile_private + (String.sub name 1 (String.length name - 1)) + else Dynlink.loadfile name + with + | Dynlink.Error err -> + Printf.printf "Dynlink error: %s\n" + (Dynlink.error_message err) + | exn -> + Printf.printf "Error: %s\n" (Printexc.to_string exn) + done diff --git a/testsuite/tests/lib-dynlink-bytecode/main.reference b/testsuite/tests/lib-dynlink-bytecode/main.reference new file mode 100644 index 00000000..df46049b --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/main.reference @@ -0,0 +1,7 @@ +Loading plug1.cma +ABCDEF +Loading plug2.cma +This is stub1! +This is stub2, calling stub1: +This is stub1! +Ok! diff --git a/testsuite/tests/lib-dynlink-bytecode/plug1.ml b/testsuite/tests/lib-dynlink-bytecode/plug1.ml new file mode 100644 index 00000000..32460451 --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/plug1.ml @@ -0,0 +1,4 @@ +external stub1: unit -> string = "stub1" + + +let () = print_endline (stub1 ()) diff --git a/testsuite/tests/lib-dynlink-bytecode/plug2.ml b/testsuite/tests/lib-dynlink-bytecode/plug2.ml new file mode 100644 index 00000000..05f4fdae --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/plug2.ml @@ -0,0 +1,4 @@ +external stub2: unit -> unit = "stub2" + + +let () = stub2 () diff --git a/testsuite/tests/lib-dynlink-bytecode/static.reference b/testsuite/tests/lib-dynlink-bytecode/static.reference new file mode 100644 index 00000000..32281bcf --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/static.reference @@ -0,0 +1,5 @@ +ABCDEF +This is stub1! +This is stub2, calling stub1: +This is stub1! +Ok! diff --git a/testsuite/tests/lib-dynlink-bytecode/stub1.c b/testsuite/tests/lib-dynlink-bytecode/stub1.c new file mode 100644 index 00000000..18ddf3f1 --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/stub1.c @@ -0,0 +1,11 @@ +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" +#include + +value stub1() { + CAMLlocal1(x); + printf("This is stub1!\n"); + x = caml_copy_string("ABCDEF"); + return x; +} diff --git a/testsuite/tests/lib-dynlink-bytecode/stub2.c b/testsuite/tests/lib-dynlink-bytecode/stub2.c new file mode 100644 index 00000000..a1186735 --- /dev/null +++ b/testsuite/tests/lib-dynlink-bytecode/stub2.c @@ -0,0 +1,13 @@ +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" +#include + +extern value stub1(); + +value stub2() { + printf("This is stub2, calling stub1:\n"); + stub1(); + printf("Ok!\n"); + return Val_unit; +} diff --git a/testsuite/tests/lib-dynlink-csharp/Makefile b/testsuite/tests/lib-dynlink-csharp/Makefile new file mode 100644 index 00000000..774eaaca --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/Makefile @@ -0,0 +1,58 @@ +CSC=csc + +default: prepare bytecode bytecode-dll native native-dll + +prepare: + @$(OCAMLC) -c plugin.ml + @$(OCAMLOPT) -o plugin.cmxs -shared plugin.ml + +bytecode: + @printf " ... testing 'bytecode':" + @if [ ! `which $(CSC) > /dev/null` ]; then \ + echo " => passed"; \ + else \ + $(OCAMLC) -output-obj -o main.dll dynlink.cma main.ml entry.c; \ + $(CSC) /out:main.exe main.cs; \ + ./main.exe > bytecode.result; \ + diff -q bytecode.reference bytecode.result > /dev/null && echo " => passed" || echo " => failed"; \ + fi + +bytecode-dll: + @printf " ... testing 'bytecode-dll':" + @if [ ! `which $(CSC) > /dev/null` ]; then \ + echo " => passed"; \ + else \ + $(OCAMLC) -output-obj -o main_obj.$(O) dynlink.cma entry.c main.ml; \ + $(MKDLL) -maindll -o main.dll main_obj.$(O) entry.$(O) ../../byterun/libcamlrun.$(A) $(BYTECCLIBS) -v; \ + $(CSC) /out:main.exe main.cs; \ + ./main.exe > bytecode.result; \ + diff -q bytecode.reference bytecode.result > /dev/null && echo " => passed" || echo " => failed"; \ + fi + +native: + @printf " ... testing 'native':" + @if [ ! `which $(CSC) > /dev/null` ]; then \ + echo " => passed"; \ + else \ + $(OCAMLOPT) -output-obj -o main.dll dynlink.cmxa entry.c main.ml; \ + $(CSC) /out:main.exe main.cs; \ + ./main.exe > native.result; \ + diff -q native.reference native.result > /dev/null && echo " => passed" || echo " => failed"; \ + fi + +native-dll: + @printf " ... testing 'native-dll':" + @if [ ! `which $(CSC) > /dev/null` ]; then \ + echo " => passed"; \ + else \ + $(OCAMLOPT) -output-obj -o main_obj.$(O) dynlink.cmxa entry.c main.ml; \ + $(MKDLL) -maindll -o main.dll main_obj.$(O) entry.$(O) ../../asmrun/libasmrun.lib -v; \ + $(CSC) /out:main.exe main.cs; \ + ./main.exe > native.result; \ + diff -q native.reference native.result > /dev/null && echo " => passed" || echo " => failed"; \ + fi + +clean: defaultclean + @rm -f *.result *.exe *.dll + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-dynlink-csharp/bytecode.reference b/testsuite/tests/lib-dynlink-csharp/bytecode.reference new file mode 100644 index 00000000..65592193 --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/bytecode.reference @@ -0,0 +1,7 @@ +Now starting the Caml engine. +Main is running. +Loading ../../../otherlibs/bigarray/bigarray.cma +I'm the plugin. +Loading plugin.cmo +I'm the plugin. +OK. diff --git a/testsuite/tests/lib-dynlink-csharp/entry.c b/testsuite/tests/lib-dynlink-csharp/entry.c new file mode 100755 index 00000000..13ecd73d --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/entry.c @@ -0,0 +1,13 @@ +#include +#include +#include +#include +#include +#include + +__declspec(dllexport) void __stdcall start_caml_engine() { + char * argv[2]; + argv[0] = "--"; + argv[1] = NULL; + caml_startup(argv); +} diff --git a/testsuite/tests/lib-dynlink-csharp/main.cs b/testsuite/tests/lib-dynlink-csharp/main.cs new file mode 100755 index 00000000..a03bfd60 --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/main.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +public class M { + [DllImport("main.dll")] + public static extern void start_caml_engine(); + + public static void Main() { + System.Console.WriteLine("Now starting the Caml engine."); + start_caml_engine(); + } +} diff --git a/testsuite/tests/lib-dynlink-csharp/main.ml b/testsuite/tests/lib-dynlink-csharp/main.ml new file mode 100755 index 00000000..fd48914a --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/main.ml @@ -0,0 +1,23 @@ +let load s = + Printf.printf "Loading %s\n%!" s; + try + Dynlink.loadfile s + with Dynlink.Error e -> + print_endline (Dynlink.error_message e) + +let () = + print_endline "Main is running."; + Dynlink.init (); + Dynlink.allow_unsafe_modules true; + let s1,s2 = + if Dynlink.is_native then + "../../../otherlibs/bigarray/bigarray.cmxs", + "plugin.cmxs" + else + "../../../otherlibs/bigarray/bigarray.cma", + "plugin.cmo" + in + load s1; + load s2; + print_endline "OK." + diff --git a/testsuite/tests/lib-dynlink-csharp/native.reference b/testsuite/tests/lib-dynlink-csharp/native.reference new file mode 100644 index 00000000..b6c9e5c4 --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/native.reference @@ -0,0 +1,7 @@ +Now starting the Caml engine. +Main is running. +Loading ../../../otherlibs/bigarray/bigarray.cmxs +I'm the plugin. +Loading plugin.cmxs +I'm the plugin. +OK. diff --git a/testsuite/tests/lib-dynlink-csharp/plugin.ml b/testsuite/tests/lib-dynlink-csharp/plugin.ml new file mode 100755 index 00000000..39c46f3a --- /dev/null +++ b/testsuite/tests/lib-dynlink-csharp/plugin.ml @@ -0,0 +1,4 @@ +let f x = x.{2} + +let () = + print_endline "I'm the plugin." diff --git a/testsuite/tests/lib-dynlink-native/.svnignore b/testsuite/tests/lib-dynlink-native/.svnignore new file mode 100644 index 00000000..94f13b81 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/.svnignore @@ -0,0 +1,5 @@ +mypack.pack.s +result +main +*.so +*.a diff --git a/testsuite/tests/lib-dynlink-native/Makefile b/testsuite/tests/lib-dynlink-native/Makefile new file mode 100644 index 00000000..49bd04a1 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/Makefile @@ -0,0 +1,70 @@ +default: compile run + +PLUGINS=plugin.so plugin2.so sub/plugin.so sub/plugin3.so plugin4.so mypack.so packed1.so packed1_client.so pack_client.so plugin_ref.so plugin_high_arity.so plugin_ext.so plugin_simple.so bug.so plugin_thread.so plugin4_unix.so a.so b.so c.so + +ADD_COMPFLAGS=-thread + +compile: $(PLUGINS) main mylib.so + +run: + @printf " ... testing 'main'" + @./main plugin_thread.so > result + @diff -q reference result > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + +main: api.cmx main.cmx + @$(OCAMLOPT) -thread -o main -linkall unix.cmxa threads.cmxa dynlink.cmxa api.cmx main.cmx $(PTHREAD_LINK) + +main_ext: api.cmx main.cmx factorial.$(O) + @$(OCAMLOPT) -o main_ext dynlink.cmxa api.cmx main.cmx factorial.$(O) + +sub/plugin3.cmx: sub/api.cmi sub/api.cmx sub/plugin3.ml + @(cd sub; mv api.cmx api.cmx.bak; $(OCAMLOPT) -c $(COMPFLAGS) plugin3.ml; mv api.cmx.bak api.cmx) + +plugin2.cmx: api.cmx plugin.cmi plugin.cmx + @(mv plugin.cmx plugin.cmx.bak; $(OCAMLOPT) -c $(COMPFLAGS) plugin2.ml; mv plugin.cmx.bak plugin.cmx) + +sub/api.so: sub/api.cmi sub/api.ml + @(cd sub; $(OCAMLOPT) -c $(COMPFLAGS) $(SHARED) api.ml) + +sub/api.cmi: sub/api.mli + @(cd sub; $(OCAMLOPT) -c $(COMPFLAGS) api.mli) + +sub/api.cmx: sub/api.cmi sub/api.ml + @(cd sub; $(OCAMLOPT) -c $(COMPFLAGS) api.ml) + +plugin.cmx: api.cmx plugin.cmi +sub/plugin.cmx: api.cmx +plugin4.cmx: api.cmx +main.cmx: api.cmx +plugin_ext.cmx: api.cmx plugin_ext.ml + @$(OCAMLOPT) -c $(COMPFLAGS) plugin_ext.ml + +plugin_ext.so: factorial.$(O) plugin_ext.cmx + @$(OCAMLOPT) $(COMPFLAGS) -shared -o plugin_ext.so factorial.$(O) plugin_ext.cmx + +plugin4_unix.so: plugin4.cmx + @$(OCAMLOPT) -shared -o plugin4_unix.so unix.cmxa plugin4.cmx + +packed1_client.cmx: packed1.cmx + +pack_client.cmx: mypack.cmx + +packed1.cmx: api.cmx packed1.ml + @$(OCAMLOPT) -c $(COMPFLAGS) -for-pack Mypack packed1.ml + +mypack.cmx: packed1.cmx + @$(OCAMLOPT) $(COMPFLAGS) -S -pack -o mypack.cmx packed1.cmx + +mylib.cmxa: plugin.cmx plugin2.cmx + @$(OCAMLOPT) $(COMPFLAGS) -a -o mylib.cmxa plugin.cmx plugin2.cmx + +factorial.$(O): factorial.c + @$(OCAMLOPT) -c -ccopt "$(SHAREDCCCOMPOPTS)" factorial.c + +clean: defaultclean + @rm -f result *.so *.o *.cm* main main_ext *.exe *.s *.asm *.obj + @rm -f *.a *.lib + @rm -f sub/*.so sub/*.o sub/*.cm* sub/*.s sub/*.asm sub/*.obj + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-dynlink-native/a.ml b/testsuite/tests/lib-dynlink-native/a.ml new file mode 100755 index 00000000..b7915822 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/a.ml @@ -0,0 +1,5 @@ +let x = ref 0 +let u = Random.int 1000 + +let () = + Printf.printf "A is running (%i)\n%!" u diff --git a/testsuite/tests/lib-dynlink-native/api.ml b/testsuite/tests/lib-dynlink-native/api.ml new file mode 100644 index 00000000..843a1c78 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/api.ml @@ -0,0 +1,18 @@ +let mods = ref [] + +let reg_mod name = + if List.mem name !mods then + Printf.printf "Reloading module %s\n" name + else ( + mods := name :: !mods; + Printf.printf "Registering module %s\n" name + ) + + +let cbs = ref [] + +let add_cb f = cbs := f :: !cbs +let runall () = List.iter (fun f -> f ()) !cbs + +let () = + at_exit runall diff --git a/testsuite/tests/lib-dynlink-native/b.ml b/testsuite/tests/lib-dynlink-native/b.ml new file mode 100755 index 00000000..58149e22 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/b.ml @@ -0,0 +1,5 @@ +let () = + print_endline "B is running"; + incr A.x; + Printf.printf "A.x = %i\n" !A.x + diff --git a/testsuite/tests/lib-dynlink-native/bug.ml b/testsuite/tests/lib-dynlink-native/bug.ml new file mode 100644 index 00000000..02828378 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/bug.ml @@ -0,0 +1,2 @@ +let () = try raise (Invalid_argument "X") with Invalid_argument s -> + raise (Invalid_argument (s ^ s)) diff --git a/testsuite/tests/lib-dynlink-native/c.ml b/testsuite/tests/lib-dynlink-native/c.ml new file mode 100755 index 00000000..d4de70f4 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/c.ml @@ -0,0 +1,4 @@ +let () = + print_endline "C is running"; + incr A.x; + Printf.printf "A.x = %i\n" !A.x diff --git a/testsuite/tests/lib-dynlink-native/factorial.c b/testsuite/tests/lib-dynlink-native/factorial.c new file mode 100644 index 00000000..c662333e --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/factorial.c @@ -0,0 +1,18 @@ +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" +#include + +value factorial(value n){ + CAMLparam1(n); + CAMLlocal1(s); + + static char buf[256]; + int x = 1; + int i; + int m = Int_val(n); + for (i = 1; i <= m; i++) x *= i; + sprintf(buf,"%i",x); + s = copy_string(buf); + CAMLreturn (s); +} diff --git a/testsuite/tests/lib-dynlink-native/main.ml b/testsuite/tests/lib-dynlink-native/main.ml new file mode 100644 index 00000000..b21253fb --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/main.ml @@ -0,0 +1,20 @@ +let () = + Dynlink.init (); + Dynlink.allow_unsafe_modules true; + for i = 1 to Array.length Sys.argv - 1 do + let name = Sys.argv.(i) in + Printf.printf "Loading %s\n" name; flush stdout; + try + if name.[0] = '-' + then Dynlink.loadfile_private + (String.sub name 1 (String.length name - 1)) + else Dynlink.loadfile name + with + | Dynlink.Error err -> + Printf.printf "Dynlink error: %s\n" + (Dynlink.error_message err) + | exn -> + Printf.printf "Error: %s\n" (Printexc.to_string exn) + done + + diff --git a/testsuite/tests/lib-dynlink-native/pack_client.ml b/testsuite/tests/lib-dynlink-native/pack_client.ml new file mode 100644 index 00000000..90229885 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/pack_client.ml @@ -0,0 +1,2 @@ +let () = + print_endline Mypack.Packed1.mykey diff --git a/testsuite/tests/lib-dynlink-native/packed1.ml b/testsuite/tests/lib-dynlink-native/packed1.ml new file mode 100644 index 00000000..8f00e39d --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/packed1.ml @@ -0,0 +1,6 @@ +let () = + Api.reg_mod "Packed1" + +let bla = Sys.argv.(0) ^ "XXX" +let mykey = Sys.argv.(0) + diff --git a/testsuite/tests/lib-dynlink-native/packed1_client.ml b/testsuite/tests/lib-dynlink-native/packed1_client.ml new file mode 100644 index 00000000..c62534fd --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/packed1_client.ml @@ -0,0 +1,3 @@ +let () = + Api.reg_mod "Packed1_client"; + print_endline Packed1.mykey diff --git a/testsuite/tests/lib-dynlink-native/plugin.ml b/testsuite/tests/lib-dynlink-native/plugin.ml new file mode 100644 index 00000000..501f1bfd --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin.ml @@ -0,0 +1,10 @@ +let rec f x = ignore ([x]); f x + +let rec fact n = if n = 0 then 1 else n * fact (n - 1) + +let facts = [ fact 1; fact 2; fact 3; fact (Random.int 4) ] + +let () = + Api.reg_mod "Plugin"; + print_endline "COUCOU"; + () diff --git a/testsuite/tests/lib-dynlink-native/plugin.mli b/testsuite/tests/lib-dynlink-native/plugin.mli new file mode 100644 index 00000000..3e659d97 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin.mli @@ -0,0 +1 @@ +val facts: int list diff --git a/testsuite/tests/lib-dynlink-native/plugin2.ml b/testsuite/tests/lib-dynlink-native/plugin2.ml new file mode 100644 index 00000000..daecace8 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin2.ml @@ -0,0 +1,8 @@ +(*external ex: int -> int = "caml_ex"*) + +let () = + Api.reg_mod "Plugin2"; +(* let i = ex 3 in*) + List.iter (fun i -> Printf.printf "%i\n" i) Plugin.facts; + Printf.printf "XXX\n"; + raise Exit diff --git a/testsuite/tests/lib-dynlink-native/plugin4.ml b/testsuite/tests/lib-dynlink-native/plugin4.ml new file mode 100644 index 00000000..ccf4642f --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin4.ml @@ -0,0 +1,5 @@ +let () = + Printf.printf "time = %f\n" (Unix.time ()); + Api.reg_mod "Plugin" + + diff --git a/testsuite/tests/lib-dynlink-native/plugin_ext.ml b/testsuite/tests/lib-dynlink-native/plugin_ext.ml new file mode 100644 index 00000000..9906769f --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin_ext.ml @@ -0,0 +1,5 @@ +external fact: int -> string = "factorial" + +let () = + Api.reg_mod "plugin_ext"; + Printf.printf "fact 10 = %s\n" (fact 10) diff --git a/testsuite/tests/lib-dynlink-native/plugin_high_arity.ml b/testsuite/tests/lib-dynlink-native/plugin_high_arity.ml new file mode 100644 index 00000000..8c58aa15 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin_high_arity.ml @@ -0,0 +1,6 @@ +let f x x x x x x x x x x x x x = () + +let g x = f x x x x x x x x + +let () = + Api.reg_mod "HA" diff --git a/testsuite/tests/lib-dynlink-native/plugin_ref.ml b/testsuite/tests/lib-dynlink-native/plugin_ref.ml new file mode 100644 index 00000000..06001241 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin_ref.ml @@ -0,0 +1,11 @@ +let x = ref 0 + +let () = + Api.reg_mod "Plugin_ref"; + + Api.add_cb + (fun () -> + Printf.printf "current value for ref = %i\n" !x; + incr x + ) + diff --git a/testsuite/tests/lib-dynlink-native/plugin_simple.ml b/testsuite/tests/lib-dynlink-native/plugin_simple.ml new file mode 100644 index 00000000..dd7d0226 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin_simple.ml @@ -0,0 +1,3 @@ +let facts = [ (Random.int 4) ] + +let () = print_endline "COUCOU"; print_char '\n' diff --git a/testsuite/tests/lib-dynlink-native/plugin_thread.ml b/testsuite/tests/lib-dynlink-native/plugin_thread.ml new file mode 100644 index 00000000..a66b958f --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/plugin_thread.ml @@ -0,0 +1,21 @@ +let () = + Api.reg_mod "Plugin_thread"; + let _t = + Thread.create + (fun () -> + for i = 1 to 5 do + print_endline "Thread"; flush stdout; + Thread.delay 1.; + done + ) () + in + for i = 1 to 10 do + print_endline "Thread"; flush stdout; + Thread.delay 0.50; + done + + + + + + diff --git a/testsuite/tests/lib-dynlink-native/reference b/testsuite/tests/lib-dynlink-native/reference new file mode 100644 index 00000000..c6adb139 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/reference @@ -0,0 +1,17 @@ +Loading plugin_thread.so +Registering module Plugin_thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread +Thread diff --git a/testsuite/tests/lib-dynlink-native/sub/api.ml b/testsuite/tests/lib-dynlink-native/sub/api.ml new file mode 100644 index 00000000..4a60586f --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/sub/api.ml @@ -0,0 +1,3 @@ +let f i = + Printf.printf "Sub/api: f called with %i\n" i; + i + 1 diff --git a/testsuite/tests/lib-dynlink-native/sub/api.mli b/testsuite/tests/lib-dynlink-native/sub/api.mli new file mode 100644 index 00000000..da5e52f2 --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/sub/api.mli @@ -0,0 +1 @@ +val f : int -> int diff --git a/testsuite/tests/lib-dynlink-native/sub/plugin.ml b/testsuite/tests/lib-dynlink-native/sub/plugin.ml new file mode 100644 index 00000000..2a41493c --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/sub/plugin.ml @@ -0,0 +1,7 @@ +let rec fact n = if n = 0 then 1 else n * fact (n - 1) + +let facts = [ fact 1; fact 2; fact 3; fact 4; fact 5 ] + +let () = + Api.reg_mod "Plugin'" + diff --git a/testsuite/tests/lib-dynlink-native/sub/plugin3.ml b/testsuite/tests/lib-dynlink-native/sub/plugin3.ml new file mode 100644 index 00000000..7b0b099f --- /dev/null +++ b/testsuite/tests/lib-dynlink-native/sub/plugin3.ml @@ -0,0 +1,3 @@ +let () = + ignore (Api.f 10) + diff --git a/testsuite/tests/lib-marshal/Makefile b/testsuite/tests/lib-marshal/Makefile new file mode 100644 index 00000000..0d28b8d9 --- /dev/null +++ b/testsuite/tests/lib-marshal/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=intext +C_FILES=intextaux + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-marshal/intext.ml b/testsuite/tests/lib-marshal/intext.ml new file mode 100644 index 00000000..5af1e252 --- /dev/null +++ b/testsuite/tests/lib-marshal/intext.ml @@ -0,0 +1,459 @@ +(* Test for output_value / input_value *) + +type t = A | B of int | C of float | D of string | E of char + | F of t | G of t * t | H of int * t | I of t * float | J + +let longstring = +"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +let verylongstring = +"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ + 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + +let bigint = Int64.to_int 0x123456789ABCDEF0L + +let rec fib n = + if n < 2 then 1 else fib(n-1) + fib(n-2) + +let test_out filename = + let oc = open_out_bin filename in + output_value oc 1; + output_value oc (-1); + output_value oc 258; + output_value oc 20000; + output_value oc 0x12345678; + output_value oc bigint; + output_value oc "foobargeebuz"; + output_value oc longstring; + output_value oc verylongstring; + output_value oc 3.141592654; + output_value oc (); + output_value oc A; + output_value oc (B 1); + output_value oc (C 2.718); + output_value oc (D "hello, world!"); + output_value oc (E 'l'); + output_value oc (F(B 1)); + output_value oc (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))); + output_value oc (H(1, A)); + output_value oc (I(B 2, 1e-6)); + let x = D "sharing" in + let y = G(x, x) in + let z = G(y, G(x, y)) in + output_value oc z; + output_value oc [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|]; + let rec big n = if n <= 0 then A else H(n, big(n-1)) in + output_value oc (big 1000); + Marshal.to_channel oc y [Marshal.No_sharing]; + Marshal.to_channel oc fib [Marshal.Closures]; + output_value oc (Int32.of_string "0"); + output_value oc (Int32.of_string "123456"); + output_value oc (Int32.of_string "-123456"); + output_value oc (Int64.of_string "0"); + output_value oc (Int64.of_string "123456789123456"); + output_value oc (Int64.of_string "-123456789123456"); + output_value oc (Nativeint.of_string "0"); + output_value oc (Nativeint.of_string "123456"); + output_value oc (Nativeint.of_string "-123456"); + output_value oc (Nativeint.shift_left (Nativeint.of_string "123456789") 32); + output_value oc (Nativeint.shift_left (Nativeint.of_string "-123456789") 32); + let i = Int64.of_string "123456789123456" in output_value oc (i,i); + close_out oc + + +let test n b = + print_string "Test "; print_int n; + if b then print_string " passed.\n" else print_string " FAILED.\n"; + flush stderr + +let test_in filename = + let ic = open_in_bin filename in + test 1 (input_value ic = 1); + test 2 (input_value ic = (-1)); + test 3 (input_value ic = 258); + test 4 (input_value ic = 20000); + test 5 (input_value ic = 0x12345678); + test 6 (input_value ic = bigint); + test 7 (input_value ic = "foobargeebuz"); + test 8 (input_value ic = longstring); + test 9 (input_value ic = verylongstring); + test 10 (input_value ic = 3.141592654); + test 11 (input_value ic = ()); + test 12 (match input_value ic with + A -> true + | _ -> false); + test 13 (match input_value ic with + (B 1) -> true + | _ -> false); + test 14 (match input_value ic with + (C f) -> f = 2.718 + | _ -> false); + test 15 (match input_value ic with + (D "hello, world!") -> true + | _ -> false); + test 16 (match input_value ic with + (E 'l') -> true + | _ -> false); + test 17 (match input_value ic with + (F(B 1)) -> true + | _ -> false); + test 18 (match input_value ic with + (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) -> true + | _ -> false); + test 19 (match input_value ic with + (H(1, A)) -> true + | _ -> false); + test 20 (match input_value ic with + (I(B 2, 1e-6)) -> true + | _ -> false); + test 21 (match input_value ic with + G((G((D "sharing" as t1), t2) as t3), G(t4, t5)) -> + t1 == t2 && t3 == t5 && t4 == t1 + | _ -> false); + test 22 (input_value ic = [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|]); + let rec check_big n t = + if n <= 0 then + test 23 (match t with A -> true | _ -> false) + else + match t with H(m, s) -> if m = n then check_big (n-1) s + else test 23 false + | _ -> test 23 false + in + check_big 1000 (input_value ic); + test 24 (match input_value ic with + G((D "sharing" as t1), (D "sharing" as t2)) -> t1 != t2 + | _ -> false); + test 25 (let fib = (input_value ic : int -> int) in fib 5 = 8 && fib 10 = 89); + test 26 (input_value ic = Int32.of_string "0"); + test 27 (input_value ic = Int32.of_string "123456"); + test 28 (input_value ic = Int32.of_string "-123456"); + test 29 (input_value ic = Int64.of_string "0"); + test 30 (input_value ic = Int64.of_string "123456789123456"); + test 31 (input_value ic = Int64.of_string "-123456789123456"); + test 32 (input_value ic = Nativeint.of_string "0"); + test 33 (input_value ic = Nativeint.of_string "123456"); + test 34 (input_value ic = Nativeint.of_string "-123456"); + test 35 (input_value ic = + Nativeint.shift_left (Nativeint.of_string "123456789") 32); + test 36 (input_value ic = + Nativeint.shift_left (Nativeint.of_string "-123456789") 32); + let ((i, j) : int64 * int64) = input_value ic in + test 37 (i = Int64.of_string "123456789123456"); + test 38 (j = Int64.of_string "123456789123456"); + test 39 (i == j); + close_in ic + +let test_string () = + let s = Marshal.to_string 1 [] in + test 101 (Marshal.from_string s 0 = 1); + let s = Marshal.to_string (-1) [] in + test 102 (Marshal.from_string s 0 = (-1)); + let s = Marshal.to_string 258 [] in + test 103 (Marshal.from_string s 0 = 258); + let s = Marshal.to_string 20000 [] in + test 104 (Marshal.from_string s 0 = 20000); + let s = Marshal.to_string 0x12345678 [] in + test 105 (Marshal.from_string s 0 = 0x12345678); + let s = Marshal.to_string bigint [] in + test 106 (Marshal.from_string s 0 = bigint); + let s = Marshal.to_string "foobargeebuz" [] in + test 107 (Marshal.from_string s 0 = "foobargeebuz"); + let s = Marshal.to_string longstring [] in + test 108 (Marshal.from_string s 0 = longstring); + let s = Marshal.to_string verylongstring [] in + test 109 (Marshal.from_string s 0 = verylongstring); + let s = Marshal.to_string 3.141592654 [] in + test 110 (Marshal.from_string s 0 = 3.141592654); + let s = Marshal.to_string () [] in + test 111 (Marshal.from_string s 0 = ()); + let s = Marshal.to_string A [] in + test 112 (match Marshal.from_string s 0 with + A -> true + | _ -> false); + let s = Marshal.to_string (B 1) [] in + test 113 (match Marshal.from_string s 0 with + (B 1) -> true + | _ -> false); + let s = Marshal.to_string (C 2.718) [] in + test 114 (match Marshal.from_string s 0 with + (C f) -> f = 2.718 + | _ -> false); + let s = Marshal.to_string (D "hello, world!") [] in + test 115 (match Marshal.from_string s 0 with + (D "hello, world!") -> true + | _ -> false); + let s = Marshal.to_string (E 'l') [] in + test 116 (match Marshal.from_string s 0 with + (E 'l') -> true + | _ -> false); + let s = Marshal.to_string (F(B 1)) [] in + test 117 (match Marshal.from_string s 0 with + (F(B 1)) -> true + | _ -> false); + let s = Marshal.to_string (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) [] in + test 118 (match Marshal.from_string s 0 with + (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) -> true + | _ -> false); + let s = Marshal.to_string (H(1, A)) [] in + test 119 (match Marshal.from_string s 0 with + (H(1, A)) -> true + | _ -> false); + let s = Marshal.to_string (I(B 2, 1e-6)) [] in + test 120 (match Marshal.from_string s 0 with + (I(B 2, 1e-6)) -> true + | _ -> false); + let x = D "sharing" in + let y = G(x, x) in + let z = G(y, G(x, y)) in + let s = Marshal.to_string z [] in + test 121 (match Marshal.from_string s 0 with + G((G((D "sharing" as t1), t2) as t3), G(t4, t5)) -> + t1 == t2 && t3 == t5 && t4 == t1 + | _ -> false); + let s = Marshal.to_string [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|] [] in + test 122 (Marshal.from_string s 0 = [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|]); + let rec big n = if n <= 0 then A else H(n, big(n-1)) in + let s = Marshal.to_string (big 1000) [] in + let rec check_big n t = + if n <= 0 then + test 123 (match t with A -> true | _ -> false) + else + match t with H(m, s) -> if m = n then check_big (n-1) s + else test 123 false + | _ -> test 123 false + in + check_big 1000 (Marshal.from_string s 0) + +let marshal_to_buffer s start len v flags = + ignore (Marshal.to_buffer s start len v flags) +;; + +let test_buffer () = + let s = String.create 512 in + marshal_to_buffer s 0 512 1 []; + test 201 (Marshal.from_string s 0 = 1); + marshal_to_buffer s 0 512 (-1) []; + test 202 (Marshal.from_string s 0 = (-1)); + marshal_to_buffer s 0 512 258 []; + test 203 (Marshal.from_string s 0 = 258); + marshal_to_buffer s 0 512 20000 []; + test 204 (Marshal.from_string s 0 = 20000); + marshal_to_buffer s 0 512 0x12345678 []; + test 205 (Marshal.from_string s 0 = 0x12345678); + marshal_to_buffer s 0 512 bigint []; + test 206 (Marshal.from_string s 0 = bigint); + marshal_to_buffer s 0 512 "foobargeebuz" []; + test 207 (Marshal.from_string s 0 = "foobargeebuz"); + marshal_to_buffer s 0 512 longstring []; + test 208 (Marshal.from_string s 0 = longstring); + test 209 + (try marshal_to_buffer s 0 512 verylongstring []; false + with Failure "Marshal.to_buffer: buffer overflow" -> true); + marshal_to_buffer s 0 512 3.141592654 []; + test 210 (Marshal.from_string s 0 = 3.141592654); + marshal_to_buffer s 0 512 () []; + test 211 (Marshal.from_string s 0 = ()); + marshal_to_buffer s 0 512 A []; + test 212 (match Marshal.from_string s 0 with + A -> true + | _ -> false); + marshal_to_buffer s 0 512 (B 1) []; + test 213 (match Marshal.from_string s 0 with + (B 1) -> true + | _ -> false); + marshal_to_buffer s 0 512 (C 2.718) []; + test 214 (match Marshal.from_string s 0 with + (C f) -> f = 2.718 + | _ -> false); + marshal_to_buffer s 0 512 (D "hello, world!") []; + test 215 (match Marshal.from_string s 0 with + (D "hello, world!") -> true + | _ -> false); + marshal_to_buffer s 0 512 (E 'l') []; + test 216 (match Marshal.from_string s 0 with + (E 'l') -> true + | _ -> false); + marshal_to_buffer s 0 512 (F(B 1)) []; + test 217 (match Marshal.from_string s 0 with + (F(B 1)) -> true + | _ -> false); + marshal_to_buffer s 0 512 (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) []; + test 218 (match Marshal.from_string s 0 with + (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) -> true + | _ -> false); + marshal_to_buffer s 0 512 (H(1, A)) []; + test 219 (match Marshal.from_string s 0 with + (H(1, A)) -> true + | _ -> false); + marshal_to_buffer s 0 512 (I(B 2, 1e-6)) []; + test 220 (match Marshal.from_string s 0 with + (I(B 2, 1e-6)) -> true + | _ -> false); + let x = D "sharing" in + let y = G(x, x) in + let z = G(y, G(x, y)) in + marshal_to_buffer s 0 512 z []; + test 221 (match Marshal.from_string s 0 with + G((G((D "sharing" as t1), t2) as t3), G(t4, t5)) -> + t1 == t2 && t3 == t5 && t4 == t1 + | _ -> false); + marshal_to_buffer s 0 512 [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|] []; + test 222 (Marshal.from_string s 0 = [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|]); + let rec big n = if n <= 0 then A else H(n, big(n-1)) in + test 223 + (try marshal_to_buffer s 0 512 (big 1000) []; false + with Failure "Marshal.to_buffer: buffer overflow" -> true) + +let test_size() = + let s = Marshal.to_string (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) [] in + test 300 (Marshal.header_size + Marshal.data_size s 0 = String.length s) + +external marshal_to_block + : string -> int -> 'a -> Marshal.extern_flags list -> unit + = "marshal_to_block" +external marshal_from_block : string -> int -> 'a = "marshal_from_block" +external static_alloc : int -> string = "caml_static_alloc" + +let test_block () = + let s = static_alloc 512 in + marshal_to_block s 512 1 []; + test 401 (marshal_from_block s 512 = 1); + marshal_to_block s 512 (-1) []; + test 402 (marshal_from_block s 512 = (-1)); + marshal_to_block s 512 258 []; + test 403 (marshal_from_block s 512 = 258); + marshal_to_block s 512 20000 []; + test 404 (marshal_from_block s 512 = 20000); + marshal_to_block s 512 0x12345678 []; + test 405 (marshal_from_block s 512 = 0x12345678); + marshal_to_block s 512 bigint []; + test 406 (marshal_from_block s 512 = bigint); + marshal_to_block s 512 "foobargeebuz" []; + test 407 (marshal_from_block s 512 = "foobargeebuz"); + marshal_to_block s 512 longstring []; + test 408 (marshal_from_block s 512 = longstring); + test 409 + (try marshal_to_block s 512 verylongstring []; false + with Failure "Marshal.to_buffer: buffer overflow" -> true); + marshal_to_block s 512 3.141592654 []; + test 410 (marshal_from_block s 512 = 3.141592654); + marshal_to_block s 512 () []; + test 411 (marshal_from_block s 512 = ()); + marshal_to_block s 512 A []; + test 412 (match marshal_from_block s 512 with + A -> true + | _ -> false); + marshal_to_block s 512 (B 1) []; + test 413 (match marshal_from_block s 512 with + (B 1) -> true + | _ -> false); + marshal_to_block s 512 (C 2.718) []; + test 414 (match marshal_from_block s 512 with + (C f) -> f = 2.718 + | _ -> false); + marshal_to_block s 512 (D "hello, world!") []; + test 415 (match marshal_from_block s 512 with + (D "hello, world!") -> true + | _ -> false); + marshal_to_block s 512 (E 'l') []; + test 416 (match marshal_from_block s 512 with + (E 'l') -> true + | _ -> false); + marshal_to_block s 512 (F(B 1)) []; + test 417 (match marshal_from_block s 512 with + (F(B 1)) -> true + | _ -> false); + marshal_to_block s 512 (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) []; + test 418 (match marshal_from_block s 512 with + (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) -> true + | _ -> false); + marshal_to_block s 512 (H(1, A)) []; + test 419 (match marshal_from_block s 512 with + (H(1, A)) -> true + | _ -> false); + marshal_to_block s 512 (I(B 2, 1e-6)) []; + test 420 (match marshal_from_block s 512 with + (I(B 2, 1e-6)) -> true + | _ -> false); + let x = D "sharing" in + let y = G(x, x) in + let z = G(y, G(x, y)) in + marshal_to_block s 512 z []; + test 421 (match marshal_from_block s 512 with + G((G((D "sharing" as t1), t2) as t3), G(t4, t5)) -> + t1 == t2 && t3 == t5 && t4 == t1 + | _ -> false); + marshal_to_block s 512 [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|] []; + test 422 (marshal_from_block s 512 = + [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|]); + let rec big n = if n <= 0 then A else H(n, big(n-1)) in + test 423 + (try marshal_to_block s 512 (big 1000) []; false + with Failure _ -> true); + test 424 + (try marshal_to_block s 512 "Hello, world!" []; + ignore (marshal_from_block s 8); + false + with Failure _ -> true) + +(* Test for really big objects *) + +let counter = ref 0 + +let rec make_big n = + if n <= 0 then begin + incr counter; B !counter + end else begin + let l = make_big (n-1) in + let r = make_big (n-1) in + G(l, r) + end + +let rec check_big n x = + if n <= 0 then begin + match x with + B k -> incr counter; k = !counter + | _ -> false + end else begin + match x with + G(l, r) -> check_big (n-1) l && check_big (n-1) r + | _ -> false + end + +let main() = + if Array.length Sys.argv <= 2 then begin + test_out "intext.data"; test_in "intext.data"; + test_out "intext.data"; test_in "intext.data"; + Sys.remove "intext.data"; + test_string(); + test_buffer(); + test_size(); + test_block() + end else + if Sys.argv.(1) = "make" then begin + let n = int_of_string Sys.argv.(2) in + let oc = open_out_bin "intext.data" in + counter := 0; + output_value oc (make_big n); + close_out oc + end else + if Sys.argv.(1) = "test" then begin + let n = int_of_string Sys.argv.(2) in + let ic = open_in_bin "intext.data" in + let b = (input_value ic : t) in + Gc.full_major(); + close_in ic; + counter := 0; + if check_big n b then + Printf.printf "Test big %d passed" n + else + Printf.printf "Test big %d FAILED" n; + print_newline() + end + +let _ = Printexc.catch main (); exit 0 diff --git a/testsuite/tests/lib-marshal/intext.reference b/testsuite/tests/lib-marshal/intext.reference new file mode 100644 index 00000000..8def6706 --- /dev/null +++ b/testsuite/tests/lib-marshal/intext.reference @@ -0,0 +1,149 @@ +Test 1 passed. +Test 2 passed. +Test 3 passed. +Test 4 passed. +Test 5 passed. +Test 6 passed. +Test 7 passed. +Test 8 passed. +Test 9 passed. +Test 10 passed. +Test 11 passed. +Test 12 passed. +Test 13 passed. +Test 14 passed. +Test 15 passed. +Test 16 passed. +Test 17 passed. +Test 18 passed. +Test 19 passed. +Test 20 passed. +Test 21 passed. +Test 22 passed. +Test 23 passed. +Test 24 passed. +Test 25 passed. +Test 26 passed. +Test 27 passed. +Test 28 passed. +Test 29 passed. +Test 30 passed. +Test 31 passed. +Test 32 passed. +Test 33 passed. +Test 34 passed. +Test 35 passed. +Test 36 passed. +Test 37 passed. +Test 38 passed. +Test 39 passed. +Test 1 passed. +Test 2 passed. +Test 3 passed. +Test 4 passed. +Test 5 passed. +Test 6 passed. +Test 7 passed. +Test 8 passed. +Test 9 passed. +Test 10 passed. +Test 11 passed. +Test 12 passed. +Test 13 passed. +Test 14 passed. +Test 15 passed. +Test 16 passed. +Test 17 passed. +Test 18 passed. +Test 19 passed. +Test 20 passed. +Test 21 passed. +Test 22 passed. +Test 23 passed. +Test 24 passed. +Test 25 passed. +Test 26 passed. +Test 27 passed. +Test 28 passed. +Test 29 passed. +Test 30 passed. +Test 31 passed. +Test 32 passed. +Test 33 passed. +Test 34 passed. +Test 35 passed. +Test 36 passed. +Test 37 passed. +Test 38 passed. +Test 39 passed. +Test 101 passed. +Test 102 passed. +Test 103 passed. +Test 104 passed. +Test 105 passed. +Test 106 passed. +Test 107 passed. +Test 108 passed. +Test 109 passed. +Test 110 passed. +Test 111 passed. +Test 112 passed. +Test 113 passed. +Test 114 passed. +Test 115 passed. +Test 116 passed. +Test 117 passed. +Test 118 passed. +Test 119 passed. +Test 120 passed. +Test 121 passed. +Test 122 passed. +Test 123 passed. +Test 201 passed. +Test 202 passed. +Test 203 passed. +Test 204 passed. +Test 205 passed. +Test 206 passed. +Test 207 passed. +Test 208 passed. +Test 209 passed. +Test 210 passed. +Test 211 passed. +Test 212 passed. +Test 213 passed. +Test 214 passed. +Test 215 passed. +Test 216 passed. +Test 217 passed. +Test 218 passed. +Test 219 passed. +Test 220 passed. +Test 221 passed. +Test 222 passed. +Test 223 passed. +Test 300 passed. +Test 401 passed. +Test 402 passed. +Test 403 passed. +Test 404 passed. +Test 405 passed. +Test 406 passed. +Test 407 passed. +Test 408 passed. +Test 409 passed. +Test 410 passed. +Test 411 passed. +Test 412 passed. +Test 413 passed. +Test 414 passed. +Test 415 passed. +Test 416 passed. +Test 417 passed. +Test 418 passed. +Test 419 passed. +Test 420 passed. +Test 421 passed. +Test 422 passed. +Test 423 passed. +Test 424 passed. diff --git a/testsuite/tests/lib-marshal/intextaux.c b/testsuite/tests/lib-marshal/intextaux.c new file mode 100644 index 00000000..9225b90b --- /dev/null +++ b/testsuite/tests/lib-marshal/intextaux.c @@ -0,0 +1,13 @@ +#include +#include + +value marshal_to_block(value vbuf, value vlen, value v, value vflags) +{ + return Val_long(output_value_to_block(v, vflags, + (char *) vbuf, Long_val(vlen))); +} + +value marshal_from_block(value vbuf, value vlen) +{ + return input_value_from_block((char *) vbuf, Long_val(vlen)); +} diff --git a/testsuite/tests/lib-num-2/Makefile b/testsuite/tests/lib-num-2/Makefile new file mode 100644 index 00000000..7b7ffec4 --- /dev/null +++ b/testsuite/tests/lib-num-2/Makefile @@ -0,0 +1,5 @@ +LIBRARIES=nums +PROGRAM_ARGS=1000 + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/otherlibs/num/test/pi_big_int.ml b/testsuite/tests/lib-num-2/pi_big_int.ml similarity index 100% rename from otherlibs/num/test/pi_big_int.ml rename to testsuite/tests/lib-num-2/pi_big_int.ml diff --git a/testsuite/tests/lib-num-2/pi_big_int.reference b/testsuite/tests/lib-num-2/pi_big_int.reference new file mode 100644 index 00000000..ad4dc996 --- /dev/null +++ b/testsuite/tests/lib-num-2/pi_big_int.reference @@ -0,0 +1,100 @@ +3141592653 :10 +5897932384 :20 +6264338327 :30 +9502884197 :40 +1693993751 :50 +0582097494 :60 +4592307816 :70 +4062862089 :80 +9862803482 :90 +5342117067 :100 +9821480865 :110 +1328230664 :120 +7093844609 :130 +5505822317 :140 +2535940812 :150 +8481117450 :160 +2841027019 :170 +3852110555 :180 +9644622948 :190 +9549303819 :200 +6442881097 :210 +5665933446 :220 +1284756482 :230 +3378678316 :240 +5271201909 :250 +1456485669 :260 +2346034861 :270 +0454326648 :280 +2133936072 :290 +6024914127 :300 +3724587006 :310 +6063155881 :320 +7488152092 :330 +0962829254 :340 +0917153643 :350 +6789259036 :360 +0011330530 :370 +5488204665 :380 +2138414695 :390 +1941511609 :400 +4330572703 :410 +6575959195 :420 +3092186117 :430 +3819326117 :440 +9310511854 :450 +8074462379 :460 +9627495673 :470 +5188575272 :480 +4891227938 :490 +1830119491 :500 +2983367336 :510 +2440656643 :520 +0860213949 :530 +4639522473 :540 +7190702179 :550 +8609437027 :560 +7053921717 :570 +6293176752 :580 +3846748184 :590 +6766940513 :600 +2000568127 :610 +1452635608 :620 +2778577134 :630 +2757789609 :640 +1736371787 :650 +2146844090 :660 +1224953430 :670 +1465495853 :680 +7105079227 :690 +9689258923 :700 +5420199561 :710 +1212902196 :720 +0864034418 :730 +1598136297 :740 +7477130996 :750 +0518707211 :760 +3499999983 :770 +7297804995 :780 +1059731732 :790 +8160963185 :800 +9502445945 :810 +5346908302 :820 +6425223082 :830 +5334468503 :840 +5261931188 :850 +1710100031 :860 +3783875288 :870 +6587533208 :880 +3814206171 :890 +7766914730 :900 +3598253490 :910 +4287554687 :920 +3115956286 :930 +3882353787 :940 +5937519577 :950 +8185778053 :960 +2171226806 :970 +6130019278 :980 +7661119590 :990 +9216420198 :1000 diff --git a/otherlibs/num/test/pi_num.ml b/testsuite/tests/lib-num-2/pi_num.ml similarity index 100% rename from otherlibs/num/test/pi_num.ml rename to testsuite/tests/lib-num-2/pi_num.ml diff --git a/testsuite/tests/lib-num-2/pi_num.reference b/testsuite/tests/lib-num-2/pi_num.reference new file mode 100644 index 00000000..ad4dc996 --- /dev/null +++ b/testsuite/tests/lib-num-2/pi_num.reference @@ -0,0 +1,100 @@ +3141592653 :10 +5897932384 :20 +6264338327 :30 +9502884197 :40 +1693993751 :50 +0582097494 :60 +4592307816 :70 +4062862089 :80 +9862803482 :90 +5342117067 :100 +9821480865 :110 +1328230664 :120 +7093844609 :130 +5505822317 :140 +2535940812 :150 +8481117450 :160 +2841027019 :170 +3852110555 :180 +9644622948 :190 +9549303819 :200 +6442881097 :210 +5665933446 :220 +1284756482 :230 +3378678316 :240 +5271201909 :250 +1456485669 :260 +2346034861 :270 +0454326648 :280 +2133936072 :290 +6024914127 :300 +3724587006 :310 +6063155881 :320 +7488152092 :330 +0962829254 :340 +0917153643 :350 +6789259036 :360 +0011330530 :370 +5488204665 :380 +2138414695 :390 +1941511609 :400 +4330572703 :410 +6575959195 :420 +3092186117 :430 +3819326117 :440 +9310511854 :450 +8074462379 :460 +9627495673 :470 +5188575272 :480 +4891227938 :490 +1830119491 :500 +2983367336 :510 +2440656643 :520 +0860213949 :530 +4639522473 :540 +7190702179 :550 +8609437027 :560 +7053921717 :570 +6293176752 :580 +3846748184 :590 +6766940513 :600 +2000568127 :610 +1452635608 :620 +2778577134 :630 +2757789609 :640 +1736371787 :650 +2146844090 :660 +1224953430 :670 +1465495853 :680 +7105079227 :690 +9689258923 :700 +5420199561 :710 +1212902196 :720 +0864034418 :730 +1598136297 :740 +7477130996 :750 +0518707211 :760 +3499999983 :770 +7297804995 :780 +1059731732 :790 +8160963185 :800 +9502445945 :810 +5346908302 :820 +6425223082 :830 +5334468503 :840 +5261931188 :850 +1710100031 :860 +3783875288 :870 +6587533208 :880 +3814206171 :890 +7766914730 :900 +3598253490 :910 +4287554687 :920 +3115956286 :930 +3882353787 :940 +5937519577 :950 +8185778053 :960 +2171226806 :970 +6130019278 :980 +7661119590 :990 +9216420198 :1000 diff --git a/testsuite/tests/lib-num/Makefile b/testsuite/tests/lib-num/Makefile new file mode 100644 index 00000000..8b7b327a --- /dev/null +++ b/testsuite/tests/lib-num/Makefile @@ -0,0 +1,7 @@ +MODULES=test test_nats test_big_ints test_ratios test_nums test_io +MAIN_MODULE=end_test +ADD_COMPFLAGS=-w a +LIBRARIES=nums + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/otherlibs/num/test/end_test.ml b/testsuite/tests/lib-num/end_test.ml similarity index 100% rename from otherlibs/num/test/end_test.ml rename to testsuite/tests/lib-num/end_test.ml diff --git a/testsuite/tests/lib-num/end_test.reference b/testsuite/tests/lib-num/end_test.reference new file mode 100644 index 00000000..274cef90 --- /dev/null +++ b/testsuite/tests/lib-num/end_test.reference @@ -0,0 +1,162 @@ + +num_digits_nat + -1... 0... 1... +length_nat + 1... +equal_nat + 1... 2... 3... 4... +incr_nat + 1... 2... 3... 4... +decr_nat + 1... 2... 3... 4... +is_zero_nat + 1... 2... 3... 4... +string_of_nat + 1... 2... +string_of_nat && nat_of_string + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... +gcd_nat + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... +sqrt_nat + 1... 2... 3... 4... 5... +compare_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... +pred_big_int + 1... 2... 3... +succ_big_int + 1... 2... 3... +add_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... +sub_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... +mult_int_big_int + 1... 2... 3... 4... +mult_big_int + 1... 2... 3... 4... 5... +quomod_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... 23... 24... 25... +gcd_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... 23... 24... 25... 26... 27... 28... +int_of_big_int + 1... 2... 3... 4... 5... 6... 7... 8... +is_int_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... +sys_string_of_big_int + 1... +big_int_of_string + 1... 2... 4... 5... 6... 7... 9... 10... +power_base_int + 1... 2... 3... +base_power_big_int + 1... 2... 3... +power_int_positive_big_int + 1... 2... 3... 4... 5... 6... 7... +power_big_int_positive_int + 1... 2... 3... 4... 5... +power_big_int_positive_big_int + 1... 2... 3... 4... 5... 6... 7... 8... 9... +square_big_int + 1... 2... 3... 4... +big_int_of_nativeint + 1... 2... 3... +nativeint_of_big_int + 1... 2... 2... +big_int_of_int32 + 1... 2... 3... +int32_of_big_int + 1... 2... 3... 4... 5... 6... 7... 8... +big_int_of_int64 + 1... 2... 3... 4... 5... 6... 7... 8... +int64_of_big_int + 1... 2... 3... 4... 5... 6... 7... 8... +and_big_int + 1... 2... 3... 4... 5... 6... +or_big_int + 1... 2... 3... 4... 5... 6... +xor_big_int + 1... 2... 3... 4... 5... 6... +shift_left_big_int + 1... 2... 2... 3... 4... 5... 6... +shift_right_big_int + 1... 2... 3... 4... 5... +extract_big_int + 1... 2... 3... 4... 5... 6... +create_ratio + 1... 2... 3... 4... 5... 6... 7... 8... +create_normalized_ratio + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... +null_denominator + 1... 2... +sign_ratio + 1... 2... 3... +normalize_ratio + 1... 2... 3... 4... +report_sign_ratio + 1... 2... +is_integer_ratio + 1... 2... +add_ratio + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 1... 2... 3... 4... +sub_ratio + 1... 2... 3... 4... 5... 6... 7... 8... +mult_ratio + 1... 2... 3... 4... 5... 6... 7... 8... +div_ratio + 1... 2... 3... 4... 5... 6... 7... 8... +integer_ratio + 1... 2... 3... 4... 5... +floor_ratio + 1... 2... 3... 4... 5... +round_ratio + 1... 2... 3... 4... 5... +ceiling_ratio + 1... 2... 3... 4... 5... 6... +eq_ratio + 1... 2... 3... 4... 5... +compare_ratio + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... 23... 24... 25... 26... 27... 28... 29... 30... 31... 32... 33... 34... 35... 36... +eq_big_int_ratio + 1... 2... 3... 4... 5... +compare_big_int_ratio + 1... 2... 3... 4... 5... 6... 7... 8... 9... +int_of_ratio + 1... 2... 3... 4... 5... +ratio_of_int + 1... 2... +nat_of_ratio + 1... 2... 3... 4... +ratio_of_big_int + 1... +big_int_of_ratio + 1... 2... 3... +string_of_ratio + 1... 2... 3... 4... +ratio_of_string + 1... 6... 7... 8... +round_futur_last_digit + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... 23... 24... +approx_ratio_fix + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... +approx_ratio_exp + 1... 2... 3... 4... 5... 6... 7... 8... 9... +add_num + 1... 2... 3... 4... 5... 6... 7... 8... 9... +sub_num + 1... 2... 3... 4... 5... 7... 8... 9... 10... +mult_num + 1... 2... 3... 4... 5... 6... 7... 8... 9... +div_num + 1... 2... 3... 4... 5... 6... 7... 8... 9... +is_integer_num + 1... 2... 3... 4... +num_of_ratio + 1... 2... 3... +num_of_string + 1... 7... 8... 11... +output_value/input_value on nats + 1... 2... 3... 4... 5... 6... 7... +output_value/input_value on big ints + 1... 2... 3... 4... 5... +output_value/input_value on nums + 1... 2... 3... 4... 5... 6... 7... 8... +************* TESTS COMPLETED SUCCESSFULLY **************** diff --git a/otherlibs/num/test/test.ml b/testsuite/tests/lib-num/test.ml similarity index 75% rename from otherlibs/num/test/test.ml rename to testsuite/tests/lib-num/test.ml index f26ea82c..fce8e363 100644 --- a/otherlibs/num/test/test.ml +++ b/testsuite/tests/lib-num/test.ml @@ -66,9 +66,9 @@ let end_tests () = flush_all (); print_newline (); if !error_occurred then begin - prerr_endline "************* TESTS FAILED ****************"; exit 2 + print_endline "************* TESTS FAILED ****************"; exit 2 end else begin - prerr_endline "************* TESTS COMPLETED SUCCESSFULLY ****************"; + print_endline "************* TESTS COMPLETED SUCCESSFULLY ****************"; exit 0 end;; @@ -80,3 +80,22 @@ let eq_int32 (i: int32) (j: int32) = (i = j);; let eq_int64 (i: int64) (j: int64) = (i = j);; let sixtyfour = (1 lsl 31) <> 0;; + +let rec gcd_int i1 i2 = + if i2 = 0 then abs i1 else gcd_int i2 (i1 mod i2);; + +let rec num_bits_int_aux n = + if n = 0 then 0 else succ(num_bits_int_aux (n lsr 1));; + +let num_bits_int n = num_bits_int_aux (abs n);; + +let sign_int i = if i = 0 then 0 else if i > 0 then 1 else -1;; + +let length_of_int = Sys.word_size - 2;; + +let monster_int = 1 lsl length_of_int;; +let biggest_int = monster_int - 1;; +let least_int = - biggest_int;; + +let compare_int n1 n2 = + if n1 == n2 then 0 else if n1 > n2 then 1 else -1;; diff --git a/otherlibs/num/test/test_big_ints.ml b/testsuite/tests/lib-num/test_big_ints.ml similarity index 86% rename from otherlibs/num/test/test_big_ints.ml rename to testsuite/tests/lib-num/test_big_ints.ml index ec95dede..3474dd41 100644 --- a/otherlibs/num/test/test_big_ints.ml +++ b/testsuite/tests/lib-num/test_big_ints.ml @@ -1,7 +1,6 @@ open Test;; open Nat;; open Big_int;; -open Int_misc;; open List;; testing_function "compare_big_int";; @@ -782,3 +781,132 @@ test 7 eq_int (should_fail "-9223372036854775809", 1);; test 8 eq_int (should_fail "18446744073709551616", 1);; + +(* build a 128-bit big int from two int64 *) + +let big_int_128 hi lo = + add_big_int (mult_big_int (big_int_of_int64 hi) + (big_int_of_string "18446744073709551616")) + (big_int_of_int64 lo);; +let h1 = 0x7fd05b7ee46a29f8L +and h2 = 0x64b28b8ee70b6e6dL +and h3 = 0x58546e563f5b44f0L +and h4 = 0x1db72f6377ff3ec6L +and h5 = 0x4f9bb0a19c543cb1L;; + +testing_function "and_big_int";; + +test 1 eq_big_int + (and_big_int unit_big_int zero_big_int, zero_big_int);; +test 2 eq_big_int + (and_big_int zero_big_int unit_big_int, zero_big_int);; +test 3 eq_big_int + (and_big_int unit_big_int unit_big_int, unit_big_int);; +test 4 eq_big_int + (and_big_int (big_int_128 h1 h2) (big_int_128 h3 h4), + big_int_128 (Int64.logand h1 h3) (Int64.logand h2 h4));; +test 5 eq_big_int + (and_big_int (big_int_128 h1 h2) (big_int_of_int64 h5), + big_int_of_int64 (Int64.logand h2 h5));; +test 6 eq_big_int + (and_big_int (big_int_of_int64 h5) (big_int_128 h3 h4) , + big_int_of_int64 (Int64.logand h5 h4));; + +testing_function "or_big_int";; + +test 1 eq_big_int + (or_big_int unit_big_int zero_big_int, unit_big_int);; +test 2 eq_big_int + (or_big_int zero_big_int unit_big_int, unit_big_int);; +test 3 eq_big_int + (or_big_int unit_big_int unit_big_int, unit_big_int);; +test 4 eq_big_int + (or_big_int (big_int_128 h1 h2) (big_int_128 h3 h4), + big_int_128 (Int64.logor h1 h3) (Int64.logor h2 h4));; +test 5 eq_big_int + (or_big_int (big_int_128 h1 h2) (big_int_of_int64 h5), + big_int_128 h1 (Int64.logor h2 h5));; +test 6 eq_big_int + (or_big_int (big_int_of_int64 h5) (big_int_128 h3 h4) , + big_int_128 h3 (Int64.logor h5 h4));; + +testing_function "xor_big_int";; + +test 1 eq_big_int + (xor_big_int unit_big_int zero_big_int, unit_big_int);; +test 2 eq_big_int + (xor_big_int zero_big_int unit_big_int, unit_big_int);; +test 3 eq_big_int + (xor_big_int unit_big_int unit_big_int, zero_big_int);; +test 4 eq_big_int + (xor_big_int (big_int_128 h1 h2) (big_int_128 h3 h4), + big_int_128 (Int64.logxor h1 h3) (Int64.logxor h2 h4));; +test 5 eq_big_int + (xor_big_int (big_int_128 h1 h2) (big_int_of_int64 h5), + big_int_128 h1 (Int64.logxor h2 h5));; +test 6 eq_big_int + (xor_big_int (big_int_of_int64 h5) (big_int_128 h3 h4) , + big_int_128 h3 (Int64.logxor h5 h4));; + +testing_function "shift_left_big_int";; + +test 1 eq_big_int + (shift_left_big_int unit_big_int 0, + unit_big_int);; +test 2 eq_big_int + (shift_left_big_int unit_big_int 1, + big_int_of_int 2);; +test 2 eq_big_int + (shift_left_big_int unit_big_int 31, + big_int_of_string "2147483648");; +test 3 eq_big_int + (shift_left_big_int unit_big_int 64, + big_int_of_string "18446744073709551616");; +test 4 eq_big_int + (shift_left_big_int unit_big_int 95, + big_int_of_string "39614081257132168796771975168");; +test 5 eq_big_int + (shift_left_big_int (big_int_of_string "39614081257132168796771975168") 67, + big_int_of_string "5846006549323611672814739330865132078623730171904");; +test 6 eq_big_int + (shift_left_big_int (big_int_of_string "-39614081257132168796771975168") 67, + big_int_of_string "-5846006549323611672814739330865132078623730171904");; + +testing_function "shift_right_big_int";; + +test 1 eq_big_int + (shift_right_big_int unit_big_int 0, + unit_big_int);; +test 2 eq_big_int + (shift_right_big_int (big_int_of_int 12345678) 3, + big_int_of_int 1543209);; +test 3 eq_big_int + (shift_right_big_int (big_int_of_string "5299989648942") 32, + big_int_of_int 1234);; +test 4 eq_big_int + (shift_right_big_int (big_int_of_string "5846006549323611672814739330865132078623730171904") 67, + big_int_of_string "39614081257132168796771975168");; +test 5 eq_big_int + (shift_right_big_int (big_int_of_string "-5299989648942") 32, + big_int_of_int (-1234));; + +testing_function "extract_big_int";; + +test 1 eq_big_int + (extract_big_int (big_int_of_int64 0x123456789ABCDEFL) 3 13, + big_int_of_int 6589);; +test 2 eq_big_int + (extract_big_int (big_int_128 h1 h2) 67 12, + big_int_of_int 1343);; +test 3 eq_big_int + (extract_big_int (big_int_of_string "-1844674407370955178") 37 9, + big_int_of_int 307);; +test 4 eq_big_int + (extract_big_int unit_big_int 2048 254, + zero_big_int);; +test 5 eq_big_int + (extract_big_int (big_int_of_int64 0x123456789ABCDEFL) 0 32, + big_int_of_int64 2309737967L);; +test 6 eq_big_int + (extract_big_int (big_int_of_int (-1)) 2048 254, + zero_big_int);; diff --git a/otherlibs/num/test/test_io.ml b/testsuite/tests/lib-num/test_io.ml similarity index 100% rename from otherlibs/num/test/test_io.ml rename to testsuite/tests/lib-num/test_io.ml diff --git a/otherlibs/num/test/test_nats.ml b/testsuite/tests/lib-num/test_nats.ml similarity index 98% rename from otherlibs/num/test/test_nats.ml rename to testsuite/tests/lib-num/test_nats.ml index 923086ec..b47b39f8 100644 --- a/otherlibs/num/test/test_nats.ml +++ b/testsuite/tests/lib-num/test_nats.ml @@ -126,7 +126,7 @@ for i = 1 to 20 do let nat1 = nat_of_int n1 and nat2 = nat_of_int n2 in ignore (gcd_nat nat1 0 1 nat2 0 1); - ignore (test i eq (int_of_nat nat1, Int_misc.gcd_int n1 n2)) + ignore (test i eq (int_of_nat nat1, gcd_int n1 n2)) done ;; diff --git a/otherlibs/num/test/test_nums.ml b/testsuite/tests/lib-num/test_nums.ml similarity index 99% rename from otherlibs/num/test/test_nums.ml rename to testsuite/tests/lib-num/test_nums.ml index 42428580..b26001bc 100644 --- a/otherlibs/num/test/test_nums.ml +++ b/testsuite/tests/lib-num/test_nums.ml @@ -2,7 +2,6 @@ open Test;; open Nat;; open Big_int;; open Ratio;; -open Int_misc;; open Num;; open Arith_status;; diff --git a/otherlibs/num/test/test_ratios.ml b/testsuite/tests/lib-num/test_ratios.ml similarity index 99% rename from otherlibs/num/test/test_ratios.ml rename to testsuite/tests/lib-num/test_ratios.ml index df2001f1..8896fb86 100644 --- a/otherlibs/num/test/test_ratios.ml +++ b/testsuite/tests/lib-num/test_ratios.ml @@ -2,7 +2,6 @@ open Test;; open Nat;; open Big_int;; open Ratio;; -open Int_misc;; open Arith_status;; set_error_when_null_denominator false diff --git a/testsuite/tests/lib-scanf-2/Makefile b/testsuite/tests/lib-scanf-2/Makefile new file mode 100644 index 00000000..90a0ea6d --- /dev/null +++ b/testsuite/tests/lib-scanf-2/Makefile @@ -0,0 +1,21 @@ +default: compile run + +compile: tscanf2_io.cmo tscanf2_io.cmx + @$(OCAMLC) unix.cma tscanf2_io.cmo -o master.byte tscanf2_master.ml + @$(OCAMLC) tscanf2_io.cmo -o slave.byte tscanf2_slave.ml + @$(OCAMLOPT) unix.cmxa tscanf2_io.cmx -o master.native tscanf2_master.ml + @$(OCAMLOPT) tscanf2_io.cmx -o slave.native tscanf2_slave.ml + +run: + @printf " ... testing with ocamlc" + @./master.byte ./slave.byte > result.byte 2>&1 + @diff -q reference result.byte > /dev/null || (echo " => failed" && exit 1) + @printf " ocamlopt" + @./master.native ./slave.native > result.native 2>&1 + @diff -q reference result.native > /dev/null || (echo " => failed" && exit 1) + @echo " => passed" + +clean: defaultclean + @rm -f master.* slave.* result.* + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-scanf-2/reference b/testsuite/tests/lib-scanf-2/reference new file mode 100644 index 00000000..4b8d53fc --- /dev/null +++ b/testsuite/tests/lib-scanf-2/reference @@ -0,0 +1,2 @@ + Ping-pong Ping-pong Ping-pong Ping-pong Ping-pong Ping-pong Ping-pong Ping-pong! +Test OK. diff --git a/testsuite/tests/lib-scanf-2/tscanf2_io.ml b/testsuite/tests/lib-scanf-2/tscanf2_io.ml new file mode 100644 index 00000000..03997897 --- /dev/null +++ b/testsuite/tests/lib-scanf-2/tscanf2_io.ml @@ -0,0 +1,19 @@ +(* A very simple communication module using buffers. It should help detecting + advanced character reading by Scanf when using stdin. *) + +let send_flush send ob oc t = + send ob t; + Buffer.output_buffer oc ob; + Buffer.clear ob; + flush oc +;; + +(* The correct sending format for the test should be "%S\n", + but to avoid problems when Scanf ask too early for the next character, + "%S\n\n" is fine. *) +let send_string = send_flush (fun ob -> Printf.bprintf ob "%S\n");; + +(* The correct reading format for the test should be "%S\n", + but to avoid problems when Scanf ask too early for the next character, + " %S\n" is fine. *) +let receive_string ib = Scanf.bscanf ib "%S\n" (fun s -> s);; diff --git a/testsuite/tests/lib-scanf-2/tscanf2_master.ml b/testsuite/tests/lib-scanf-2/tscanf2_master.ml new file mode 100644 index 00000000..2dd91bc0 --- /dev/null +++ b/testsuite/tests/lib-scanf-2/tscanf2_master.ml @@ -0,0 +1,51 @@ +(* A very simple master: + - first launch a slave process, + - then repeat a random number of times: + + print the string " Ping" on stderr, + + send it to the slave, + + and wait for its answer "-pong", + - finally send the string "stop" to the slave + and wait for its answer "OK, bye!" + and die. + + Use the communication module Tscanf2_io. + + Usage: test_master *) + +open Tscanf2_io;; + +let slave = Sys.argv.(1);; +let ic, oc = Unix.open_process slave;; +let ib = Scanf.Scanning.from_channel ic;; +let ob = Buffer.create 1024;; + +let send_string_ping ob = send_string ob oc " Ping";; +let send_string_stop ob = send_string ob oc "stop";; + +let interact i = + Printf.eprintf " Ping"; flush stderr; + send_string_ping ob; + let s = receive_string ib in + if s <> "-pong" then failwith ("Master: unbound string " ^ s) +;; + +begin +(* + Random.self_init (); + let n = max (Random.int 8) 1 in +*) + let n = 8 in + let rec loop i = + if i > 0 then (interact i; loop (i - 1)) in + loop n +end +;; + +begin + send_string_stop ob; + let ack = receive_string ib in + if ack = "OK, bye!" + then (print_endline "Test OK."; exit 0) + else (print_endline "Test Failed!"; exit 2) +end +;; diff --git a/testsuite/tests/lib-scanf-2/tscanf2_slave.ml b/testsuite/tests/lib-scanf-2/tscanf2_slave.ml new file mode 100644 index 00000000..e06a81f8 --- /dev/null +++ b/testsuite/tests/lib-scanf-2/tscanf2_slave.ml @@ -0,0 +1,28 @@ +(* A very simple slave: + - read the string " Ping" on stdin, + - then print the string "-pong" on stderr, + - and send it back on stdout + - until reading the string "stop" on stdin, + - then print the string "!\n" on stderr, + - send back the string "OK, bye!" on stdout, + - and die. + + Use the communication module Test_scanf2_io. *) + +open Tscanf2_io;; + +let ib = Scanf.Scanning.from_channel stdin;; +let ob = Buffer.create 1024 +and oc = stdout;; + +let send_string_pong ob = send_string ob oc "-pong";; +let send_string_okbye ob = send_string ob oc "OK, bye!";; + +while true do + let s = receive_string ib in + match s with + | " Ping" -> Printf.eprintf "-pong"; flush stderr; send_string_pong ob + | "stop" -> Printf.eprintf "!\n"; flush stderr; send_string_okbye ob; exit 0 + | s -> failwith ("Slave: unbound string " ^ s) +done +;; diff --git a/testsuite/tests/lib-scanf/Makefile b/testsuite/tests/lib-scanf/Makefile new file mode 100644 index 00000000..0be4bf14 --- /dev/null +++ b/testsuite/tests/lib-scanf/Makefile @@ -0,0 +1,7 @@ +MODULES= +MAIN_MODULE=tscanf +ADD_COMPFLAGS=-I $(BASEDIR)/lib +ADD_MODULES=testing + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-scanf/tscanf.ml b/testsuite/tests/lib-scanf/tscanf.ml new file mode 100644 index 00000000..c6fa1f54 --- /dev/null +++ b/testsuite/tests/lib-scanf/tscanf.ml @@ -0,0 +1,1434 @@ +(*************************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Pierre Weis, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(*************************************************************************) + +(* $Id: tscanf.ml 9306 2009-07-03 08:36:54Z weis $ + +A testbed file for the module Scanf. + +*) + +open Testing;; + +open Scanf;; + +(* The ``continuation'' that returns the scanned value. *) +let id x = x;; + +(* Testing space scanning. *) +let test0 () = + (sscanf "" "" id) 1 + + (sscanf "" " " id) 2 + + (sscanf " " " " id) 3 + + (sscanf "\t" " " id) 4 + + (sscanf "\n" " " id) 5 + + (sscanf "\n\t 6" " %d" id) +;; + +test (test0 () = 21) +;; + +(* Testing integer scanning %i and %d. *) +let test1 () = + sscanf "1" "%d" id + + sscanf " 2" " %d" id + + sscanf " -2" " %d" id + + sscanf " +2" " %d" id + + sscanf " 2a " " %da" id +;; + +test (test1 () = 5) +;; + +let test2 () = + sscanf "123" "%2i" id + + sscanf "245" "%d" id + + sscanf " 2a " " %1da" id +;; + +test (test2 () = 259) +;; + +let test3 () = + sscanf "0xff" "%3i" id + + sscanf "0XEF" "%3i" id + + sscanf "x=-245" " x = %d" id + + sscanf " 2a " " %1da" id +;; + +test (test3 () = -214) +;; + +(* Testing float scanning. *) +(* f style. *) +let test4 () = + bscanf (Scanning.from_string "1") + "%f" (fun b0 -> b0 = 1.0) && + bscanf (Scanning.from_string "-1") + "%f" (fun b0 -> b0 = -1.0) && + bscanf (Scanning.from_string "+1") + "%f" (fun b0 -> b0 = 1.0) && + bscanf (Scanning.from_string "1.") + "%f" (fun b0 -> b0 = 1.0) && + bscanf (Scanning.from_string ".1") + "%f" (fun b0 -> b0 = 0.1) && + bscanf (Scanning.from_string "-.1") + "%f" (fun b0 -> b0 = -0.1) && + bscanf (Scanning.from_string "+.1") + "%f" (fun b0 -> b0 = 0.1) && + bscanf (Scanning.from_string "+1.") + "%f" (fun b0 -> b0 = 1.0) && + bscanf (Scanning.from_string "-1.") + "%f" (fun b0 -> b0 = -1.0) && + bscanf (Scanning.from_string "0 1. 1.3") + "%f %f %f" (fun b0 b1 b2 -> b0 = 0.0 && b1 = 1.0 && b2 = 1.3) && + bscanf (Scanning.from_string "0.113") + "%4f" (fun b0 -> b0 = 0.11) && + bscanf (Scanning.from_string "0.113") + "%5f" (fun b0 -> b0 = 0.113) && + bscanf (Scanning.from_string "000.113") + "%15f" (fun b0 -> b0 = 0.113) && + bscanf (Scanning.from_string "+000.113") + "%15f" (fun b0 -> b0 = 0.113) && + bscanf (Scanning.from_string "-000.113") + "%15f" (fun b0 -> b0 = -0.113) +;; +test (test4 ()) +;; + +(* e style. *) +let test5 () = + bscanf (Scanning.from_string "1e1") + "%e" (fun b -> b = 10.0) && + bscanf (Scanning.from_string "1e+1") + "%e" (fun b -> b = 10.0) && + bscanf (Scanning.from_string "10e-1") + "%e" (fun b -> b = 1.0) && + bscanf (Scanning.from_string "10.e-1") + "%e" (fun b -> b = 1.0) && + bscanf (Scanning.from_string "1e1 1.e+1 1.3e-1") + "%e %e %e" (fun b1 b2 b3 -> b1 = 10.0 && b2 = b1 && b3 = 0.13) && + +(* g style. *) + bscanf (Scanning.from_string "1 1.1 0e+1 1.3e-1") + "%g %g %g %g" + (fun b1 b2 b3 b4 -> + b1 = 1.0 && b2 = 1.1 && b3 = 0.0 && b4 = 0.13) +;; + +test (test5 ()) +;; + +(* Testing boolean scanning. *) +let test6 () = + bscanf (Scanning.from_string "truetrue") "%B%B" + (fun b1 b2 -> (b1, b2) = (true, true)) && + bscanf (Scanning.from_string "truefalse") "%B%B" + (fun b1 b2 -> (b1, b2) = (true, false)) && + bscanf (Scanning.from_string "falsetrue") "%B%B" + (fun b1 b2 -> (b1, b2) = (false, true)) && + bscanf (Scanning.from_string "falsefalse") "%B%B" + (fun b1 b2 -> (b1, b2) = (false, false)) && + bscanf (Scanning.from_string "true false") "%B %B" + (fun b1 b2 -> (b1, b2) = (true, false)) +;; + +test (test6 ()) +;; + +(* Testing char scanning. *) + +let test7 () = + bscanf (Scanning.from_string "'a' '\n' '\t' '\000' '\032'") + "%C %C %C %C %C" + (fun c1 c2 c3 c4 c5 -> + c1 = 'a' && c2 = '\n' && c3 = '\t' && c4 = '\000' && c5 = '\032') && + +(* Here \n, \t, and \032 are skipped due to the space semantics of scanf. *) + bscanf (Scanning.from_string "a \n \t \000 \032b") + "%c %c %c " + (fun c1 c2 c3 -> + c1 = 'a' && c2 = '\000' && c3 = 'b') +;; + +test (test7 ()) +;; + +let verify_read c = + let s = Printf.sprintf "%C" c in + let ib = Scanning.from_string s in + assert (bscanf ib "%C" id = c) +;; + +let verify_scan_Chars () = + for i = 0 to 255 do verify_read (char_of_int i) done +;; + +let test8 () = verify_scan_Chars () = ();; + +test (test8 ()) +;; + +(* Testing string scanning. *) + +(* %S and %s styles. *) +let unit fmt s = + let ib = Scanning.from_string (Printf.sprintf "%S" s) in + Scanf.bscanf ib fmt id +;; + +let test_fmt fmt s = unit fmt s = s;; + +(* The following test9_string is a result for test9 scanning. + Test9_string is the string "", + that is character i tréma, followed by french right guillemet, + followed by inverted question mark. + It is NOT the string "Ôªø", + that is uppercase o with circonflex accent, followed by commercial a, + followed by empty set. + + In other words, the string "" has the following 3 characters + "\239\187\191". + It has NOT the characters "\212\170\248"! + + Beware with automatic translation by your own local settings + (being your locale or your OS!) +*) +let test9_string = "";; + +let test_S = test_fmt "%S";; +let test9 () = + test_S "poi" && + test_S "a\"b" && + test_S "a\nb" && + test_S "a\010b" && + test_S "a\\\n\ + b \\\n\ + c\010\\\n\ + b" && + test_S "a\\\n\ + \\\n\ + \\\n\ + b \\\n\ + c\010\\\n\ + b" && + test_S "\xef" && + test_S "\\xef" && + Scanf.sscanf "\"\\xef\"" "%S" (fun s -> s) = + "\xef" && + Scanf.sscanf "\"\\xef\\xbb\\xbf\"" "%S" (fun s -> s) = + test9_string && + Scanf.sscanf "\"\\xef\\xbb\\xbf\"" "%S" (fun s -> s) = + "\239\187\191" && + Scanf.sscanf "\"\xef\xbb\xbf\"" "%S" (fun s -> s) = + test9_string && + Scanf.sscanf "\"\\\\xef\\\\xbb\\\\xbf\"" "%S" (fun s -> s) = + "\\xef\\xbb\\xbf" && + Scanf.sscanf "\"\ \"" "%S" (fun s -> s) = + "\ " +;; + +test (test9 ()) +;; + +let test10 () = + let unit s = + let ib = Scanning.from_string s in + Scanf.bscanf ib "%S" id in + + let res = + sscanf "Une chaîne: \"celle-ci\" et \"celle-là\"!" + "%s %s %S %s %S %s" + (fun s1 s2 s3 s4 s5 s6 -> s1 ^ s2 ^ s3 ^ s4 ^ s5 ^ s6) in + res = "Unechaîne:celle-cietcelle-là!" && + (* Testing the result of reading a %S string. *) + unit "\"a\\\n b\"" = "ab" && + unit "\"\\\n ab\"" = "ab" && + unit "\"\n\\\n ab\"" = "\nab" && + unit "\"\n\\\n a\nb\"" = "\na\nb" && + unit "\"\n\\\n \\\n a\nb\"" = "\na\nb" && + unit "\"\n\\\n a\n\\\nb\\\n\"" = "\na\nb" && + unit "\"a\\\n \"" = "a" && + true +;; + +test (test10 ()) +;; + +(* %[] style *) +let test11 () = + sscanf "Pierre Weis 70" "%s %s %s" + (fun prenom nom poids -> + prenom = "Pierre" && nom = "Weis" && int_of_string poids = 70) + && + sscanf "Jean-Luc de Léage 68" "%[^ ] %[^ ] %d" + (fun prenom nom poids -> + prenom = "Jean-Luc" && nom = "de Léage" && poids = 68) + && + sscanf "Daniel de Rauglaudre 66" "%s@\t %s@\t %d" + (fun prenom nom poids -> + prenom = "Daniel" && nom = "de Rauglaudre" && poids = 66) +;; + +(* Empty string (end of input) testing. *) +let test110 () = + sscanf "" " " (fun x -> x) "" = "" && + sscanf "" "%s" (fun x -> x = "") && + sscanf "" "%s%s" (fun x y -> x = "" && y = "") && + sscanf "" "%s " (fun x -> x = "") && + sscanf "" " %s" (fun x -> x = "") && + sscanf "" " %s " (fun x -> x = "") && + sscanf "" "%[^\n]" (fun x -> x = "") && + sscanf "" "%[^\n] " (fun x -> x = "") && + sscanf " " "%s" (fun x -> x = "") && + sscanf " " "%s%s" (fun x y -> x = "" && y = "") && + sscanf " " " %s " (fun x -> x = "") && + sscanf " " " %s %s" (fun x y -> x = "" && x = y) && + sscanf " " " %s@ %s" (fun x y -> x = "" && x = y) && + sscanf " poi !" " %s@ %s@." (fun x y -> x = "poi" && y = "!") && + sscanf " poi !" "%s@ %s@." (fun x y -> x = "" && y = "poi !") +;; + +let test111 () = sscanf "" "%[^\n]@\n" (fun x -> x = "");; + +test (test11 () && test110 () && test111 ()) +;; + +(* Scanning lists. *) +let ib () = Scanning.from_string "[1;2;3;4; ]";; + +(* Statically known lists can be scanned directly. *) +let f ib = + bscanf ib " [" (); + bscanf ib " %i;" (fun i -> + bscanf ib " %i;" (fun j -> + bscanf ib " %i;" (fun k -> + bscanf ib " %i;" (fun l -> + bscanf ib " ]" (); + [i; j; k; l]))));; + +let test12 () = f (ib ()) = [1; 2; 3; 4];; + +test (test12 ()) +;; + +(* A general list scanner that always fails to succeed. *) +let rec scan_elems ib accu = + try bscanf ib " %i;" (fun i -> scan_elems ib (i :: accu)) with + | _ -> accu +;; + +let g ib = bscanf ib "[ " (); List.rev (scan_elems ib []);; + +let test13 () = g (ib ()) = [1; 2; 3; 4];; + +test (test13 ()) +;; + +(* A general int list scanner. *) +let rec scan_int_list ib = + bscanf ib "[ " (); + let accu = scan_elems ib [] in + bscanf ib " ]" (); + List.rev accu +;; + +let test14 () = scan_int_list (ib ()) = [1; 2; 3; 4];; + +test (test14 ()) +;; + +(* A general list scanner that always succeeds. *) +let rec scan_elems ib accu = + bscanf ib " %i %c" + (fun i -> function + | ';' -> scan_elems ib (i :: accu) + | ']' -> List.rev (i :: accu) + | c -> failwith "scan_elems") +;; + +let rec scan_int_list ib = + bscanf ib "[ " (); + scan_elems ib [] +;; + +let test15 () = + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1; 2; 3; 4];; + +test (test15 ()) +;; + +let rec scan_elems ib accu = + try + bscanf ib "%c %i" + (fun c i -> + match c with + | ';' -> scan_elems ib (i :: accu) + | ']' -> List.rev (i :: accu) + | '[' when accu = [] -> scan_elems ib (i :: accu) + | c -> print_endline (String.make 1 c); failwith "scan_elems") + with + | Scan_failure _ -> bscanf ib "]" (); accu + | End_of_file -> accu +;; + +let scan_int_list ib = scan_elems ib [];; + +let test16 () = + scan_int_list (Scanning.from_string "[]") = List.rev [] && + scan_int_list (Scanning.from_string "[1;2;3;4]") = List.rev [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4; ]") = List.rev [1;2;3;4] && + (* Should fail but succeeds! *) + scan_int_list (Scanning.from_string "[1;2;3;4") = List.rev [1;2;3;4];; + +test (test16 ()) +;; + +let rec scan_elems ib accu = + bscanf ib " %i%[]; \t\n\r]" + (fun i s -> + match s with + | ";" -> scan_elems ib (i :: accu) + | "]" -> List.rev (i :: accu) + | s -> List.rev (i :: accu)) +;; + +let scan_int_list ib = + bscanf ib " [" (); + scan_elems ib [] +;; + +let test17 () = + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4; ]") = [1;2;3;4] && + (* Should fail but succeeds! *) + scan_int_list (Scanning.from_string "[1;2;3;4 5]") = [1;2;3;4];; + +test (test17 ()) +;; + +let rec scan_elems ib accu = + bscanf ib " %c " (fun c -> + match c with + | '[' when accu = [] -> + (* begginning of list: could find either + - an int, if the list is not empty, + - the char ], if the list is empty. *) + bscanf ib "%[]]" + (function + | "]" -> accu + | _ -> + bscanf ib " %i " (fun i -> + scan_rest ib (i :: accu))) + | _ -> failwith "scan_elems") + +and scan_rest ib accu = + bscanf ib " %c " (fun c -> + match c with + | ';' -> + bscanf ib "%[]]" + (function + | "]" -> accu + | _ -> + bscanf ib " %i " (fun i -> + scan_rest ib (i :: accu))) + | ']' -> accu + | _ -> failwith "scan_rest") +;; + +let scan_int_list ib = List.rev (scan_elems ib []);; + +let test18 () = + scan_int_list (Scanning.from_string "[]") = [] && + scan_int_list (Scanning.from_string "[ ]") = [] && + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4; ]") = [1;2;3;4];; + +test (test18 ()) +;; + +(* Those properly fail *) + +let test19 () = + failure_test + scan_int_list (Scanning.from_string "[1;2;3;4 5]") + "scan_rest" +;; + +(test19 ()) +;; + +let test20 () = + scan_failure_test + scan_int_list (Scanning.from_string "[1;2;3;4;; 5]");; + +(test20 ()) +;; + +let test21 () = + scan_failure_test + scan_int_list (Scanning.from_string "[1;2;3;4;;");; + +(test21 ()) +;; + +let rec scan_elems ib accu = + bscanf ib "%1[];]" (function + | "]" -> accu + | ";" -> scan_rest ib accu + | _ -> + failwith + (Printf.sprintf "scan_int_list" (* + "scan_int_list: char %i waiting for ']' or ';' but found %c" + (Scanning.char_count ib) (Scanning.peek_char ib)*))) + +and scan_rest ib accu = + bscanf ib "%[]]" (function + | "]" -> accu + | _ -> scan_elem ib accu) + +and scan_elem ib accu = + bscanf ib " %i " (fun i -> scan_elems ib (i :: accu)) +;; + +let scan_int_list ib = + bscanf ib " [ " (); + List.rev (scan_rest ib []) +;; + +let test22 () = + scan_int_list (Scanning.from_string "[]") = [] && + scan_int_list (Scanning.from_string "[ ]") = [] && + scan_int_list (Scanning.from_string "[1]") = [1] && + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4;]") = [1;2;3;4];; + +test (test22 ()) +;; + +(* Should work and does not with this version of scan_int_list! +scan_int_list (Scanning.from_string "[1;2;3;4; ]");; +(* Should lead to a bad input error. *) +scan_int_list (Scanning.from_string "[1;2;3;4 5]");; +scan_int_list (Scanning.from_string "[1;2;3;4;;");; +scan_int_list (Scanning.from_string "[1;2;3;4;; 5]");; +scan_int_list (Scanning.from_string "[1;2;3;4;; 23]");; +*) + +let rec scan_elems ib accu = + try bscanf ib " %i %1[;]" (fun i s -> + if s = "" then i :: accu else scan_elems ib (i :: accu)) with + | Scan_failure _ -> accu +;; + +(* The general int list scanner. *) +let rec scan_int_list ib = + bscanf ib "[ " (); + let accu = scan_elems ib [] in + bscanf ib " ]" (); + List.rev accu +;; + +(* The general HO list scanner. + This version does not fix the separator, nor the spacing before and after + the separator (it uses the functional argument [scan_elem] to parse the + separator, its spacing, and the item). + *) +let rec scan_elems ib scan_elem accu = + try scan_elem ib (fun i s -> + let accu = i :: accu in + if s = "" then accu else scan_elems ib scan_elem accu) with + | Scan_failure _ -> accu +;; + +let scan_list scan_elem ib = + bscanf ib "[ " (); + let accu = scan_elems ib scan_elem [] in + bscanf ib " ]" (); + List.rev accu +;; + +(* Deriving particular list scanners from the HO list scanner. *) +let scan_int_elem ib = bscanf ib " %i %1[;]";; +let scan_int_list = scan_list scan_int_elem;; + +let test23 () = + scan_int_list (Scanning.from_string "[]") = [] && + scan_int_list (Scanning.from_string "[ ]") = [] && + scan_int_list (Scanning.from_string "[1]") = [1] && + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4;]") = [1;2;3;4];; + +test (test23 ()) +;; + +let test24 () = + scan_failure_test scan_int_list (Scanning.from_string "[1;2;3;4 5]") +and test25 () = + scan_failure_test scan_int_list (Scanning.from_string "[1;2;3;4;;") +and test26 () = + scan_failure_test scan_int_list (Scanning.from_string "[1;2;3;4;; 5]") +and test27 () = + scan_failure_test scan_int_list (Scanning.from_string "[1;2;3;4;; 23]");; + + (test24 ()) && + (test25 ()) && + (test26 ()) && + (test27 ()) +;; + +(* To scan a Caml string: + the format is "\"%s@\"". + A better way would be to add a %S (String.escaped), a %C (Char.escaped). + This is now available. *) +let scan_string_elem ib = bscanf ib " \"%s@\" %1[;]";; +let scan_string_list = scan_list scan_string_elem;; + +let scan_String_elem ib = bscanf ib " %S %1[;]";; +let scan_String_list = scan_list scan_String_elem;; + +let test28 () = + scan_string_list (Scanning.from_string "[]") = [] && + scan_string_list (Scanning.from_string "[\"Le\"]") = ["Le"] && + scan_string_list + (Scanning.from_string "[\"Le\";\"langage\";\"Objective\";\"Caml\"]") = + ["Le"; "langage"; "Objective"; "Caml"] && + scan_string_list + (Scanning.from_string "[\"Le\";\"langage\";\"Objective\";\"Caml\"; ]") = + ["Le"; "langage"; "Objective"; "Caml"] && + + scan_String_list (Scanning.from_string "[]") = [] && + scan_String_list (Scanning.from_string "[\"Le\"]") = ["Le"] && + scan_String_list + (Scanning.from_string "[\"Le\";\"langage\";\"Objective\";\"Caml\"]") = + ["Le"; "langage"; "Objective"; "Caml"] && + scan_String_list + (Scanning.from_string "[\"Le\";\"langage\";\"Objective\";\"Caml\"; ]") = + ["Le"; "langage"; "Objective"; "Caml"];; + +test (test28 ()) +;; + +(* The general HO list scanner with continuations. *) +let rec scan_elems ib scan_elem accu = + scan_elem ib + (fun i s -> + let accu = i :: accu in + if s = "" then accu else scan_elems ib scan_elem accu) + (fun ib exc -> accu) +;; + +let scan_list scan_elem ib = + bscanf ib "[ " (); + let accu = scan_elems ib scan_elem [] in + bscanf ib " ]" (); + List.rev accu +;; + +(* Deriving particular list scanners from the HO list scanner. *) +let scan_int_elem ib f ek = kscanf ib ek " %i %1[;]" f;; +let scan_int_list = scan_list scan_int_elem;; + +let test29 () = + scan_int_list (Scanning.from_string "[]") = [] && + scan_int_list (Scanning.from_string "[ ]") = [] && + scan_int_list (Scanning.from_string "[1]") = [1] && + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4;]") = [1;2;3;4];; + +test (test29 ()) +;; + +let scan_string_elem ib f ek = kscanf ib ek " %S %1[;]" f;; +let scan_string_list = scan_list scan_string_elem;; + +let test30 () = + scan_string_list (Scanning.from_string "[]") = [] && + scan_string_list (Scanning.from_string "[ ]") = [] && + scan_string_list (Scanning.from_string "[ \"1\" ]") = ["1"] && + scan_string_list + (Scanning.from_string "[\"1\"; \"2\"; \"3\"; \"4\"]") = + ["1"; "2"; "3"; "4"] && + scan_string_list + (Scanning.from_string "[\"1\"; \"2\"; \"3\"; \"4\";]") = + ["1"; "2"; "3"; "4"];; + +test (test30 ()) +;; + +(* A generic polymorphic item scanner, *) +let scan_elem fmt ib f ek = kscanf ib ek fmt f;; + +(* Derivation of list scanners from the generic polymorphic item scanner + applications. *) +let scan_int_list = scan_list (scan_elem " %i %1[;]");; +let scan_string_list = scan_list (scan_elem " %S %1[;]");; +let scan_bool_list = scan_list (scan_elem " %B %1[;]");; +let scan_char_list = scan_list (scan_elem " %C %1[;]");; +let scan_float_list = scan_list (scan_elem " %f %1[;]");; + +(* In this version the [scan_elem] function should be a [kscanf] like + scanning function: we give it an error continuation. + + The [scan_elem] argument, probably use some partial application of the + following generic [scan_elem]: + + let scan_elem fmt ib f ek = kscanf ib ek fmt f;; + + For instance, a suitable [scan_elem] for integers could be: + + let scan_integer_elem = scan_elem " %i";; + +*) +let rec scan_elems ib scan_elem accu = + scan_elem ib + (fun i -> + let accu = i :: accu in + kscanf ib + (fun ib exc -> accu) + " %1[;]" + (fun s -> if s = "" then accu else scan_elems ib scan_elem accu)) + (fun ib exc -> accu) +;; + +let scan_list scan_elem ib = + bscanf ib "[ " (); + let accu = scan_elems ib scan_elem [] in + bscanf ib " ]" (); + List.rev accu +;; + +let scan_int_list = scan_list (scan_elem " %i");; +let scan_string_list = scan_list (scan_elem " %S");; +let scan_bool_list = scan_list (scan_elem " %B");; +let scan_char_list = scan_list (scan_elem " %C");; +let scan_float_list = scan_list (scan_elem " %f");; + +let test31 () = + scan_int_list (Scanning.from_string "[]") = [] && + scan_int_list (Scanning.from_string "[ ]") = [] && + scan_int_list (Scanning.from_string "[1]") = [1] && + scan_int_list (Scanning.from_string "[1;2;3;4]") = [1;2;3;4] && + scan_int_list (Scanning.from_string "[1;2;3;4;]") = [1;2;3;4];; + +test (test31 ()) +;; + +let test32 () = + scan_string_list (Scanning.from_string "[]") = [] && + scan_string_list (Scanning.from_string "[ ]") = [] && + scan_string_list (Scanning.from_string "[ \"1\" ]") = ["1"] && + scan_string_list + (Scanning.from_string "[\"1\"; \"2\"; \"3\"; \"4\"]") = + ["1"; "2"; "3"; "4"] && + scan_string_list + (Scanning.from_string "[\"1\"; \"2\"; \"3\"; \"4\";]") = + ["1"; "2"; "3"; "4"];; + +test (test32 ()) +;; + +(* Using [kscanf] only. + + We use format values to stand for ``functional'' specifications to scan + the elements of lists. + + The list item separator and the separator spacing are builtin into the + [scan_elems] iterator and thus are conveniently omitted from the + definitional format for item scanning. +*) +let rec scan_elems ib scan_elem_fmt accu = + kscanf ib (fun ib exc -> accu) + scan_elem_fmt + (fun i -> + let accu = i :: accu in + bscanf ib + " %1[;] " + (function + | "" -> accu + | _ -> scan_elems ib scan_elem_fmt accu) + ) +;; + +let scan_list scan_elem_fmt ib = + bscanf ib "[ " (); + let accu = scan_elems ib scan_elem_fmt [] in + bscanf ib " ]" (); + List.rev accu +;; + +let scan_int_list = scan_list "%i";; +let scan_string_list = scan_list "%S";; +let scan_bool_list = scan_list "%B";; +let scan_char_list = scan_list "%C";; +let scan_float_list = scan_list "%f";; + +let test33 () = + scan_int_list (Scanning.from_string "[]") = [] && + scan_int_list (Scanning.from_string "[ ]") = [] && + scan_int_list (Scanning.from_string "[ 1 ]") = [1] && + scan_int_list (Scanning.from_string "[ 1; 2; 3; 4 ]") = [1; 2; 3; 4] && + scan_int_list (Scanning.from_string "[1;2;3;4;]") = [1; 2; 3; 4];; + +test (test33 ()) +;; + +let test34 () = + scan_string_list (Scanning.from_string "[]") = [] && + scan_string_list (Scanning.from_string "[ ]") = [] && + scan_string_list (Scanning.from_string "[ \"1\" ]") = ["1"] && + scan_string_list + (Scanning.from_string "[\"1\"; \"2\"; \"3\"; \"4\"]") = + ["1"; "2"; "3"; "4"] && + scan_string_list + (Scanning.from_string "[\"1\"; \"2\"; \"3\"; \"4\";]") = + ["1"; "2"; "3"; "4"];; + +test (test34 ()) +;; + +(* Using kscanf only. + + Same as the preceding functional, except that we no more use format values + to scan items: we use scanners that scan elements of the list on the + fly. +*) +(* This version cannot handle empty lists! +let rec scan_elems ib scan_elem accu = + scan_elem ib + (fun elem -> + let accu = elem :: accu in + kscanf ib (fun ib exc -> accu) + " %1[;] " + (function + | "" -> accu + | _ -> scan_elems ib scan_elem accu)) +;; +*) + +(* We use [kscanf] with a [%r] format ! *) +let rec scan_elems scan_elem accu ib = + kscanf ib (fun ib exc -> accu) + "%r" + (function ib -> + scan_elem ib + (function elem -> + let accu = elem :: accu in + bscanf ib + " %1[;] " + (function + | "" -> accu + | _ -> scan_elems scan_elem accu ib))) + (function l -> l) +;; + +let scan_list scan_elem ib = + bscanf ib "[ " (); + let accu = scan_elems scan_elem [] ib in + bscanf ib " ]" (); + List.rev accu +;; + +(* We may also try a version with only one format: + We also changed the type of [scan_elem] to partially apply it to its + ``natural'' continuation. +let rec scan_elems scan_elem accu ib = + (* We use [kscanf], so that: + if the element reader fails, we can return the list of elements read so + far. *) + kscanf ib (fun ib exc -> accu) + (* The format string for [kscanf]: we read an element using [scan_elem], + then find a semi-colon if any, in order to decide if we stop reading + or go on with other elements. *) + "%r %1[;] " + (* The reader: once an element has been read it returns the new accu. *) + (scan_elem (function elem -> elem :: accu)) + (fun accu s -> + (* Cannot find a semi-colon: no more elements to read. *) + if s = "" then accu + (* We found a semi-colon: go on with the new accu. *) + else scan_elems scan_elem accu ib) +;; + +let scan_list scan_elem ib = + bscanf ib "[ %r ]" (scan_elems scan_elem []) List.rev +;; + +(* For instance: +let scan_float f ib = Scanf.bscanf ib "%f" f;; +# scan_list scan_float;; +- : Scanf.Scanning.scanbuf -> float list = +*) + +(* The element scanner builder. *) +let make_scan_elem fmt f ib = Scanf.bscanf ib fmt f;; + +(* Promote an element reader format to an element list reader. *) +let list_scanner fmt = scan_list (make_scan_elem fmt);; + +let scan_float = make_scan_elem "%f";; + +scan_list scan_float;; + +list_scanner "%f";; +- : Scanf.Scanning.scanbuf -> float list = +*) + +(* The prototype of a [scan_elem] function for the generic [scan_list] + functional. + This [scan_elem] scans a floating point number. *) +let scan_float ib = Scanf.bscanf ib "%f";; +let scan_float_list = scan_list scan_float;; + +(* In the following list scanners, we directly give the [scan_elem] function + as an immediate function value argument to the polymorphic + [scan_list]. *) +let scan_int_list = scan_list (fun ib -> Scanf.bscanf ib "%i");; +let scan_string_list = scan_list (fun ib -> Scanf.bscanf ib "%S");; +let scan_bool_list = scan_list (fun ib -> Scanf.bscanf ib "%B");; +let scan_char_list = scan_list (fun ib -> Scanf.bscanf ib "%C");; + +(* [scan_list] is truely polymorphic: scanning a list of lists of items + is a one liner! + + Here we scan list of lists of floats. *) +let scan_float_list_list = + scan_list + (fun ib k -> k (scan_list (fun ib -> Scanf.bscanf ib "%f") ib)) +;; + +let scan_float_list_list = + scan_list + (fun ib k -> k (scan_list scan_float ib)) +;; + +let scan_float_list_list = + scan_list + (fun ib k -> k (scan_float_list ib)) +;; + +(* The killer way to define [scan_float_list_list]. *) +(* let scan_float_list_list = scan_list scan_float_list;; *) + +test ( + scan_float_list_list + (Scanning.from_string "[[1.0] ; []; [2.0; 3; 5.0; 6.];]") = + [[1.]; []; [2.; 3.; 5.; 6.]]) +;; + +(* A general scan_list_list functional. *) +let scan_list_list scan_elems ib = + scan_list + (fun ib k -> k (scan_elems ib)) ib +;; + +let scan_float_list_list = scan_list_list scan_float_list;; + +(* Programming with continuations :) *) +let scan_float_item ib k = k (scan_float ib (fun x -> x));; +let scan_float_list ib k = k (scan_list scan_float_item ib);; +let scan_float_list_list ib k = k (scan_list scan_float_list ib);; + +(* Testing the %N format. *) +let test35 () = + sscanf "" "%N" (fun x -> x) = 0 && + sscanf "456" "%N" (fun x -> x) = 0 && + sscanf "456" "%d%N" (fun x y -> x, y) = (456, 1) && + sscanf " " "%N%s%N" (fun x s y -> x, s, y) = (0, "", 1) +;; + +test (test35 ()) +;; + +(* The prefered reader functionnals. *) + +(* To read a list as in Caml (elements are ``blank + semicolon + blank'' + separated, and the list is enclosed in brackets). *) +let rec read_elems read_elem accu ib = + kscanf ib (fun ib exc -> accu) + "%r %1[;] " + (read_elem (function elem -> elem :: accu)) + (fun accu s -> if s = "" then accu else read_elems read_elem accu ib) +;; + +let read_list read_elem ib = + bscanf ib "[ %r ]" (read_elems read_elem []) List.rev +;; + +(* The element reader builder. *) +let make_read_elem fmt f ib = Scanf.bscanf ib fmt f;; + +(* Promote an element reader format to an element list reader. *) +let scan_List fmt = read_list (make_read_elem fmt);; + +(* Example for list of floatting point numbers. *) +(* +scan_List "%f";; +- : Scanf.Scanning.scanbuf -> float list = + +(* To read a list as a succession of elements separated by a blank. *) +let rec read_elems read_elem accu ib = + kscanf ib (fun ib exc -> accu) + "%r " + (read_elem (function elem -> elem :: accu)) + (fun accu -> read_elems read_elem accu ib) +;; + +let read_list read_elem ib = + List.rev (read_elems read_elem [] ib) +;; + +(* Promote an element reader format to an element list reader. *) +let scan_list fmt = read_list (make_read_elem fmt);; + +scan_list "%f";; +*) + +(* Testing the %n format. *) +let test36 () = + sscanf "" "%n" (fun x -> x) = 0 && + sscanf "456" "%n" (fun x -> x) = 0 && + sscanf "456" "%d%n" (fun x y -> x, y) = (456, 3) && + sscanf " " "%n%s%n" (fun x s y -> x, s, y) = (0, "", 0) +;; + +test (test36 ()) +;; + +(* Weird tests to empty strings or formats. *) +let test37 () = + sscanf "" "" true && + sscanf "" "" (fun x -> x) 1 = 1 && + sscanf "123" "" (fun x -> x) 1 = 1 +;; + +test (test37 ()) +;; + +(* Testing end of input condition. *) +let test38 () = + sscanf "a" "a%!" true && + sscanf "a" "a%!%!" true && + sscanf " a" " a%!" true && + sscanf "a " "a %!" true && + sscanf "" "%!" true && + sscanf " " " %!" true && + sscanf "" " %!" true && + sscanf "" " %!%!" true +;; + +test (test38 ()) +;; + +(* Weird tests on empty buffers. *) +let test39 () = + let is_empty_buff ib = + Scanning.beginning_of_input ib && + Scanning.end_of_input ib in + + let ib = Scanning.from_string "" in + is_empty_buff ib && + (* Do it twice since testing empty buff could incorrectly + thraw an exception or wrongly change the beginning_of_input condition. *) + is_empty_buff ib +;; + +test (test39 ()) +;; + +(* Testing ranges. *) +let test40 () = + let s = "cba" in + let ib = Scanning.from_string s in + bscanf ib "%[^ab]%s%!" (fun s1 s2 -> s1 = "c" && s2 = "ba") +;; + +test (test40 ()) +;; + +let test41 () = + let s = "cba" in + let ib = Scanning.from_string s in + bscanf ib "%[^abc]%[cba]%!" (fun s1 s2 -> s1 = "" && s2 = "cba") +;; + +test (test41 ()) +;; + +let test42 () = + let s = "defcbaaghi" in + let ib = Scanning.from_string s in + bscanf ib "%[^abc]%[abc]%s%!" (fun s1 s2 s3 -> + s1 = "def" && s2 = "cbaa" && s3 = "ghi") && + let ib = Scanning.from_string s in + bscanf ib "%s@\t" (fun s -> s = "defcbaaghi") +;; + +test (test42 ()) +;; + +(* Testing end of file condition (bug found). *) +let test43, test44 = + let s = "" in + let ib = Scanning.from_string s in + (fun () -> bscanf ib "%i%!" (fun i -> i)), + (fun () -> bscanf ib "%!%i" (fun i -> i)) +;; + +test_raises_this_exc End_of_file test43 () && +test_raises_this_exc End_of_file test44 () +;; + +(* Testing small range scanning (bug found once). *) +let test45 () = + let s = "12.2" in + let ib = Scanning.from_string s in + bscanf ib "%[0-9].%[0-9]%s%!" (fun s1 s2 s3 -> + s1 = "12" && s2 = "2" && s3 = "") +;; + +test (test45 ()) +;; + +(* Testing printing of meta formats. *) + +let test46, test47 = + (fun () -> + Printf.sprintf "%i %(%s%)." + 1 "spells one, %s" "in english"), + (fun () -> + Printf.sprintf "%i ,%{%s%}, %s." + 1 "spells one %s" "in english") +;; + +test (test46 () = "1 spells one, in english.") +;; +test (test47 () = "1 ,%s, in english.") +;; + +(* Testing scanning of meta formats. *) +let test48 () = + (* Testing format_from_string. *) + let test_meta_read s fmt efmt = format_from_string s fmt = efmt in + (* Test if format %i is indeed read as %i. *) + let s, fmt = "%i", format_of_string "%i" in + test_meta_read s fmt fmt && + (* Test if format %i is compatible with %d and indeed read as %i. *) + let s, fmt = "%i", format_of_string "%d" in + test_meta_read s fmt "%i" && + (* Complex test of scanning a meta format specified in the scanner input + format string and extraction of its specification from a string. *) + sscanf "12 \"%i\"89 " "%i %{%d%}%s %!" + (fun i f s -> i = 12 && f = "%i" && s = "89") +;; + +test (test48 ()) +;; + +(* Testing stoppers after ranges. *) +let test49 () = + sscanf "as" "%[\\]" (fun s -> s = "") && + sscanf "as" "%[\\]%s" (fun s t -> s = "" && t = "as") && + sscanf "as" "%[\\]%s%!" (fun s t -> s = "" && t = "as") && + sscanf "as" "%[a..z]" (fun s -> s = "a") && + sscanf "as" "%[a-z]" (fun s -> s = "as") && + sscanf "as" "%[a..z]%s" (fun s t -> s = "a" && t = "s") && + sscanf "as" "%[a-z]%s" (fun s t -> s = "as" && t = "") && + sscanf "-as" "%[-a-z]" (fun s -> s = "-as") && + sscanf "-as" "%[-a-z]@s" (fun s -> s = "-a") && + sscanf "-as" "-%[a]@s" (fun s -> s = "a") && + sscanf "-asb" "-%[a]@sb%!" (fun s -> s = "a") && + sscanf "-asb" "-%[a]@s%s" (fun s t -> s = "a" && t = "b") +;; + +test (test49 ()) +;; + +(* Testing buffers defined via functions + + co-routines that read and write from the same buffers + + range chars and proper handling of \n + + the end of file condition. *) +let next_char ob () = + let s = Buffer.contents ob in + let len = String.length s in + if len = 0 then raise End_of_file else + let c = s.[0] in + Buffer.clear ob; + Buffer.add_string ob (String.sub s 1 (len - 1)); + c +;; + +let send_string ob s = + Buffer.add_string ob s; Buffer.add_char ob '\n';; +let send_int ob i = send_string ob (string_of_int i);; + +let rec reader = + let count = ref 0 in + (fun ib ob -> + if Scanf.Scanning.beginning_of_input ib then begin + count := 0; send_string ob "start"; writer ib ob end else + Scanf.bscanf ib "%[^\n]\n" (function + | "stop" -> send_string ob "stop"; writer ib ob + | s -> + let l = String.length s in + count := l + !count; + if !count >= 100 then begin + send_string ob "stop"; + send_int ob !count + end else + send_int ob l; + writer ib ob)) + +and writer ib ob = + Scanf.bscanf ib "%s\n" (function + | "start" -> send_string ob "Hello World!"; reader ib ob + | "stop" -> Scanf.bscanf ib "%i" (function i -> i) + | s -> send_int ob (int_of_string s); reader ib ob);; + +let go () = + let ob = Buffer.create 17 in + let ib = Scanf.Scanning.from_function (next_char ob) in + reader ib ob +;; + +let test50 () = go () = 100;; + +test (test50 ()) +;; + +(* Simple tests may also fail! + Ensure this is not the case with the current version for module [Scanf]. *) +let test51 () = + sscanf "Hello" "%s" id = "Hello" && + sscanf "Hello\n" "%s\n" id = "Hello" && + sscanf "Hello\n" "%s%s\n" (fun s1 s2 -> + s1 = "Hello" && 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!") && + sscanf "Hello\n" "%s@\n%s" (fun s1 s2 -> + s1 = "Hello" && s2 = "") && + sscanf "Hello \n" "%s@\n%s" (fun s1 s2 -> + s1 = "Hello " && s2 = "") +;; + +test (test51 ()) +;; + +(* Tests that indeed the [%s@c] format works properly. + Also tests the difference between [\n] and [@\n] is correctly handled. + In particular, tests that if no [c] character can be found in the + input, then the token obtained for [%s@c] spreads to the end of + input. *) +let test52 () = + sscanf "Hello\n" "%s@\n" id = "Hello" && + sscanf "Hello" "%s@\n" id = "Hello" && + sscanf "Hello" "%s%s@\n" (fun s1 s2 -> + s1 = "Hello" && s2 = "") && + sscanf "Hello\nWorld" "%s@\n%s%!" (fun s1 s2 -> + s1 = "Hello" && s2 = "World") && + sscanf "Hello\nWorld!" "%s@\n%s@\n" (fun s1 s2 -> + s1 = "Hello" && s2 = "World!") && + sscanf "Hello\n" "%s@\n%s" (fun s1 s2 -> + s1 = "Hello" && s2 = "") && + sscanf "Hello \n" "%s%s@\n" (fun s1 s2 -> + s1 = "Hello" && s2 = " ") && +sscanf "Hello \n" "%s%s%_1[ ]\n" (fun s1 s2 -> + s1 = "Hello" && s2 = "") && + sscanf "Hello \n" "%s%_1[ ]%s\n" (fun s1 s2 -> + s1 = "Hello" && 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!") && + sscanf "Hello\nWorld!" "%s\n%s@!%!" (fun s1 s2 -> + s1 = "Hello" && s2 = "World") +;; + +test (test52 ()) +;; + +(* Reading native, int32 and int64 numbers. *) +let test53 () = + sscanf "123" "%nd" id = 123n && + sscanf "124" "%nd" (fun i -> Nativeint.pred i = 123n) && + + sscanf "123" "%ld" id = 123l && + sscanf "124" "%ld" (fun i -> Int32.succ i = 125l) && + + sscanf "123" "%Ld" id = 123L && + sscanf "124" "%Ld" (fun i -> Int64.pred i = 123L) +;; + +test (test53 ()) +;; + +(* Routines to create the file that tscanf uses as a testbed case. *) +let create_tscanf_data ob lines = + let add_line (p, e) = + Buffer.add_string ob (Printf.sprintf "%S" p); + Buffer.add_string ob " -> "; + Buffer.add_string ob (Printf.sprintf "%S" e); + Buffer.add_string ob ";\n" in + List.iter add_line lines +;; + +let write_tscanf_data_file fname lines = + let oc = open_out fname in + let ob = Buffer.create 42 in + create_tscanf_data ob lines; + Buffer.output_buffer oc ob; + close_out oc +;; + +(* The tscanf testbed case file name. *) +let tscanf_data_file = "tscanf_data";; +(* The contents of the tscanf testbed case file. *) +let tscanf_data_file_lines = [ + "Objective", "Caml"; +] +;; +(* We write the tscanf testbed case file. *) +write_tscanf_data_file tscanf_data_file tscanf_data_file_lines +;; + +(* Then we verify that its contents is indeed correct: + the lines written into the [tscanf_data] file should be the same as the + lines read from it. *) + +(* Reading back tscanf_data_file_lines (hence, testing data file reading as + well). *) +let get_lines fname = + let ib = Scanf.Scanning.from_file fname in + let l = ref [] in + try + while not (Scanf.Scanning.end_of_input ib) do + Scanf.bscanf ib " %S -> %S; " (fun x y -> + l := (x, y) :: !l) + done; + List.rev !l + with + | Scanf.Scan_failure s -> + failwith (Printf.sprintf "in file %s, %s" fname s) + | End_of_file -> + failwith (Printf.sprintf "in file %s, unexpected end of file" fname) +;; + +(* Simpy test that the list of lines read from the file are the list of lines + written to it!. *) +let test54 () = + get_lines tscanf_data_file = tscanf_data_file_lines +;; + +test (test54 ()) +;; + +(* Creating digests for files. *) +let add_digest_ib ob ib = + let digest s = String.uppercase (Digest.to_hex (Digest.string s)) in + let scan_line ib f = Scanf.bscanf ib "%[^\n\r]\n" f in + let output_line_digest s = + Buffer.add_string ob s; + Buffer.add_char ob '#'; Buffer.add_string ob (digest s); + Buffer.add_char ob '\n' in + try while true do scan_line ib output_line_digest done; with + | End_of_file -> () +;; + +let digest_file fname = + let ib = Scanf.Scanning.from_file fname in + let ob = Buffer.create 42 in + add_digest_ib ob ib; + Buffer.contents ob +;; + +let test55 () = + let ob = Buffer.create 42 in + let ib = + create_tscanf_data ob tscanf_data_file_lines; + let s = Buffer.contents ob in + Buffer.clear ob; + Scanning.from_string s in + let tscanf_data_file_lines_digest = add_digest_ib ob ib; Buffer.contents ob in + digest_file tscanf_data_file = tscanf_data_file_lines_digest +;; + +test (test55 ()) +;; + +(* Testing the number of characters read. *) +let test56 () = + let g s = Scanf.sscanf s "%d%n" (fun i n -> (i, n)) in + g "99" = (99, 2) && + g "99 syntaxes all in a row" = (99, 2) && + g "-20 degrees Celsius" = (-20, 3) +;; + +test (test56 ()) +;; + +(* Testing the scanning of formats. *) +let test48 () = + (* Testing format_from_string. *) + let test_format_scan s fmt efmt = + format_from_string s fmt = efmt in + (* Test if format %i is indeed read as %i. *) + let s, fmt = " %i ", format_of_string "%i" in + test_format_scan s fmt " %i " && + (* Test if format %i is compatible with %d and indeed read as %i. *) + let s, fmt = "%i", format_of_string "%d" in + test_format_scan s fmt "%i" && + + let s, fmt = + "Read an int %i then a string %s.", + format_of_string "Spec%difi%scation" in + test_format_scan s fmt "Read an int %i then a string %s." && + + let s, fmt = + "Read an int %i then a string \"%s\".", + format_of_string "Spec%difi%Scation" in + test_format_scan s fmt "Read an int %i then a string \"%s\"." && + + let s, fmt = + "Read an int %i then a string \"%s\".", + format_of_string "Spec%difi%scation" in + test_format_scan s fmt "Read an int %i then a string \"%s\"." && + + (* Complex test of scanning a meta format specified in the scanner input + format string and extraction of its specification from a string. *) + sscanf "12 \"%i\"89 " "%i %{%d%}%s %!" + (fun i f s -> i = 12 && f = "%i" && s = "89") +;; + +(* To be continued ... +(* Trying to scan records. *) +let rec scan_fields ib scan_field accu = + kscanf ib (fun ib exc -> accu) + scan_field + (fun i -> + let accu = i :: accu in + kscanf ib (fun ib exc -> accu) + " %1[;] " + (fun s -> + if s = "" then accu else scan_fields ib scan_field accu)) +;; + +let scan_record scan_field ib = + bscanf ib "{ " (); + let accu = scan_fields ib scan_field [] in + bscanf ib " }" (); + List.rev accu +;; + +let scan_field ib = + bscanf ib "%s = %[^;]" (fun finame ficont -> finame, ficont);; +*) diff --git a/testsuite/tests/lib-scanf/tscanf.reference b/testsuite/tests/lib-scanf/tscanf.reference new file mode 100644 index 00000000..edeff672 --- /dev/null +++ b/testsuite/tests/lib-scanf/tscanf.reference @@ -0,0 +1,2 @@ +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 +All tests succeeded. diff --git a/testsuite/tests/lib-scanf/tscanf_data b/testsuite/tests/lib-scanf/tscanf_data new file mode 100644 index 00000000..e4ae5b68 --- /dev/null +++ b/testsuite/tests/lib-scanf/tscanf_data @@ -0,0 +1 @@ +"Objective" -> "Caml"; diff --git a/testsuite/tests/lib-str/Makefile b/testsuite/tests/lib-str/Makefile new file mode 100644 index 00000000..530ea730 --- /dev/null +++ b/testsuite/tests/lib-str/Makefile @@ -0,0 +1,4 @@ +LIBRARIES=str + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-str/t01.ml b/testsuite/tests/lib-str/t01.ml new file mode 100644 index 00000000..bb266a01 --- /dev/null +++ b/testsuite/tests/lib-str/t01.ml @@ -0,0 +1,1005 @@ +open Printf + +let build_result ngroups input = + let res = Array.make (ngroups + 1) "~" in + for i = 0 to ngroups do + try + res.(i) <- Str.matched_group i input + with Not_found -> () + done; + res + +let search_forward re ng input start = + try + ignore(Str.search_forward re input start); + build_result ng input + with Not_found -> + [||] + +let search_backward re ng input start = + try + ignore(Str.search_backward re input start); + build_result ng input + with Not_found -> + [||] + +let partial_match re ng input start = + if Str.string_partial_match re input start + then build_result ng input + else [||] + +let start_test msg = + print_newline(); printf "%s\n " msg + +let num_failures = ref 0 + +let test res1 res2 = + if res1 = res2 + then print_char '.' + else begin print_string " FAIL "; incr num_failures end + +let test_search_forward r ng s exp = + test (search_forward r ng s 0) exp + +let test_search_backward r ng s exp = + test (search_backward r ng s (String.length s)) exp + +let test_partial_match r ng s exp = + test (partial_match r ng s 0) exp + +let end_test () = + print_newline(); + if !num_failures = 0 then + printf "All tests passed\n" + else begin + printf "TEST FAILED: %d failure(s)\n" !num_failures; + exit 2 + end + +let automated_test() = + + (** Forward searches *) + start_test "Search for /the quick brown fox/"; + let r = Str.regexp "the quick brown fox" in + let n = 0 in + test_search_forward r n "the quick brown fox" + [|"the quick brown fox"|]; + test_search_forward r n "What do you know about the quick brown fox?" + [|"the quick brown fox"|]; + test_search_forward r n "The quick brown FOX" + [||]; + test_search_forward r n "What do you know about THE QUICK BROWN FOX?" + [||]; + + start_test "Search for /the quick brown fox/ (case-insensitive)"; + let r = Str.regexp_case_fold "the quick brown fox" in + let n = 0 in + test_search_forward r n "the quick brown fox" + [|"the quick brown fox"|]; + test_search_forward r n "What do you know about the quick brown fox?" + [|"the quick brown fox"|]; + test_search_forward r n "The quick brown FOX" + [|"The quick brown FOX"|]; + test_search_forward r n "What do you know about THE QUICK BROWN FOX?" + [|"THE QUICK BROWN FOX"|]; + test_search_forward r n "The slow white snail" + [||]; + + start_test "Search for /a*abc?xyz+pqrrrabbb*xyyyyy?pq?q?q?q?q?q?AB*zz/"; + let r = Str.regexp "a*abc?xyz+pqrrrabbb*xyyyyy?pq?q?q?q?q?q?AB*zz" in + let n = 0 in + test_search_forward r n "abxyzpqrrrabbxyyyypqAzz" + [|"abxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "abxyzpqrrrabbxyyyypqAzz" + [|"abxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aabxyzpqrrrabbxyyyypqAzz" + [|"aabxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaabxyzpqrrrabbxyyyypqAzz" + [|"aaabxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaaabxyzpqrrrabbxyyyypqAzz" + [|"aaaabxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "abcxyzpqrrrabbxyyyypqAzz" + [|"abcxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aabcxyzpqrrrabbxyyyypqAzz" + [|"aabcxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypAzz" + [|"aaabcxyzpqrrrabbxyyyypAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqAzz" + [|"aaabcxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqqAzz" + [|"aaabcxyzpqrrrabbxyyyypqqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqqqAzz" + [|"aaabcxyzpqrrrabbxyyyypqqqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqqqqAzz" + [|"aaabcxyzpqrrrabbxyyyypqqqqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqqqqqAzz" + [|"aaabcxyzpqrrrabbxyyyypqqqqqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" + [|"aaabcxyzpqrrrabbxyyyypqqqqqqAzz"|]; + test_search_forward r n "aaaabcxyzpqrrrabbxyyyypqAzz" + [|"aaaabcxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "abxyzzpqrrrabbxyyyypqAzz" + [|"abxyzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aabxyzzzpqrrrabbxyyyypqAzz" + [|"aabxyzzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaabxyzzzzpqrrrabbxyyyypqAzz" + [|"aaabxyzzzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaaabxyzzzzpqrrrabbxyyyypqAzz" + [|"aaaabxyzzzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "abcxyzzpqrrrabbxyyyypqAzz" + [|"abcxyzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aabcxyzzzpqrrrabbxyyyypqAzz" + [|"aabcxyzzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaabcxyzzzzpqrrrabbxyyyypqAzz" + [|"aaabcxyzzzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaaabcxyzzzzpqrrrabbxyyyypqAzz" + [|"aaaabcxyzzzzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" + [|"aaaabcxyzzzzpqrrrabbbxyyyypqAzz"|]; + test_search_forward r n "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" + [|"aaaabcxyzzzzpqrrrabbbxyyyyypqAzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypABzz" + [|"aaabcxyzpqrrrabbxyyyypABzz"|]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypABBzz" + [|"aaabcxyzpqrrrabbxyyyypABBzz"|]; + test_search_forward r n ">>>aaabxyzpqrrrabbxyyyypqAzz" + [|"aaabxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n ">aaaabxyzpqrrrabbxyyyypqAzz" + [|"aaaabxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n ">>>>abcxyzpqrrrabbxyyyypqAzz" + [|"abcxyzpqrrrabbxyyyypqAzz"|]; + test_search_forward r n "abxyzpqrrabbxyyyypqAzz" + [||]; + test_search_forward r n "abxyzpqrrrrabbxyyyypqAzz" + [||]; + test_search_forward r n "abxyzpqrrrabxyyyypqAzz" + [||]; + test_search_forward r n "aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz" + [||]; + test_search_forward r n "aaaabcxyzzzzpqrrrabbbxyyypqAzz" + [||]; + test_search_forward r n "aaabcxyzpqrrrabbxyyyypqqqqqqqAzz" + [||]; + + start_test "Search for /^abc\\(abc\\)?zz/"; + let r = Str.regexp "^abc\\(abc\\)?zz" in + let n = 1 in + test_search_forward r n "abczz" + [|"abczz"; "~"|]; + test_search_forward r n "abcabczz" + [|"abcabczz"; "abc"|]; + test_search_forward r n "zz" + [||]; + test_search_forward r n "abcabcabczz" + [||]; + test_search_forward r n ">>abczz" + [||]; + + start_test "Search for /^\\(b+\\|a\\)\\(b+\\|a\\)?c/"; + let r = Str.regexp "^\\(b+\\|a\\)\\(b+\\|a\\)?c" in + let n = 2 in + test_search_forward r n "bc" + [|"bc"; "b"; "~"|]; + test_search_forward r n "bbc" + [|"bbc"; "bb"; "~"|]; + test_search_forward r n "bbbc" + [|"bbbc"; "bbb"; "~"|]; + test_search_forward r n "bac" + [|"bac"; "b"; "a"|]; + test_search_forward r n "bbac" + [|"bbac"; "bb"; "a"|]; + test_search_forward r n "aac" + [|"aac"; "a"; "a"|]; + test_search_forward r n "abbbbbbbbbbbc" + [|"abbbbbbbbbbbc"; "a"; "bbbbbbbbbbb"|]; + test_search_forward r n "bbbbbbbbbbbac" + [|"bbbbbbbbbbbac"; "bbbbbbbbbbb"; "a"|]; + test_search_forward r n "aaac" + [||]; + test_search_forward r n "abbbbbbbbbbbac" + [||]; + + start_test "Search for /r\\(\\(g*\\|k\\)y?\\)*A/"; + let r = Str.regexp "r\\(\\(g*\\|k\\)y?\\)*A" in + let n = 2 in + test_search_forward r n "ArA" + [|"rA"; "~"; "~"|]; + test_search_forward r n "ArkA" + [|"rkA"; "k"; "k"|]; + test_search_forward r n "AryA" + [|"ryA"; "y"; ""|]; + test_search_forward r n "ArgggkyggkA" + [|"rgggkyggkA"; "k"; "k"|]; + + start_test "Search for /A\\(\\(t\\|v\\)\\(q?\\|n\\)\\)*A/"; + let r = Str.regexp "A\\(\\(t\\|v\\)\\(q?\\|n\\)\\)*A" in + let n = 3 in + test_search_forward r n "AvA" + [|"AvA"; "v"; "v"; ""|]; + + start_test "Search for /A\\(\\(b\\(\\(d\\|l*\\)?\\|w\\)\\)*a\\)A/"; + let r = Str.regexp "A\\(\\(b\\(\\(d\\|l*\\)?\\|w\\)\\)*a\\)A" in + let n = 4 in + test_search_forward r n "AbbaA" + [|"AbbaA"; "bba"; "b"; ""; ""|]; + + start_test "Search for /\\(\\|f\\)*x/"; + let r = Str.regexp "\\(\\|f\\)*x" in + let n = 1 in + test_search_forward r n "abcd" + [||]; + test_search_forward r n "fffff" + [||]; + test_search_forward r n "fffxab" + [|"fffx"; "f"|]; + test_search_forward r n "zzzxab" + [|"x"; "~"|]; + + start_test "Search for /\\(\\|f\\)+x/"; + let r = Str.regexp "\\(\\|f\\)+x" in + let n = 1 in + test_search_forward r n "abcd" + [||]; + test_search_forward r n "fffff" + [||]; + test_search_forward r n "fffxab" + [|"fffx"; "f"|]; + test_search_forward r n "zzzxab" + [|"x"; ""|]; + + start_test "Search for /A\\(.?\\)*A/"; + let r = Str.regexp "A\\(.?\\)*A" in + let n = 1 in + test_search_forward r n "AA" + [|"AA"; "~"|]; + test_search_forward r n "AAA" + [|"AAA"; "A"|]; + test_search_forward r n "AbA" + [|"AbA"; "b"|]; + test_search_forward r n "A" + [||]; + + start_test "Search for /\\([ab]*\\)\\1+c/"; + let r = Str.regexp "\\([ab]*\\)\\1+c" in + let n = 1 in + test_search_forward r n "abababc" + [| "abababc"; "ab" |]; + test_search_forward r n "abbc" + [| "bbc"; "b" |]; + test_search_forward r n "abc" + [| "c"; "" |]; + + start_test "Search for /^\\(\\(b+\\|a\\)\\(b+\\|a\\)?\\)?bc/"; + let r = Str.regexp "^\\(\\(b+\\|a\\)\\(b+\\|a\\)?\\)?bc" in + let n = 3 in + test_search_forward r n "bbc" + [|"bbc"; "b"; "b"; "~"|]; + + start_test "Search for /^\\(\\(b*\\|ba\\)\\(b*\\|ba\\)?\\)?bc/"; + let r = Str.regexp "^\\(\\(b*\\|ba\\)\\(b*\\|ba\\)?\\)?bc" in + let n = 3 in + test_search_forward r n "babc" + [|"babc"; "ba"; ""; "ba"|]; + test_search_forward r n "bbabc" + [|"bbabc"; "bba"; "b"; "ba"|]; + test_search_forward r n "bababc" + [|"bababc"; "baba"; "ba"; "ba"|]; + test_search_forward r n "bababbc" + [||]; + test_search_forward r n "babababc" + [||]; + + start_test "Search for /[^a]/"; + let r = Str.regexp "[^a]" in + let n = 0 in + test_search_forward r n "athing" [|"t"|]; + test_search_forward r n "Athing" [|"A"|]; + + start_test "Search for /[^a]/ (case-insensitive)"; + let r = Str.regexp_case_fold "[^a]" in + let n = 0 in + test_search_forward r n "athing" [|"t"|]; + test_search_forward r n "Athing" [|"t"|]; + + start_test "Search for /^[]abcde]/"; + let r = Str.regexp "^[]abcde]" in + let n = 0 in + test_search_forward r n "athing" + [|"a"|]; + test_search_forward r n "bthing" + [|"b"|]; + test_search_forward r n "]thing" + [|"]"|]; + test_search_forward r n "cthing" + [|"c"|]; + test_search_forward r n "dthing" + [|"d"|]; + test_search_forward r n "ething" + [|"e"|]; + test_search_forward r n "fthing" + [||]; + test_search_forward r n "[thing" + [||]; + test_search_forward r n "\\\\thing" + [||]; + + start_test "Search for /^[]cde]/"; + let r = Str.regexp "^[]cde]" in + let n = 0 in + test_search_forward r n "]thing" + [|"]"|]; + test_search_forward r n "cthing" + [|"c"|]; + test_search_forward r n "dthing" + [|"d"|]; + test_search_forward r n "ething" + [|"e"|]; + test_search_forward r n "athing" + [||]; + test_search_forward r n "fthing" + [||]; + + start_test "Search for /^[^]abcde]/"; + let r = Str.regexp "^[^]abcde]" in + let n = 0 in + test_search_forward r n "fthing" + [|"f"|]; + test_search_forward r n "[thing" + [|"["|]; + test_search_forward r n "\\\\thing" + [|"\\"|]; + test_search_forward r n "athing" + [||]; + test_search_forward r n "bthing" + [||]; + test_search_forward r n "]thing" + [||]; + test_search_forward r n "cthing" + [||]; + test_search_forward r n "dthing" + [||]; + test_search_forward r n "ething" + [||]; + + start_test "Search for /^[^]cde]/"; + let r = Str.regexp "^[^]cde]" in + let n = 0 in + test_search_forward r n "athing" + [|"a"|]; + test_search_forward r n "fthing" + [|"f"|]; + test_search_forward r n "]thing" + [||]; + test_search_forward r n "cthing" + [||]; + test_search_forward r n "dthing" + [||]; + test_search_forward r n "ething" + [||]; + + start_test "Search for /^ÿ/"; + let r = Str.regexp "^ÿ" in + let n = 0 in + test_search_forward r n "ÿ" + [|"ÿ"|]; + + start_test "Search for /^[0-9]+$/"; + let r = Str.regexp "^[0-9]+$" in + let n = 0 in + test_search_forward r n "0" + [|"0"|]; + test_search_forward r n "1" + [|"1"|]; + test_search_forward r n "2" + [|"2"|]; + test_search_forward r n "3" + [|"3"|]; + test_search_forward r n "4" + [|"4"|]; + test_search_forward r n "5" + [|"5"|]; + test_search_forward r n "6" + [|"6"|]; + test_search_forward r n "7" + [|"7"|]; + test_search_forward r n "8" + [|"8"|]; + test_search_forward r n "9" + [|"9"|]; + test_search_forward r n "10" + [|"10"|]; + test_search_forward r n "100" + [|"100"|]; + test_search_forward r n "abc" + [||]; + + start_test "Search for /^.*nter/"; + let r = Str.regexp "^.*nter" in + let n = 0 in + test_search_forward r n "enter" + [|"enter"|]; + test_search_forward r n "inter" + [|"inter"|]; + test_search_forward r n "uponter" + [|"uponter"|]; + + start_test "Search for /^xxx[0-9]+$/"; + let r = Str.regexp "^xxx[0-9]+$" in + let n = 0 in + test_search_forward r n "xxx0" + [|"xxx0"|]; + test_search_forward r n "xxx1234" + [|"xxx1234"|]; + test_search_forward r n "xxx" + [||]; + + start_test "Search for /^.+[0-9][0-9][0-9]$/"; + let r = Str.regexp "^.+[0-9][0-9][0-9]$" in + let n = 0 in + test_search_forward r n "x123" + [|"x123"|]; + test_search_forward r n "xx123" + [|"xx123"|]; + test_search_forward r n "123456" + [|"123456"|]; + test_search_forward r n "123" + [||]; + test_search_forward r n "x123x" + [||]; + + start_test "Search for /^\\([^!]+\\)!\\(.+\\)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/"; + let r = Str.regexp "^\\([^!]+\\)!\\(.+\\)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" in + let n = 2 in + test_search_forward r n "abc!pqr=apquxz.ixr.zzz.ac.uk" + [|"abc!pqr=apquxz.ixr.zzz.ac.uk"; "abc"; "pqr"|]; + test_search_forward r n "!pqr=apquxz.ixr.zzz.ac.uk" + [||]; + test_search_forward r n "abc!=apquxz.ixr.zzz.ac.uk" + [||]; + test_search_forward r n "abc!pqr=apquxz:ixr.zzz.ac.uk" + [||]; + test_search_forward r n "abc!pqr=apquxz.ixr.zzz.ac.ukk" + [||]; + + start_test "Search for /\\([0-9a-f:]+\\)$/"; + let r = Str.regexp_case_fold "\\([0-9a-f:]+\\)$" in + let n = 1 in + test_search_forward r n "0abc" + [|"0abc"; "0abc"|]; + test_search_forward r n "abc" + [|"abc"; "abc"|]; + test_search_forward r n "fed" + [|"fed"; "fed"|]; + test_search_forward r n "E" + [|"E"; "E"|]; + test_search_forward r n "::" + [|"::"; "::"|]; + test_search_forward r n "5f03:12C0::932e" + [|"5f03:12C0::932e"; "5f03:12C0::932e"|]; + test_search_forward r n "fed def" + [|"def"; "def"|]; + test_search_forward r n "Any old stuff" + [|"ff"; "ff"|]; + test_search_forward r n "0zzz" + [||]; + test_search_forward r n "gzzz" + [||]; + test_search_forward r n "fed " + [||]; + test_search_forward r n "Any old rubbish" + [||]; + + start_test "Search for /^[a-z0-9][a-z0-9-]*\\(\\.[a-z0-9][A-Z0-9-]*\\)*\\.$/"; + let r = Str.regexp_case_fold "^[a-z0-9][a-z0-9-]*\\(\\.[a-z0-9][A-Z0-9-]*\\)*\\.$" in + let n = 1 in + test_search_forward r n "a." + [|"a."; "~"|]; + test_search_forward r n "Z." + [|"Z."; "~"|]; + test_search_forward r n "2." + [|"2."; "~"|]; + test_search_forward r n "ab-c." + [|"ab-c."; "~"|]; + test_search_forward r n "ab-c.pq-r." + [|"ab-c.pq-r."; ".pq-r"|]; + test_search_forward r n "sxk.zzz.ac.uk." + [|"sxk.zzz.ac.uk."; ".uk"|]; + test_search_forward r n "sxk.ZZZ.ac.UK." + [|"sxk.ZZZ.ac.UK."; ".UK"|]; + test_search_forward r n "x-.y-." + [|"x-.y-."; ".y-"|]; + test_search_forward r n "-abc.peq." + [||]; + + start_test "Search for /^\\*\\.[a-z]\\([a-z0-9-]*[a-z0-9]+\\)?\\(\\.[a-z]\\([a-z0-9-]*[a-z0-9]+\\)?\\)*$/"; + let r = Str.regexp "^\\*\\.[a-z]\\([a-z0-9-]*[a-z0-9]+\\)?\\(\\.[a-z]\\([a-z0-9-]*[a-z0-9]+\\)?\\)*$" in + let n = 3 in + test_search_forward r n "*.a" + [|"*.a"; "~"; "~"; "~"|]; + test_search_forward r n "*.b0-a" + [|"*.b0-a"; "0-a"; "~"; "~"|]; + test_search_forward r n "*.c3-b.c" + [|"*.c3-b.c"; "3-b"; ".c"; "~"|]; + test_search_forward r n "*.c-a.b-c" + [|"*.c-a.b-c"; "-a"; ".b-c"; "-c"|]; + test_search_forward r n "*.0" + [||]; + test_search_forward r n "*.a-" + [||]; + test_search_forward r n "*.a-b.c-" + [||]; + test_search_forward r n "*.c-a.0-c" + [||]; + + start_test "Search for /^[0-9a-fA-F]\\(\\.[0-9a-fA-F]\\)*$/"; + let r = Str.regexp "^[0-9a-fA-F]\\(\\.[0-9a-fA-F]\\)*$" in + let n = 1 in + test_search_forward r n "a.b.c.d" + [|"a.b.c.d"; ".d"|]; + test_search_forward r n "A.B.C.D" + [|"A.B.C.D"; ".D"|]; + test_search_forward r n "a.b.c.1.2.3.C" + [|"a.b.c.1.2.3.C"; ".C"|]; + test_search_forward r n "a.b.c.dz" + [||]; + test_search_forward r n "za" + [||]; + + start_test "Search for /^\\\".*\\\" *\\(;.*\\)?$/"; + let r = Str.regexp "^\\\".*\\\" *\\(;.*\\)?$" in + let n = 1 in + test_search_forward r n "\"1234\"" + [|"\"1234\""; "~"|]; + test_search_forward r n "\"abcd\" ;" + [|"\"abcd\" ;"; ";"|]; + test_search_forward r n "\"\" ; rhubarb" + [|"\"\" ; rhubarb"; "; rhubarb"|]; + test_search_forward r n "\"1234\" : things" + [||]; + + start_test "Search for /^\\(a\\(b\\(c\\)\\)\\)\\(d\\(e\\(f\\)\\)\\)\\(h\\(i\\(j\\)\\)\\)$/"; + let r = Str.regexp "^\\(a\\(b\\(c\\)\\)\\)\\(d\\(e\\(f\\)\\)\\)\\(h\\(i\\(j\\)\\)\\)$" in + let n = 9 in + test_search_forward r n "abcdefhij" + [|"abcdefhij"; "abc"; "bc"; "c"; "def"; "ef"; "f"; "hij"; "ij"; "j"|]; + + start_test "Search for /^[.^$|()*+?{,}]+/"; + let r = Str.regexp "^[.^$|()*+?{,}]+" in + let n = 0 in + test_search_forward r n ".^$*(+)|{?,?}" + [|".^$*(+)|{?,?}"|]; + + start_test "Search for /\\(cat\\(a\\(ract\\|tonic\\)\\|erpillar\\)\\) \\1\\(\\)2\\(3\\)/"; + let r = Str.regexp "\\(cat\\(a\\(ract\\|tonic\\)\\|erpillar\\)\\) \\1\\(\\)2\\(3\\)" in + let n = 5 in + test_search_forward r n "cataract cataract23" + [|"cataract cataract23"; "cataract"; "aract"; "ract"; ""; "3"|]; + test_search_forward r n "catatonic catatonic23" + [|"catatonic catatonic23"; "catatonic"; "atonic"; "tonic"; ""; "3"|]; + test_search_forward r n "caterpillar caterpillar23" + [|"caterpillar caterpillar23"; "caterpillar"; "erpillar"; "~"; ""; "3"|]; + + start_test "Search for /^From +\\([^ ]+\\) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/"; + let r = Str.regexp "^From +\\([^ ]+\\) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]" in + let n = 1 in + test_search_forward r n "From abcd Mon Sep 01 12:33:02 1997" + [|"From abcd Mon Sep 01 12:33"; "abcd"|]; + + start_test "Search for /\\ba/"; + let r = Str.regexp "\\ba" in + let n = 0 in + test_search_forward r n "abcd" + [|"a"|]; + test_search_forward r n "the a" + [|"a"|]; + test_search_forward r n ".ab" + [|"a"|]; + test_search_forward r n "bad" + [||]; + test_search_forward r n "the ba" + [||]; + test_search_forward r n "ba." + [||]; + + start_test "Search for /a\\b/"; + let r = Str.regexp "a\\b" in + let n = 0 in + test_search_forward r n "a" + [|"a"|]; + test_search_forward r n "bcda" + [|"a"|]; + test_search_forward r n "a foo" + [|"a"|]; + test_search_forward r n "a." + [|"a"|]; + test_search_forward r n "bad" + [||]; + test_search_forward r n "ab" + [||]; + + start_test "Search for /\\([a-z]*\\)b/"; + let r = Str.regexp "\\([a-z]*\\)b" in + let n = 1 in + test_search_forward r n "abbb" + [|"abbb"; "abb"|]; + + start_test "Search for /\\([a-z]+\\)b/"; + let r = Str.regexp "\\([a-z]+\\)b" in + let n = 1 in + test_search_forward r n "abbb" + [|"abbb"; "abb"|]; + + start_test "Search for /\\([a-z]?\\)b/"; + let r = Str.regexp "\\([a-z]?\\)b" in + let n = 1 in + test_search_forward r n "bbbb" + [|"bb"; "b"|]; + + start_test "Search for /^a/"; + let r = Str.regexp "^a" in + let n = 0 in + test_search_forward r n "abcdef" + [|"a"|]; + test_search_forward r n "zzzz\nabcdef" + [|"a"|]; + + start_test "Search for /a$/"; + let r = Str.regexp "a$" in + let n = 0 in + test_search_forward r n "xyza" + [|"a"|]; + test_search_forward r n "xyza\nbcdef" + [|"a"|]; + + start_test "Null characters in regexps"; + let r = Str.regexp "ab\000cd" in + let n = 0 in + test_search_forward r n "qerpoiuab\000cdwerltkh" + [| "ab\000cd" |]; + let r = Str.regexp "\000cd" in + let n = 0 in + test_search_forward r n "qerpoiuab\000cdwerltkh" + [| "\000cd" |]; + + (** Backward searches *) + start_test "Backward search for /the quick/"; + let r = Str.regexp "the quick" in + let n = 0 in + test_search_backward r n "the quick brown fox" + [|"the quick"|]; + test_search_backward r n "What do you know about the quick brown fox?" + [|"the quick"|]; + test_search_backward r n "The quick brown FOX" + [||]; + test_search_backward r n "What do you know about THE QUICK BROWN FOX?" + [||]; + + start_test "Backward search for /a\\([0-9]+\\)/"; + let r = Str.regexp "a\\([0-9]+\\)" in + let n = 1 in + test_search_backward r n "a123 a456zzzz" + [|"a456"; "456"|]; + test_search_backward r n "ab123" + [||]; + + (** Partial match searches *) + + start_test "Partial match for /partial match/"; + let r = Str.regexp "partial match" in + let n = 0 in + test_partial_match r n "" + [|""|]; + test_partial_match r n "partial matching" + [|"partial match"|]; + test_partial_match r n "partial m" + [|"partial m"|]; + + start_test "Partial match for /\\(partial\\)\\|\\(match\\)/"; + let r = Str.regexp "\\(partial\\)\\|\\(match\\)" in + let n = 2 in + test_partial_match r n "" + [|""; "~"; "~"|]; + test_partial_match r n "part" + [|"part"; "~"; "~"|]; + test_partial_match r n "partial" + [|"partial"; "partial"; "~"|]; + test_partial_match r n "matching" + [|"match"; "~"; "match"|]; + test_partial_match r n "mat" + [|"mat"; "~"; "~"|]; + test_partial_match r n "zorglub" + [||]; + + (** Replacement *) + start_test "Global replacement"; + test (Str.global_replace (Str.regexp "[aeiou]") ".." + "abcdefghijklmnopqrstuvwxyz") + "..bcd..fgh..jklmn..pqrst..vwxyz"; + test (Str.global_replace (Str.regexp "[0-9]\\([0-9]*\\)") "-\\0-\\1-" + "abc012def3ghi45") + "abc-012-12-def-3--ghi-45-5-"; + test (Str.global_replace (Str.regexp "[0-9]?") "." + "abc012def3ghi45") + ".a.b.c....d.e.f..g.h.i..."; + + start_test "First replacement"; + test (Str.replace_first (Str.regexp "[eiou]") ".." + "abcdefghijklmnopqrstuvwxyz") + "abcd..fghijklmnopqrstuvwxyz"; + test (Str.replace_first (Str.regexp "[0-9]\\([0-9]*\\)") "-\\0-\\1-" + "abc012def3ghi45") + "abc-012-12-def3ghi45"; + + (** Splitting *) + start_test "Splitting"; + test (Str.split (Str.regexp "[ \t]+") "si non e vero") + ["si"; "non"; "e"; "vero"]; + test (Str.split (Str.regexp "[ \t]+") " si non\te vero\t") + ["si"; "non"; "e"; "vero"]; + test (Str.bounded_split (Str.regexp "[ \t]+") " si non e vero " 3) + ["si"; "non"; "e vero "]; + test (Str.split (Str.regexp "[ \t]*") "si non e vero") + ["s"; "i"; "n"; "o"; "n"; "e"; "v"; "e"; "r"; "o"]; + test (Str.split_delim (Str.regexp "[ \t]+") " si non e vero\t") + [""; "si"; "non"; "e"; "vero"; ""]; + test (Str.full_split (Str.regexp "[ \t]+") " si non\te vero\t") + [Str.Delim " "; Str.Text "si"; + Str.Delim " "; Str.Text "non"; + Str.Delim "\t"; Str.Text "e"; + Str.Delim " "; Str.Text "vero"; Str.Delim "\t"]; + + (** XML tokenization *) + (* See "REX: XML Shallow Parsing with Regular Expressions", + Robert D. Cameron, Simon Fraser University, CMPT TR 1998-17. *) + start_test "XML tokenization"; + begin + let _TextSE = "[^<]+" in + let _UntilHyphen = "[^-]*-" in + let _Until2Hyphens = _UntilHyphen ^ "\\([^-]" ^ _UntilHyphen ^ "\\)*-" in + let _CommentCE = _Until2Hyphens ^ ">?" in + let _UntilRSBs = "[^]]*]\\([^]]+]\\)*]+" in + let _CDATA_CE = _UntilRSBs ^ "\\([^]>]" ^ _UntilRSBs ^ "\\)*>" in + let _S = "[ \n\t\r]+" in + let _NameStrt = "[A-Za-z_:]\\|[^\x00-\x7F]" in + let _NameChar = "[A-Za-z0-9_:.-]\\|[^\x00-\x7F]" in + let _Name = "\\(" ^ _NameStrt ^ "\\)\\(" ^ _NameChar ^ "\\)*" in + let _QuoteSE = "\"[^\"]*\"\\|'[^']*'" in + let _DT_IdentSE = _S ^ _Name ^ "\\(" ^ _S ^ "\\(" ^ _Name ^ "\\|" ^ _QuoteSE ^ "\\)\\)*" in + let _MarkupDeclCE = "\\([^]\"'><]\\|" ^ _QuoteSE ^ "\\)*>" in + let _S1 = "[\n\r\t ]" in + let _UntilQMs = "[^?]*\\?+" in + let _PI_Tail = "\\?>\\|" ^ _S1 ^ _UntilQMs ^ "\\([^>?]" ^ _UntilQMs ^ "\\)*>" in + let _DT_ItemSE = "<\\(!\\(--" ^ _Until2Hyphens ^ ">\\|[^-]" ^ _MarkupDeclCE ^ "\\)\\|\\?" ^ _Name ^ "\\(" ^ _PI_Tail ^ "\\)\\)\\|%" ^ _Name ^ ";\\|" ^ _S1 in + let _DocTypeCE = _DT_IdentSE ^ "\\(" ^ _S ^ "\\)?\\(\\[\\(" ^ _DT_ItemSE ^ "\\)*]\\(" ^ _S ^ "\\)?\\)?>?" in + let _DeclCE = "--\\(" ^ _CommentCE ^ "\\)?\\|\\[_CDATA\\[\\(" ^ _CDATA_CE ^ "\\)?\\|_DOCTYPE\\(" ^ _DocTypeCE ^ "\\)?" in + let _PI_CE = _Name ^ "\\(" ^ _PI_Tail ^ "\\)?" in + let _EndTagCE = _Name ^ "\\(" ^ _S ^ "\\)?>?" in + let _AttValSE = "\"[^<\"]*\"\\|'[^<']*'" in + let _ElemTagCE = _Name ^ "\\(" ^ _S ^ _Name ^ "\\(" ^ _S ^ "\\)?=\\(" ^ _S ^ "\\)?\\(" ^ _AttValSE ^ "\\)\\)*\\(" ^ _S ^ "\\)?/?>?" in + let _MarkupSPE = "<\\(!\\(" ^ _DeclCE ^ "\\)?\\|\\?\\(" ^ _PI_CE ^ "\\)?\\|/\\(" ^ _EndTagCE ^ "\\)?\\|\\(" ^ _ElemTagCE ^ "\\)?\\)" in + let _XML_SPE = _TextSE ^ "\\|" ^ _MarkupSPE in + let input = "\ + + + + +]> + + + + + 65 + 20 + 300 + 2400 + 300 + 25 + 50 + + + Avocado Dip + Sunnydale + 29 + + 11 + 3 + 5 + 210 + 2 + 0 + 1 + + 0 + 0 + + + 0 + 0 + + + +" in + let result = [ + ""; + "\n"; + ""; + "\n"; + "\n "; + "\n]>\n"; + "\n"; + " \n"; + ""; + "\n"; + ""; + "\n\t"; + ""; + "65"; + ""; + "\n\t"; + ""; + "20"; + ""; + "\n\t"; + ""; + "300"; + ""; + "\n\t"; + ""; + "2400"; + ""; + "\n\t"; + ""; + "300"; + ""; + "\n\t"; + ""; + "25"; + ""; + "\n\t"; + ""; + "50"; + ""; + "\n"; + ""; + "\n"; + ""; + "\n\t"; + ""; + "Avocado Dip"; + ""; + "\n\t"; + ""; + "Sunnydale"; + ""; + "\n\t"; + ""; + "29"; + ""; + "\n\t"; + ""; + "\n\t"; + ""; + "11"; + ""; + "\n\t"; + ""; + "3"; + ""; + "\n\t"; + ""; + "5"; + ""; + "\n\t"; + ""; + "210"; + ""; + "\n\t"; + ""; + "2"; + ""; + "\n\t"; + ""; + "0"; + ""; + "\n\t"; + ""; + "1"; + ""; + "\n\t"; + ""; + "\n\t\t"; + ""; + "0"; + ""; + "\n\t\t"; + ""; + "0"; + ""; + "\n\t"; + ""; + "\n\t"; + ""; + "\n\t\t"; + ""; + "0"; + ""; + "\n\t\t"; + ""; + "0"; + ""; + "\n\t"; + ""; + "\n"; + ""; + "\n"; + ""; + "\n"] in + let re = Str.regexp _XML_SPE in + let rec process i l = + let j = try Str.search_forward re input i with Not_found -> (-1) in + if j < 0 then begin + test l [] + end else begin + match l with + [] -> test 0 1 (* failure *) + | hd :: tl -> + test (Str.matched_string input) hd; process (Str.match_end()) tl + end in + process 0 result + end; + + end_test() + +let manual_test regexp text = + try + ignore (Str.search_forward (Str.regexp regexp) text 0); + printf "Matched,"; + begin try + for i = 0 to 31 do + try + let s = Str.matched_group i text in + printf " \\%d=%s" i s + with Not_found -> + () + done + with Invalid_argument "Str.matched_group" -> (*yuck*) + () + end; + print_newline() + with Not_found -> + printf "Not matched\n" + +let _ = + if Array.length Sys.argv >= 3 + then manual_test Sys.argv.(1) Sys.argv.(2) + else automated_test() diff --git a/testsuite/tests/lib-str/t01.reference b/testsuite/tests/lib-str/t01.reference new file mode 100644 index 00000000..ade95dea --- /dev/null +++ b/testsuite/tests/lib-str/t01.reference @@ -0,0 +1,104 @@ + +Search for /the quick brown fox/ + .... +Search for /the quick brown fox/ (case-insensitive) + ..... +Search for /a*abc?xyz+pqrrrabbb*xyyyyy?pq?q?q?q?q?q?AB*zz/ + .................................... +Search for /^abc\(abc\)?zz/ + ..... +Search for /^\(b+\|a\)\(b+\|a\)?c/ + .......... +Search for /r\(\(g*\|k\)y?\)*A/ + .... +Search for /A\(\(t\|v\)\(q?\|n\)\)*A/ + . +Search for /A\(\(b\(\(d\|l*\)?\|w\)\)*a\)A/ + . +Search for /\(\|f\)*x/ + .... +Search for /\(\|f\)+x/ + .... +Search for /A\(.?\)*A/ + .... +Search for /\([ab]*\)\1+c/ + ... +Search for /^\(\(b+\|a\)\(b+\|a\)?\)?bc/ + . +Search for /^\(\(b*\|ba\)\(b*\|ba\)?\)?bc/ + ..... +Search for /[^a]/ + .. +Search for /[^a]/ (case-insensitive) + .. +Search for /^[]abcde]/ + ......... +Search for /^[]cde]/ + ...... +Search for /^[^]abcde]/ + ......... +Search for /^[^]cde]/ + ...... +Search for /^ÿ/ + . +Search for /^[0-9]+$/ + ............. +Search for /^.*nter/ + ... +Search for /^xxx[0-9]+$/ + ... +Search for /^.+[0-9][0-9][0-9]$/ + ..... +Search for /^\([^!]+\)!\(.+\)=apquxz\.ixr\.zzz\.ac\.uk$/ + ..... +Search for /\([0-9a-f:]+\)$/ + ............ +Search for /^[a-z0-9][a-z0-9-]*\(\.[a-z0-9][A-Z0-9-]*\)*\.$/ + ......... +Search for /^\*\.[a-z]\([a-z0-9-]*[a-z0-9]+\)?\(\.[a-z]\([a-z0-9-]*[a-z0-9]+\)?\)*$/ + ........ +Search for /^[0-9a-fA-F]\(\.[0-9a-fA-F]\)*$/ + ..... +Search for /^\".*\" *\(;.*\)?$/ + .... +Search for /^\(a\(b\(c\)\)\)\(d\(e\(f\)\)\)\(h\(i\(j\)\)\)$/ + . +Search for /^[.^$|()*+?{,}]+/ + . +Search for /\(cat\(a\(ract\|tonic\)\|erpillar\)\) \1\(\)2\(3\)/ + ... +Search for /^From +\([^ ]+\) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + . +Search for /\ba/ + ...... +Search for /a\b/ + ...... +Search for /\([a-z]*\)b/ + . +Search for /\([a-z]+\)b/ + . +Search for /\([a-z]?\)b/ + . +Search for /^a/ + .. +Search for /a$/ + .. +Null characters in regexps + .. +Backward search for /the quick/ + .... +Backward search for /a\([0-9]+\)/ + .. +Partial match for /partial match/ + ... +Partial match for /\(partial\)\|\(match\)/ + ...... +Global replacement + ... +First replacement + .. +Splitting + ...... +XML tokenization + ......................................................................................................................... +All tests passed diff --git a/testsuite/tests/lib-systhreads/Makefile b/testsuite/tests/lib-systhreads/Makefile new file mode 100644 index 00000000..80138b26 --- /dev/null +++ b/testsuite/tests/lib-systhreads/Makefile @@ -0,0 +1,5 @@ +LIBRARIES=unix threads +ADD_COMPFLAGS=-thread + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-systhreads/testfork.ml b/testsuite/tests/lib-systhreads/testfork.ml new file mode 100644 index 00000000..d0d253b3 --- /dev/null +++ b/testsuite/tests/lib-systhreads/testfork.ml @@ -0,0 +1,32 @@ +(* POSIX threads and fork() *) + +let compute_thread c = ignore c +(* + while true do + print_char c; flush stdout; + for i = 1 to 100000 do ignore(ref []) done + done +*) + +let main () = + ignore(Thread.create compute_thread '1'); + Thread.delay 1.0; + print_string "Forking..."; print_newline(); + match Unix.fork() with + | 0 -> + print_string "In child..."; print_newline(); + Gc.minor(); + print_string "Child did minor GC."; print_newline(); + ignore(Thread.create compute_thread '2'); + Thread.delay 1.0; + print_string "Child is exiting."; print_newline(); + exit 0 + | pid -> + print_string "In parent..."; print_newline(); + Thread.delay 2.0; + print_string "Parent is exiting."; print_newline(); + exit 0 + +let _ = main() + + diff --git a/testsuite/tests/lib-systhreads/testfork.reference b/testsuite/tests/lib-systhreads/testfork.reference new file mode 100644 index 00000000..fb7a3c29 --- /dev/null +++ b/testsuite/tests/lib-systhreads/testfork.reference @@ -0,0 +1,6 @@ +Forking... +In parent... +In child... +Child did minor GC. +Child is exiting. +Parent is exiting. diff --git a/testsuite/tests/lib-threads/.cvsignore b/testsuite/tests/lib-threads/.cvsignore new file mode 100644 index 00000000..e6d9e45b --- /dev/null +++ b/testsuite/tests/lib-threads/.cvsignore @@ -0,0 +1 @@ +*.byt diff --git a/testsuite/tests/lib-threads/Makefile b/testsuite/tests/lib-threads/Makefile new file mode 100644 index 00000000..80138b26 --- /dev/null +++ b/testsuite/tests/lib-threads/Makefile @@ -0,0 +1,5 @@ +LIBRARIES=unix threads +ADD_COMPFLAGS=-thread + +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/lib-threads/close.ml b/testsuite/tests/lib-threads/close.ml new file mode 100644 index 00000000..7bda2426 --- /dev/null +++ b/testsuite/tests/lib-threads/close.ml @@ -0,0 +1,15 @@ +let main () = + let (rd, wr) = Unix.pipe() in + let _ = Thread.create + (fun () -> + ignore (Unix.write wr "0123456789" 0 10); + Thread.delay 3.0; + print_endline "closing fd..."; + Unix.close rd) + () in + let buf = String.create 10 in + print_endline "reading..."; + ignore (Unix.read rd buf 0 10); + print_endline "read returned" + +let _ = Unix.handle_unix_error main () diff --git a/testsuite/tests/lib-threads/close.reference b/testsuite/tests/lib-threads/close.reference new file mode 100644 index 00000000..53b6e2a8 --- /dev/null +++ b/testsuite/tests/lib-threads/close.reference @@ -0,0 +1,2 @@ +reading... +read returned diff --git a/testsuite/tests/lib-threads/sieve.ml b/testsuite/tests/lib-threads/sieve.ml new file mode 100644 index 00000000..72e26566 --- /dev/null +++ b/testsuite/tests/lib-threads/sieve.ml @@ -0,0 +1,33 @@ +open Printf +open Thread + +let rec integers n ch = + Event.sync (Event.send ch n); + integers (n+1) ch + +let rec sieve n chin chout = + let m = Event.sync (Event.receive chin) + in if m mod n = 0 + then sieve n chin chout + else Event.sync (Event.send chout m); + sieve n chin chout + +let rec print_primes ch max = + let n = Event.sync (Event.receive ch) + in if n > max + then () + else begin + printf "%d\n" n; flush stdout; + let ch_after_n = Event.new_channel () + in Thread.create (sieve n ch) ch_after_n; + print_primes ch_after_n max + end + +let go max = + let ch = Event.new_channel () + in Thread.create (integers 2) ch; + print_primes ch max;; + +let _ = go 1000 + +;; diff --git a/testsuite/tests/lib-threads/sieve.reference b/testsuite/tests/lib-threads/sieve.reference new file mode 100644 index 00000000..1d0db087 --- /dev/null +++ b/testsuite/tests/lib-threads/sieve.reference @@ -0,0 +1,168 @@ +2 +3 +5 +7 +11 +13 +17 +19 +23 +29 +31 +37 +41 +43 +47 +53 +59 +61 +67 +71 +73 +79 +83 +89 +97 +101 +103 +107 +109 +113 +127 +131 +137 +139 +149 +151 +157 +163 +167 +173 +179 +181 +191 +193 +197 +199 +211 +223 +227 +229 +233 +239 +241 +251 +257 +263 +269 +271 +277 +281 +283 +293 +307 +311 +313 +317 +331 +337 +347 +349 +353 +359 +367 +373 +379 +383 +389 +397 +401 +409 +419 +421 +431 +433 +439 +443 +449 +457 +461 +463 +467 +479 +487 +491 +499 +503 +509 +521 +523 +541 +547 +557 +563 +569 +571 +577 +587 +593 +599 +601 +607 +613 +617 +619 +631 +641 +643 +647 +653 +659 +661 +673 +677 +683 +691 +701 +709 +719 +727 +733 +739 +743 +751 +757 +761 +769 +773 +787 +797 +809 +811 +821 +823 +827 +829 +839 +853 +857 +859 +863 +877 +881 +883 +887 +907 +911 +919 +929 +937 +941 +947 +953 +967 +971 +977 +983 +991 +997 diff --git a/testsuite/tests/lib-threads/test1.checker b/testsuite/tests/lib-threads/test1.checker new file mode 100644 index 00000000..cbfe7ce5 --- /dev/null +++ b/testsuite/tests/lib-threads/test1.checker @@ -0,0 +1 @@ +sort test1.result | diff -q test1.reference - diff --git a/testsuite/tests/lib-threads/test1.ml b/testsuite/tests/lib-threads/test1.ml new file mode 100644 index 00000000..66c40240 --- /dev/null +++ b/testsuite/tests/lib-threads/test1.ml @@ -0,0 +1,63 @@ +(* Classic producer-consumer *) + +type 'a prodcons = + { buffer: 'a array; + lock: Mutex.t; + mutable readpos: int; + mutable writepos: int; + notempty: Condition.t; + notfull: Condition.t } + +let create size init = + { buffer = Array.create size init; + lock = Mutex.create(); + readpos = 0; + writepos = 0; + notempty = Condition.create(); + notfull = Condition.create() } + +let output_lock = Mutex.create() + +let put p data = + Mutex.lock p.lock; + while (p.writepos + 1) mod Array.length p.buffer = p.readpos do + Condition.wait p.notfull p.lock + done; + p.buffer.(p.writepos) <- data; + p.writepos <- (p.writepos + 1) mod Array.length p.buffer; + Condition.signal p.notempty; + Mutex.unlock p.lock + +let get p = + Mutex.lock p.lock; + while p.writepos = p.readpos do + Condition.wait p.notempty p.lock + done; + let data = p.buffer.(p.readpos) in + p.readpos <- (p.readpos + 1) mod Array.length p.buffer; + Condition.signal p.notfull; + Mutex.unlock p.lock; + data + +(* Test *) + +let buff = create 20 0 + +let rec produce n = + Mutex.lock output_lock; + print_int n; print_string "-->"; print_newline(); + Mutex.unlock output_lock; + put buff n; + if n < 10000 then produce (n+1) + +let rec consume () = + let n = get buff in + Mutex.lock output_lock; + print_string "-->"; print_int n; print_newline(); + Mutex.unlock output_lock; + if n < 10000 then consume () + +let t1 = Thread.create produce 0 +let _ = consume () + +;; diff --git a/testsuite/tests/lib-threads/test1.reference b/testsuite/tests/lib-threads/test1.reference new file mode 100644 index 00000000..febf6610 --- /dev/null +++ b/testsuite/tests/lib-threads/test1.reference @@ -0,0 +1,20002 @@ +-->0 +-->1 +-->10 +-->100 +-->1000 +-->10000 +-->1001 +-->1002 +-->1003 +-->1004 +-->1005 +-->1006 +-->1007 +-->1008 +-->1009 +-->101 +-->1010 +-->1011 +-->1012 +-->1013 +-->1014 +-->1015 +-->1016 +-->1017 +-->1018 +-->1019 +-->102 +-->1020 +-->1021 +-->1022 +-->1023 +-->1024 +-->1025 +-->1026 +-->1027 +-->1028 +-->1029 +-->103 +-->1030 +-->1031 +-->1032 +-->1033 +-->1034 +-->1035 +-->1036 +-->1037 +-->1038 +-->1039 +-->104 +-->1040 +-->1041 +-->1042 +-->1043 +-->1044 +-->1045 +-->1046 +-->1047 +-->1048 +-->1049 +-->105 +-->1050 +-->1051 +-->1052 +-->1053 +-->1054 +-->1055 +-->1056 +-->1057 +-->1058 +-->1059 +-->106 +-->1060 +-->1061 +-->1062 +-->1063 +-->1064 +-->1065 +-->1066 +-->1067 +-->1068 +-->1069 +-->107 +-->1070 +-->1071 +-->1072 +-->1073 +-->1074 +-->1075 +-->1076 +-->1077 +-->1078 +-->1079 +-->108 +-->1080 +-->1081 +-->1082 +-->1083 +-->1084 +-->1085 +-->1086 +-->1087 +-->1088 +-->1089 +-->109 +-->1090 +-->1091 +-->1092 +-->1093 +-->1094 +-->1095 +-->1096 +-->1097 +-->1098 +-->1099 +-->11 +-->110 +-->1100 +-->1101 +-->1102 +-->1103 +-->1104 +-->1105 +-->1106 +-->1107 +-->1108 +-->1109 +-->111 +-->1110 +-->1111 +-->1112 +-->1113 +-->1114 +-->1115 +-->1116 +-->1117 +-->1118 +-->1119 +-->112 +-->1120 +-->1121 +-->1122 +-->1123 +-->1124 +-->1125 +-->1126 +-->1127 +-->1128 +-->1129 +-->113 +-->1130 +-->1131 +-->1132 +-->1133 +-->1134 +-->1135 +-->1136 +-->1137 +-->1138 +-->1139 +-->114 +-->1140 +-->1141 +-->1142 +-->1143 +-->1144 +-->1145 +-->1146 +-->1147 +-->1148 +-->1149 +-->115 +-->1150 +-->1151 +-->1152 +-->1153 +-->1154 +-->1155 +-->1156 +-->1157 +-->1158 +-->1159 +-->116 +-->1160 +-->1161 +-->1162 +-->1163 +-->1164 +-->1165 +-->1166 +-->1167 +-->1168 +-->1169 +-->117 +-->1170 +-->1171 +-->1172 +-->1173 +-->1174 +-->1175 +-->1176 +-->1177 +-->1178 +-->1179 +-->118 +-->1180 +-->1181 +-->1182 +-->1183 +-->1184 +-->1185 +-->1186 +-->1187 +-->1188 +-->1189 +-->119 +-->1190 +-->1191 +-->1192 +-->1193 +-->1194 +-->1195 +-->1196 +-->1197 +-->1198 +-->1199 +-->12 +-->120 +-->1200 +-->1201 +-->1202 +-->1203 +-->1204 +-->1205 +-->1206 +-->1207 +-->1208 +-->1209 +-->121 +-->1210 +-->1211 +-->1212 +-->1213 +-->1214 +-->1215 +-->1216 +-->1217 +-->1218 +-->1219 +-->122 +-->1220 +-->1221 +-->1222 +-->1223 +-->1224 +-->1225 +-->1226 +-->1227 +-->1228 +-->1229 +-->123 +-->1230 +-->1231 +-->1232 +-->1233 +-->1234 +-->1235 +-->1236 +-->1237 +-->1238 +-->1239 +-->124 +-->1240 +-->1241 +-->1242 +-->1243 +-->1244 +-->1245 +-->1246 +-->1247 +-->1248 +-->1249 +-->125 +-->1250 +-->1251 +-->1252 +-->1253 +-->1254 +-->1255 +-->1256 +-->1257 +-->1258 +-->1259 +-->126 +-->1260 +-->1261 +-->1262 +-->1263 +-->1264 +-->1265 +-->1266 +-->1267 +-->1268 +-->1269 +-->127 +-->1270 +-->1271 +-->1272 +-->1273 +-->1274 +-->1275 +-->1276 +-->1277 +-->1278 +-->1279 +-->128 +-->1280 +-->1281 +-->1282 +-->1283 +-->1284 +-->1285 +-->1286 +-->1287 +-->1288 +-->1289 +-->129 +-->1290 +-->1291 +-->1292 +-->1293 +-->1294 +-->1295 +-->1296 +-->1297 +-->1298 +-->1299 +-->13 +-->130 +-->1300 +-->1301 +-->1302 +-->1303 +-->1304 +-->1305 +-->1306 +-->1307 +-->1308 +-->1309 +-->131 +-->1310 +-->1311 +-->1312 +-->1313 +-->1314 +-->1315 +-->1316 +-->1317 +-->1318 +-->1319 +-->132 +-->1320 +-->1321 +-->1322 +-->1323 +-->1324 +-->1325 +-->1326 +-->1327 +-->1328 +-->1329 +-->133 +-->1330 +-->1331 +-->1332 +-->1333 +-->1334 +-->1335 +-->1336 +-->1337 +-->1338 +-->1339 +-->134 +-->1340 +-->1341 +-->1342 +-->1343 +-->1344 +-->1345 +-->1346 +-->1347 +-->1348 +-->1349 +-->135 +-->1350 +-->1351 +-->1352 +-->1353 +-->1354 +-->1355 +-->1356 +-->1357 +-->1358 +-->1359 +-->136 +-->1360 +-->1361 +-->1362 +-->1363 +-->1364 +-->1365 +-->1366 +-->1367 +-->1368 +-->1369 +-->137 +-->1370 +-->1371 +-->1372 +-->1373 +-->1374 +-->1375 +-->1376 +-->1377 +-->1378 +-->1379 +-->138 +-->1380 +-->1381 +-->1382 +-->1383 +-->1384 +-->1385 +-->1386 +-->1387 +-->1388 +-->1389 +-->139 +-->1390 +-->1391 +-->1392 +-->1393 +-->1394 +-->1395 +-->1396 +-->1397 +-->1398 +-->1399 +-->14 +-->140 +-->1400 +-->1401 +-->1402 +-->1403 +-->1404 +-->1405 +-->1406 +-->1407 +-->1408 +-->1409 +-->141 +-->1410 +-->1411 +-->1412 +-->1413 +-->1414 +-->1415 +-->1416 +-->1417 +-->1418 +-->1419 +-->142 +-->1420 +-->1421 +-->1422 +-->1423 +-->1424 +-->1425 +-->1426 +-->1427 +-->1428 +-->1429 +-->143 +-->1430 +-->1431 +-->1432 +-->1433 +-->1434 +-->1435 +-->1436 +-->1437 +-->1438 +-->1439 +-->144 +-->1440 +-->1441 +-->1442 +-->1443 +-->1444 +-->1445 +-->1446 +-->1447 +-->1448 +-->1449 +-->145 +-->1450 +-->1451 +-->1452 +-->1453 +-->1454 +-->1455 +-->1456 +-->1457 +-->1458 +-->1459 +-->146 +-->1460 +-->1461 +-->1462 +-->1463 +-->1464 +-->1465 +-->1466 +-->1467 +-->1468 +-->1469 +-->147 +-->1470 +-->1471 +-->1472 +-->1473 +-->1474 +-->1475 +-->1476 +-->1477 +-->1478 +-->1479 +-->148 +-->1480 +-->1481 +-->1482 +-->1483 +-->1484 +-->1485 +-->1486 +-->1487 +-->1488 +-->1489 +-->149 +-->1490 +-->1491 +-->1492 +-->1493 +-->1494 +-->1495 +-->1496 +-->1497 +-->1498 +-->1499 +-->15 +-->150 +-->1500 +-->1501 +-->1502 +-->1503 +-->1504 +-->1505 +-->1506 +-->1507 +-->1508 +-->1509 +-->151 +-->1510 +-->1511 +-->1512 +-->1513 +-->1514 +-->1515 +-->1516 +-->1517 +-->1518 +-->1519 +-->152 +-->1520 +-->1521 +-->1522 +-->1523 +-->1524 +-->1525 +-->1526 +-->1527 +-->1528 +-->1529 +-->153 +-->1530 +-->1531 +-->1532 +-->1533 +-->1534 +-->1535 +-->1536 +-->1537 +-->1538 +-->1539 +-->154 +-->1540 +-->1541 +-->1542 +-->1543 +-->1544 +-->1545 +-->1546 +-->1547 +-->1548 +-->1549 +-->155 +-->1550 +-->1551 +-->1552 +-->1553 +-->1554 +-->1555 +-->1556 +-->1557 +-->1558 +-->1559 +-->156 +-->1560 +-->1561 +-->1562 +-->1563 +-->1564 +-->1565 +-->1566 +-->1567 +-->1568 +-->1569 +-->157 +-->1570 +-->1571 +-->1572 +-->1573 +-->1574 +-->1575 +-->1576 +-->1577 +-->1578 +-->1579 +-->158 +-->1580 +-->1581 +-->1582 +-->1583 +-->1584 +-->1585 +-->1586 +-->1587 +-->1588 +-->1589 +-->159 +-->1590 +-->1591 +-->1592 +-->1593 +-->1594 +-->1595 +-->1596 +-->1597 +-->1598 +-->1599 +-->16 +-->160 +-->1600 +-->1601 +-->1602 +-->1603 +-->1604 +-->1605 +-->1606 +-->1607 +-->1608 +-->1609 +-->161 +-->1610 +-->1611 +-->1612 +-->1613 +-->1614 +-->1615 +-->1616 +-->1617 +-->1618 +-->1619 +-->162 +-->1620 +-->1621 +-->1622 +-->1623 +-->1624 +-->1625 +-->1626 +-->1627 +-->1628 +-->1629 +-->163 +-->1630 +-->1631 +-->1632 +-->1633 +-->1634 +-->1635 +-->1636 +-->1637 +-->1638 +-->1639 +-->164 +-->1640 +-->1641 +-->1642 +-->1643 +-->1644 +-->1645 +-->1646 +-->1647 +-->1648 +-->1649 +-->165 +-->1650 +-->1651 +-->1652 +-->1653 +-->1654 +-->1655 +-->1656 +-->1657 +-->1658 +-->1659 +-->166 +-->1660 +-->1661 +-->1662 +-->1663 +-->1664 +-->1665 +-->1666 +-->1667 +-->1668 +-->1669 +-->167 +-->1670 +-->1671 +-->1672 +-->1673 +-->1674 +-->1675 +-->1676 +-->1677 +-->1678 +-->1679 +-->168 +-->1680 +-->1681 +-->1682 +-->1683 +-->1684 +-->1685 +-->1686 +-->1687 +-->1688 +-->1689 +-->169 +-->1690 +-->1691 +-->1692 +-->1693 +-->1694 +-->1695 +-->1696 +-->1697 +-->1698 +-->1699 +-->17 +-->170 +-->1700 +-->1701 +-->1702 +-->1703 +-->1704 +-->1705 +-->1706 +-->1707 +-->1708 +-->1709 +-->171 +-->1710 +-->1711 +-->1712 +-->1713 +-->1714 +-->1715 +-->1716 +-->1717 +-->1718 +-->1719 +-->172 +-->1720 +-->1721 +-->1722 +-->1723 +-->1724 +-->1725 +-->1726 +-->1727 +-->1728 +-->1729 +-->173 +-->1730 +-->1731 +-->1732 +-->1733 +-->1734 +-->1735 +-->1736 +-->1737 +-->1738 +-->1739 +-->174 +-->1740 +-->1741 +-->1742 +-->1743 +-->1744 +-->1745 +-->1746 +-->1747 +-->1748 +-->1749 +-->175 +-->1750 +-->1751 +-->1752 +-->1753 +-->1754 +-->1755 +-->1756 +-->1757 +-->1758 +-->1759 +-->176 +-->1760 +-->1761 +-->1762 +-->1763 +-->1764 +-->1765 +-->1766 +-->1767 +-->1768 +-->1769 +-->177 +-->1770 +-->1771 +-->1772 +-->1773 +-->1774 +-->1775 +-->1776 +-->1777 +-->1778 +-->1779 +-->178 +-->1780 +-->1781 +-->1782 +-->1783 +-->1784 +-->1785 +-->1786 +-->1787 +-->1788 +-->1789 +-->179 +-->1790 +-->1791 +-->1792 +-->1793 +-->1794 +-->1795 +-->1796 +-->1797 +-->1798 +-->1799 +-->18 +-->180 +-->1800 +-->1801 +-->1802 +-->1803 +-->1804 +-->1805 +-->1806 +-->1807 +-->1808 +-->1809 +-->181 +-->1810 +-->1811 +-->1812 +-->1813 +-->1814 +-->1815 +-->1816 +-->1817 +-->1818 +-->1819 +-->182 +-->1820 +-->1821 +-->1822 +-->1823 +-->1824 +-->1825 +-->1826 +-->1827 +-->1828 +-->1829 +-->183 +-->1830 +-->1831 +-->1832 +-->1833 +-->1834 +-->1835 +-->1836 +-->1837 +-->1838 +-->1839 +-->184 +-->1840 +-->1841 +-->1842 +-->1843 +-->1844 +-->1845 +-->1846 +-->1847 +-->1848 +-->1849 +-->185 +-->1850 +-->1851 +-->1852 +-->1853 +-->1854 +-->1855 +-->1856 +-->1857 +-->1858 +-->1859 +-->186 +-->1860 +-->1861 +-->1862 +-->1863 +-->1864 +-->1865 +-->1866 +-->1867 +-->1868 +-->1869 +-->187 +-->1870 +-->1871 +-->1872 +-->1873 +-->1874 +-->1875 +-->1876 +-->1877 +-->1878 +-->1879 +-->188 +-->1880 +-->1881 +-->1882 +-->1883 +-->1884 +-->1885 +-->1886 +-->1887 +-->1888 +-->1889 +-->189 +-->1890 +-->1891 +-->1892 +-->1893 +-->1894 +-->1895 +-->1896 +-->1897 +-->1898 +-->1899 +-->19 +-->190 +-->1900 +-->1901 +-->1902 +-->1903 +-->1904 +-->1905 +-->1906 +-->1907 +-->1908 +-->1909 +-->191 +-->1910 +-->1911 +-->1912 +-->1913 +-->1914 +-->1915 +-->1916 +-->1917 +-->1918 +-->1919 +-->192 +-->1920 +-->1921 +-->1922 +-->1923 +-->1924 +-->1925 +-->1926 +-->1927 +-->1928 +-->1929 +-->193 +-->1930 +-->1931 +-->1932 +-->1933 +-->1934 +-->1935 +-->1936 +-->1937 +-->1938 +-->1939 +-->194 +-->1940 +-->1941 +-->1942 +-->1943 +-->1944 +-->1945 +-->1946 +-->1947 +-->1948 +-->1949 +-->195 +-->1950 +-->1951 +-->1952 +-->1953 +-->1954 +-->1955 +-->1956 +-->1957 +-->1958 +-->1959 +-->196 +-->1960 +-->1961 +-->1962 +-->1963 +-->1964 +-->1965 +-->1966 +-->1967 +-->1968 +-->1969 +-->197 +-->1970 +-->1971 +-->1972 +-->1973 +-->1974 +-->1975 +-->1976 +-->1977 +-->1978 +-->1979 +-->198 +-->1980 +-->1981 +-->1982 +-->1983 +-->1984 +-->1985 +-->1986 +-->1987 +-->1988 +-->1989 +-->199 +-->1990 +-->1991 +-->1992 +-->1993 +-->1994 +-->1995 +-->1996 +-->1997 +-->1998 +-->1999 +-->2 +-->20 +-->200 +-->2000 +-->2001 +-->2002 +-->2003 +-->2004 +-->2005 +-->2006 +-->2007 +-->2008 +-->2009 +-->201 +-->2010 +-->2011 +-->2012 +-->2013 +-->2014 +-->2015 +-->2016 +-->2017 +-->2018 +-->2019 +-->202 +-->2020 +-->2021 +-->2022 +-->2023 +-->2024 +-->2025 +-->2026 +-->2027 +-->2028 +-->2029 +-->203 +-->2030 +-->2031 +-->2032 +-->2033 +-->2034 +-->2035 +-->2036 +-->2037 +-->2038 +-->2039 +-->204 +-->2040 +-->2041 +-->2042 +-->2043 +-->2044 +-->2045 +-->2046 +-->2047 +-->2048 +-->2049 +-->205 +-->2050 +-->2051 +-->2052 +-->2053 +-->2054 +-->2055 +-->2056 +-->2057 +-->2058 +-->2059 +-->206 +-->2060 +-->2061 +-->2062 +-->2063 +-->2064 +-->2065 +-->2066 +-->2067 +-->2068 +-->2069 +-->207 +-->2070 +-->2071 +-->2072 +-->2073 +-->2074 +-->2075 +-->2076 +-->2077 +-->2078 +-->2079 +-->208 +-->2080 +-->2081 +-->2082 +-->2083 +-->2084 +-->2085 +-->2086 +-->2087 +-->2088 +-->2089 +-->209 +-->2090 +-->2091 +-->2092 +-->2093 +-->2094 +-->2095 +-->2096 +-->2097 +-->2098 +-->2099 +-->21 +-->210 +-->2100 +-->2101 +-->2102 +-->2103 +-->2104 +-->2105 +-->2106 +-->2107 +-->2108 +-->2109 +-->211 +-->2110 +-->2111 +-->2112 +-->2113 +-->2114 +-->2115 +-->2116 +-->2117 +-->2118 +-->2119 +-->212 +-->2120 +-->2121 +-->2122 +-->2123 +-->2124 +-->2125 +-->2126 +-->2127 +-->2128 +-->2129 +-->213 +-->2130 +-->2131 +-->2132 +-->2133 +-->2134 +-->2135 +-->2136 +-->2137 +-->2138 +-->2139 +-->214 +-->2140 +-->2141 +-->2142 +-->2143 +-->2144 +-->2145 +-->2146 +-->2147 +-->2148 +-->2149 +-->215 +-->2150 +-->2151 +-->2152 +-->2153 +-->2154 +-->2155 +-->2156 +-->2157 +-->2158 +-->2159 +-->216 +-->2160 +-->2161 +-->2162 +-->2163 +-->2164 +-->2165 +-->2166 +-->2167 +-->2168 +-->2169 +-->217 +-->2170 +-->2171 +-->2172 +-->2173 +-->2174 +-->2175 +-->2176 +-->2177 +-->2178 +-->2179 +-->218 +-->2180 +-->2181 +-->2182 +-->2183 +-->2184 +-->2185 +-->2186 +-->2187 +-->2188 +-->2189 +-->219 +-->2190 +-->2191 +-->2192 +-->2193 +-->2194 +-->2195 +-->2196 +-->2197 +-->2198 +-->2199 +-->22 +-->220 +-->2200 +-->2201 +-->2202 +-->2203 +-->2204 +-->2205 +-->2206 +-->2207 +-->2208 +-->2209 +-->221 +-->2210 +-->2211 +-->2212 +-->2213 +-->2214 +-->2215 +-->2216 +-->2217 +-->2218 +-->2219 +-->222 +-->2220 +-->2221 +-->2222 +-->2223 +-->2224 +-->2225 +-->2226 +-->2227 +-->2228 +-->2229 +-->223 +-->2230 +-->2231 +-->2232 +-->2233 +-->2234 +-->2235 +-->2236 +-->2237 +-->2238 +-->2239 +-->224 +-->2240 +-->2241 +-->2242 +-->2243 +-->2244 +-->2245 +-->2246 +-->2247 +-->2248 +-->2249 +-->225 +-->2250 +-->2251 +-->2252 +-->2253 +-->2254 +-->2255 +-->2256 +-->2257 +-->2258 +-->2259 +-->226 +-->2260 +-->2261 +-->2262 +-->2263 +-->2264 +-->2265 +-->2266 +-->2267 +-->2268 +-->2269 +-->227 +-->2270 +-->2271 +-->2272 +-->2273 +-->2274 +-->2275 +-->2276 +-->2277 +-->2278 +-->2279 +-->228 +-->2280 +-->2281 +-->2282 +-->2283 +-->2284 +-->2285 +-->2286 +-->2287 +-->2288 +-->2289 +-->229 +-->2290 +-->2291 +-->2292 +-->2293 +-->2294 +-->2295 +-->2296 +-->2297 +-->2298 +-->2299 +-->23 +-->230 +-->2300 +-->2301 +-->2302 +-->2303 +-->2304 +-->2305 +-->2306 +-->2307 +-->2308 +-->2309 +-->231 +-->2310 +-->2311 +-->2312 +-->2313 +-->2314 +-->2315 +-->2316 +-->2317 +-->2318 +-->2319 +-->232 +-->2320 +-->2321 +-->2322 +-->2323 +-->2324 +-->2325 +-->2326 +-->2327 +-->2328 +-->2329 +-->233 +-->2330 +-->2331 +-->2332 +-->2333 +-->2334 +-->2335 +-->2336 +-->2337 +-->2338 +-->2339 +-->234 +-->2340 +-->2341 +-->2342 +-->2343 +-->2344 +-->2345 +-->2346 +-->2347 +-->2348 +-->2349 +-->235 +-->2350 +-->2351 +-->2352 +-->2353 +-->2354 +-->2355 +-->2356 +-->2357 +-->2358 +-->2359 +-->236 +-->2360 +-->2361 +-->2362 +-->2363 +-->2364 +-->2365 +-->2366 +-->2367 +-->2368 +-->2369 +-->237 +-->2370 +-->2371 +-->2372 +-->2373 +-->2374 +-->2375 +-->2376 +-->2377 +-->2378 +-->2379 +-->238 +-->2380 +-->2381 +-->2382 +-->2383 +-->2384 +-->2385 +-->2386 +-->2387 +-->2388 +-->2389 +-->239 +-->2390 +-->2391 +-->2392 +-->2393 +-->2394 +-->2395 +-->2396 +-->2397 +-->2398 +-->2399 +-->24 +-->240 +-->2400 +-->2401 +-->2402 +-->2403 +-->2404 +-->2405 +-->2406 +-->2407 +-->2408 +-->2409 +-->241 +-->2410 +-->2411 +-->2412 +-->2413 +-->2414 +-->2415 +-->2416 +-->2417 +-->2418 +-->2419 +-->242 +-->2420 +-->2421 +-->2422 +-->2423 +-->2424 +-->2425 +-->2426 +-->2427 +-->2428 +-->2429 +-->243 +-->2430 +-->2431 +-->2432 +-->2433 +-->2434 +-->2435 +-->2436 +-->2437 +-->2438 +-->2439 +-->244 +-->2440 +-->2441 +-->2442 +-->2443 +-->2444 +-->2445 +-->2446 +-->2447 +-->2448 +-->2449 +-->245 +-->2450 +-->2451 +-->2452 +-->2453 +-->2454 +-->2455 +-->2456 +-->2457 +-->2458 +-->2459 +-->246 +-->2460 +-->2461 +-->2462 +-->2463 +-->2464 +-->2465 +-->2466 +-->2467 +-->2468 +-->2469 +-->247 +-->2470 +-->2471 +-->2472 +-->2473 +-->2474 +-->2475 +-->2476 +-->2477 +-->2478 +-->2479 +-->248 +-->2480 +-->2481 +-->2482 +-->2483 +-->2484 +-->2485 +-->2486 +-->2487 +-->2488 +-->2489 +-->249 +-->2490 +-->2491 +-->2492 +-->2493 +-->2494 +-->2495 +-->2496 +-->2497 +-->2498 +-->2499 +-->25 +-->250 +-->2500 +-->2501 +-->2502 +-->2503 +-->2504 +-->2505 +-->2506 +-->2507 +-->2508 +-->2509 +-->251 +-->2510 +-->2511 +-->2512 +-->2513 +-->2514 +-->2515 +-->2516 +-->2517 +-->2518 +-->2519 +-->252 +-->2520 +-->2521 +-->2522 +-->2523 +-->2524 +-->2525 +-->2526 +-->2527 +-->2528 +-->2529 +-->253 +-->2530 +-->2531 +-->2532 +-->2533 +-->2534 +-->2535 +-->2536 +-->2537 +-->2538 +-->2539 +-->254 +-->2540 +-->2541 +-->2542 +-->2543 +-->2544 +-->2545 +-->2546 +-->2547 +-->2548 +-->2549 +-->255 +-->2550 +-->2551 +-->2552 +-->2553 +-->2554 +-->2555 +-->2556 +-->2557 +-->2558 +-->2559 +-->256 +-->2560 +-->2561 +-->2562 +-->2563 +-->2564 +-->2565 +-->2566 +-->2567 +-->2568 +-->2569 +-->257 +-->2570 +-->2571 +-->2572 +-->2573 +-->2574 +-->2575 +-->2576 +-->2577 +-->2578 +-->2579 +-->258 +-->2580 +-->2581 +-->2582 +-->2583 +-->2584 +-->2585 +-->2586 +-->2587 +-->2588 +-->2589 +-->259 +-->2590 +-->2591 +-->2592 +-->2593 +-->2594 +-->2595 +-->2596 +-->2597 +-->2598 +-->2599 +-->26 +-->260 +-->2600 +-->2601 +-->2602 +-->2603 +-->2604 +-->2605 +-->2606 +-->2607 +-->2608 +-->2609 +-->261 +-->2610 +-->2611 +-->2612 +-->2613 +-->2614 +-->2615 +-->2616 +-->2617 +-->2618 +-->2619 +-->262 +-->2620 +-->2621 +-->2622 +-->2623 +-->2624 +-->2625 +-->2626 +-->2627 +-->2628 +-->2629 +-->263 +-->2630 +-->2631 +-->2632 +-->2633 +-->2634 +-->2635 +-->2636 +-->2637 +-->2638 +-->2639 +-->264 +-->2640 +-->2641 +-->2642 +-->2643 +-->2644 +-->2645 +-->2646 +-->2647 +-->2648 +-->2649 +-->265 +-->2650 +-->2651 +-->2652 +-->2653 +-->2654 +-->2655 +-->2656 +-->2657 +-->2658 +-->2659 +-->266 +-->2660 +-->2661 +-->2662 +-->2663 +-->2664 +-->2665 +-->2666 +-->2667 +-->2668 +-->2669 +-->267 +-->2670 +-->2671 +-->2672 +-->2673 +-->2674 +-->2675 +-->2676 +-->2677 +-->2678 +-->2679 +-->268 +-->2680 +-->2681 +-->2682 +-->2683 +-->2684 +-->2685 +-->2686 +-->2687 +-->2688 +-->2689 +-->269 +-->2690 +-->2691 +-->2692 +-->2693 +-->2694 +-->2695 +-->2696 +-->2697 +-->2698 +-->2699 +-->27 +-->270 +-->2700 +-->2701 +-->2702 +-->2703 +-->2704 +-->2705 +-->2706 +-->2707 +-->2708 +-->2709 +-->271 +-->2710 +-->2711 +-->2712 +-->2713 +-->2714 +-->2715 +-->2716 +-->2717 +-->2718 +-->2719 +-->272 +-->2720 +-->2721 +-->2722 +-->2723 +-->2724 +-->2725 +-->2726 +-->2727 +-->2728 +-->2729 +-->273 +-->2730 +-->2731 +-->2732 +-->2733 +-->2734 +-->2735 +-->2736 +-->2737 +-->2738 +-->2739 +-->274 +-->2740 +-->2741 +-->2742 +-->2743 +-->2744 +-->2745 +-->2746 +-->2747 +-->2748 +-->2749 +-->275 +-->2750 +-->2751 +-->2752 +-->2753 +-->2754 +-->2755 +-->2756 +-->2757 +-->2758 +-->2759 +-->276 +-->2760 +-->2761 +-->2762 +-->2763 +-->2764 +-->2765 +-->2766 +-->2767 +-->2768 +-->2769 +-->277 +-->2770 +-->2771 +-->2772 +-->2773 +-->2774 +-->2775 +-->2776 +-->2777 +-->2778 +-->2779 +-->278 +-->2780 +-->2781 +-->2782 +-->2783 +-->2784 +-->2785 +-->2786 +-->2787 +-->2788 +-->2789 +-->279 +-->2790 +-->2791 +-->2792 +-->2793 +-->2794 +-->2795 +-->2796 +-->2797 +-->2798 +-->2799 +-->28 +-->280 +-->2800 +-->2801 +-->2802 +-->2803 +-->2804 +-->2805 +-->2806 +-->2807 +-->2808 +-->2809 +-->281 +-->2810 +-->2811 +-->2812 +-->2813 +-->2814 +-->2815 +-->2816 +-->2817 +-->2818 +-->2819 +-->282 +-->2820 +-->2821 +-->2822 +-->2823 +-->2824 +-->2825 +-->2826 +-->2827 +-->2828 +-->2829 +-->283 +-->2830 +-->2831 +-->2832 +-->2833 +-->2834 +-->2835 +-->2836 +-->2837 +-->2838 +-->2839 +-->284 +-->2840 +-->2841 +-->2842 +-->2843 +-->2844 +-->2845 +-->2846 +-->2847 +-->2848 +-->2849 +-->285 +-->2850 +-->2851 +-->2852 +-->2853 +-->2854 +-->2855 +-->2856 +-->2857 +-->2858 +-->2859 +-->286 +-->2860 +-->2861 +-->2862 +-->2863 +-->2864 +-->2865 +-->2866 +-->2867 +-->2868 +-->2869 +-->287 +-->2870 +-->2871 +-->2872 +-->2873 +-->2874 +-->2875 +-->2876 +-->2877 +-->2878 +-->2879 +-->288 +-->2880 +-->2881 +-->2882 +-->2883 +-->2884 +-->2885 +-->2886 +-->2887 +-->2888 +-->2889 +-->289 +-->2890 +-->2891 +-->2892 +-->2893 +-->2894 +-->2895 +-->2896 +-->2897 +-->2898 +-->2899 +-->29 +-->290 +-->2900 +-->2901 +-->2902 +-->2903 +-->2904 +-->2905 +-->2906 +-->2907 +-->2908 +-->2909 +-->291 +-->2910 +-->2911 +-->2912 +-->2913 +-->2914 +-->2915 +-->2916 +-->2917 +-->2918 +-->2919 +-->292 +-->2920 +-->2921 +-->2922 +-->2923 +-->2924 +-->2925 +-->2926 +-->2927 +-->2928 +-->2929 +-->293 +-->2930 +-->2931 +-->2932 +-->2933 +-->2934 +-->2935 +-->2936 +-->2937 +-->2938 +-->2939 +-->294 +-->2940 +-->2941 +-->2942 +-->2943 +-->2944 +-->2945 +-->2946 +-->2947 +-->2948 +-->2949 +-->295 +-->2950 +-->2951 +-->2952 +-->2953 +-->2954 +-->2955 +-->2956 +-->2957 +-->2958 +-->2959 +-->296 +-->2960 +-->2961 +-->2962 +-->2963 +-->2964 +-->2965 +-->2966 +-->2967 +-->2968 +-->2969 +-->297 +-->2970 +-->2971 +-->2972 +-->2973 +-->2974 +-->2975 +-->2976 +-->2977 +-->2978 +-->2979 +-->298 +-->2980 +-->2981 +-->2982 +-->2983 +-->2984 +-->2985 +-->2986 +-->2987 +-->2988 +-->2989 +-->299 +-->2990 +-->2991 +-->2992 +-->2993 +-->2994 +-->2995 +-->2996 +-->2997 +-->2998 +-->2999 +-->3 +-->30 +-->300 +-->3000 +-->3001 +-->3002 +-->3003 +-->3004 +-->3005 +-->3006 +-->3007 +-->3008 +-->3009 +-->301 +-->3010 +-->3011 +-->3012 +-->3013 +-->3014 +-->3015 +-->3016 +-->3017 +-->3018 +-->3019 +-->302 +-->3020 +-->3021 +-->3022 +-->3023 +-->3024 +-->3025 +-->3026 +-->3027 +-->3028 +-->3029 +-->303 +-->3030 +-->3031 +-->3032 +-->3033 +-->3034 +-->3035 +-->3036 +-->3037 +-->3038 +-->3039 +-->304 +-->3040 +-->3041 +-->3042 +-->3043 +-->3044 +-->3045 +-->3046 +-->3047 +-->3048 +-->3049 +-->305 +-->3050 +-->3051 +-->3052 +-->3053 +-->3054 +-->3055 +-->3056 +-->3057 +-->3058 +-->3059 +-->306 +-->3060 +-->3061 +-->3062 +-->3063 +-->3064 +-->3065 +-->3066 +-->3067 +-->3068 +-->3069 +-->307 +-->3070 +-->3071 +-->3072 +-->3073 +-->3074 +-->3075 +-->3076 +-->3077 +-->3078 +-->3079 +-->308 +-->3080 +-->3081 +-->3082 +-->3083 +-->3084 +-->3085 +-->3086 +-->3087 +-->3088 +-->3089 +-->309 +-->3090 +-->3091 +-->3092 +-->3093 +-->3094 +-->3095 +-->3096 +-->3097 +-->3098 +-->3099 +-->31 +-->310 +-->3100 +-->3101 +-->3102 +-->3103 +-->3104 +-->3105 +-->3106 +-->3107 +-->3108 +-->3109 +-->311 +-->3110 +-->3111 +-->3112 +-->3113 +-->3114 +-->3115 +-->3116 +-->3117 +-->3118 +-->3119 +-->312 +-->3120 +-->3121 +-->3122 +-->3123 +-->3124 +-->3125 +-->3126 +-->3127 +-->3128 +-->3129 +-->313 +-->3130 +-->3131 +-->3132 +-->3133 +-->3134 +-->3135 +-->3136 +-->3137 +-->3138 +-->3139 +-->314 +-->3140 +-->3141 +-->3142 +-->3143 +-->3144 +-->3145 +-->3146 +-->3147 +-->3148 +-->3149 +-->315 +-->3150 +-->3151 +-->3152 +-->3153 +-->3154 +-->3155 +-->3156 +-->3157 +-->3158 +-->3159 +-->316 +-->3160 +-->3161 +-->3162 +-->3163 +-->3164 +-->3165 +-->3166 +-->3167 +-->3168 +-->3169 +-->317 +-->3170 +-->3171 +-->3172 +-->3173 +-->3174 +-->3175 +-->3176 +-->3177 +-->3178 +-->3179 +-->318 +-->3180 +-->3181 +-->3182 +-->3183 +-->3184 +-->3185 +-->3186 +-->3187 +-->3188 +-->3189 +-->319 +-->3190 +-->3191 +-->3192 +-->3193 +-->3194 +-->3195 +-->3196 +-->3197 +-->3198 +-->3199 +-->32 +-->320 +-->3200 +-->3201 +-->3202 +-->3203 +-->3204 +-->3205 +-->3206 +-->3207 +-->3208 +-->3209 +-->321 +-->3210 +-->3211 +-->3212 +-->3213 +-->3214 +-->3215 +-->3216 +-->3217 +-->3218 +-->3219 +-->322 +-->3220 +-->3221 +-->3222 +-->3223 +-->3224 +-->3225 +-->3226 +-->3227 +-->3228 +-->3229 +-->323 +-->3230 +-->3231 +-->3232 +-->3233 +-->3234 +-->3235 +-->3236 +-->3237 +-->3238 +-->3239 +-->324 +-->3240 +-->3241 +-->3242 +-->3243 +-->3244 +-->3245 +-->3246 +-->3247 +-->3248 +-->3249 +-->325 +-->3250 +-->3251 +-->3252 +-->3253 +-->3254 +-->3255 +-->3256 +-->3257 +-->3258 +-->3259 +-->326 +-->3260 +-->3261 +-->3262 +-->3263 +-->3264 +-->3265 +-->3266 +-->3267 +-->3268 +-->3269 +-->327 +-->3270 +-->3271 +-->3272 +-->3273 +-->3274 +-->3275 +-->3276 +-->3277 +-->3278 +-->3279 +-->328 +-->3280 +-->3281 +-->3282 +-->3283 +-->3284 +-->3285 +-->3286 +-->3287 +-->3288 +-->3289 +-->329 +-->3290 +-->3291 +-->3292 +-->3293 +-->3294 +-->3295 +-->3296 +-->3297 +-->3298 +-->3299 +-->33 +-->330 +-->3300 +-->3301 +-->3302 +-->3303 +-->3304 +-->3305 +-->3306 +-->3307 +-->3308 +-->3309 +-->331 +-->3310 +-->3311 +-->3312 +-->3313 +-->3314 +-->3315 +-->3316 +-->3317 +-->3318 +-->3319 +-->332 +-->3320 +-->3321 +-->3322 +-->3323 +-->3324 +-->3325 +-->3326 +-->3327 +-->3328 +-->3329 +-->333 +-->3330 +-->3331 +-->3332 +-->3333 +-->3334 +-->3335 +-->3336 +-->3337 +-->3338 +-->3339 +-->334 +-->3340 +-->3341 +-->3342 +-->3343 +-->3344 +-->3345 +-->3346 +-->3347 +-->3348 +-->3349 +-->335 +-->3350 +-->3351 +-->3352 +-->3353 +-->3354 +-->3355 +-->3356 +-->3357 +-->3358 +-->3359 +-->336 +-->3360 +-->3361 +-->3362 +-->3363 +-->3364 +-->3365 +-->3366 +-->3367 +-->3368 +-->3369 +-->337 +-->3370 +-->3371 +-->3372 +-->3373 +-->3374 +-->3375 +-->3376 +-->3377 +-->3378 +-->3379 +-->338 +-->3380 +-->3381 +-->3382 +-->3383 +-->3384 +-->3385 +-->3386 +-->3387 +-->3388 +-->3389 +-->339 +-->3390 +-->3391 +-->3392 +-->3393 +-->3394 +-->3395 +-->3396 +-->3397 +-->3398 +-->3399 +-->34 +-->340 +-->3400 +-->3401 +-->3402 +-->3403 +-->3404 +-->3405 +-->3406 +-->3407 +-->3408 +-->3409 +-->341 +-->3410 +-->3411 +-->3412 +-->3413 +-->3414 +-->3415 +-->3416 +-->3417 +-->3418 +-->3419 +-->342 +-->3420 +-->3421 +-->3422 +-->3423 +-->3424 +-->3425 +-->3426 +-->3427 +-->3428 +-->3429 +-->343 +-->3430 +-->3431 +-->3432 +-->3433 +-->3434 +-->3435 +-->3436 +-->3437 +-->3438 +-->3439 +-->344 +-->3440 +-->3441 +-->3442 +-->3443 +-->3444 +-->3445 +-->3446 +-->3447 +-->3448 +-->3449 +-->345 +-->3450 +-->3451 +-->3452 +-->3453 +-->3454 +-->3455 +-->3456 +-->3457 +-->3458 +-->3459 +-->346 +-->3460 +-->3461 +-->3462 +-->3463 +-->3464 +-->3465 +-->3466 +-->3467 +-->3468 +-->3469 +-->347 +-->3470 +-->3471 +-->3472 +-->3473 +-->3474 +-->3475 +-->3476 +-->3477 +-->3478 +-->3479 +-->348 +-->3480 +-->3481 +-->3482 +-->3483 +-->3484 +-->3485 +-->3486 +-->3487 +-->3488 +-->3489 +-->349 +-->3490 +-->3491 +-->3492 +-->3493 +-->3494 +-->3495 +-->3496 +-->3497 +-->3498 +-->3499 +-->35 +-->350 +-->3500 +-->3501 +-->3502 +-->3503 +-->3504 +-->3505 +-->3506 +-->3507 +-->3508 +-->3509 +-->351 +-->3510 +-->3511 +-->3512 +-->3513 +-->3514 +-->3515 +-->3516 +-->3517 +-->3518 +-->3519 +-->352 +-->3520 +-->3521 +-->3522 +-->3523 +-->3524 +-->3525 +-->3526 +-->3527 +-->3528 +-->3529 +-->353 +-->3530 +-->3531 +-->3532 +-->3533 +-->3534 +-->3535 +-->3536 +-->3537 +-->3538 +-->3539 +-->354 +-->3540 +-->3541 +-->3542 +-->3543 +-->3544 +-->3545 +-->3546 +-->3547 +-->3548 +-->3549 +-->355 +-->3550 +-->3551 +-->3552 +-->3553 +-->3554 +-->3555 +-->3556 +-->3557 +-->3558 +-->3559 +-->356 +-->3560 +-->3561 +-->3562 +-->3563 +-->3564 +-->3565 +-->3566 +-->3567 +-->3568 +-->3569 +-->357 +-->3570 +-->3571 +-->3572 +-->3573 +-->3574 +-->3575 +-->3576 +-->3577 +-->3578 +-->3579 +-->358 +-->3580 +-->3581 +-->3582 +-->3583 +-->3584 +-->3585 +-->3586 +-->3587 +-->3588 +-->3589 +-->359 +-->3590 +-->3591 +-->3592 +-->3593 +-->3594 +-->3595 +-->3596 +-->3597 +-->3598 +-->3599 +-->36 +-->360 +-->3600 +-->3601 +-->3602 +-->3603 +-->3604 +-->3605 +-->3606 +-->3607 +-->3608 +-->3609 +-->361 +-->3610 +-->3611 +-->3612 +-->3613 +-->3614 +-->3615 +-->3616 +-->3617 +-->3618 +-->3619 +-->362 +-->3620 +-->3621 +-->3622 +-->3623 +-->3624 +-->3625 +-->3626 +-->3627 +-->3628 +-->3629 +-->363 +-->3630 +-->3631 +-->3632 +-->3633 +-->3634 +-->3635 +-->3636 +-->3637 +-->3638 +-->3639 +-->364 +-->3640 +-->3641 +-->3642 +-->3643 +-->3644 +-->3645 +-->3646 +-->3647 +-->3648 +-->3649 +-->365 +-->3650 +-->3651 +-->3652 +-->3653 +-->3654 +-->3655 +-->3656 +-->3657 +-->3658 +-->3659 +-->366 +-->3660 +-->3661 +-->3662 +-->3663 +-->3664 +-->3665 +-->3666 +-->3667 +-->3668 +-->3669 +-->367 +-->3670 +-->3671 +-->3672 +-->3673 +-->3674 +-->3675 +-->3676 +-->3677 +-->3678 +-->3679 +-->368 +-->3680 +-->3681 +-->3682 +-->3683 +-->3684 +-->3685 +-->3686 +-->3687 +-->3688 +-->3689 +-->369 +-->3690 +-->3691 +-->3692 +-->3693 +-->3694 +-->3695 +-->3696 +-->3697 +-->3698 +-->3699 +-->37 +-->370 +-->3700 +-->3701 +-->3702 +-->3703 +-->3704 +-->3705 +-->3706 +-->3707 +-->3708 +-->3709 +-->371 +-->3710 +-->3711 +-->3712 +-->3713 +-->3714 +-->3715 +-->3716 +-->3717 +-->3718 +-->3719 +-->372 +-->3720 +-->3721 +-->3722 +-->3723 +-->3724 +-->3725 +-->3726 +-->3727 +-->3728 +-->3729 +-->373 +-->3730 +-->3731 +-->3732 +-->3733 +-->3734 +-->3735 +-->3736 +-->3737 +-->3738 +-->3739 +-->374 +-->3740 +-->3741 +-->3742 +-->3743 +-->3744 +-->3745 +-->3746 +-->3747 +-->3748 +-->3749 +-->375 +-->3750 +-->3751 +-->3752 +-->3753 +-->3754 +-->3755 +-->3756 +-->3757 +-->3758 +-->3759 +-->376 +-->3760 +-->3761 +-->3762 +-->3763 +-->3764 +-->3765 +-->3766 +-->3767 +-->3768 +-->3769 +-->377 +-->3770 +-->3771 +-->3772 +-->3773 +-->3774 +-->3775 +-->3776 +-->3777 +-->3778 +-->3779 +-->378 +-->3780 +-->3781 +-->3782 +-->3783 +-->3784 +-->3785 +-->3786 +-->3787 +-->3788 +-->3789 +-->379 +-->3790 +-->3791 +-->3792 +-->3793 +-->3794 +-->3795 +-->3796 +-->3797 +-->3798 +-->3799 +-->38 +-->380 +-->3800 +-->3801 +-->3802 +-->3803 +-->3804 +-->3805 +-->3806 +-->3807 +-->3808 +-->3809 +-->381 +-->3810 +-->3811 +-->3812 +-->3813 +-->3814 +-->3815 +-->3816 +-->3817 +-->3818 +-->3819 +-->382 +-->3820 +-->3821 +-->3822 +-->3823 +-->3824 +-->3825 +-->3826 +-->3827 +-->3828 +-->3829 +-->383 +-->3830 +-->3831 +-->3832 +-->3833 +-->3834 +-->3835 +-->3836 +-->3837 +-->3838 +-->3839 +-->384 +-->3840 +-->3841 +-->3842 +-->3843 +-->3844 +-->3845 +-->3846 +-->3847 +-->3848 +-->3849 +-->385 +-->3850 +-->3851 +-->3852 +-->3853 +-->3854 +-->3855 +-->3856 +-->3857 +-->3858 +-->3859 +-->386 +-->3860 +-->3861 +-->3862 +-->3863 +-->3864 +-->3865 +-->3866 +-->3867 +-->3868 +-->3869 +-->387 +-->3870 +-->3871 +-->3872 +-->3873 +-->3874 +-->3875 +-->3876 +-->3877 +-->3878 +-->3879 +-->388 +-->3880 +-->3881 +-->3882 +-->3883 +-->3884 +-->3885 +-->3886 +-->3887 +-->3888 +-->3889 +-->389 +-->3890 +-->3891 +-->3892 +-->3893 +-->3894 +-->3895 +-->3896 +-->3897 +-->3898 +-->3899 +-->39 +-->390 +-->3900 +-->3901 +-->3902 +-->3903 +-->3904 +-->3905 +-->3906 +-->3907 +-->3908 +-->3909 +-->391 +-->3910 +-->3911 +-->3912 +-->3913 +-->3914 +-->3915 +-->3916 +-->3917 +-->3918 +-->3919 +-->392 +-->3920 +-->3921 +-->3922 +-->3923 +-->3924 +-->3925 +-->3926 +-->3927 +-->3928 +-->3929 +-->393 +-->3930 +-->3931 +-->3932 +-->3933 +-->3934 +-->3935 +-->3936 +-->3937 +-->3938 +-->3939 +-->394 +-->3940 +-->3941 +-->3942 +-->3943 +-->3944 +-->3945 +-->3946 +-->3947 +-->3948 +-->3949 +-->395 +-->3950 +-->3951 +-->3952 +-->3953 +-->3954 +-->3955 +-->3956 +-->3957 +-->3958 +-->3959 +-->396 +-->3960 +-->3961 +-->3962 +-->3963 +-->3964 +-->3965 +-->3966 +-->3967 +-->3968 +-->3969 +-->397 +-->3970 +-->3971 +-->3972 +-->3973 +-->3974 +-->3975 +-->3976 +-->3977 +-->3978 +-->3979 +-->398 +-->3980 +-->3981 +-->3982 +-->3983 +-->3984 +-->3985 +-->3986 +-->3987 +-->3988 +-->3989 +-->399 +-->3990 +-->3991 +-->3992 +-->3993 +-->3994 +-->3995 +-->3996 +-->3997 +-->3998 +-->3999 +-->4 +-->40 +-->400 +-->4000 +-->4001 +-->4002 +-->4003 +-->4004 +-->4005 +-->4006 +-->4007 +-->4008 +-->4009 +-->401 +-->4010 +-->4011 +-->4012 +-->4013 +-->4014 +-->4015 +-->4016 +-->4017 +-->4018 +-->4019 +-->402 +-->4020 +-->4021 +-->4022 +-->4023 +-->4024 +-->4025 +-->4026 +-->4027 +-->4028 +-->4029 +-->403 +-->4030 +-->4031 +-->4032 +-->4033 +-->4034 +-->4035 +-->4036 +-->4037 +-->4038 +-->4039 +-->404 +-->4040 +-->4041 +-->4042 +-->4043 +-->4044 +-->4045 +-->4046 +-->4047 +-->4048 +-->4049 +-->405 +-->4050 +-->4051 +-->4052 +-->4053 +-->4054 +-->4055 +-->4056 +-->4057 +-->4058 +-->4059 +-->406 +-->4060 +-->4061 +-->4062 +-->4063 +-->4064 +-->4065 +-->4066 +-->4067 +-->4068 +-->4069 +-->407 +-->4070 +-->4071 +-->4072 +-->4073 +-->4074 +-->4075 +-->4076 +-->4077 +-->4078 +-->4079 +-->408 +-->4080 +-->4081 +-->4082 +-->4083 +-->4084 +-->4085 +-->4086 +-->4087 +-->4088 +-->4089 +-->409 +-->4090 +-->4091 +-->4092 +-->4093 +-->4094 +-->4095 +-->4096 +-->4097 +-->4098 +-->4099 +-->41 +-->410 +-->4100 +-->4101 +-->4102 +-->4103 +-->4104 +-->4105 +-->4106 +-->4107 +-->4108 +-->4109 +-->411 +-->4110 +-->4111 +-->4112 +-->4113 +-->4114 +-->4115 +-->4116 +-->4117 +-->4118 +-->4119 +-->412 +-->4120 +-->4121 +-->4122 +-->4123 +-->4124 +-->4125 +-->4126 +-->4127 +-->4128 +-->4129 +-->413 +-->4130 +-->4131 +-->4132 +-->4133 +-->4134 +-->4135 +-->4136 +-->4137 +-->4138 +-->4139 +-->414 +-->4140 +-->4141 +-->4142 +-->4143 +-->4144 +-->4145 +-->4146 +-->4147 +-->4148 +-->4149 +-->415 +-->4150 +-->4151 +-->4152 +-->4153 +-->4154 +-->4155 +-->4156 +-->4157 +-->4158 +-->4159 +-->416 +-->4160 +-->4161 +-->4162 +-->4163 +-->4164 +-->4165 +-->4166 +-->4167 +-->4168 +-->4169 +-->417 +-->4170 +-->4171 +-->4172 +-->4173 +-->4174 +-->4175 +-->4176 +-->4177 +-->4178 +-->4179 +-->418 +-->4180 +-->4181 +-->4182 +-->4183 +-->4184 +-->4185 +-->4186 +-->4187 +-->4188 +-->4189 +-->419 +-->4190 +-->4191 +-->4192 +-->4193 +-->4194 +-->4195 +-->4196 +-->4197 +-->4198 +-->4199 +-->42 +-->420 +-->4200 +-->4201 +-->4202 +-->4203 +-->4204 +-->4205 +-->4206 +-->4207 +-->4208 +-->4209 +-->421 +-->4210 +-->4211 +-->4212 +-->4213 +-->4214 +-->4215 +-->4216 +-->4217 +-->4218 +-->4219 +-->422 +-->4220 +-->4221 +-->4222 +-->4223 +-->4224 +-->4225 +-->4226 +-->4227 +-->4228 +-->4229 +-->423 +-->4230 +-->4231 +-->4232 +-->4233 +-->4234 +-->4235 +-->4236 +-->4237 +-->4238 +-->4239 +-->424 +-->4240 +-->4241 +-->4242 +-->4243 +-->4244 +-->4245 +-->4246 +-->4247 +-->4248 +-->4249 +-->425 +-->4250 +-->4251 +-->4252 +-->4253 +-->4254 +-->4255 +-->4256 +-->4257 +-->4258 +-->4259 +-->426 +-->4260 +-->4261 +-->4262 +-->4263 +-->4264 +-->4265 +-->4266 +-->4267 +-->4268 +-->4269 +-->427 +-->4270 +-->4271 +-->4272 +-->4273 +-->4274 +-->4275 +-->4276 +-->4277 +-->4278 +-->4279 +-->428 +-->4280 +-->4281 +-->4282 +-->4283 +-->4284 +-->4285 +-->4286 +-->4287 +-->4288 +-->4289 +-->429 +-->4290 +-->4291 +-->4292 +-->4293 +-->4294 +-->4295 +-->4296 +-->4297 +-->4298 +-->4299 +-->43 +-->430 +-->4300 +-->4301 +-->4302 +-->4303 +-->4304 +-->4305 +-->4306 +-->4307 +-->4308 +-->4309 +-->431 +-->4310 +-->4311 +-->4312 +-->4313 +-->4314 +-->4315 +-->4316 +-->4317 +-->4318 +-->4319 +-->432 +-->4320 +-->4321 +-->4322 +-->4323 +-->4324 +-->4325 +-->4326 +-->4327 +-->4328 +-->4329 +-->433 +-->4330 +-->4331 +-->4332 +-->4333 +-->4334 +-->4335 +-->4336 +-->4337 +-->4338 +-->4339 +-->434 +-->4340 +-->4341 +-->4342 +-->4343 +-->4344 +-->4345 +-->4346 +-->4347 +-->4348 +-->4349 +-->435 +-->4350 +-->4351 +-->4352 +-->4353 +-->4354 +-->4355 +-->4356 +-->4357 +-->4358 +-->4359 +-->436 +-->4360 +-->4361 +-->4362 +-->4363 +-->4364 +-->4365 +-->4366 +-->4367 +-->4368 +-->4369 +-->437 +-->4370 +-->4371 +-->4372 +-->4373 +-->4374 +-->4375 +-->4376 +-->4377 +-->4378 +-->4379 +-->438 +-->4380 +-->4381 +-->4382 +-->4383 +-->4384 +-->4385 +-->4386 +-->4387 +-->4388 +-->4389 +-->439 +-->4390 +-->4391 +-->4392 +-->4393 +-->4394 +-->4395 +-->4396 +-->4397 +-->4398 +-->4399 +-->44 +-->440 +-->4400 +-->4401 +-->4402 +-->4403 +-->4404 +-->4405 +-->4406 +-->4407 +-->4408 +-->4409 +-->441 +-->4410 +-->4411 +-->4412 +-->4413 +-->4414 +-->4415 +-->4416 +-->4417 +-->4418 +-->4419 +-->442 +-->4420 +-->4421 +-->4422 +-->4423 +-->4424 +-->4425 +-->4426 +-->4427 +-->4428 +-->4429 +-->443 +-->4430 +-->4431 +-->4432 +-->4433 +-->4434 +-->4435 +-->4436 +-->4437 +-->4438 +-->4439 +-->444 +-->4440 +-->4441 +-->4442 +-->4443 +-->4444 +-->4445 +-->4446 +-->4447 +-->4448 +-->4449 +-->445 +-->4450 +-->4451 +-->4452 +-->4453 +-->4454 +-->4455 +-->4456 +-->4457 +-->4458 +-->4459 +-->446 +-->4460 +-->4461 +-->4462 +-->4463 +-->4464 +-->4465 +-->4466 +-->4467 +-->4468 +-->4469 +-->447 +-->4470 +-->4471 +-->4472 +-->4473 +-->4474 +-->4475 +-->4476 +-->4477 +-->4478 +-->4479 +-->448 +-->4480 +-->4481 +-->4482 +-->4483 +-->4484 +-->4485 +-->4486 +-->4487 +-->4488 +-->4489 +-->449 +-->4490 +-->4491 +-->4492 +-->4493 +-->4494 +-->4495 +-->4496 +-->4497 +-->4498 +-->4499 +-->45 +-->450 +-->4500 +-->4501 +-->4502 +-->4503 +-->4504 +-->4505 +-->4506 +-->4507 +-->4508 +-->4509 +-->451 +-->4510 +-->4511 +-->4512 +-->4513 +-->4514 +-->4515 +-->4516 +-->4517 +-->4518 +-->4519 +-->452 +-->4520 +-->4521 +-->4522 +-->4523 +-->4524 +-->4525 +-->4526 +-->4527 +-->4528 +-->4529 +-->453 +-->4530 +-->4531 +-->4532 +-->4533 +-->4534 +-->4535 +-->4536 +-->4537 +-->4538 +-->4539 +-->454 +-->4540 +-->4541 +-->4542 +-->4543 +-->4544 +-->4545 +-->4546 +-->4547 +-->4548 +-->4549 +-->455 +-->4550 +-->4551 +-->4552 +-->4553 +-->4554 +-->4555 +-->4556 +-->4557 +-->4558 +-->4559 +-->456 +-->4560 +-->4561 +-->4562 +-->4563 +-->4564 +-->4565 +-->4566 +-->4567 +-->4568 +-->4569 +-->457 +-->4570 +-->4571 +-->4572 +-->4573 +-->4574 +-->4575 +-->4576 +-->4577 +-->4578 +-->4579 +-->458 +-->4580 +-->4581 +-->4582 +-->4583 +-->4584 +-->4585 +-->4586 +-->4587 +-->4588 +-->4589 +-->459 +-->4590 +-->4591 +-->4592 +-->4593 +-->4594 +-->4595 +-->4596 +-->4597 +-->4598 +-->4599 +-->46 +-->460 +-->4600 +-->4601 +-->4602 +-->4603 +-->4604 +-->4605 +-->4606 +-->4607 +-->4608 +-->4609 +-->461 +-->4610 +-->4611 +-->4612 +-->4613 +-->4614 +-->4615 +-->4616 +-->4617 +-->4618 +-->4619 +-->462 +-->4620 +-->4621 +-->4622 +-->4623 +-->4624 +-->4625 +-->4626 +-->4627 +-->4628 +-->4629 +-->463 +-->4630 +-->4631 +-->4632 +-->4633 +-->4634 +-->4635 +-->4636 +-->4637 +-->4638 +-->4639 +-->464 +-->4640 +-->4641 +-->4642 +-->4643 +-->4644 +-->4645 +-->4646 +-->4647 +-->4648 +-->4649 +-->465 +-->4650 +-->4651 +-->4652 +-->4653 +-->4654 +-->4655 +-->4656 +-->4657 +-->4658 +-->4659 +-->466 +-->4660 +-->4661 +-->4662 +-->4663 +-->4664 +-->4665 +-->4666 +-->4667 +-->4668 +-->4669 +-->467 +-->4670 +-->4671 +-->4672 +-->4673 +-->4674 +-->4675 +-->4676 +-->4677 +-->4678 +-->4679 +-->468 +-->4680 +-->4681 +-->4682 +-->4683 +-->4684 +-->4685 +-->4686 +-->4687 +-->4688 +-->4689 +-->469 +-->4690 +-->4691 +-->4692 +-->4693 +-->4694 +-->4695 +-->4696 +-->4697 +-->4698 +-->4699 +-->47 +-->470 +-->4700 +-->4701 +-->4702 +-->4703 +-->4704 +-->4705 +-->4706 +-->4707 +-->4708 +-->4709 +-->471 +-->4710 +-->4711 +-->4712 +-->4713 +-->4714 +-->4715 +-->4716 +-->4717 +-->4718 +-->4719 +-->472 +-->4720 +-->4721 +-->4722 +-->4723 +-->4724 +-->4725 +-->4726 +-->4727 +-->4728 +-->4729 +-->473 +-->4730 +-->4731 +-->4732 +-->4733 +-->4734 +-->4735 +-->4736 +-->4737 +-->4738 +-->4739 +-->474 +-->4740 +-->4741 +-->4742 +-->4743 +-->4744 +-->4745 +-->4746 +-->4747 +-->4748 +-->4749 +-->475 +-->4750 +-->4751 +-->4752 +-->4753 +-->4754 +-->4755 +-->4756 +-->4757 +-->4758 +-->4759 +-->476 +-->4760 +-->4761 +-->4762 +-->4763 +-->4764 +-->4765 +-->4766 +-->4767 +-->4768 +-->4769 +-->477 +-->4770 +-->4771 +-->4772 +-->4773 +-->4774 +-->4775 +-->4776 +-->4777 +-->4778 +-->4779 +-->478 +-->4780 +-->4781 +-->4782 +-->4783 +-->4784 +-->4785 +-->4786 +-->4787 +-->4788 +-->4789 +-->479 +-->4790 +-->4791 +-->4792 +-->4793 +-->4794 +-->4795 +-->4796 +-->4797 +-->4798 +-->4799 +-->48 +-->480 +-->4800 +-->4801 +-->4802 +-->4803 +-->4804 +-->4805 +-->4806 +-->4807 +-->4808 +-->4809 +-->481 +-->4810 +-->4811 +-->4812 +-->4813 +-->4814 +-->4815 +-->4816 +-->4817 +-->4818 +-->4819 +-->482 +-->4820 +-->4821 +-->4822 +-->4823 +-->4824 +-->4825 +-->4826 +-->4827 +-->4828 +-->4829 +-->483 +-->4830 +-->4831 +-->4832 +-->4833 +-->4834 +-->4835 +-->4836 +-->4837 +-->4838 +-->4839 +-->484 +-->4840 +-->4841 +-->4842 +-->4843 +-->4844 +-->4845 +-->4846 +-->4847 +-->4848 +-->4849 +-->485 +-->4850 +-->4851 +-->4852 +-->4853 +-->4854 +-->4855 +-->4856 +-->4857 +-->4858 +-->4859 +-->486 +-->4860 +-->4861 +-->4862 +-->4863 +-->4864 +-->4865 +-->4866 +-->4867 +-->4868 +-->4869 +-->487 +-->4870 +-->4871 +-->4872 +-->4873 +-->4874 +-->4875 +-->4876 +-->4877 +-->4878 +-->4879 +-->488 +-->4880 +-->4881 +-->4882 +-->4883 +-->4884 +-->4885 +-->4886 +-->4887 +-->4888 +-->4889 +-->489 +-->4890 +-->4891 +-->4892 +-->4893 +-->4894 +-->4895 +-->4896 +-->4897 +-->4898 +-->4899 +-->49 +-->490 +-->4900 +-->4901 +-->4902 +-->4903 +-->4904 +-->4905 +-->4906 +-->4907 +-->4908 +-->4909 +-->491 +-->4910 +-->4911 +-->4912 +-->4913 +-->4914 +-->4915 +-->4916 +-->4917 +-->4918 +-->4919 +-->492 +-->4920 +-->4921 +-->4922 +-->4923 +-->4924 +-->4925 +-->4926 +-->4927 +-->4928 +-->4929 +-->493 +-->4930 +-->4931 +-->4932 +-->4933 +-->4934 +-->4935 +-->4936 +-->4937 +-->4938 +-->4939 +-->494 +-->4940 +-->4941 +-->4942 +-->4943 +-->4944 +-->4945 +-->4946 +-->4947 +-->4948 +-->4949 +-->495 +-->4950 +-->4951 +-->4952 +-->4953 +-->4954 +-->4955 +-->4956 +-->4957 +-->4958 +-->4959 +-->496 +-->4960 +-->4961 +-->4962 +-->4963 +-->4964 +-->4965 +-->4966 +-->4967 +-->4968 +-->4969 +-->497 +-->4970 +-->4971 +-->4972 +-->4973 +-->4974 +-->4975 +-->4976 +-->4977 +-->4978 +-->4979 +-->498 +-->4980 +-->4981 +-->4982 +-->4983 +-->4984 +-->4985 +-->4986 +-->4987 +-->4988 +-->4989 +-->499 +-->4990 +-->4991 +-->4992 +-->4993 +-->4994 +-->4995 +-->4996 +-->4997 +-->4998 +-->4999 +-->5 +-->50 +-->500 +-->5000 +-->5001 +-->5002 +-->5003 +-->5004 +-->5005 +-->5006 +-->5007 +-->5008 +-->5009 +-->501 +-->5010 +-->5011 +-->5012 +-->5013 +-->5014 +-->5015 +-->5016 +-->5017 +-->5018 +-->5019 +-->502 +-->5020 +-->5021 +-->5022 +-->5023 +-->5024 +-->5025 +-->5026 +-->5027 +-->5028 +-->5029 +-->503 +-->5030 +-->5031 +-->5032 +-->5033 +-->5034 +-->5035 +-->5036 +-->5037 +-->5038 +-->5039 +-->504 +-->5040 +-->5041 +-->5042 +-->5043 +-->5044 +-->5045 +-->5046 +-->5047 +-->5048 +-->5049 +-->505 +-->5050 +-->5051 +-->5052 +-->5053 +-->5054 +-->5055 +-->5056 +-->5057 +-->5058 +-->5059 +-->506 +-->5060 +-->5061 +-->5062 +-->5063 +-->5064 +-->5065 +-->5066 +-->5067 +-->5068 +-->5069 +-->507 +-->5070 +-->5071 +-->5072 +-->5073 +-->5074 +-->5075 +-->5076 +-->5077 +-->5078 +-->5079 +-->508 +-->5080 +-->5081 +-->5082 +-->5083 +-->5084 +-->5085 +-->5086 +-->5087 +-->5088 +-->5089 +-->509 +-->5090 +-->5091 +-->5092 +-->5093 +-->5094 +-->5095 +-->5096 +-->5097 +-->5098 +-->5099 +-->51 +-->510 +-->5100 +-->5101 +-->5102 +-->5103 +-->5104 +-->5105 +-->5106 +-->5107 +-->5108 +-->5109 +-->511 +-->5110 +-->5111 +-->5112 +-->5113 +-->5114 +-->5115 +-->5116 +-->5117 +-->5118 +-->5119 +-->512 +-->5120 +-->5121 +-->5122 +-->5123 +-->5124 +-->5125 +-->5126 +-->5127 +-->5128 +-->5129 +-->513 +-->5130 +-->5131 +-->5132 +-->5133 +-->5134 +-->5135 +-->5136 +-->5137 +-->5138 +-->5139 +-->514 +-->5140 +-->5141 +-->5142 +-->5143 +-->5144 +-->5145 +-->5146 +-->5147 +-->5148 +-->5149 +-->515 +-->5150 +-->5151 +-->5152 +-->5153 +-->5154 +-->5155 +-->5156 +-->5157 +-->5158 +-->5159 +-->516 +-->5160 +-->5161 +-->5162 +-->5163 +-->5164 +-->5165 +-->5166 +-->5167 +-->5168 +-->5169 +-->517 +-->5170 +-->5171 +-->5172 +-->5173 +-->5174 +-->5175 +-->5176 +-->5177 +-->5178 +-->5179 +-->518 +-->5180 +-->5181 +-->5182 +-->5183 +-->5184 +-->5185 +-->5186 +-->5187 +-->5188 +-->5189 +-->519 +-->5190 +-->5191 +-->5192 +-->5193 +-->5194 +-->5195 +-->5196 +-->5197 +-->5198 +-->5199 +-->52 +-->520 +-->5200 +-->5201 +-->5202 +-->5203 +-->5204 +-->5205 +-->5206 +-->5207 +-->5208 +-->5209 +-->521 +-->5210 +-->5211 +-->5212 +-->5213 +-->5214 +-->5215 +-->5216 +-->5217 +-->5218 +-->5219 +-->522 +-->5220 +-->5221 +-->5222 +-->5223 +-->5224 +-->5225 +-->5226 +-->5227 +-->5228 +-->5229 +-->523 +-->5230 +-->5231 +-->5232 +-->5233 +-->5234 +-->5235 +-->5236 +-->5237 +-->5238 +-->5239 +-->524 +-->5240 +-->5241 +-->5242 +-->5243 +-->5244 +-->5245 +-->5246 +-->5247 +-->5248 +-->5249 +-->525 +-->5250 +-->5251 +-->5252 +-->5253 +-->5254 +-->5255 +-->5256 +-->5257 +-->5258 +-->5259 +-->526 +-->5260 +-->5261 +-->5262 +-->5263 +-->5264 +-->5265 +-->5266 +-->5267 +-->5268 +-->5269 +-->527 +-->5270 +-->5271 +-->5272 +-->5273 +-->5274 +-->5275 +-->5276 +-->5277 +-->5278 +-->5279 +-->528 +-->5280 +-->5281 +-->5282 +-->5283 +-->5284 +-->5285 +-->5286 +-->5287 +-->5288 +-->5289 +-->529 +-->5290 +-->5291 +-->5292 +-->5293 +-->5294 +-->5295 +-->5296 +-->5297 +-->5298 +-->5299 +-->53 +-->530 +-->5300 +-->5301 +-->5302 +-->5303 +-->5304 +-->5305 +-->5306 +-->5307 +-->5308 +-->5309 +-->531 +-->5310 +-->5311 +-->5312 +-->5313 +-->5314 +-->5315 +-->5316 +-->5317 +-->5318 +-->5319 +-->532 +-->5320 +-->5321 +-->5322 +-->5323 +-->5324 +-->5325 +-->5326 +-->5327 +-->5328 +-->5329 +-->533 +-->5330 +-->5331 +-->5332 +-->5333 +-->5334 +-->5335 +-->5336 +-->5337 +-->5338 +-->5339 +-->534 +-->5340 +-->5341 +-->5342 +-->5343 +-->5344 +-->5345 +-->5346 +-->5347 +-->5348 +-->5349 +-->535 +-->5350 +-->5351 +-->5352 +-->5353 +-->5354 +-->5355 +-->5356 +-->5357 +-->5358 +-->5359 +-->536 +-->5360 +-->5361 +-->5362 +-->5363 +-->5364 +-->5365 +-->5366 +-->5367 +-->5368 +-->5369 +-->537 +-->5370 +-->5371 +-->5372 +-->5373 +-->5374 +-->5375 +-->5376 +-->5377 +-->5378 +-->5379 +-->538 +-->5380 +-->5381 +-->5382 +-->5383 +-->5384 +-->5385 +-->5386 +-->5387 +-->5388 +-->5389 +-->539 +-->5390 +-->5391 +-->5392 +-->5393 +-->5394 +-->5395 +-->5396 +-->5397 +-->5398 +-->5399 +-->54 +-->540 +-->5400 +-->5401 +-->5402 +-->5403 +-->5404 +-->5405 +-->5406 +-->5407 +-->5408 +-->5409 +-->541 +-->5410 +-->5411 +-->5412 +-->5413 +-->5414 +-->5415 +-->5416 +-->5417 +-->5418 +-->5419 +-->542 +-->5420 +-->5421 +-->5422 +-->5423 +-->5424 +-->5425 +-->5426 +-->5427 +-->5428 +-->5429 +-->543 +-->5430 +-->5431 +-->5432 +-->5433 +-->5434 +-->5435 +-->5436 +-->5437 +-->5438 +-->5439 +-->544 +-->5440 +-->5441 +-->5442 +-->5443 +-->5444 +-->5445 +-->5446 +-->5447 +-->5448 +-->5449 +-->545 +-->5450 +-->5451 +-->5452 +-->5453 +-->5454 +-->5455 +-->5456 +-->5457 +-->5458 +-->5459 +-->546 +-->5460 +-->5461 +-->5462 +-->5463 +-->5464 +-->5465 +-->5466 +-->5467 +-->5468 +-->5469 +-->547 +-->5470 +-->5471 +-->5472 +-->5473 +-->5474 +-->5475 +-->5476 +-->5477 +-->5478 +-->5479 +-->548 +-->5480 +-->5481 +-->5482 +-->5483 +-->5484 +-->5485 +-->5486 +-->5487 +-->5488 +-->5489 +-->549 +-->5490 +-->5491 +-->5492 +-->5493 +-->5494 +-->5495 +-->5496 +-->5497 +-->5498 +-->5499 +-->55 +-->550 +-->5500 +-->5501 +-->5502 +-->5503 +-->5504 +-->5505 +-->5506 +-->5507 +-->5508 +-->5509 +-->551 +-->5510 +-->5511 +-->5512 +-->5513 +-->5514 +-->5515 +-->5516 +-->5517 +-->5518 +-->5519 +-->552 +-->5520 +-->5521 +-->5522 +-->5523 +-->5524 +-->5525 +-->5526 +-->5527 +-->5528 +-->5529 +-->553 +-->5530 +-->5531 +-->5532 +-->5533 +-->5534 +-->5535 +-->5536 +-->5537 +-->5538 +-->5539 +-->554 +-->5540 +-->5541 +-->5542 +-->5543 +-->5544 +-->5545 +-->5546 +-->5547 +-->5548 +-->5549 +-->555 +-->5550 +-->5551 +-->5552 +-->5553 +-->5554 +-->5555 +-->5556 +-->5557 +-->5558 +-->5559 +-->556 +-->5560 +-->5561 +-->5562 +-->5563 +-->5564 +-->5565 +-->5566 +-->5567 +-->5568 +-->5569 +-->557 +-->5570 +-->5571 +-->5572 +-->5573 +-->5574 +-->5575 +-->5576 +-->5577 +-->5578 +-->5579 +-->558 +-->5580 +-->5581 +-->5582 +-->5583 +-->5584 +-->5585 +-->5586 +-->5587 +-->5588 +-->5589 +-->559 +-->5590 +-->5591 +-->5592 +-->5593 +-->5594 +-->5595 +-->5596 +-->5597 +-->5598 +-->5599 +-->56 +-->560 +-->5600 +-->5601 +-->5602 +-->5603 +-->5604 +-->5605 +-->5606 +-->5607 +-->5608 +-->5609 +-->561 +-->5610 +-->5611 +-->5612 +-->5613 +-->5614 +-->5615 +-->5616 +-->5617 +-->5618 +-->5619 +-->562 +-->5620 +-->5621 +-->5622 +-->5623 +-->5624 +-->5625 +-->5626 +-->5627 +-->5628 +-->5629 +-->563 +-->5630 +-->5631 +-->5632 +-->5633 +-->5634 +-->5635 +-->5636 +-->5637 +-->5638 +-->5639 +-->564 +-->5640 +-->5641 +-->5642 +-->5643 +-->5644 +-->5645 +-->5646 +-->5647 +-->5648 +-->5649 +-->565 +-->5650 +-->5651 +-->5652 +-->5653 +-->5654 +-->5655 +-->5656 +-->5657 +-->5658 +-->5659 +-->566 +-->5660 +-->5661 +-->5662 +-->5663 +-->5664 +-->5665 +-->5666 +-->5667 +-->5668 +-->5669 +-->567 +-->5670 +-->5671 +-->5672 +-->5673 +-->5674 +-->5675 +-->5676 +-->5677 +-->5678 +-->5679 +-->568 +-->5680 +-->5681 +-->5682 +-->5683 +-->5684 +-->5685 +-->5686 +-->5687 +-->5688 +-->5689 +-->569 +-->5690 +-->5691 +-->5692 +-->5693 +-->5694 +-->5695 +-->5696 +-->5697 +-->5698 +-->5699 +-->57 +-->570 +-->5700 +-->5701 +-->5702 +-->5703 +-->5704 +-->5705 +-->5706 +-->5707 +-->5708 +-->5709 +-->571 +-->5710 +-->5711 +-->5712 +-->5713 +-->5714 +-->5715 +-->5716 +-->5717 +-->5718 +-->5719 +-->572 +-->5720 +-->5721 +-->5722 +-->5723 +-->5724 +-->5725 +-->5726 +-->5727 +-->5728 +-->5729 +-->573 +-->5730 +-->5731 +-->5732 +-->5733 +-->5734 +-->5735 +-->5736 +-->5737 +-->5738 +-->5739 +-->574 +-->5740 +-->5741 +-->5742 +-->5743 +-->5744 +-->5745 +-->5746 +-->5747 +-->5748 +-->5749 +-->575 +-->5750 +-->5751 +-->5752 +-->5753 +-->5754 +-->5755 +-->5756 +-->5757 +-->5758 +-->5759 +-->576 +-->5760 +-->5761 +-->5762 +-->5763 +-->5764 +-->5765 +-->5766 +-->5767 +-->5768 +-->5769 +-->577 +-->5770 +-->5771 +-->5772 +-->5773 +-->5774 +-->5775 +-->5776 +-->5777 +-->5778 +-->5779 +-->578 +-->5780 +-->5781 +-->5782 +-->5783 +-->5784 +-->5785 +-->5786 +-->5787 +-->5788 +-->5789 +-->579 +-->5790 +-->5791 +-->5792 +-->5793 +-->5794 +-->5795 +-->5796 +-->5797 +-->5798 +-->5799 +-->58 +-->580 +-->5800 +-->5801 +-->5802 +-->5803 +-->5804 +-->5805 +-->5806 +-->5807 +-->5808 +-->5809 +-->581 +-->5810 +-->5811 +-->5812 +-->5813 +-->5814 +-->5815 +-->5816 +-->5817 +-->5818 +-->5819 +-->582 +-->5820 +-->5821 +-->5822 +-->5823 +-->5824 +-->5825 +-->5826 +-->5827 +-->5828 +-->5829 +-->583 +-->5830 +-->5831 +-->5832 +-->5833 +-->5834 +-->5835 +-->5836 +-->5837 +-->5838 +-->5839 +-->584 +-->5840 +-->5841 +-->5842 +-->5843 +-->5844 +-->5845 +-->5846 +-->5847 +-->5848 +-->5849 +-->585 +-->5850 +-->5851 +-->5852 +-->5853 +-->5854 +-->5855 +-->5856 +-->5857 +-->5858 +-->5859 +-->586 +-->5860 +-->5861 +-->5862 +-->5863 +-->5864 +-->5865 +-->5866 +-->5867 +-->5868 +-->5869 +-->587 +-->5870 +-->5871 +-->5872 +-->5873 +-->5874 +-->5875 +-->5876 +-->5877 +-->5878 +-->5879 +-->588 +-->5880 +-->5881 +-->5882 +-->5883 +-->5884 +-->5885 +-->5886 +-->5887 +-->5888 +-->5889 +-->589 +-->5890 +-->5891 +-->5892 +-->5893 +-->5894 +-->5895 +-->5896 +-->5897 +-->5898 +-->5899 +-->59 +-->590 +-->5900 +-->5901 +-->5902 +-->5903 +-->5904 +-->5905 +-->5906 +-->5907 +-->5908 +-->5909 +-->591 +-->5910 +-->5911 +-->5912 +-->5913 +-->5914 +-->5915 +-->5916 +-->5917 +-->5918 +-->5919 +-->592 +-->5920 +-->5921 +-->5922 +-->5923 +-->5924 +-->5925 +-->5926 +-->5927 +-->5928 +-->5929 +-->593 +-->5930 +-->5931 +-->5932 +-->5933 +-->5934 +-->5935 +-->5936 +-->5937 +-->5938 +-->5939 +-->594 +-->5940 +-->5941 +-->5942 +-->5943 +-->5944 +-->5945 +-->5946 +-->5947 +-->5948 +-->5949 +-->595 +-->5950 +-->5951 +-->5952 +-->5953 +-->5954 +-->5955 +-->5956 +-->5957 +-->5958 +-->5959 +-->596 +-->5960 +-->5961 +-->5962 +-->5963 +-->5964 +-->5965 +-->5966 +-->5967 +-->5968 +-->5969 +-->597 +-->5970 +-->5971 +-->5972 +-->5973 +-->5974 +-->5975 +-->5976 +-->5977 +-->5978 +-->5979 +-->598 +-->5980 +-->5981 +-->5982 +-->5983 +-->5984 +-->5985 +-->5986 +-->5987 +-->5988 +-->5989 +-->599 +-->5990 +-->5991 +-->5992 +-->5993 +-->5994 +-->5995 +-->5996 +-->5997 +-->5998 +-->5999 +-->6 +-->60 +-->600 +-->6000 +-->6001 +-->6002 +-->6003 +-->6004 +-->6005 +-->6006 +-->6007 +-->6008 +-->6009 +-->601 +-->6010 +-->6011 +-->6012 +-->6013 +-->6014 +-->6015 +-->6016 +-->6017 +-->6018 +-->6019 +-->602 +-->6020 +-->6021 +-->6022 +-->6023 +-->6024 +-->6025 +-->6026 +-->6027 +-->6028 +-->6029 +-->603 +-->6030 +-->6031 +-->6032 +-->6033 +-->6034 +-->6035 +-->6036 +-->6037 +-->6038 +-->6039 +-->604 +-->6040 +-->6041 +-->6042 +-->6043 +-->6044 +-->6045 +-->6046 +-->6047 +-->6048 +-->6049 +-->605 +-->6050 +-->6051 +-->6052 +-->6053 +-->6054 +-->6055 +-->6056 +-->6057 +-->6058 +-->6059 +-->606 +-->6060 +-->6061 +-->6062 +-->6063 +-->6064 +-->6065 +-->6066 +-->6067 +-->6068 +-->6069 +-->607 +-->6070 +-->6071 +-->6072 +-->6073 +-->6074 +-->6075 +-->6076 +-->6077 +-->6078 +-->6079 +-->608 +-->6080 +-->6081 +-->6082 +-->6083 +-->6084 +-->6085 +-->6086 +-->6087 +-->6088 +-->6089 +-->609 +-->6090 +-->6091 +-->6092 +-->6093 +-->6094 +-->6095 +-->6096 +-->6097 +-->6098 +-->6099 +-->61 +-->610 +-->6100 +-->6101 +-->6102 +-->6103 +-->6104 +-->6105 +-->6106 +-->6107 +-->6108 +-->6109 +-->611 +-->6110 +-->6111 +-->6112 +-->6113 +-->6114 +-->6115 +-->6116 +-->6117 +-->6118 +-->6119 +-->612 +-->6120 +-->6121 +-->6122 +-->6123 +-->6124 +-->6125 +-->6126 +-->6127 +-->6128 +-->6129 +-->613 +-->6130 +-->6131 +-->6132 +-->6133 +-->6134 +-->6135 +-->6136 +-->6137 +-->6138 +-->6139 +-->614 +-->6140 +-->6141 +-->6142 +-->6143 +-->6144 +-->6145 +-->6146 +-->6147 +-->6148 +-->6149 +-->615 +-->6150 +-->6151 +-->6152 +-->6153 +-->6154 +-->6155 +-->6156 +-->6157 +-->6158 +-->6159 +-->616 +-->6160 +-->6161 +-->6162 +-->6163 +-->6164 +-->6165 +-->6166 +-->6167 +-->6168 +-->6169 +-->617 +-->6170 +-->6171 +-->6172 +-->6173 +-->6174 +-->6175 +-->6176 +-->6177 +-->6178 +-->6179 +-->618 +-->6180 +-->6181 +-->6182 +-->6183 +-->6184 +-->6185 +-->6186 +-->6187 +-->6188 +-->6189 +-->619 +-->6190 +-->6191 +-->6192 +-->6193 +-->6194 +-->6195 +-->6196 +-->6197 +-->6198 +-->6199 +-->62 +-->620 +-->6200 +-->6201 +-->6202 +-->6203 +-->6204 +-->6205 +-->6206 +-->6207 +-->6208 +-->6209 +-->621 +-->6210 +-->6211 +-->6212 +-->6213 +-->6214 +-->6215 +-->6216 +-->6217 +-->6218 +-->6219 +-->622 +-->6220 +-->6221 +-->6222 +-->6223 +-->6224 +-->6225 +-->6226 +-->6227 +-->6228 +-->6229 +-->623 +-->6230 +-->6231 +-->6232 +-->6233 +-->6234 +-->6235 +-->6236 +-->6237 +-->6238 +-->6239 +-->624 +-->6240 +-->6241 +-->6242 +-->6243 +-->6244 +-->6245 +-->6246 +-->6247 +-->6248 +-->6249 +-->625 +-->6250 +-->6251 +-->6252 +-->6253 +-->6254 +-->6255 +-->6256 +-->6257 +-->6258 +-->6259 +-->626 +-->6260 +-->6261 +-->6262 +-->6263 +-->6264 +-->6265 +-->6266 +-->6267 +-->6268 +-->6269 +-->627 +-->6270 +-->6271 +-->6272 +-->6273 +-->6274 +-->6275 +-->6276 +-->6277 +-->6278 +-->6279 +-->628 +-->6280 +-->6281 +-->6282 +-->6283 +-->6284 +-->6285 +-->6286 +-->6287 +-->6288 +-->6289 +-->629 +-->6290 +-->6291 +-->6292 +-->6293 +-->6294 +-->6295 +-->6296 +-->6297 +-->6298 +-->6299 +-->63 +-->630 +-->6300 +-->6301 +-->6302 +-->6303 +-->6304 +-->6305 +-->6306 +-->6307 +-->6308 +-->6309 +-->631 +-->6310 +-->6311 +-->6312 +-->6313 +-->6314 +-->6315 +-->6316 +-->6317 +-->6318 +-->6319 +-->632 +-->6320 +-->6321 +-->6322 +-->6323 +-->6324 +-->6325 +-->6326 +-->6327 +-->6328 +-->6329 +-->633 +-->6330 +-->6331 +-->6332 +-->6333 +-->6334 +-->6335 +-->6336 +-->6337 +-->6338 +-->6339 +-->634 +-->6340 +-->6341 +-->6342 +-->6343 +-->6344 +-->6345 +-->6346 +-->6347 +-->6348 +-->6349 +-->635 +-->6350 +-->6351 +-->6352 +-->6353 +-->6354 +-->6355 +-->6356 +-->6357 +-->6358 +-->6359 +-->636 +-->6360 +-->6361 +-->6362 +-->6363 +-->6364 +-->6365 +-->6366 +-->6367 +-->6368 +-->6369 +-->637 +-->6370 +-->6371 +-->6372 +-->6373 +-->6374 +-->6375 +-->6376 +-->6377 +-->6378 +-->6379 +-->638 +-->6380 +-->6381 +-->6382 +-->6383 +-->6384 +-->6385 +-->6386 +-->6387 +-->6388 +-->6389 +-->639 +-->6390 +-->6391 +-->6392 +-->6393 +-->6394 +-->6395 +-->6396 +-->6397 +-->6398 +-->6399 +-->64 +-->640 +-->6400 +-->6401 +-->6402 +-->6403 +-->6404 +-->6405 +-->6406 +-->6407 +-->6408 +-->6409 +-->641 +-->6410 +-->6411 +-->6412 +-->6413 +-->6414 +-->6415 +-->6416 +-->6417 +-->6418 +-->6419 +-->642 +-->6420 +-->6421 +-->6422 +-->6423 +-->6424 +-->6425 +-->6426 +-->6427 +-->6428 +-->6429 +-->643 +-->6430 +-->6431 +-->6432 +-->6433 +-->6434 +-->6435 +-->6436 +-->6437 +-->6438 +-->6439 +-->644 +-->6440 +-->6441 +-->6442 +-->6443 +-->6444 +-->6445 +-->6446 +-->6447 +-->6448 +-->6449 +-->645 +-->6450 +-->6451 +-->6452 +-->6453 +-->6454 +-->6455 +-->6456 +-->6457 +-->6458 +-->6459 +-->646 +-->6460 +-->6461 +-->6462 +-->6463 +-->6464 +-->6465 +-->6466 +-->6467 +-->6468 +-->6469 +-->647 +-->6470 +-->6471 +-->6472 +-->6473 +-->6474 +-->6475 +-->6476 +-->6477 +-->6478 +-->6479 +-->648 +-->6480 +-->6481 +-->6482 +-->6483 +-->6484 +-->6485 +-->6486 +-->6487 +-->6488 +-->6489 +-->649 +-->6490 +-->6491 +-->6492 +-->6493 +-->6494 +-->6495 +-->6496 +-->6497 +-->6498 +-->6499 +-->65 +-->650 +-->6500 +-->6501 +-->6502 +-->6503 +-->6504 +-->6505 +-->6506 +-->6507 +-->6508 +-->6509 +-->651 +-->6510 +-->6511 +-->6512 +-->6513 +-->6514 +-->6515 +-->6516 +-->6517 +-->6518 +-->6519 +-->652 +-->6520 +-->6521 +-->6522 +-->6523 +-->6524 +-->6525 +-->6526 +-->6527 +-->6528 +-->6529 +-->653 +-->6530 +-->6531 +-->6532 +-->6533 +-->6534 +-->6535 +-->6536 +-->6537 +-->6538 +-->6539 +-->654 +-->6540 +-->6541 +-->6542 +-->6543 +-->6544 +-->6545 +-->6546 +-->6547 +-->6548 +-->6549 +-->655 +-->6550 +-->6551 +-->6552 +-->6553 +-->6554 +-->6555 +-->6556 +-->6557 +-->6558 +-->6559 +-->656 +-->6560 +-->6561 +-->6562 +-->6563 +-->6564 +-->6565 +-->6566 +-->6567 +-->6568 +-->6569 +-->657 +-->6570 +-->6571 +-->6572 +-->6573 +-->6574 +-->6575 +-->6576 +-->6577 +-->6578 +-->6579 +-->658 +-->6580 +-->6581 +-->6582 +-->6583 +-->6584 +-->6585 +-->6586 +-->6587 +-->6588 +-->6589 +-->659 +-->6590 +-->6591 +-->6592 +-->6593 +-->6594 +-->6595 +-->6596 +-->6597 +-->6598 +-->6599 +-->66 +-->660 +-->6600 +-->6601 +-->6602 +-->6603 +-->6604 +-->6605 +-->6606 +-->6607 +-->6608 +-->6609 +-->661 +-->6610 +-->6611 +-->6612 +-->6613 +-->6614 +-->6615 +-->6616 +-->6617 +-->6618 +-->6619 +-->662 +-->6620 +-->6621 +-->6622 +-->6623 +-->6624 +-->6625 +-->6626 +-->6627 +-->6628 +-->6629 +-->663 +-->6630 +-->6631 +-->6632 +-->6633 +-->6634 +-->6635 +-->6636 +-->6637 +-->6638 +-->6639 +-->664 +-->6640 +-->6641 +-->6642 +-->6643 +-->6644 +-->6645 +-->6646 +-->6647 +-->6648 +-->6649 +-->665 +-->6650 +-->6651 +-->6652 +-->6653 +-->6654 +-->6655 +-->6656 +-->6657 +-->6658 +-->6659 +-->666 +-->6660 +-->6661 +-->6662 +-->6663 +-->6664 +-->6665 +-->6666 +-->6667 +-->6668 +-->6669 +-->667 +-->6670 +-->6671 +-->6672 +-->6673 +-->6674 +-->6675 +-->6676 +-->6677 +-->6678 +-->6679 +-->668 +-->6680 +-->6681 +-->6682 +-->6683 +-->6684 +-->6685 +-->6686 +-->6687 +-->6688 +-->6689 +-->669 +-->6690 +-->6691 +-->6692 +-->6693 +-->6694 +-->6695 +-->6696 +-->6697 +-->6698 +-->6699 +-->67 +-->670 +-->6700 +-->6701 +-->6702 +-->6703 +-->6704 +-->6705 +-->6706 +-->6707 +-->6708 +-->6709 +-->671 +-->6710 +-->6711 +-->6712 +-->6713 +-->6714 +-->6715 +-->6716 +-->6717 +-->6718 +-->6719 +-->672 +-->6720 +-->6721 +-->6722 +-->6723 +-->6724 +-->6725 +-->6726 +-->6727 +-->6728 +-->6729 +-->673 +-->6730 +-->6731 +-->6732 +-->6733 +-->6734 +-->6735 +-->6736 +-->6737 +-->6738 +-->6739 +-->674 +-->6740 +-->6741 +-->6742 +-->6743 +-->6744 +-->6745 +-->6746 +-->6747 +-->6748 +-->6749 +-->675 +-->6750 +-->6751 +-->6752 +-->6753 +-->6754 +-->6755 +-->6756 +-->6757 +-->6758 +-->6759 +-->676 +-->6760 +-->6761 +-->6762 +-->6763 +-->6764 +-->6765 +-->6766 +-->6767 +-->6768 +-->6769 +-->677 +-->6770 +-->6771 +-->6772 +-->6773 +-->6774 +-->6775 +-->6776 +-->6777 +-->6778 +-->6779 +-->678 +-->6780 +-->6781 +-->6782 +-->6783 +-->6784 +-->6785 +-->6786 +-->6787 +-->6788 +-->6789 +-->679 +-->6790 +-->6791 +-->6792 +-->6793 +-->6794 +-->6795 +-->6796 +-->6797 +-->6798 +-->6799 +-->68 +-->680 +-->6800 +-->6801 +-->6802 +-->6803 +-->6804 +-->6805 +-->6806 +-->6807 +-->6808 +-->6809 +-->681 +-->6810 +-->6811 +-->6812 +-->6813 +-->6814 +-->6815 +-->6816 +-->6817 +-->6818 +-->6819 +-->682 +-->6820 +-->6821 +-->6822 +-->6823 +-->6824 +-->6825 +-->6826 +-->6827 +-->6828 +-->6829 +-->683 +-->6830 +-->6831 +-->6832 +-->6833 +-->6834 +-->6835 +-->6836 +-->6837 +-->6838 +-->6839 +-->684 +-->6840 +-->6841 +-->6842 +-->6843 +-->6844 +-->6845 +-->6846 +-->6847 +-->6848 +-->6849 +-->685 +-->6850 +-->6851 +-->6852 +-->6853 +-->6854 +-->6855 +-->6856 +-->6857 +-->6858 +-->6859 +-->686 +-->6860 +-->6861 +-->6862 +-->6863 +-->6864 +-->6865 +-->6866 +-->6867 +-->6868 +-->6869 +-->687 +-->6870 +-->6871 +-->6872 +-->6873 +-->6874 +-->6875 +-->6876 +-->6877 +-->6878 +-->6879 +-->688 +-->6880 +-->6881 +-->6882 +-->6883 +-->6884 +-->6885 +-->6886 +-->6887 +-->6888 +-->6889 +-->689 +-->6890 +-->6891 +-->6892 +-->6893 +-->6894 +-->6895 +-->6896 +-->6897 +-->6898 +-->6899 +-->69 +-->690 +-->6900 +-->6901 +-->6902 +-->6903 +-->6904 +-->6905 +-->6906 +-->6907 +-->6908 +-->6909 +-->691 +-->6910 +-->6911 +-->6912 +-->6913 +-->6914 +-->6915 +-->6916 +-->6917 +-->6918 +-->6919 +-->692 +-->6920 +-->6921 +-->6922 +-->6923 +-->6924 +-->6925 +-->6926 +-->6927 +-->6928 +-->6929 +-->693 +-->6930 +-->6931 +-->6932 +-->6933 +-->6934 +-->6935 +-->6936 +-->6937 +-->6938 +-->6939 +-->694 +-->6940 +-->6941 +-->6942 +-->6943 +-->6944 +-->6945 +-->6946 +-->6947 +-->6948 +-->6949 +-->695 +-->6950 +-->6951 +-->6952 +-->6953 +-->6954 +-->6955 +-->6956 +-->6957 +-->6958 +-->6959 +-->696 +-->6960 +-->6961 +-->6962 +-->6963 +-->6964 +-->6965 +-->6966 +-->6967 +-->6968 +-->6969 +-->697 +-->6970 +-->6971 +-->6972 +-->6973 +-->6974 +-->6975 +-->6976 +-->6977 +-->6978 +-->6979 +-->698 +-->6980 +-->6981 +-->6982 +-->6983 +-->6984 +-->6985 +-->6986 +-->6987 +-->6988 +-->6989 +-->699 +-->6990 +-->6991 +-->6992 +-->6993 +-->6994 +-->6995 +-->6996 +-->6997 +-->6998 +-->6999 +-->7 +-->70 +-->700 +-->7000 +-->7001 +-->7002 +-->7003 +-->7004 +-->7005 +-->7006 +-->7007 +-->7008 +-->7009 +-->701 +-->7010 +-->7011 +-->7012 +-->7013 +-->7014 +-->7015 +-->7016 +-->7017 +-->7018 +-->7019 +-->702 +-->7020 +-->7021 +-->7022 +-->7023 +-->7024 +-->7025 +-->7026 +-->7027 +-->7028 +-->7029 +-->703 +-->7030 +-->7031 +-->7032 +-->7033 +-->7034 +-->7035 +-->7036 +-->7037 +-->7038 +-->7039 +-->704 +-->7040 +-->7041 +-->7042 +-->7043 +-->7044 +-->7045 +-->7046 +-->7047 +-->7048 +-->7049 +-->705 +-->7050 +-->7051 +-->7052 +-->7053 +-->7054 +-->7055 +-->7056 +-->7057 +-->7058 +-->7059 +-->706 +-->7060 +-->7061 +-->7062 +-->7063 +-->7064 +-->7065 +-->7066 +-->7067 +-->7068 +-->7069 +-->707 +-->7070 +-->7071 +-->7072 +-->7073 +-->7074 +-->7075 +-->7076 +-->7077 +-->7078 +-->7079 +-->708 +-->7080 +-->7081 +-->7082 +-->7083 +-->7084 +-->7085 +-->7086 +-->7087 +-->7088 +-->7089 +-->709 +-->7090 +-->7091 +-->7092 +-->7093 +-->7094 +-->7095 +-->7096 +-->7097 +-->7098 +-->7099 +-->71 +-->710 +-->7100 +-->7101 +-->7102 +-->7103 +-->7104 +-->7105 +-->7106 +-->7107 +-->7108 +-->7109 +-->711 +-->7110 +-->7111 +-->7112 +-->7113 +-->7114 +-->7115 +-->7116 +-->7117 +-->7118 +-->7119 +-->712 +-->7120 +-->7121 +-->7122 +-->7123 +-->7124 +-->7125 +-->7126 +-->7127 +-->7128 +-->7129 +-->713 +-->7130 +-->7131 +-->7132 +-->7133 +-->7134 +-->7135 +-->7136 +-->7137 +-->7138 +-->7139 +-->714 +-->7140 +-->7141 +-->7142 +-->7143 +-->7144 +-->7145 +-->7146 +-->7147 +-->7148 +-->7149 +-->715 +-->7150 +-->7151 +-->7152 +-->7153 +-->7154 +-->7155 +-->7156 +-->7157 +-->7158 +-->7159 +-->716 +-->7160 +-->7161 +-->7162 +-->7163 +-->7164 +-->7165 +-->7166 +-->7167 +-->7168 +-->7169 +-->717 +-->7170 +-->7171 +-->7172 +-->7173 +-->7174 +-->7175 +-->7176 +-->7177 +-->7178 +-->7179 +-->718 +-->7180 +-->7181 +-->7182 +-->7183 +-->7184 +-->7185 +-->7186 +-->7187 +-->7188 +-->7189 +-->719 +-->7190 +-->7191 +-->7192 +-->7193 +-->7194 +-->7195 +-->7196 +-->7197 +-->7198 +-->7199 +-->72 +-->720 +-->7200 +-->7201 +-->7202 +-->7203 +-->7204 +-->7205 +-->7206 +-->7207 +-->7208 +-->7209 +-->721 +-->7210 +-->7211 +-->7212 +-->7213 +-->7214 +-->7215 +-->7216 +-->7217 +-->7218 +-->7219 +-->722 +-->7220 +-->7221 +-->7222 +-->7223 +-->7224 +-->7225 +-->7226 +-->7227 +-->7228 +-->7229 +-->723 +-->7230 +-->7231 +-->7232 +-->7233 +-->7234 +-->7235 +-->7236 +-->7237 +-->7238 +-->7239 +-->724 +-->7240 +-->7241 +-->7242 +-->7243 +-->7244 +-->7245 +-->7246 +-->7247 +-->7248 +-->7249 +-->725 +-->7250 +-->7251 +-->7252 +-->7253 +-->7254 +-->7255 +-->7256 +-->7257 +-->7258 +-->7259 +-->726 +-->7260 +-->7261 +-->7262 +-->7263 +-->7264 +-->7265 +-->7266 +-->7267 +-->7268 +-->7269 +-->727 +-->7270 +-->7271 +-->7272 +-->7273 +-->7274 +-->7275 +-->7276 +-->7277 +-->7278 +-->7279 +-->728 +-->7280 +-->7281 +-->7282 +-->7283 +-->7284 +-->7285 +-->7286 +-->7287 +-->7288 +-->7289 +-->729 +-->7290 +-->7291 +-->7292 +-->7293 +-->7294 +-->7295 +-->7296 +-->7297 +-->7298 +-->7299 +-->73 +-->730 +-->7300 +-->7301 +-->7302 +-->7303 +-->7304 +-->7305 +-->7306 +-->7307 +-->7308 +-->7309 +-->731 +-->7310 +-->7311 +-->7312 +-->7313 +-->7314 +-->7315 +-->7316 +-->7317 +-->7318 +-->7319 +-->732 +-->7320 +-->7321 +-->7322 +-->7323 +-->7324 +-->7325 +-->7326 +-->7327 +-->7328 +-->7329 +-->733 +-->7330 +-->7331 +-->7332 +-->7333 +-->7334 +-->7335 +-->7336 +-->7337 +-->7338 +-->7339 +-->734 +-->7340 +-->7341 +-->7342 +-->7343 +-->7344 +-->7345 +-->7346 +-->7347 +-->7348 +-->7349 +-->735 +-->7350 +-->7351 +-->7352 +-->7353 +-->7354 +-->7355 +-->7356 +-->7357 +-->7358 +-->7359 +-->736 +-->7360 +-->7361 +-->7362 +-->7363 +-->7364 +-->7365 +-->7366 +-->7367 +-->7368 +-->7369 +-->737 +-->7370 +-->7371 +-->7372 +-->7373 +-->7374 +-->7375 +-->7376 +-->7377 +-->7378 +-->7379 +-->738 +-->7380 +-->7381 +-->7382 +-->7383 +-->7384 +-->7385 +-->7386 +-->7387 +-->7388 +-->7389 +-->739 +-->7390 +-->7391 +-->7392 +-->7393 +-->7394 +-->7395 +-->7396 +-->7397 +-->7398 +-->7399 +-->74 +-->740 +-->7400 +-->7401 +-->7402 +-->7403 +-->7404 +-->7405 +-->7406 +-->7407 +-->7408 +-->7409 +-->741 +-->7410 +-->7411 +-->7412 +-->7413 +-->7414 +-->7415 +-->7416 +-->7417 +-->7418 +-->7419 +-->742 +-->7420 +-->7421 +-->7422 +-->7423 +-->7424 +-->7425 +-->7426 +-->7427 +-->7428 +-->7429 +-->743 +-->7430 +-->7431 +-->7432 +-->7433 +-->7434 +-->7435 +-->7436 +-->7437 +-->7438 +-->7439 +-->744 +-->7440 +-->7441 +-->7442 +-->7443 +-->7444 +-->7445 +-->7446 +-->7447 +-->7448 +-->7449 +-->745 +-->7450 +-->7451 +-->7452 +-->7453 +-->7454 +-->7455 +-->7456 +-->7457 +-->7458 +-->7459 +-->746 +-->7460 +-->7461 +-->7462 +-->7463 +-->7464 +-->7465 +-->7466 +-->7467 +-->7468 +-->7469 +-->747 +-->7470 +-->7471 +-->7472 +-->7473 +-->7474 +-->7475 +-->7476 +-->7477 +-->7478 +-->7479 +-->748 +-->7480 +-->7481 +-->7482 +-->7483 +-->7484 +-->7485 +-->7486 +-->7487 +-->7488 +-->7489 +-->749 +-->7490 +-->7491 +-->7492 +-->7493 +-->7494 +-->7495 +-->7496 +-->7497 +-->7498 +-->7499 +-->75 +-->750 +-->7500 +-->7501 +-->7502 +-->7503 +-->7504 +-->7505 +-->7506 +-->7507 +-->7508 +-->7509 +-->751 +-->7510 +-->7511 +-->7512 +-->7513 +-->7514 +-->7515 +-->7516 +-->7517 +-->7518 +-->7519 +-->752 +-->7520 +-->7521 +-->7522 +-->7523 +-->7524 +-->7525 +-->7526 +-->7527 +-->7528 +-->7529 +-->753 +-->7530 +-->7531 +-->7532 +-->7533 +-->7534 +-->7535 +-->7536 +-->7537 +-->7538 +-->7539 +-->754 +-->7540 +-->7541 +-->7542 +-->7543 +-->7544 +-->7545 +-->7546 +-->7547 +-->7548 +-->7549 +-->755 +-->7550 +-->7551 +-->7552 +-->7553 +-->7554 +-->7555 +-->7556 +-->7557 +-->7558 +-->7559 +-->756 +-->7560 +-->7561 +-->7562 +-->7563 +-->7564 +-->7565 +-->7566 +-->7567 +-->7568 +-->7569 +-->757 +-->7570 +-->7571 +-->7572 +-->7573 +-->7574 +-->7575 +-->7576 +-->7577 +-->7578 +-->7579 +-->758 +-->7580 +-->7581 +-->7582 +-->7583 +-->7584 +-->7585 +-->7586 +-->7587 +-->7588 +-->7589 +-->759 +-->7590 +-->7591 +-->7592 +-->7593 +-->7594 +-->7595 +-->7596 +-->7597 +-->7598 +-->7599 +-->76 +-->760 +-->7600 +-->7601 +-->7602 +-->7603 +-->7604 +-->7605 +-->7606 +-->7607 +-->7608 +-->7609 +-->761 +-->7610 +-->7611 +-->7612 +-->7613 +-->7614 +-->7615 +-->7616 +-->7617 +-->7618 +-->7619 +-->762 +-->7620 +-->7621 +-->7622 +-->7623 +-->7624 +-->7625 +-->7626 +-->7627 +-->7628 +-->7629 +-->763 +-->7630 +-->7631 +-->7632 +-->7633 +-->7634 +-->7635 +-->7636 +-->7637 +-->7638 +-->7639 +-->764 +-->7640 +-->7641 +-->7642 +-->7643 +-->7644 +-->7645 +-->7646 +-->7647 +-->7648 +-->7649 +-->765 +-->7650 +-->7651 +-->7652 +-->7653 +-->7654 +-->7655 +-->7656 +-->7657 +-->7658 +-->7659 +-->766 +-->7660 +-->7661 +-->7662 +-->7663 +-->7664 +-->7665 +-->7666 +-->7667 +-->7668 +-->7669 +-->767 +-->7670 +-->7671 +-->7672 +-->7673 +-->7674 +-->7675 +-->7676 +-->7677 +-->7678 +-->7679 +-->768 +-->7680 +-->7681 +-->7682 +-->7683 +-->7684 +-->7685 +-->7686 +-->7687 +-->7688 +-->7689 +-->769 +-->7690 +-->7691 +-->7692 +-->7693 +-->7694 +-->7695 +-->7696 +-->7697 +-->7698 +-->7699 +-->77 +-->770 +-->7700 +-->7701 +-->7702 +-->7703 +-->7704 +-->7705 +-->7706 +-->7707 +-->7708 +-->7709 +-->771 +-->7710 +-->7711 +-->7712 +-->7713 +-->7714 +-->7715 +-->7716 +-->7717 +-->7718 +-->7719 +-->772 +-->7720 +-->7721 +-->7722 +-->7723 +-->7724 +-->7725 +-->7726 +-->7727 +-->7728 +-->7729 +-->773 +-->7730 +-->7731 +-->7732 +-->7733 +-->7734 +-->7735 +-->7736 +-->7737 +-->7738 +-->7739 +-->774 +-->7740 +-->7741 +-->7742 +-->7743 +-->7744 +-->7745 +-->7746 +-->7747 +-->7748 +-->7749 +-->775 +-->7750 +-->7751 +-->7752 +-->7753 +-->7754 +-->7755 +-->7756 +-->7757 +-->7758 +-->7759 +-->776 +-->7760 +-->7761 +-->7762 +-->7763 +-->7764 +-->7765 +-->7766 +-->7767 +-->7768 +-->7769 +-->777 +-->7770 +-->7771 +-->7772 +-->7773 +-->7774 +-->7775 +-->7776 +-->7777 +-->7778 +-->7779 +-->778 +-->7780 +-->7781 +-->7782 +-->7783 +-->7784 +-->7785 +-->7786 +-->7787 +-->7788 +-->7789 +-->779 +-->7790 +-->7791 +-->7792 +-->7793 +-->7794 +-->7795 +-->7796 +-->7797 +-->7798 +-->7799 +-->78 +-->780 +-->7800 +-->7801 +-->7802 +-->7803 +-->7804 +-->7805 +-->7806 +-->7807 +-->7808 +-->7809 +-->781 +-->7810 +-->7811 +-->7812 +-->7813 +-->7814 +-->7815 +-->7816 +-->7817 +-->7818 +-->7819 +-->782 +-->7820 +-->7821 +-->7822 +-->7823 +-->7824 +-->7825 +-->7826 +-->7827 +-->7828 +-->7829 +-->783 +-->7830 +-->7831 +-->7832 +-->7833 +-->7834 +-->7835 +-->7836 +-->7837 +-->7838 +-->7839 +-->784 +-->7840 +-->7841 +-->7842 +-->7843 +-->7844 +-->7845 +-->7846 +-->7847 +-->7848 +-->7849 +-->785 +-->7850 +-->7851 +-->7852 +-->7853 +-->7854 +-->7855 +-->7856 +-->7857 +-->7858 +-->7859 +-->786 +-->7860 +-->7861 +-->7862 +-->7863 +-->7864 +-->7865 +-->7866 +-->7867 +-->7868 +-->7869 +-->787 +-->7870 +-->7871 +-->7872 +-->7873 +-->7874 +-->7875 +-->7876 +-->7877 +-->7878 +-->7879 +-->788 +-->7880 +-->7881 +-->7882 +-->7883 +-->7884 +-->7885 +-->7886 +-->7887 +-->7888 +-->7889 +-->789 +-->7890 +-->7891 +-->7892 +-->7893 +-->7894 +-->7895 +-->7896 +-->7897 +-->7898 +-->7899 +-->79 +-->790 +-->7900 +-->7901 +-->7902 +-->7903 +-->7904 +-->7905 +-->7906 +-->7907 +-->7908 +-->7909 +-->791 +-->7910 +-->7911 +-->7912 +-->7913 +-->7914 +-->7915 +-->7916 +-->7917 +-->7918 +-->7919 +-->792 +-->7920 +-->7921 +-->7922 +-->7923 +-->7924 +-->7925 +-->7926 +-->7927 +-->7928 +-->7929 +-->793 +-->7930 +-->7931 +-->7932 +-->7933 +-->7934 +-->7935 +-->7936 +-->7937 +-->7938 +-->7939 +-->794 +-->7940 +-->7941 +-->7942 +-->7943 +-->7944 +-->7945 +-->7946 +-->7947 +-->7948 +-->7949 +-->795 +-->7950 +-->7951 +-->7952 +-->7953 +-->7954 +-->7955 +-->7956 +-->7957 +-->7958 +-->7959 +-->796 +-->7960 +-->7961 +-->7962 +-->7963 +-->7964 +-->7965 +-->7966 +-->7967 +-->7968 +-->7969 +-->797 +-->7970 +-->7971 +-->7972 +-->7973 +-->7974 +-->7975 +-->7976 +-->7977 +-->7978 +-->7979 +-->798 +-->7980 +-->7981 +-->7982 +-->7983 +-->7984 +-->7985 +-->7986 +-->7987 +-->7988 +-->7989 +-->799 +-->7990 +-->7991 +-->7992 +-->7993 +-->7994 +-->7995 +-->7996 +-->7997 +-->7998 +-->7999 +-->8 +-->80 +-->800 +-->8000 +-->8001 +-->8002 +-->8003 +-->8004 +-->8005 +-->8006 +-->8007 +-->8008 +-->8009 +-->801 +-->8010 +-->8011 +-->8012 +-->8013 +-->8014 +-->8015 +-->8016 +-->8017 +-->8018 +-->8019 +-->802 +-->8020 +-->8021 +-->8022 +-->8023 +-->8024 +-->8025 +-->8026 +-->8027 +-->8028 +-->8029 +-->803 +-->8030 +-->8031 +-->8032 +-->8033 +-->8034 +-->8035 +-->8036 +-->8037 +-->8038 +-->8039 +-->804 +-->8040 +-->8041 +-->8042 +-->8043 +-->8044 +-->8045 +-->8046 +-->8047 +-->8048 +-->8049 +-->805 +-->8050 +-->8051 +-->8052 +-->8053 +-->8054 +-->8055 +-->8056 +-->8057 +-->8058 +-->8059 +-->806 +-->8060 +-->8061 +-->8062 +-->8063 +-->8064 +-->8065 +-->8066 +-->8067 +-->8068 +-->8069 +-->807 +-->8070 +-->8071 +-->8072 +-->8073 +-->8074 +-->8075 +-->8076 +-->8077 +-->8078 +-->8079 +-->808 +-->8080 +-->8081 +-->8082 +-->8083 +-->8084 +-->8085 +-->8086 +-->8087 +-->8088 +-->8089 +-->809 +-->8090 +-->8091 +-->8092 +-->8093 +-->8094 +-->8095 +-->8096 +-->8097 +-->8098 +-->8099 +-->81 +-->810 +-->8100 +-->8101 +-->8102 +-->8103 +-->8104 +-->8105 +-->8106 +-->8107 +-->8108 +-->8109 +-->811 +-->8110 +-->8111 +-->8112 +-->8113 +-->8114 +-->8115 +-->8116 +-->8117 +-->8118 +-->8119 +-->812 +-->8120 +-->8121 +-->8122 +-->8123 +-->8124 +-->8125 +-->8126 +-->8127 +-->8128 +-->8129 +-->813 +-->8130 +-->8131 +-->8132 +-->8133 +-->8134 +-->8135 +-->8136 +-->8137 +-->8138 +-->8139 +-->814 +-->8140 +-->8141 +-->8142 +-->8143 +-->8144 +-->8145 +-->8146 +-->8147 +-->8148 +-->8149 +-->815 +-->8150 +-->8151 +-->8152 +-->8153 +-->8154 +-->8155 +-->8156 +-->8157 +-->8158 +-->8159 +-->816 +-->8160 +-->8161 +-->8162 +-->8163 +-->8164 +-->8165 +-->8166 +-->8167 +-->8168 +-->8169 +-->817 +-->8170 +-->8171 +-->8172 +-->8173 +-->8174 +-->8175 +-->8176 +-->8177 +-->8178 +-->8179 +-->818 +-->8180 +-->8181 +-->8182 +-->8183 +-->8184 +-->8185 +-->8186 +-->8187 +-->8188 +-->8189 +-->819 +-->8190 +-->8191 +-->8192 +-->8193 +-->8194 +-->8195 +-->8196 +-->8197 +-->8198 +-->8199 +-->82 +-->820 +-->8200 +-->8201 +-->8202 +-->8203 +-->8204 +-->8205 +-->8206 +-->8207 +-->8208 +-->8209 +-->821 +-->8210 +-->8211 +-->8212 +-->8213 +-->8214 +-->8215 +-->8216 +-->8217 +-->8218 +-->8219 +-->822 +-->8220 +-->8221 +-->8222 +-->8223 +-->8224 +-->8225 +-->8226 +-->8227 +-->8228 +-->8229 +-->823 +-->8230 +-->8231 +-->8232 +-->8233 +-->8234 +-->8235 +-->8236 +-->8237 +-->8238 +-->8239 +-->824 +-->8240 +-->8241 +-->8242 +-->8243 +-->8244 +-->8245 +-->8246 +-->8247 +-->8248 +-->8249 +-->825 +-->8250 +-->8251 +-->8252 +-->8253 +-->8254 +-->8255 +-->8256 +-->8257 +-->8258 +-->8259 +-->826 +-->8260 +-->8261 +-->8262 +-->8263 +-->8264 +-->8265 +-->8266 +-->8267 +-->8268 +-->8269 +-->827 +-->8270 +-->8271 +-->8272 +-->8273 +-->8274 +-->8275 +-->8276 +-->8277 +-->8278 +-->8279 +-->828 +-->8280 +-->8281 +-->8282 +-->8283 +-->8284 +-->8285 +-->8286 +-->8287 +-->8288 +-->8289 +-->829 +-->8290 +-->8291 +-->8292 +-->8293 +-->8294 +-->8295 +-->8296 +-->8297 +-->8298 +-->8299 +-->83 +-->830 +-->8300 +-->8301 +-->8302 +-->8303 +-->8304 +-->8305 +-->8306 +-->8307 +-->8308 +-->8309 +-->831 +-->8310 +-->8311 +-->8312 +-->8313 +-->8314 +-->8315 +-->8316 +-->8317 +-->8318 +-->8319 +-->832 +-->8320 +-->8321 +-->8322 +-->8323 +-->8324 +-->8325 +-->8326 +-->8327 +-->8328 +-->8329 +-->833 +-->8330 +-->8331 +-->8332 +-->8333 +-->8334 +-->8335 +-->8336 +-->8337 +-->8338 +-->8339 +-->834 +-->8340 +-->8341 +-->8342 +-->8343 +-->8344 +-->8345 +-->8346 +-->8347 +-->8348 +-->8349 +-->835 +-->8350 +-->8351 +-->8352 +-->8353 +-->8354 +-->8355 +-->8356 +-->8357 +-->8358 +-->8359 +-->836 +-->8360 +-->8361 +-->8362 +-->8363 +-->8364 +-->8365 +-->8366 +-->8367 +-->8368 +-->8369 +-->837 +-->8370 +-->8371 +-->8372 +-->8373 +-->8374 +-->8375 +-->8376 +-->8377 +-->8378 +-->8379 +-->838 +-->8380 +-->8381 +-->8382 +-->8383 +-->8384 +-->8385 +-->8386 +-->8387 +-->8388 +-->8389 +-->839 +-->8390 +-->8391 +-->8392 +-->8393 +-->8394 +-->8395 +-->8396 +-->8397 +-->8398 +-->8399 +-->84 +-->840 +-->8400 +-->8401 +-->8402 +-->8403 +-->8404 +-->8405 +-->8406 +-->8407 +-->8408 +-->8409 +-->841 +-->8410 +-->8411 +-->8412 +-->8413 +-->8414 +-->8415 +-->8416 +-->8417 +-->8418 +-->8419 +-->842 +-->8420 +-->8421 +-->8422 +-->8423 +-->8424 +-->8425 +-->8426 +-->8427 +-->8428 +-->8429 +-->843 +-->8430 +-->8431 +-->8432 +-->8433 +-->8434 +-->8435 +-->8436 +-->8437 +-->8438 +-->8439 +-->844 +-->8440 +-->8441 +-->8442 +-->8443 +-->8444 +-->8445 +-->8446 +-->8447 +-->8448 +-->8449 +-->845 +-->8450 +-->8451 +-->8452 +-->8453 +-->8454 +-->8455 +-->8456 +-->8457 +-->8458 +-->8459 +-->846 +-->8460 +-->8461 +-->8462 +-->8463 +-->8464 +-->8465 +-->8466 +-->8467 +-->8468 +-->8469 +-->847 +-->8470 +-->8471 +-->8472 +-->8473 +-->8474 +-->8475 +-->8476 +-->8477 +-->8478 +-->8479 +-->848 +-->8480 +-->8481 +-->8482 +-->8483 +-->8484 +-->8485 +-->8486 +-->8487 +-->8488 +-->8489 +-->849 +-->8490 +-->8491 +-->8492 +-->8493 +-->8494 +-->8495 +-->8496 +-->8497 +-->8498 +-->8499 +-->85 +-->850 +-->8500 +-->8501 +-->8502 +-->8503 +-->8504 +-->8505 +-->8506 +-->8507 +-->8508 +-->8509 +-->851 +-->8510 +-->8511 +-->8512 +-->8513 +-->8514 +-->8515 +-->8516 +-->8517 +-->8518 +-->8519 +-->852 +-->8520 +-->8521 +-->8522 +-->8523 +-->8524 +-->8525 +-->8526 +-->8527 +-->8528 +-->8529 +-->853 +-->8530 +-->8531 +-->8532 +-->8533 +-->8534 +-->8535 +-->8536 +-->8537 +-->8538 +-->8539 +-->854 +-->8540 +-->8541 +-->8542 +-->8543 +-->8544 +-->8545 +-->8546 +-->8547 +-->8548 +-->8549 +-->855 +-->8550 +-->8551 +-->8552 +-->8553 +-->8554 +-->8555 +-->8556 +-->8557 +-->8558 +-->8559 +-->856 +-->8560 +-->8561 +-->8562 +-->8563 +-->8564 +-->8565 +-->8566 +-->8567 +-->8568 +-->8569 +-->857 +-->8570 +-->8571 +-->8572 +-->8573 +-->8574 +-->8575 +-->8576 +-->8577 +-->8578 +-->8579 +-->858 +-->8580 +-->8581 +-->8582 +-->8583 +-->8584 +-->8585 +-->8586 +-->8587 +-->8588 +-->8589 +-->859 +-->8590 +-->8591 +-->8592 +-->8593 +-->8594 +-->8595 +-->8596 +-->8597 +-->8598 +-->8599 +-->86 +-->860 +-->8600 +-->8601 +-->8602 +-->8603 +-->8604 +-->8605 +-->8606 +-->8607 +-->8608 +-->8609 +-->861 +-->8610 +-->8611 +-->8612 +-->8613 +-->8614 +-->8615 +-->8616 +-->8617 +-->8618 +-->8619 +-->862 +-->8620 +-->8621 +-->8622 +-->8623 +-->8624 +-->8625 +-->8626 +-->8627 +-->8628 +-->8629 +-->863 +-->8630 +-->8631 +-->8632 +-->8633 +-->8634 +-->8635 +-->8636 +-->8637 +-->8638 +-->8639 +-->864 +-->8640 +-->8641 +-->8642 +-->8643 +-->8644 +-->8645 +-->8646 +-->8647 +-->8648 +-->8649 +-->865 +-->8650 +-->8651 +-->8652 +-->8653 +-->8654 +-->8655 +-->8656 +-->8657 +-->8658 +-->8659 +-->866 +-->8660 +-->8661 +-->8662 +-->8663 +-->8664 +-->8665 +-->8666 +-->8667 +-->8668 +-->8669 +-->867 +-->8670 +-->8671 +-->8672 +-->8673 +-->8674 +-->8675 +-->8676 +-->8677 +-->8678 +-->8679 +-->868 +-->8680 +-->8681 +-->8682 +-->8683 +-->8684 +-->8685 +-->8686 +-->8687 +-->8688 +-->8689 +-->869 +-->8690 +-->8691 +-->8692 +-->8693 +-->8694 +-->8695 +-->8696 +-->8697 +-->8698 +-->8699 +-->87 +-->870 +-->8700 +-->8701 +-->8702 +-->8703 +-->8704 +-->8705 +-->8706 +-->8707 +-->8708 +-->8709 +-->871 +-->8710 +-->8711 +-->8712 +-->8713 +-->8714 +-->8715 +-->8716 +-->8717 +-->8718 +-->8719 +-->872 +-->8720 +-->8721 +-->8722 +-->8723 +-->8724 +-->8725 +-->8726 +-->8727 +-->8728 +-->8729 +-->873 +-->8730 +-->8731 +-->8732 +-->8733 +-->8734 +-->8735 +-->8736 +-->8737 +-->8738 +-->8739 +-->874 +-->8740 +-->8741 +-->8742 +-->8743 +-->8744 +-->8745 +-->8746 +-->8747 +-->8748 +-->8749 +-->875 +-->8750 +-->8751 +-->8752 +-->8753 +-->8754 +-->8755 +-->8756 +-->8757 +-->8758 +-->8759 +-->876 +-->8760 +-->8761 +-->8762 +-->8763 +-->8764 +-->8765 +-->8766 +-->8767 +-->8768 +-->8769 +-->877 +-->8770 +-->8771 +-->8772 +-->8773 +-->8774 +-->8775 +-->8776 +-->8777 +-->8778 +-->8779 +-->878 +-->8780 +-->8781 +-->8782 +-->8783 +-->8784 +-->8785 +-->8786 +-->8787 +-->8788 +-->8789 +-->879 +-->8790 +-->8791 +-->8792 +-->8793 +-->8794 +-->8795 +-->8796 +-->8797 +-->8798 +-->8799 +-->88 +-->880 +-->8800 +-->8801 +-->8802 +-->8803 +-->8804 +-->8805 +-->8806 +-->8807 +-->8808 +-->8809 +-->881 +-->8810 +-->8811 +-->8812 +-->8813 +-->8814 +-->8815 +-->8816 +-->8817 +-->8818 +-->8819 +-->882 +-->8820 +-->8821 +-->8822 +-->8823 +-->8824 +-->8825 +-->8826 +-->8827 +-->8828 +-->8829 +-->883 +-->8830 +-->8831 +-->8832 +-->8833 +-->8834 +-->8835 +-->8836 +-->8837 +-->8838 +-->8839 +-->884 +-->8840 +-->8841 +-->8842 +-->8843 +-->8844 +-->8845 +-->8846 +-->8847 +-->8848 +-->8849 +-->885 +-->8850 +-->8851 +-->8852 +-->8853 +-->8854 +-->8855 +-->8856 +-->8857 +-->8858 +-->8859 +-->886 +-->8860 +-->8861 +-->8862 +-->8863 +-->8864 +-->8865 +-->8866 +-->8867 +-->8868 +-->8869 +-->887 +-->8870 +-->8871 +-->8872 +-->8873 +-->8874 +-->8875 +-->8876 +-->8877 +-->8878 +-->8879 +-->888 +-->8880 +-->8881 +-->8882 +-->8883 +-->8884 +-->8885 +-->8886 +-->8887 +-->8888 +-->8889 +-->889 +-->8890 +-->8891 +-->8892 +-->8893 +-->8894 +-->8895 +-->8896 +-->8897 +-->8898 +-->8899 +-->89 +-->890 +-->8900 +-->8901 +-->8902 +-->8903 +-->8904 +-->8905 +-->8906 +-->8907 +-->8908 +-->8909 +-->891 +-->8910 +-->8911 +-->8912 +-->8913 +-->8914 +-->8915 +-->8916 +-->8917 +-->8918 +-->8919 +-->892 +-->8920 +-->8921 +-->8922 +-->8923 +-->8924 +-->8925 +-->8926 +-->8927 +-->8928 +-->8929 +-->893 +-->8930 +-->8931 +-->8932 +-->8933 +-->8934 +-->8935 +-->8936 +-->8937 +-->8938 +-->8939 +-->894 +-->8940 +-->8941 +-->8942 +-->8943 +-->8944 +-->8945 +-->8946 +-->8947 +-->8948 +-->8949 +-->895 +-->8950 +-->8951 +-->8952 +-->8953 +-->8954 +-->8955 +-->8956 +-->8957 +-->8958 +-->8959 +-->896 +-->8960 +-->8961 +-->8962 +-->8963 +-->8964 +-->8965 +-->8966 +-->8967 +-->8968 +-->8969 +-->897 +-->8970 +-->8971 +-->8972 +-->8973 +-->8974 +-->8975 +-->8976 +-->8977 +-->8978 +-->8979 +-->898 +-->8980 +-->8981 +-->8982 +-->8983 +-->8984 +-->8985 +-->8986 +-->8987 +-->8988 +-->8989 +-->899 +-->8990 +-->8991 +-->8992 +-->8993 +-->8994 +-->8995 +-->8996 +-->8997 +-->8998 +-->8999 +-->9 +-->90 +-->900 +-->9000 +-->9001 +-->9002 +-->9003 +-->9004 +-->9005 +-->9006 +-->9007 +-->9008 +-->9009 +-->901 +-->9010 +-->9011 +-->9012 +-->9013 +-->9014 +-->9015 +-->9016 +-->9017 +-->9018 +-->9019 +-->902 +-->9020 +-->9021 +-->9022 +-->9023 +-->9024 +-->9025 +-->9026 +-->9027 +-->9028 +-->9029 +-->903 +-->9030 +-->9031 +-->9032 +-->9033 +-->9034 +-->9035 +-->9036 +-->9037 +-->9038 +-->9039 +-->904 +-->9040 +-->9041 +-->9042 +-->9043 +-->9044 +-->9045 +-->9046 +-->9047 +-->9048 +-->9049 +-->905 +-->9050 +-->9051 +-->9052 +-->9053 +-->9054 +-->9055 +-->9056 +-->9057 +-->9058 +-->9059 +-->906 +-->9060 +-->9061 +-->9062 +-->9063 +-->9064 +-->9065 +-->9066 +-->9067 +-->9068 +-->9069 +-->907 +-->9070 +-->9071 +-->9072 +-->9073 +-->9074 +-->9075 +-->9076 +-->9077 +-->9078 +-->9079 +-->908 +-->9080 +-->9081 +-->9082 +-->9083 +-->9084 +-->9085 +-->9086 +-->9087 +-->9088 +-->9089 +-->909 +-->9090 +-->9091 +-->9092 +-->9093 +-->9094 +-->9095 +-->9096 +-->9097 +-->9098 +-->9099 +-->91 +-->910 +-->9100 +-->9101 +-->9102 +-->9103 +-->9104 +-->9105 +-->9106 +-->9107 +-->9108 +-->9109 +-->911 +-->9110 +-->9111 +-->9112 +-->9113 +-->9114 +-->9115 +-->9116 +-->9117 +-->9118 +-->9119 +-->912 +-->9120 +-->9121 +-->9122 +-->9123 +-->9124 +-->9125 +-->9126 +-->9127 +-->9128 +-->9129 +-->913 +-->9130 +-->9131 +-->9132 +-->9133 +-->9134 +-->9135 +-->9136 +-->9137 +-->9138 +-->9139 +-->914 +-->9140 +-->9141 +-->9142 +-->9143 +-->9144 +-->9145 +-->9146 +-->9147 +-->9148 +-->9149 +-->915 +-->9150 +-->9151 +-->9152 +-->9153 +-->9154 +-->9155 +-->9156 +-->9157 +-->9158 +-->9159 +-->916 +-->9160 +-->9161 +-->9162 +-->9163 +-->9164 +-->9165 +-->9166 +-->9167 +-->9168 +-->9169 +-->917 +-->9170 +-->9171 +-->9172 +-->9173 +-->9174 +-->9175 +-->9176 +-->9177 +-->9178 +-->9179 +-->918 +-->9180 +-->9181 +-->9182 +-->9183 +-->9184 +-->9185 +-->9186 +-->9187 +-->9188 +-->9189 +-->919 +-->9190 +-->9191 +-->9192 +-->9193 +-->9194 +-->9195 +-->9196 +-->9197 +-->9198 +-->9199 +-->92 +-->920 +-->9200 +-->9201 +-->9202 +-->9203 +-->9204 +-->9205 +-->9206 +-->9207 +-->9208 +-->9209 +-->921 +-->9210 +-->9211 +-->9212 +-->9213 +-->9214 +-->9215 +-->9216 +-->9217 +-->9218 +-->9219 +-->922 +-->9220 +-->9221 +-->9222 +-->9223 +-->9224 +-->9225 +-->9226 +-->9227 +-->9228 +-->9229 +-->923 +-->9230 +-->9231 +-->9232 +-->9233 +-->9234 +-->9235 +-->9236 +-->9237 +-->9238 +-->9239 +-->924 +-->9240 +-->9241 +-->9242 +-->9243 +-->9244 +-->9245 +-->9246 +-->9247 +-->9248 +-->9249 +-->925 +-->9250 +-->9251 +-->9252 +-->9253 +-->9254 +-->9255 +-->9256 +-->9257 +-->9258 +-->9259 +-->926 +-->9260 +-->9261 +-->9262 +-->9263 +-->9264 +-->9265 +-->9266 +-->9267 +-->9268 +-->9269 +-->927 +-->9270 +-->9271 +-->9272 +-->9273 +-->9274 +-->9275 +-->9276 +-->9277 +-->9278 +-->9279 +-->928 +-->9280 +-->9281 +-->9282 +-->9283 +-->9284 +-->9285 +-->9286 +-->9287 +-->9288 +-->9289 +-->929 +-->9290 +-->9291 +-->9292 +-->9293 +-->9294 +-->9295 +-->9296 +-->9297 +-->9298 +-->9299 +-->93 +-->930 +-->9300 +-->9301 +-->9302 +-->9303 +-->9304 +-->9305 +-->9306 +-->9307 +-->9308 +-->9309 +-->931 +-->9310 +-->9311 +-->9312 +-->9313 +-->9314 +-->9315 +-->9316 +-->9317 +-->9318 +-->9319 +-->932 +-->9320 +-->9321 +-->9322 +-->9323 +-->9324 +-->9325 +-->9326 +-->9327 +-->9328 +-->9329 +-->933 +-->9330 +-->9331 +-->9332 +-->9333 +-->9334 +-->9335 +-->9336 +-->9337 +-->9338 +-->9339 +-->934 +-->9340 +-->9341 +-->9342 +-->9343 +-->9344 +-->9345 +-->9346 +-->9347 +-->9348 +-->9349 +-->935 +-->9350 +-->9351 +-->9352 +-->9353 +-->9354 +-->9355 +-->9356 +-->9357 +-->9358 +-->9359 +-->936 +-->9360 +-->9361 +-->9362 +-->9363 +-->9364 +-->9365 +-->9366 +-->9367 +-->9368 +-->9369 +-->937 +-->9370 +-->9371 +-->9372 +-->9373 +-->9374 +-->9375 +-->9376 +-->9377 +-->9378 +-->9379 +-->938 +-->9380 +-->9381 +-->9382 +-->9383 +-->9384 +-->9385 +-->9386 +-->9387 +-->9388 +-->9389 +-->939 +-->9390 +-->9391 +-->9392 +-->9393 +-->9394 +-->9395 +-->9396 +-->9397 +-->9398 +-->9399 +-->94 +-->940 +-->9400 +-->9401 +-->9402 +-->9403 +-->9404 +-->9405 +-->9406 +-->9407 +-->9408 +-->9409 +-->941 +-->9410 +-->9411 +-->9412 +-->9413 +-->9414 +-->9415 +-->9416 +-->9417 +-->9418 +-->9419 +-->942 +-->9420 +-->9421 +-->9422 +-->9423 +-->9424 +-->9425 +-->9426 +-->9427 +-->9428 +-->9429 +-->943 +-->9430 +-->9431 +-->9432 +-->9433 +-->9434 +-->9435 +-->9436 +-->9437 +-->9438 +-->9439 +-->944 +-->9440 +-->9441 +-->9442 +-->9443 +-->9444 +-->9445 +-->9446 +-->9447 +-->9448 +-->9449 +-->945 +-->9450 +-->9451 +-->9452 +-->9453 +-->9454 +-->9455 +-->9456 +-->9457 +-->9458 +-->9459 +-->946 +-->9460 +-->9461 +-->9462 +-->9463 +-->9464 +-->9465 +-->9466 +-->9467 +-->9468 +-->9469 +-->947 +-->9470 +-->9471 +-->9472 +-->9473 +-->9474 +-->9475 +-->9476 +-->9477 +-->9478 +-->9479 +-->948 +-->9480 +-->9481 +-->9482 +-->9483 +-->9484 +-->9485 +-->9486 +-->9487 +-->9488 +-->9489 +-->949 +-->9490 +-->9491 +-->9492 +-->9493 +-->9494 +-->9495 +-->9496 +-->9497 +-->9498 +-->9499 +-->95 +-->950 +-->9500 +-->9501 +-->9502 +-->9503 +-->9504 +-->9505 +-->9506 +-->9507 +-->9508 +-->9509 +-->951 +-->9510 +-->9511 +-->9512 +-->9513 +-->9514 +-->9515 +-->9516 +-->9517 +-->9518 +-->9519 +-->952 +-->9520 +-->9521 +-->9522 +-->9523 +-->9524 +-->9525 +-->9526 +-->9527 +-->9528 +-->9529 +-->953 +-->9530 +-->9531 +-->9532 +-->9533 +-->9534 +-->9535 +-->9536 +-->9537 +-->9538 +-->9539 +-->954 +-->9540 +-->9541 +-->9542 +-->9543 +-->9544 +-->9545 +-->9546 +-->9547 +-->9548 +-->9549 +-->955 +-->9550 +-->9551 +-->9552 +-->9553 +-->9554 +-->9555 +-->9556 +-->9557 +-->9558 +-->9559 +-->956 +-->9560 +-->9561 +-->9562 +-->9563 +-->9564 +-->9565 +-->9566 +-->9567 +-->9568 +-->9569 +-->957 +-->9570 +-->9571 +-->9572 +-->9573 +-->9574 +-->9575 +-->9576 +-->9577 +-->9578 +-->9579 +-->958 +-->9580 +-->9581 +-->9582 +-->9583 +-->9584 +-->9585 +-->9586 +-->9587 +-->9588 +-->9589 +-->959 +-->9590 +-->9591 +-->9592 +-->9593 +-->9594 +-->9595 +-->9596 +-->9597 +-->9598 +-->9599 +-->96 +-->960 +-->9600 +-->9601 +-->9602 +-->9603 +-->9604 +-->9605 +-->9606 +-->9607 +-->9608 +-->9609 +-->961 +-->9610 +-->9611 +-->9612 +-->9613 +-->9614 +-->9615 +-->9616 +-->9617 +-->9618 +-->9619 +-->962 +-->9620 +-->9621 +-->9622 +-->9623 +-->9624 +-->9625 +-->9626 +-->9627 +-->9628 +-->9629 +-->963 +-->9630 +-->9631 +-->9632 +-->9633 +-->9634 +-->9635 +-->9636 +-->9637 +-->9638 +-->9639 +-->964 +-->9640 +-->9641 +-->9642 +-->9643 +-->9644 +-->9645 +-->9646 +-->9647 +-->9648 +-->9649 +-->965 +-->9650 +-->9651 +-->9652 +-->9653 +-->9654 +-->9655 +-->9656 +-->9657 +-->9658 +-->9659 +-->966 +-->9660 +-->9661 +-->9662 +-->9663 +-->9664 +-->9665 +-->9666 +-->9667 +-->9668 +-->9669 +-->967 +-->9670 +-->9671 +-->9672 +-->9673 +-->9674 +-->9675 +-->9676 +-->9677 +-->9678 +-->9679 +-->968 +-->9680 +-->9681 +-->9682 +-->9683 +-->9684 +-->9685 +-->9686 +-->9687 +-->9688 +-->9689 +-->969 +-->9690 +-->9691 +-->9692 +-->9693 +-->9694 +-->9695 +-->9696 +-->9697 +-->9698 +-->9699 +-->97 +-->970 +-->9700 +-->9701 +-->9702 +-->9703 +-->9704 +-->9705 +-->9706 +-->9707 +-->9708 +-->9709 +-->971 +-->9710 +-->9711 +-->9712 +-->9713 +-->9714 +-->9715 +-->9716 +-->9717 +-->9718 +-->9719 +-->972 +-->9720 +-->9721 +-->9722 +-->9723 +-->9724 +-->9725 +-->9726 +-->9727 +-->9728 +-->9729 +-->973 +-->9730 +-->9731 +-->9732 +-->9733 +-->9734 +-->9735 +-->9736 +-->9737 +-->9738 +-->9739 +-->974 +-->9740 +-->9741 +-->9742 +-->9743 +-->9744 +-->9745 +-->9746 +-->9747 +-->9748 +-->9749 +-->975 +-->9750 +-->9751 +-->9752 +-->9753 +-->9754 +-->9755 +-->9756 +-->9757 +-->9758 +-->9759 +-->976 +-->9760 +-->9761 +-->9762 +-->9763 +-->9764 +-->9765 +-->9766 +-->9767 +-->9768 +-->9769 +-->977 +-->9770 +-->9771 +-->9772 +-->9773 +-->9774 +-->9775 +-->9776 +-->9777 +-->9778 +-->9779 +-->978 +-->9780 +-->9781 +-->9782 +-->9783 +-->9784 +-->9785 +-->9786 +-->9787 +-->9788 +-->9789 +-->979 +-->9790 +-->9791 +-->9792 +-->9793 +-->9794 +-->9795 +-->9796 +-->9797 +-->9798 +-->9799 +-->98 +-->980 +-->9800 +-->9801 +-->9802 +-->9803 +-->9804 +-->9805 +-->9806 +-->9807 +-->9808 +-->9809 +-->981 +-->9810 +-->9811 +-->9812 +-->9813 +-->9814 +-->9815 +-->9816 +-->9817 +-->9818 +-->9819 +-->982 +-->9820 +-->9821 +-->9822 +-->9823 +-->9824 +-->9825 +-->9826 +-->9827 +-->9828 +-->9829 +-->983 +-->9830 +-->9831 +-->9832 +-->9833 +-->9834 +-->9835 +-->9836 +-->9837 +-->9838 +-->9839 +-->984 +-->9840 +-->9841 +-->9842 +-->9843 +-->9844 +-->9845 +-->9846 +-->9847 +-->9848 +-->9849 +-->985 +-->9850 +-->9851 +-->9852 +-->9853 +-->9854 +-->9855 +-->9856 +-->9857 +-->9858 +-->9859 +-->986 +-->9860 +-->9861 +-->9862 +-->9863 +-->9864 +-->9865 +-->9866 +-->9867 +-->9868 +-->9869 +-->987 +-->9870 +-->9871 +-->9872 +-->9873 +-->9874 +-->9875 +-->9876 +-->9877 +-->9878 +-->9879 +-->988 +-->9880 +-->9881 +-->9882 +-->9883 +-->9884 +-->9885 +-->9886 +-->9887 +-->9888 +-->9889 +-->989 +-->9890 +-->9891 +-->9892 +-->9893 +-->9894 +-->9895 +-->9896 +-->9897 +-->9898 +-->9899 +-->99 +-->990 +-->9900 +-->9901 +-->9902 +-->9903 +-->9904 +-->9905 +-->9906 +-->9907 +-->9908 +-->9909 +-->991 +-->9910 +-->9911 +-->9912 +-->9913 +-->9914 +-->9915 +-->9916 +-->9917 +-->9918 +-->9919 +-->992 +-->9920 +-->9921 +-->9922 +-->9923 +-->9924 +-->9925 +-->9926 +-->9927 +-->9928 +-->9929 +-->993 +-->9930 +-->9931 +-->9932 +-->9933 +-->9934 +-->9935 +-->9936 +-->9937 +-->9938 +-->9939 +-->994 +-->9940 +-->9941 +-->9942 +-->9943 +-->9944 +-->9945 +-->9946 +-->9947 +-->9948 +-->9949 +-->995 +-->9950 +-->9951 +-->9952 +-->9953 +-->9954 +-->9955 +-->9956 +-->9957 +-->9958 +-->9959 +-->996 +-->9960 +-->9961 +-->9962 +-->9963 +-->9964 +-->9965 +-->9966 +-->9967 +-->9968 +-->9969 +-->997 +-->9970 +-->9971 +-->9972 +-->9973 +-->9974 +-->9975 +-->9976 +-->9977 +-->9978 +-->9979 +-->998 +-->9980 +-->9981 +-->9982 +-->9983 +-->9984 +-->9985 +-->9986 +-->9987 +-->9988 +-->9989 +-->999 +-->9990 +-->9991 +-->9992 +-->9993 +-->9994 +-->9995 +-->9996 +-->9997 +-->9998 +-->9999 +0--> +1--> +10--> +100--> +1000--> +10000--> +1001--> +1002--> +1003--> +1004--> +1005--> +1006--> +1007--> +1008--> +1009--> +101--> +1010--> +1011--> +1012--> +1013--> +1014--> +1015--> +1016--> +1017--> +1018--> +1019--> +102--> +1020--> +1021--> +1022--> +1023--> +1024--> +1025--> +1026--> +1027--> +1028--> +1029--> +103--> +1030--> +1031--> +1032--> +1033--> +1034--> +1035--> +1036--> +1037--> +1038--> +1039--> +104--> +1040--> +1041--> +1042--> +1043--> +1044--> +1045--> +1046--> +1047--> +1048--> +1049--> +105--> +1050--> +1051--> +1052--> +1053--> +1054--> +1055--> +1056--> +1057--> +1058--> +1059--> +106--> +1060--> +1061--> +1062--> +1063--> +1064--> +1065--> +1066--> +1067--> +1068--> +1069--> +107--> +1070--> +1071--> +1072--> +1073--> +1074--> +1075--> +1076--> +1077--> +1078--> +1079--> +108--> +1080--> +1081--> +1082--> +1083--> +1084--> +1085--> +1086--> +1087--> +1088--> +1089--> +109--> +1090--> +1091--> +1092--> +1093--> +1094--> +1095--> +1096--> +1097--> +1098--> +1099--> +11--> +110--> +1100--> +1101--> +1102--> +1103--> +1104--> +1105--> +1106--> +1107--> +1108--> +1109--> +111--> +1110--> +1111--> +1112--> +1113--> +1114--> +1115--> +1116--> +1117--> +1118--> +1119--> +112--> +1120--> +1121--> +1122--> +1123--> +1124--> +1125--> +1126--> +1127--> +1128--> +1129--> +113--> +1130--> +1131--> +1132--> +1133--> +1134--> +1135--> +1136--> +1137--> +1138--> +1139--> +114--> +1140--> +1141--> +1142--> +1143--> +1144--> +1145--> +1146--> +1147--> +1148--> +1149--> +115--> +1150--> +1151--> +1152--> +1153--> +1154--> +1155--> +1156--> +1157--> +1158--> +1159--> +116--> +1160--> +1161--> +1162--> +1163--> +1164--> +1165--> +1166--> +1167--> +1168--> +1169--> +117--> +1170--> +1171--> +1172--> +1173--> +1174--> +1175--> +1176--> +1177--> +1178--> +1179--> +118--> +1180--> +1181--> +1182--> +1183--> +1184--> +1185--> +1186--> +1187--> +1188--> +1189--> +119--> +1190--> +1191--> +1192--> +1193--> +1194--> +1195--> +1196--> +1197--> +1198--> +1199--> +12--> +120--> +1200--> +1201--> +1202--> +1203--> +1204--> +1205--> +1206--> +1207--> +1208--> +1209--> +121--> +1210--> +1211--> +1212--> +1213--> +1214--> +1215--> +1216--> +1217--> +1218--> +1219--> +122--> +1220--> +1221--> +1222--> +1223--> +1224--> +1225--> +1226--> +1227--> +1228--> +1229--> +123--> +1230--> +1231--> +1232--> +1233--> +1234--> +1235--> +1236--> +1237--> +1238--> +1239--> +124--> +1240--> +1241--> +1242--> +1243--> +1244--> +1245--> +1246--> +1247--> +1248--> +1249--> +125--> +1250--> +1251--> +1252--> +1253--> +1254--> +1255--> +1256--> +1257--> +1258--> +1259--> +126--> +1260--> +1261--> +1262--> +1263--> +1264--> +1265--> +1266--> +1267--> +1268--> +1269--> +127--> +1270--> +1271--> +1272--> +1273--> +1274--> +1275--> +1276--> +1277--> +1278--> +1279--> +128--> +1280--> +1281--> +1282--> +1283--> +1284--> +1285--> +1286--> +1287--> +1288--> +1289--> +129--> +1290--> +1291--> +1292--> +1293--> +1294--> +1295--> +1296--> +1297--> +1298--> +1299--> +13--> +130--> +1300--> +1301--> +1302--> +1303--> +1304--> +1305--> +1306--> +1307--> +1308--> +1309--> +131--> +1310--> +1311--> +1312--> +1313--> +1314--> +1315--> +1316--> +1317--> +1318--> +1319--> +132--> +1320--> +1321--> +1322--> +1323--> +1324--> +1325--> +1326--> +1327--> +1328--> +1329--> +133--> +1330--> +1331--> +1332--> +1333--> +1334--> +1335--> +1336--> +1337--> +1338--> +1339--> +134--> +1340--> +1341--> +1342--> +1343--> +1344--> +1345--> +1346--> +1347--> +1348--> +1349--> +135--> +1350--> +1351--> +1352--> +1353--> +1354--> +1355--> +1356--> +1357--> +1358--> +1359--> +136--> +1360--> +1361--> +1362--> +1363--> +1364--> +1365--> +1366--> +1367--> +1368--> +1369--> +137--> +1370--> +1371--> +1372--> +1373--> +1374--> +1375--> +1376--> +1377--> +1378--> +1379--> +138--> +1380--> +1381--> +1382--> +1383--> +1384--> +1385--> +1386--> +1387--> +1388--> +1389--> +139--> +1390--> +1391--> +1392--> +1393--> +1394--> +1395--> +1396--> +1397--> +1398--> +1399--> +14--> +140--> +1400--> +1401--> +1402--> +1403--> +1404--> +1405--> +1406--> +1407--> +1408--> +1409--> +141--> +1410--> +1411--> +1412--> +1413--> +1414--> +1415--> +1416--> +1417--> +1418--> +1419--> +142--> +1420--> +1421--> +1422--> +1423--> +1424--> +1425--> +1426--> +1427--> +1428--> +1429--> +143--> +1430--> +1431--> +1432--> +1433--> +1434--> +1435--> +1436--> +1437--> +1438--> +1439--> +144--> +1440--> +1441--> +1442--> +1443--> +1444--> +1445--> +1446--> +1447--> +1448--> +1449--> +145--> +1450--> +1451--> +1452--> +1453--> +1454--> +1455--> +1456--> +1457--> +1458--> +1459--> +146--> +1460--> +1461--> +1462--> +1463--> +1464--> +1465--> +1466--> +1467--> +1468--> +1469--> +147--> +1470--> +1471--> +1472--> +1473--> +1474--> +1475--> +1476--> +1477--> +1478--> +1479--> +148--> +1480--> +1481--> +1482--> +1483--> +1484--> +1485--> +1486--> +1487--> +1488--> +1489--> +149--> +1490--> +1491--> +1492--> +1493--> +1494--> +1495--> +1496--> +1497--> +1498--> +1499--> +15--> +150--> +1500--> +1501--> +1502--> +1503--> +1504--> +1505--> +1506--> +1507--> +1508--> +1509--> +151--> +1510--> +1511--> +1512--> +1513--> +1514--> +1515--> +1516--> +1517--> +1518--> +1519--> +152--> +1520--> +1521--> +1522--> +1523--> +1524--> +1525--> +1526--> +1527--> +1528--> +1529--> +153--> +1530--> +1531--> +1532--> +1533--> +1534--> +1535--> +1536--> +1537--> +1538--> +1539--> +154--> +1540--> +1541--> +1542--> +1543--> +1544--> +1545--> +1546--> +1547--> +1548--> +1549--> +155--> +1550--> +1551--> +1552--> +1553--> +1554--> +1555--> +1556--> +1557--> +1558--> +1559--> +156--> +1560--> +1561--> +1562--> +1563--> +1564--> +1565--> +1566--> +1567--> +1568--> +1569--> +157--> +1570--> +1571--> +1572--> +1573--> +1574--> +1575--> +1576--> +1577--> +1578--> +1579--> +158--> +1580--> +1581--> +1582--> +1583--> +1584--> +1585--> +1586--> +1587--> +1588--> +1589--> +159--> +1590--> +1591--> +1592--> +1593--> +1594--> +1595--> +1596--> +1597--> +1598--> +1599--> +16--> +160--> +1600--> +1601--> +1602--> +1603--> +1604--> +1605--> +1606--> +1607--> +1608--> +1609--> +161--> +1610--> +1611--> +1612--> +1613--> +1614--> +1615--> +1616--> +1617--> +1618--> +1619--> +162--> +1620--> +1621--> +1622--> +1623--> +1624--> +1625--> +1626--> +1627--> +1628--> +1629--> +163--> +1630--> +1631--> +1632--> +1633--> +1634--> +1635--> +1636--> +1637--> +1638--> +1639--> +164--> +1640--> +1641--> +1642--> +1643--> +1644--> +1645--> +1646--> +1647--> +1648--> +1649--> +165--> +1650--> +1651--> +1652--> +1653--> +1654--> +1655--> +1656--> +1657--> +1658--> +1659--> +166--> +1660--> +1661--> +1662--> +1663--> +1664--> +1665--> +1666--> +1667--> +1668--> +1669--> +167--> +1670--> +1671--> +1672--> +1673--> +1674--> +1675--> +1676--> +1677--> +1678--> +1679--> +168--> +1680--> +1681--> +1682--> +1683--> +1684--> +1685--> +1686--> +1687--> +1688--> +1689--> +169--> +1690--> +1691--> +1692--> +1693--> +1694--> +1695--> +1696--> +1697--> +1698--> +1699--> +17--> +170--> +1700--> +1701--> +1702--> +1703--> +1704--> +1705--> +1706--> +1707--> +1708--> +1709--> +171--> +1710--> +1711--> +1712--> +1713--> +1714--> +1715--> +1716--> +1717--> +1718--> +1719--> +172--> +1720--> +1721--> +1722--> +1723--> +1724--> +1725--> +1726--> +1727--> +1728--> +1729--> +173--> +1730--> +1731--> +1732--> +1733--> +1734--> +1735--> +1736--> +1737--> +1738--> +1739--> +174--> +1740--> +1741--> +1742--> +1743--> +1744--> +1745--> +1746--> +1747--> +1748--> +1749--> +175--> +1750--> +1751--> +1752--> +1753--> +1754--> +1755--> +1756--> +1757--> +1758--> +1759--> +176--> +1760--> +1761--> +1762--> +1763--> +1764--> +1765--> +1766--> +1767--> +1768--> +1769--> +177--> +1770--> +1771--> +1772--> +1773--> +1774--> +1775--> +1776--> +1777--> +1778--> +1779--> +178--> +1780--> +1781--> +1782--> +1783--> +1784--> +1785--> +1786--> +1787--> +1788--> +1789--> +179--> +1790--> +1791--> +1792--> +1793--> +1794--> +1795--> +1796--> +1797--> +1798--> +1799--> +18--> +180--> +1800--> +1801--> +1802--> +1803--> +1804--> +1805--> +1806--> +1807--> +1808--> +1809--> +181--> +1810--> +1811--> +1812--> +1813--> +1814--> +1815--> +1816--> +1817--> +1818--> +1819--> +182--> +1820--> +1821--> +1822--> +1823--> +1824--> +1825--> +1826--> +1827--> +1828--> +1829--> +183--> +1830--> +1831--> +1832--> +1833--> +1834--> +1835--> +1836--> +1837--> +1838--> +1839--> +184--> +1840--> +1841--> +1842--> +1843--> +1844--> +1845--> +1846--> +1847--> +1848--> +1849--> +185--> +1850--> +1851--> +1852--> +1853--> +1854--> +1855--> +1856--> +1857--> +1858--> +1859--> +186--> +1860--> +1861--> +1862--> +1863--> +1864--> +1865--> +1866--> +1867--> +1868--> +1869--> +187--> +1870--> +1871--> +1872--> +1873--> +1874--> +1875--> +1876--> +1877--> +1878--> +1879--> +188--> +1880--> +1881--> +1882--> +1883--> +1884--> +1885--> +1886--> +1887--> +1888--> +1889--> +189--> +1890--> +1891--> +1892--> +1893--> +1894--> +1895--> +1896--> +1897--> +1898--> +1899--> +19--> +190--> +1900--> +1901--> +1902--> +1903--> +1904--> +1905--> +1906--> +1907--> +1908--> +1909--> +191--> +1910--> +1911--> +1912--> +1913--> +1914--> +1915--> +1916--> +1917--> +1918--> +1919--> +192--> +1920--> +1921--> +1922--> +1923--> +1924--> +1925--> +1926--> +1927--> +1928--> +1929--> +193--> +1930--> +1931--> +1932--> +1933--> +1934--> +1935--> +1936--> +1937--> +1938--> +1939--> +194--> +1940--> +1941--> +1942--> +1943--> +1944--> +1945--> +1946--> +1947--> +1948--> +1949--> +195--> +1950--> +1951--> +1952--> +1953--> +1954--> +1955--> +1956--> +1957--> +1958--> +1959--> +196--> +1960--> +1961--> +1962--> +1963--> +1964--> +1965--> +1966--> +1967--> +1968--> +1969--> +197--> +1970--> +1971--> +1972--> +1973--> +1974--> +1975--> +1976--> +1977--> +1978--> +1979--> +198--> +1980--> +1981--> +1982--> +1983--> +1984--> +1985--> +1986--> +1987--> +1988--> +1989--> +199--> +1990--> +1991--> +1992--> +1993--> +1994--> +1995--> +1996--> +1997--> +1998--> +1999--> +2--> +20--> +200--> +2000--> +2001--> +2002--> +2003--> +2004--> +2005--> +2006--> +2007--> +2008--> +2009--> +201--> +2010--> +2011--> +2012--> +2013--> +2014--> +2015--> +2016--> +2017--> +2018--> +2019--> +202--> +2020--> +2021--> +2022--> +2023--> +2024--> +2025--> +2026--> +2027--> +2028--> +2029--> +203--> +2030--> +2031--> +2032--> +2033--> +2034--> +2035--> +2036--> +2037--> +2038--> +2039--> +204--> +2040--> +2041--> +2042--> +2043--> +2044--> +2045--> +2046--> +2047--> +2048--> +2049--> +205--> +2050--> +2051--> +2052--> +2053--> +2054--> +2055--> +2056--> +2057--> +2058--> +2059--> +206--> +2060--> +2061--> +2062--> +2063--> +2064--> +2065--> +2066--> +2067--> +2068--> +2069--> +207--> +2070--> +2071--> +2072--> +2073--> +2074--> +2075--> +2076--> +2077--> +2078--> +2079--> +208--> +2080--> +2081--> +2082--> +2083--> +2084--> +2085--> +2086--> +2087--> +2088--> +2089--> +209--> +2090--> +2091--> +2092--> +2093--> +2094--> +2095--> +2096--> +2097--> +2098--> +2099--> +21--> +210--> +2100--> +2101--> +2102--> +2103--> +2104--> +2105--> +2106--> +2107--> +2108--> +2109--> +211--> +2110--> +2111--> +2112--> +2113--> +2114--> +2115--> +2116--> +2117--> +2118--> +2119--> +212--> +2120--> +2121--> +2122--> +2123--> +2124--> +2125--> +2126--> +2127--> +2128--> +2129--> +213--> +2130--> +2131--> +2132--> +2133--> +2134--> +2135--> +2136--> +2137--> +2138--> +2139--> +214--> +2140--> +2141--> +2142--> +2143--> +2144--> +2145--> +2146--> +2147--> +2148--> +2149--> +215--> +2150--> +2151--> +2152--> +2153--> +2154--> +2155--> +2156--> +2157--> +2158--> +2159--> +216--> +2160--> +2161--> +2162--> +2163--> +2164--> +2165--> +2166--> +2167--> +2168--> +2169--> +217--> +2170--> +2171--> +2172--> +2173--> +2174--> +2175--> +2176--> +2177--> +2178--> +2179--> +218--> +2180--> +2181--> +2182--> +2183--> +2184--> +2185--> +2186--> +2187--> +2188--> +2189--> +219--> +2190--> +2191--> +2192--> +2193--> +2194--> +2195--> +2196--> +2197--> +2198--> +2199--> +22--> +220--> +2200--> +2201--> +2202--> +2203--> +2204--> +2205--> +2206--> +2207--> +2208--> +2209--> +221--> +2210--> +2211--> +2212--> +2213--> +2214--> +2215--> +2216--> +2217--> +2218--> +2219--> +222--> +2220--> +2221--> +2222--> +2223--> +2224--> +2225--> +2226--> +2227--> +2228--> +2229--> +223--> +2230--> +2231--> +2232--> +2233--> +2234--> +2235--> +2236--> +2237--> +2238--> +2239--> +224--> +2240--> +2241--> +2242--> +2243--> +2244--> +2245--> +2246--> +2247--> +2248--> +2249--> +225--> +2250--> +2251--> +2252--> +2253--> +2254--> +2255--> +2256--> +2257--> +2258--> +2259--> +226--> +2260--> +2261--> +2262--> +2263--> +2264--> +2265--> +2266--> +2267--> +2268--> +2269--> +227--> +2270--> +2271--> +2272--> +2273--> +2274--> +2275--> +2276--> +2277--> +2278--> +2279--> +228--> +2280--> +2281--> +2282--> +2283--> +2284--> +2285--> +2286--> +2287--> +2288--> +2289--> +229--> +2290--> +2291--> +2292--> +2293--> +2294--> +2295--> +2296--> +2297--> +2298--> +2299--> +23--> +230--> +2300--> +2301--> +2302--> +2303--> +2304--> +2305--> +2306--> +2307--> +2308--> +2309--> +231--> +2310--> +2311--> +2312--> +2313--> +2314--> +2315--> +2316--> +2317--> +2318--> +2319--> +232--> +2320--> +2321--> +2322--> +2323--> +2324--> +2325--> +2326--> +2327--> +2328--> +2329--> +233--> +2330--> +2331--> +2332--> +2333--> +2334--> +2335--> +2336--> +2337--> +2338--> +2339--> +234--> +2340--> +2341--> +2342--> +2343--> +2344--> +2345--> +2346--> +2347--> +2348--> +2349--> +235--> +2350--> +2351--> +2352--> +2353--> +2354--> +2355--> +2356--> +2357--> +2358--> +2359--> +236--> +2360--> +2361--> +2362--> +2363--> +2364--> +2365--> +2366--> +2367--> +2368--> +2369--> +237--> +2370--> +2371--> +2372--> +2373--> +2374--> +2375--> +2376--> +2377--> +2378--> +2379--> +238--> +2380--> +2381--> +2382--> +2383--> +2384--> +2385--> +2386--> +2387--> +2388--> +2389--> +239--> +2390--> +2391--> +2392--> +2393--> +2394--> +2395--> +2396--> +2397--> +2398--> +2399--> +24--> +240--> +2400--> +2401--> +2402--> +2403--> +2404--> +2405--> +2406--> +2407--> +2408--> +2409--> +241--> +2410--> +2411--> +2412--> +2413--> +2414--> +2415--> +2416--> +2417--> +2418--> +2419--> +242--> +2420--> +2421--> +2422--> +2423--> +2424--> +2425--> +2426--> +2427--> +2428--> +2429--> +243--> +2430--> +2431--> +2432--> +2433--> +2434--> +2435--> +2436--> +2437--> +2438--> +2439--> +244--> +2440--> +2441--> +2442--> +2443--> +2444--> +2445--> +2446--> +2447--> +2448--> +2449--> +245--> +2450--> +2451--> +2452--> +2453--> +2454--> +2455--> +2456--> +2457--> +2458--> +2459--> +246--> +2460--> +2461--> +2462--> +2463--> +2464--> +2465--> +2466--> +2467--> +2468--> +2469--> +247--> +2470--> +2471--> +2472--> +2473--> +2474--> +2475--> +2476--> +2477--> +2478--> +2479--> +248--> +2480--> +2481--> +2482--> +2483--> +2484--> +2485--> +2486--> +2487--> +2488--> +2489--> +249--> +2490--> +2491--> +2492--> +2493--> +2494--> +2495--> +2496--> +2497--> +2498--> +2499--> +25--> +250--> +2500--> +2501--> +2502--> +2503--> +2504--> +2505--> +2506--> +2507--> +2508--> +2509--> +251--> +2510--> +2511--> +2512--> +2513--> +2514--> +2515--> +2516--> +2517--> +2518--> +2519--> +252--> +2520--> +2521--> +2522--> +2523--> +2524--> +2525--> +2526--> +2527--> +2528--> +2529--> +253--> +2530--> +2531--> +2532--> +2533--> +2534--> +2535--> +2536--> +2537--> +2538--> +2539--> +254--> +2540--> +2541--> +2542--> +2543--> +2544--> +2545--> +2546--> +2547--> +2548--> +2549--> +255--> +2550--> +2551--> +2552--> +2553--> +2554--> +2555--> +2556--> +2557--> +2558--> +2559--> +256--> +2560--> +2561--> +2562--> +2563--> +2564--> +2565--> +2566--> +2567--> +2568--> +2569--> +257--> +2570--> +2571--> +2572--> +2573--> +2574--> +2575--> +2576--> +2577--> +2578--> +2579--> +258--> +2580--> +2581--> +2582--> +2583--> +2584--> +2585--> +2586--> +2587--> +2588--> +2589--> +259--> +2590--> +2591--> +2592--> +2593--> +2594--> +2595--> +2596--> +2597--> +2598--> +2599--> +26--> +260--> +2600--> +2601--> +2602--> +2603--> +2604--> +2605--> +2606--> +2607--> +2608--> +2609--> +261--> +2610--> +2611--> +2612--> +2613--> +2614--> +2615--> +2616--> +2617--> +2618--> +2619--> +262--> +2620--> +2621--> +2622--> +2623--> +2624--> +2625--> +2626--> +2627--> +2628--> +2629--> +263--> +2630--> +2631--> +2632--> +2633--> +2634--> +2635--> +2636--> +2637--> +2638--> +2639--> +264--> +2640--> +2641--> +2642--> +2643--> +2644--> +2645--> +2646--> +2647--> +2648--> +2649--> +265--> +2650--> +2651--> +2652--> +2653--> +2654--> +2655--> +2656--> +2657--> +2658--> +2659--> +266--> +2660--> +2661--> +2662--> +2663--> +2664--> +2665--> +2666--> +2667--> +2668--> +2669--> +267--> +2670--> +2671--> +2672--> +2673--> +2674--> +2675--> +2676--> +2677--> +2678--> +2679--> +268--> +2680--> +2681--> +2682--> +2683--> +2684--> +2685--> +2686--> +2687--> +2688--> +2689--> +269--> +2690--> +2691--> +2692--> +2693--> +2694--> +2695--> +2696--> +2697--> +2698--> +2699--> +27--> +270--> +2700--> +2701--> +2702--> +2703--> +2704--> +2705--> +2706--> +2707--> +2708--> +2709--> +271--> +2710--> +2711--> +2712--> +2713--> +2714--> +2715--> +2716--> +2717--> +2718--> +2719--> +272--> +2720--> +2721--> +2722--> +2723--> +2724--> +2725--> +2726--> +2727--> +2728--> +2729--> +273--> +2730--> +2731--> +2732--> +2733--> +2734--> +2735--> +2736--> +2737--> +2738--> +2739--> +274--> +2740--> +2741--> +2742--> +2743--> +2744--> +2745--> +2746--> +2747--> +2748--> +2749--> +275--> +2750--> +2751--> +2752--> +2753--> +2754--> +2755--> +2756--> +2757--> +2758--> +2759--> +276--> +2760--> +2761--> +2762--> +2763--> +2764--> +2765--> +2766--> +2767--> +2768--> +2769--> +277--> +2770--> +2771--> +2772--> +2773--> +2774--> +2775--> +2776--> +2777--> +2778--> +2779--> +278--> +2780--> +2781--> +2782--> +2783--> +2784--> +2785--> +2786--> +2787--> +2788--> +2789--> +279--> +2790--> +2791--> +2792--> +2793--> +2794--> +2795--> +2796--> +2797--> +2798--> +2799--> +28--> +280--> +2800--> +2801--> +2802--> +2803--> +2804--> +2805--> +2806--> +2807--> +2808--> +2809--> +281--> +2810--> +2811--> +2812--> +2813--> +2814--> +2815--> +2816--> +2817--> +2818--> +2819--> +282--> +2820--> +2821--> +2822--> +2823--> +2824--> +2825--> +2826--> +2827--> +2828--> +2829--> +283--> +2830--> +2831--> +2832--> +2833--> +2834--> +2835--> +2836--> +2837--> +2838--> +2839--> +284--> +2840--> +2841--> +2842--> +2843--> +2844--> +2845--> +2846--> +2847--> +2848--> +2849--> +285--> +2850--> +2851--> +2852--> +2853--> +2854--> +2855--> +2856--> +2857--> +2858--> +2859--> +286--> +2860--> +2861--> +2862--> +2863--> +2864--> +2865--> +2866--> +2867--> +2868--> +2869--> +287--> +2870--> +2871--> +2872--> +2873--> +2874--> +2875--> +2876--> +2877--> +2878--> +2879--> +288--> +2880--> +2881--> +2882--> +2883--> +2884--> +2885--> +2886--> +2887--> +2888--> +2889--> +289--> +2890--> +2891--> +2892--> +2893--> +2894--> +2895--> +2896--> +2897--> +2898--> +2899--> +29--> +290--> +2900--> +2901--> +2902--> +2903--> +2904--> +2905--> +2906--> +2907--> +2908--> +2909--> +291--> +2910--> +2911--> +2912--> +2913--> +2914--> +2915--> +2916--> +2917--> +2918--> +2919--> +292--> +2920--> +2921--> +2922--> +2923--> +2924--> +2925--> +2926--> +2927--> +2928--> +2929--> +293--> +2930--> +2931--> +2932--> +2933--> +2934--> +2935--> +2936--> +2937--> +2938--> +2939--> +294--> +2940--> +2941--> +2942--> +2943--> +2944--> +2945--> +2946--> +2947--> +2948--> +2949--> +295--> +2950--> +2951--> +2952--> +2953--> +2954--> +2955--> +2956--> +2957--> +2958--> +2959--> +296--> +2960--> +2961--> +2962--> +2963--> +2964--> +2965--> +2966--> +2967--> +2968--> +2969--> +297--> +2970--> +2971--> +2972--> +2973--> +2974--> +2975--> +2976--> +2977--> +2978--> +2979--> +298--> +2980--> +2981--> +2982--> +2983--> +2984--> +2985--> +2986--> +2987--> +2988--> +2989--> +299--> +2990--> +2991--> +2992--> +2993--> +2994--> +2995--> +2996--> +2997--> +2998--> +2999--> +3--> +30--> +300--> +3000--> +3001--> +3002--> +3003--> +3004--> +3005--> +3006--> +3007--> +3008--> +3009--> +301--> +3010--> +3011--> +3012--> +3013--> +3014--> +3015--> +3016--> +3017--> +3018--> +3019--> +302--> +3020--> +3021--> +3022--> +3023--> +3024--> +3025--> +3026--> +3027--> +3028--> +3029--> +303--> +3030--> +3031--> +3032--> +3033--> +3034--> +3035--> +3036--> +3037--> +3038--> +3039--> +304--> +3040--> +3041--> +3042--> +3043--> +3044--> +3045--> +3046--> +3047--> +3048--> +3049--> +305--> +3050--> +3051--> +3052--> +3053--> +3054--> +3055--> +3056--> +3057--> +3058--> +3059--> +306--> +3060--> +3061--> +3062--> +3063--> +3064--> +3065--> +3066--> +3067--> +3068--> +3069--> +307--> +3070--> +3071--> +3072--> +3073--> +3074--> +3075--> +3076--> +3077--> +3078--> +3079--> +308--> +3080--> +3081--> +3082--> +3083--> +3084--> +3085--> +3086--> +3087--> +3088--> +3089--> +309--> +3090--> +3091--> +3092--> +3093--> +3094--> +3095--> +3096--> +3097--> +3098--> +3099--> +31--> +310--> +3100--> +3101--> +3102--> +3103--> +3104--> +3105--> +3106--> +3107--> +3108--> +3109--> +311--> +3110--> +3111--> +3112--> +3113--> +3114--> +3115--> +3116--> +3117--> +3118--> +3119--> +312--> +3120--> +3121--> +3122--> +3123--> +3124--> +3125--> +3126--> +3127--> +3128--> +3129--> +313--> +3130--> +3131--> +3132--> +3133--> +3134--> +3135--> +3136--> +3137--> +3138--> +3139--> +314--> +3140--> +3141--> +3142--> +3143--> +3144--> +3145--> +3146--> +3147--> +3148--> +3149--> +315--> +3150--> +3151--> +3152--> +3153--> +3154--> +3155--> +3156--> +3157--> +3158--> +3159--> +316--> +3160--> +3161--> +3162--> +3163--> +3164--> +3165--> +3166--> +3167--> +3168--> +3169--> +317--> +3170--> +3171--> +3172--> +3173--> +3174--> +3175--> +3176--> +3177--> +3178--> +3179--> +318--> +3180--> +3181--> +3182--> +3183--> +3184--> +3185--> +3186--> +3187--> +3188--> +3189--> +319--> +3190--> +3191--> +3192--> +3193--> +3194--> +3195--> +3196--> +3197--> +3198--> +3199--> +32--> +320--> +3200--> +3201--> +3202--> +3203--> +3204--> +3205--> +3206--> +3207--> +3208--> +3209--> +321--> +3210--> +3211--> +3212--> +3213--> +3214--> +3215--> +3216--> +3217--> +3218--> +3219--> +322--> +3220--> +3221--> +3222--> +3223--> +3224--> +3225--> +3226--> +3227--> +3228--> +3229--> +323--> +3230--> +3231--> +3232--> +3233--> +3234--> +3235--> +3236--> +3237--> +3238--> +3239--> +324--> +3240--> +3241--> +3242--> +3243--> +3244--> +3245--> +3246--> +3247--> +3248--> +3249--> +325--> +3250--> +3251--> +3252--> +3253--> +3254--> +3255--> +3256--> +3257--> +3258--> +3259--> +326--> +3260--> +3261--> +3262--> +3263--> +3264--> +3265--> +3266--> +3267--> +3268--> +3269--> +327--> +3270--> +3271--> +3272--> +3273--> +3274--> +3275--> +3276--> +3277--> +3278--> +3279--> +328--> +3280--> +3281--> +3282--> +3283--> +3284--> +3285--> +3286--> +3287--> +3288--> +3289--> +329--> +3290--> +3291--> +3292--> +3293--> +3294--> +3295--> +3296--> +3297--> +3298--> +3299--> +33--> +330--> +3300--> +3301--> +3302--> +3303--> +3304--> +3305--> +3306--> +3307--> +3308--> +3309--> +331--> +3310--> +3311--> +3312--> +3313--> +3314--> +3315--> +3316--> +3317--> +3318--> +3319--> +332--> +3320--> +3321--> +3322--> +3323--> +3324--> +3325--> +3326--> +3327--> +3328--> +3329--> +333--> +3330--> +3331--> +3332--> +3333--> +3334--> +3335--> +3336--> +3337--> +3338--> +3339--> +334--> +3340--> +3341--> +3342--> +3343--> +3344--> +3345--> +3346--> +3347--> +3348--> +3349--> +335--> +3350--> +3351--> +3352--> +3353--> +3354--> +3355--> +3356--> +3357--> +3358--> +3359--> +336--> +3360--> +3361--> +3362--> +3363--> +3364--> +3365--> +3366--> +3367--> +3368--> +3369--> +337--> +3370--> +3371--> +3372--> +3373--> +3374--> +3375--> +3376--> +3377--> +3378--> +3379--> +338--> +3380--> +3381--> +3382--> +3383--> +3384--> +3385--> +3386--> +3387--> +3388--> +3389--> +339--> +3390--> +3391--> +3392--> +3393--> +3394--> +3395--> +3396--> +3397--> +3398--> +3399--> +34--> +340--> +3400--> +3401--> +3402--> +3403--> +3404--> +3405--> +3406--> +3407--> +3408--> +3409--> +341--> +3410--> +3411--> +3412--> +3413--> +3414--> +3415--> +3416--> +3417--> +3418--> +3419--> +342--> +3420--> +3421--> +3422--> +3423--> +3424--> +3425--> +3426--> +3427--> +3428--> +3429--> +343--> +3430--> +3431--> +3432--> +3433--> +3434--> +3435--> +3436--> +3437--> +3438--> +3439--> +344--> +3440--> +3441--> +3442--> +3443--> +3444--> +3445--> +3446--> +3447--> +3448--> +3449--> +345--> +3450--> +3451--> +3452--> +3453--> +3454--> +3455--> +3456--> +3457--> +3458--> +3459--> +346--> +3460--> +3461--> +3462--> +3463--> +3464--> +3465--> +3466--> +3467--> +3468--> +3469--> +347--> +3470--> +3471--> +3472--> +3473--> +3474--> +3475--> +3476--> +3477--> +3478--> +3479--> +348--> +3480--> +3481--> +3482--> +3483--> +3484--> +3485--> +3486--> +3487--> +3488--> +3489--> +349--> +3490--> +3491--> +3492--> +3493--> +3494--> +3495--> +3496--> +3497--> +3498--> +3499--> +35--> +350--> +3500--> +3501--> +3502--> +3503--> +3504--> +3505--> +3506--> +3507--> +3508--> +3509--> +351--> +3510--> +3511--> +3512--> +3513--> +3514--> +3515--> +3516--> +3517--> +3518--> +3519--> +352--> +3520--> +3521--> +3522--> +3523--> +3524--> +3525--> +3526--> +3527--> +3528--> +3529--> +353--> +3530--> +3531--> +3532--> +3533--> +3534--> +3535--> +3536--> +3537--> +3538--> +3539--> +354--> +3540--> +3541--> +3542--> +3543--> +3544--> +3545--> +3546--> +3547--> +3548--> +3549--> +355--> +3550--> +3551--> +3552--> +3553--> +3554--> +3555--> +3556--> +3557--> +3558--> +3559--> +356--> +3560--> +3561--> +3562--> +3563--> +3564--> +3565--> +3566--> +3567--> +3568--> +3569--> +357--> +3570--> +3571--> +3572--> +3573--> +3574--> +3575--> +3576--> +3577--> +3578--> +3579--> +358--> +3580--> +3581--> +3582--> +3583--> +3584--> +3585--> +3586--> +3587--> +3588--> +3589--> +359--> +3590--> +3591--> +3592--> +3593--> +3594--> +3595--> +3596--> +3597--> +3598--> +3599--> +36--> +360--> +3600--> +3601--> +3602--> +3603--> +3604--> +3605--> +3606--> +3607--> +3608--> +3609--> +361--> +3610--> +3611--> +3612--> +3613--> +3614--> +3615--> +3616--> +3617--> +3618--> +3619--> +362--> +3620--> +3621--> +3622--> +3623--> +3624--> +3625--> +3626--> +3627--> +3628--> +3629--> +363--> +3630--> +3631--> +3632--> +3633--> +3634--> +3635--> +3636--> +3637--> +3638--> +3639--> +364--> +3640--> +3641--> +3642--> +3643--> +3644--> +3645--> +3646--> +3647--> +3648--> +3649--> +365--> +3650--> +3651--> +3652--> +3653--> +3654--> +3655--> +3656--> +3657--> +3658--> +3659--> +366--> +3660--> +3661--> +3662--> +3663--> +3664--> +3665--> +3666--> +3667--> +3668--> +3669--> +367--> +3670--> +3671--> +3672--> +3673--> +3674--> +3675--> +3676--> +3677--> +3678--> +3679--> +368--> +3680--> +3681--> +3682--> +3683--> +3684--> +3685--> +3686--> +3687--> +3688--> +3689--> +369--> +3690--> +3691--> +3692--> +3693--> +3694--> +3695--> +3696--> +3697--> +3698--> +3699--> +37--> +370--> +3700--> +3701--> +3702--> +3703--> +3704--> +3705--> +3706--> +3707--> +3708--> +3709--> +371--> +3710--> +3711--> +3712--> +3713--> +3714--> +3715--> +3716--> +3717--> +3718--> +3719--> +372--> +3720--> +3721--> +3722--> +3723--> +3724--> +3725--> +3726--> +3727--> +3728--> +3729--> +373--> +3730--> +3731--> +3732--> +3733--> +3734--> +3735--> +3736--> +3737--> +3738--> +3739--> +374--> +3740--> +3741--> +3742--> +3743--> +3744--> +3745--> +3746--> +3747--> +3748--> +3749--> +375--> +3750--> +3751--> +3752--> +3753--> +3754--> +3755--> +3756--> +3757--> +3758--> +3759--> +376--> +3760--> +3761--> +3762--> +3763--> +3764--> +3765--> +3766--> +3767--> +3768--> +3769--> +377--> +3770--> +3771--> +3772--> +3773--> +3774--> +3775--> +3776--> +3777--> +3778--> +3779--> +378--> +3780--> +3781--> +3782--> +3783--> +3784--> +3785--> +3786--> +3787--> +3788--> +3789--> +379--> +3790--> +3791--> +3792--> +3793--> +3794--> +3795--> +3796--> +3797--> +3798--> +3799--> +38--> +380--> +3800--> +3801--> +3802--> +3803--> +3804--> +3805--> +3806--> +3807--> +3808--> +3809--> +381--> +3810--> +3811--> +3812--> +3813--> +3814--> +3815--> +3816--> +3817--> +3818--> +3819--> +382--> +3820--> +3821--> +3822--> +3823--> +3824--> +3825--> +3826--> +3827--> +3828--> +3829--> +383--> +3830--> +3831--> +3832--> +3833--> +3834--> +3835--> +3836--> +3837--> +3838--> +3839--> +384--> +3840--> +3841--> +3842--> +3843--> +3844--> +3845--> +3846--> +3847--> +3848--> +3849--> +385--> +3850--> +3851--> +3852--> +3853--> +3854--> +3855--> +3856--> +3857--> +3858--> +3859--> +386--> +3860--> +3861--> +3862--> +3863--> +3864--> +3865--> +3866--> +3867--> +3868--> +3869--> +387--> +3870--> +3871--> +3872--> +3873--> +3874--> +3875--> +3876--> +3877--> +3878--> +3879--> +388--> +3880--> +3881--> +3882--> +3883--> +3884--> +3885--> +3886--> +3887--> +3888--> +3889--> +389--> +3890--> +3891--> +3892--> +3893--> +3894--> +3895--> +3896--> +3897--> +3898--> +3899--> +39--> +390--> +3900--> +3901--> +3902--> +3903--> +3904--> +3905--> +3906--> +3907--> +3908--> +3909--> +391--> +3910--> +3911--> +3912--> +3913--> +3914--> +3915--> +3916--> +3917--> +3918--> +3919--> +392--> +3920--> +3921--> +3922--> +3923--> +3924--> +3925--> +3926--> +3927--> +3928--> +3929--> +393--> +3930--> +3931--> +3932--> +3933--> +3934--> +3935--> +3936--> +3937--> +3938--> +3939--> +394--> +3940--> +3941--> +3942--> +3943--> +3944--> +3945--> +3946--> +3947--> +3948--> +3949--> +395--> +3950--> +3951--> +3952--> +3953--> +3954--> +3955--> +3956--> +3957--> +3958--> +3959--> +396--> +3960--> +3961--> +3962--> +3963--> +3964--> +3965--> +3966--> +3967--> +3968--> +3969--> +397--> +3970--> +3971--> +3972--> +3973--> +3974--> +3975--> +3976--> +3977--> +3978--> +3979--> +398--> +3980--> +3981--> +3982--> +3983--> +3984--> +3985--> +3986--> +3987--> +3988--> +3989--> +399--> +3990--> +3991--> +3992--> +3993--> +3994--> +3995--> +3996--> +3997--> +3998--> +3999--> +4--> +40--> +400--> +4000--> +4001--> +4002--> +4003--> +4004--> +4005--> +4006--> +4007--> +4008--> +4009--> +401--> +4010--> +4011--> +4012--> +4013--> +4014--> +4015--> +4016--> +4017--> +4018--> +4019--> +402--> +4020--> +4021--> +4022--> +4023--> +4024--> +4025--> +4026--> +4027--> +4028--> +4029--> +403--> +4030--> +4031--> +4032--> +4033--> +4034--> +4035--> +4036--> +4037--> +4038--> +4039--> +404--> +4040--> +4041--> +4042--> +4043--> +4044--> +4045--> +4046--> +4047--> +4048--> +4049--> +405--> +4050--> +4051--> +4052--> +4053--> +4054--> +4055--> +4056--> +4057--> +4058--> +4059--> +406--> +4060--> +4061--> +4062--> +4063--> +4064--> +4065--> +4066--> +4067--> +4068--> +4069--> +407--> +4070--> +4071--> +4072--> +4073--> +4074--> +4075--> +4076--> +4077--> +4078--> +4079--> +408--> +4080--> +4081--> +4082--> +4083--> +4084--> +4085--> +4086--> +4087--> +4088--> +4089--> +409--> +4090--> +4091--> +4092--> +4093--> +4094--> +4095--> +4096--> +4097--> +4098--> +4099--> +41--> +410--> +4100--> +4101--> +4102--> +4103--> +4104--> +4105--> +4106--> +4107--> +4108--> +4109--> +411--> +4110--> +4111--> +4112--> +4113--> +4114--> +4115--> +4116--> +4117--> +4118--> +4119--> +412--> +4120--> +4121--> +4122--> +4123--> +4124--> +4125--> +4126--> +4127--> +4128--> +4129--> +413--> +4130--> +4131--> +4132--> +4133--> +4134--> +4135--> +4136--> +4137--> +4138--> +4139--> +414--> +4140--> +4141--> +4142--> +4143--> +4144--> +4145--> +4146--> +4147--> +4148--> +4149--> +415--> +4150--> +4151--> +4152--> +4153--> +4154--> +4155--> +4156--> +4157--> +4158--> +4159--> +416--> +4160--> +4161--> +4162--> +4163--> +4164--> +4165--> +4166--> +4167--> +4168--> +4169--> +417--> +4170--> +4171--> +4172--> +4173--> +4174--> +4175--> +4176--> +4177--> +4178--> +4179--> +418--> +4180--> +4181--> +4182--> +4183--> +4184--> +4185--> +4186--> +4187--> +4188--> +4189--> +419--> +4190--> +4191--> +4192--> +4193--> +4194--> +4195--> +4196--> +4197--> +4198--> +4199--> +42--> +420--> +4200--> +4201--> +4202--> +4203--> +4204--> +4205--> +4206--> +4207--> +4208--> +4209--> +421--> +4210--> +4211--> +4212--> +4213--> +4214--> +4215--> +4216--> +4217--> +4218--> +4219--> +422--> +4220--> +4221--> +4222--> +4223--> +4224--> +4225--> +4226--> +4227--> +4228--> +4229--> +423--> +4230--> +4231--> +4232--> +4233--> +4234--> +4235--> +4236--> +4237--> +4238--> +4239--> +424--> +4240--> +4241--> +4242--> +4243--> +4244--> +4245--> +4246--> +4247--> +4248--> +4249--> +425--> +4250--> +4251--> +4252--> +4253--> +4254--> +4255--> +4256--> +4257--> +4258--> +4259--> +426--> +4260--> +4261--> +4262--> +4263--> +4264--> +4265--> +4266--> +4267--> +4268--> +4269--> +427--> +4270--> +4271--> +4272--> +4273--> +4274--> +4275--> +4276--> +4277--> +4278--> +4279--> +428--> +4280--> +4281--> +4282--> +4283--> +4284--> +4285--> +4286--> +4287--> +4288--> +4289--> +429--> +4290--> +4291--> +4292--> +4293--> +4294--> +4295--> +4296--> +4297--> +4298--> +4299--> +43--> +430--> +4300--> +4301--> +4302--> +4303--> +4304--> +4305--> +4306--> +4307--> +4308--> +4309--> +431--> +4310--> +4311--> +4312--> +4313--> +4314--> +4315--> +4316--> +4317--> +4318--> +4319--> +432--> +4320--> +4321--> +4322--> +4323--> +4324--> +4325--> +4326--> +4327--> +4328--> +4329--> +433--> +4330--> +4331--> +4332--> +4333--> +4334--> +4335--> +4336--> +4337--> +4338--> +4339--> +434--> +4340--> +4341--> +4342--> +4343--> +4344--> +4345--> +4346--> +4347--> +4348--> +4349--> +435--> +4350--> +4351--> +4352--> +4353--> +4354--> +4355--> +4356--> +4357--> +4358--> +4359--> +436--> +4360--> +4361--> +4362--> +4363--> +4364--> +4365--> +4366--> +4367--> +4368--> +4369--> +437--> +4370--> +4371--> +4372--> +4373--> +4374--> +4375--> +4376--> +4377--> +4378--> +4379--> +438--> +4380--> +4381--> +4382--> +4383--> +4384--> +4385--> +4386--> +4387--> +4388--> +4389--> +439--> +4390--> +4391--> +4392--> +4393--> +4394--> +4395--> +4396--> +4397--> +4398--> +4399--> +44--> +440--> +4400--> +4401--> +4402--> +4403--> +4404--> +4405--> +4406--> +4407--> +4408--> +4409--> +441--> +4410--> +4411--> +4412--> +4413--> +4414--> +4415--> +4416--> +4417--> +4418--> +4419--> +442--> +4420--> +4421--> +4422--> +4423--> +4424--> +4425--> +4426--> +4427--> +4428--> +4429--> +443--> +4430--> +4431--> +4432--> +4433--> +4434--> +4435--> +4436--> +4437--> +4438--> +4439--> +444--> +4440--> +4441--> +4442--> +4443--> +4444--> +4445--> +4446--> +4447--> +4448--> +4449--> +445--> +4450--> +4451--> +4452--> +4453--> +4454--> +4455--> +4456--> +4457--> +4458--> +4459--> +446--> +4460--> +4461--> +4462--> +4463--> +4464--> +4465--> +4466--> +4467--> +4468--> +4469--> +447--> +4470--> +4471--> +4472--> +4473--> +4474--> +4475--> +4476--> +4477--> +4478--> +4479--> +448--> +4480--> +4481--> +4482--> +4483--> +4484--> +4485--> +4486--> +4487--> +4488--> +4489--> +449--> +4490--> +4491--> +4492--> +4493--> +4494--> +4495--> +4496--> +4497--> +4498--> +4499--> +45--> +450--> +4500--> +4501--> +4502--> +4503--> +4504--> +4505--> +4506--> +4507--> +4508--> +4509--> +451--> +4510--> +4511--> +4512--> +4513--> +4514--> +4515--> +4516--> +4517--> +4518--> +4519--> +452--> +4520--> +4521--> +4522--> +4523--> +4524--> +4525--> +4526--> +4527--> +4528--> +4529--> +453--> +4530--> +4531--> +4532--> +4533--> +4534--> +4535--> +4536--> +4537--> +4538--> +4539--> +454--> +4540--> +4541--> +4542--> +4543--> +4544--> +4545--> +4546--> +4547--> +4548--> +4549--> +455--> +4550--> +4551--> +4552--> +4553--> +4554--> +4555--> +4556--> +4557--> +4558--> +4559--> +456--> +4560--> +4561--> +4562--> +4563--> +4564--> +4565--> +4566--> +4567--> +4568--> +4569--> +457--> +4570--> +4571--> +4572--> +4573--> +4574--> +4575--> +4576--> +4577--> +4578--> +4579--> +458--> +4580--> +4581--> +4582--> +4583--> +4584--> +4585--> +4586--> +4587--> +4588--> +4589--> +459--> +4590--> +4591--> +4592--> +4593--> +4594--> +4595--> +4596--> +4597--> +4598--> +4599--> +46--> +460--> +4600--> +4601--> +4602--> +4603--> +4604--> +4605--> +4606--> +4607--> +4608--> +4609--> +461--> +4610--> +4611--> +4612--> +4613--> +4614--> +4615--> +4616--> +4617--> +4618--> +4619--> +462--> +4620--> +4621--> +4622--> +4623--> +4624--> +4625--> +4626--> +4627--> +4628--> +4629--> +463--> +4630--> +4631--> +4632--> +4633--> +4634--> +4635--> +4636--> +4637--> +4638--> +4639--> +464--> +4640--> +4641--> +4642--> +4643--> +4644--> +4645--> +4646--> +4647--> +4648--> +4649--> +465--> +4650--> +4651--> +4652--> +4653--> +4654--> +4655--> +4656--> +4657--> +4658--> +4659--> +466--> +4660--> +4661--> +4662--> +4663--> +4664--> +4665--> +4666--> +4667--> +4668--> +4669--> +467--> +4670--> +4671--> +4672--> +4673--> +4674--> +4675--> +4676--> +4677--> +4678--> +4679--> +468--> +4680--> +4681--> +4682--> +4683--> +4684--> +4685--> +4686--> +4687--> +4688--> +4689--> +469--> +4690--> +4691--> +4692--> +4693--> +4694--> +4695--> +4696--> +4697--> +4698--> +4699--> +47--> +470--> +4700--> +4701--> +4702--> +4703--> +4704--> +4705--> +4706--> +4707--> +4708--> +4709--> +471--> +4710--> +4711--> +4712--> +4713--> +4714--> +4715--> +4716--> +4717--> +4718--> +4719--> +472--> +4720--> +4721--> +4722--> +4723--> +4724--> +4725--> +4726--> +4727--> +4728--> +4729--> +473--> +4730--> +4731--> +4732--> +4733--> +4734--> +4735--> +4736--> +4737--> +4738--> +4739--> +474--> +4740--> +4741--> +4742--> +4743--> +4744--> +4745--> +4746--> +4747--> +4748--> +4749--> +475--> +4750--> +4751--> +4752--> +4753--> +4754--> +4755--> +4756--> +4757--> +4758--> +4759--> +476--> +4760--> +4761--> +4762--> +4763--> +4764--> +4765--> +4766--> +4767--> +4768--> +4769--> +477--> +4770--> +4771--> +4772--> +4773--> +4774--> +4775--> +4776--> +4777--> +4778--> +4779--> +478--> +4780--> +4781--> +4782--> +4783--> +4784--> +4785--> +4786--> +4787--> +4788--> +4789--> +479--> +4790--> +4791--> +4792--> +4793--> +4794--> +4795--> +4796--> +4797--> +4798--> +4799--> +48--> +480--> +4800--> +4801--> +4802--> +4803--> +4804--> +4805--> +4806--> +4807--> +4808--> +4809--> +481--> +4810--> +4811--> +4812--> +4813--> +4814--> +4815--> +4816--> +4817--> +4818--> +4819--> +482--> +4820--> +4821--> +4822--> +4823--> +4824--> +4825--> +4826--> +4827--> +4828--> +4829--> +483--> +4830--> +4831--> +4832--> +4833--> +4834--> +4835--> +4836--> +4837--> +4838--> +4839--> +484--> +4840--> +4841--> +4842--> +4843--> +4844--> +4845--> +4846--> +4847--> +4848--> +4849--> +485--> +4850--> +4851--> +4852--> +4853--> +4854--> +4855--> +4856--> +4857--> +4858--> +4859--> +486--> +4860--> +4861--> +4862--> +4863--> +4864--> +4865--> +4866--> +4867--> +4868--> +4869--> +487--> +4870--> +4871--> +4872--> +4873--> +4874--> +4875--> +4876--> +4877--> +4878--> +4879--> +488--> +4880--> +4881--> +4882--> +4883--> +4884--> +4885--> +4886--> +4887--> +4888--> +4889--> +489--> +4890--> +4891--> +4892--> +4893--> +4894--> +4895--> +4896--> +4897--> +4898--> +4899--> +49--> +490--> +4900--> +4901--> +4902--> +4903--> +4904--> +4905--> +4906--> +4907--> +4908--> +4909--> +491--> +4910--> +4911--> +4912--> +4913--> +4914--> +4915--> +4916--> +4917--> +4918--> +4919--> +492--> +4920--> +4921--> +4922--> +4923--> +4924--> +4925--> +4926--> +4927--> +4928--> +4929--> +493--> +4930--> +4931--> +4932--> +4933--> +4934--> +4935--> +4936--> +4937--> +4938--> +4939--> +494--> +4940--> +4941--> +4942--> +4943--> +4944--> +4945--> +4946--> +4947--> +4948--> +4949--> +495--> +4950--> +4951--> +4952--> +4953--> +4954--> +4955--> +4956--> +4957--> +4958--> +4959--> +496--> +4960--> +4961--> +4962--> +4963--> +4964--> +4965--> +4966--> +4967--> +4968--> +4969--> +497--> +4970--> +4971--> +4972--> +4973--> +4974--> +4975--> +4976--> +4977--> +4978--> +4979--> +498--> +4980--> +4981--> +4982--> +4983--> +4984--> +4985--> +4986--> +4987--> +4988--> +4989--> +499--> +4990--> +4991--> +4992--> +4993--> +4994--> +4995--> +4996--> +4997--> +4998--> +4999--> +5--> +50--> +500--> +5000--> +5001--> +5002--> +5003--> +5004--> +5005--> +5006--> +5007--> +5008--> +5009--> +501--> +5010--> +5011--> +5012--> +5013--> +5014--> +5015--> +5016--> +5017--> +5018--> +5019--> +502--> +5020--> +5021--> +5022--> +5023--> +5024--> +5025--> +5026--> +5027--> +5028--> +5029--> +503--> +5030--> +5031--> +5032--> +5033--> +5034--> +5035--> +5036--> +5037--> +5038--> +5039--> +504--> +5040--> +5041--> +5042--> +5043--> +5044--> +5045--> +5046--> +5047--> +5048--> +5049--> +505--> +5050--> +5051--> +5052--> +5053--> +5054--> +5055--> +5056--> +5057--> +5058--> +5059--> +506--> +5060--> +5061--> +5062--> +5063--> +5064--> +5065--> +5066--> +5067--> +5068--> +5069--> +507--> +5070--> +5071--> +5072--> +5073--> +5074--> +5075--> +5076--> +5077--> +5078--> +5079--> +508--> +5080--> +5081--> +5082--> +5083--> +5084--> +5085--> +5086--> +5087--> +5088--> +5089--> +509--> +5090--> +5091--> +5092--> +5093--> +5094--> +5095--> +5096--> +5097--> +5098--> +5099--> +51--> +510--> +5100--> +5101--> +5102--> +5103--> +5104--> +5105--> +5106--> +5107--> +5108--> +5109--> +511--> +5110--> +5111--> +5112--> +5113--> +5114--> +5115--> +5116--> +5117--> +5118--> +5119--> +512--> +5120--> +5121--> +5122--> +5123--> +5124--> +5125--> +5126--> +5127--> +5128--> +5129--> +513--> +5130--> +5131--> +5132--> +5133--> +5134--> +5135--> +5136--> +5137--> +5138--> +5139--> +514--> +5140--> +5141--> +5142--> +5143--> +5144--> +5145--> +5146--> +5147--> +5148--> +5149--> +515--> +5150--> +5151--> +5152--> +5153--> +5154--> +5155--> +5156--> +5157--> +5158--> +5159--> +516--> +5160--> +5161--> +5162--> +5163--> +5164--> +5165--> +5166--> +5167--> +5168--> +5169--> +517--> +5170--> +5171--> +5172--> +5173--> +5174--> +5175--> +5176--> +5177--> +5178--> +5179--> +518--> +5180--> +5181--> +5182--> +5183--> +5184--> +5185--> +5186--> +5187--> +5188--> +5189--> +519--> +5190--> +5191--> +5192--> +5193--> +5194--> +5195--> +5196--> +5197--> +5198--> +5199--> +52--> +520--> +5200--> +5201--> +5202--> +5203--> +5204--> +5205--> +5206--> +5207--> +5208--> +5209--> +521--> +5210--> +5211--> +5212--> +5213--> +5214--> +5215--> +5216--> +5217--> +5218--> +5219--> +522--> +5220--> +5221--> +5222--> +5223--> +5224--> +5225--> +5226--> +5227--> +5228--> +5229--> +523--> +5230--> +5231--> +5232--> +5233--> +5234--> +5235--> +5236--> +5237--> +5238--> +5239--> +524--> +5240--> +5241--> +5242--> +5243--> +5244--> +5245--> +5246--> +5247--> +5248--> +5249--> +525--> +5250--> +5251--> +5252--> +5253--> +5254--> +5255--> +5256--> +5257--> +5258--> +5259--> +526--> +5260--> +5261--> +5262--> +5263--> +5264--> +5265--> +5266--> +5267--> +5268--> +5269--> +527--> +5270--> +5271--> +5272--> +5273--> +5274--> +5275--> +5276--> +5277--> +5278--> +5279--> +528--> +5280--> +5281--> +5282--> +5283--> +5284--> +5285--> +5286--> +5287--> +5288--> +5289--> +529--> +5290--> +5291--> +5292--> +5293--> +5294--> +5295--> +5296--> +5297--> +5298--> +5299--> +53--> +530--> +5300--> +5301--> +5302--> +5303--> +5304--> +5305--> +5306--> +5307--> +5308--> +5309--> +531--> +5310--> +5311--> +5312--> +5313--> +5314--> +5315--> +5316--> +5317--> +5318--> +5319--> +532--> +5320--> +5321--> +5322--> +5323--> +5324--> +5325--> +5326--> +5327--> +5328--> +5329--> +533--> +5330--> +5331--> +5332--> +5333--> +5334--> +5335--> +5336--> +5337--> +5338--> +5339--> +534--> +5340--> +5341--> +5342--> +5343--> +5344--> +5345--> +5346--> +5347--> +5348--> +5349--> +535--> +5350--> +5351--> +5352--> +5353--> +5354--> +5355--> +5356--> +5357--> +5358--> +5359--> +536--> +5360--> +5361--> +5362--> +5363--> +5364--> +5365--> +5366--> +5367--> +5368--> +5369--> +537--> +5370--> +5371--> +5372--> +5373--> +5374--> +5375--> +5376--> +5377--> +5378--> +5379--> +538--> +5380--> +5381--> +5382--> +5383--> +5384--> +5385--> +5386--> +5387--> +5388--> +5389--> +539--> +5390--> +5391--> +5392--> +5393--> +5394--> +5395--> +5396--> +5397--> +5398--> +5399--> +54--> +540--> +5400--> +5401--> +5402--> +5403--> +5404--> +5405--> +5406--> +5407--> +5408--> +5409--> +541--> +5410--> +5411--> +5412--> +5413--> +5414--> +5415--> +5416--> +5417--> +5418--> +5419--> +542--> +5420--> +5421--> +5422--> +5423--> +5424--> +5425--> +5426--> +5427--> +5428--> +5429--> +543--> +5430--> +5431--> +5432--> +5433--> +5434--> +5435--> +5436--> +5437--> +5438--> +5439--> +544--> +5440--> +5441--> +5442--> +5443--> +5444--> +5445--> +5446--> +5447--> +5448--> +5449--> +545--> +5450--> +5451--> +5452--> +5453--> +5454--> +5455--> +5456--> +5457--> +5458--> +5459--> +546--> +5460--> +5461--> +5462--> +5463--> +5464--> +5465--> +5466--> +5467--> +5468--> +5469--> +547--> +5470--> +5471--> +5472--> +5473--> +5474--> +5475--> +5476--> +5477--> +5478--> +5479--> +548--> +5480--> +5481--> +5482--> +5483--> +5484--> +5485--> +5486--> +5487--> +5488--> +5489--> +549--> +5490--> +5491--> +5492--> +5493--> +5494--> +5495--> +5496--> +5497--> +5498--> +5499--> +55--> +550--> +5500--> +5501--> +5502--> +5503--> +5504--> +5505--> +5506--> +5507--> +5508--> +5509--> +551--> +5510--> +5511--> +5512--> +5513--> +5514--> +5515--> +5516--> +5517--> +5518--> +5519--> +552--> +5520--> +5521--> +5522--> +5523--> +5524--> +5525--> +5526--> +5527--> +5528--> +5529--> +553--> +5530--> +5531--> +5532--> +5533--> +5534--> +5535--> +5536--> +5537--> +5538--> +5539--> +554--> +5540--> +5541--> +5542--> +5543--> +5544--> +5545--> +5546--> +5547--> +5548--> +5549--> +555--> +5550--> +5551--> +5552--> +5553--> +5554--> +5555--> +5556--> +5557--> +5558--> +5559--> +556--> +5560--> +5561--> +5562--> +5563--> +5564--> +5565--> +5566--> +5567--> +5568--> +5569--> +557--> +5570--> +5571--> +5572--> +5573--> +5574--> +5575--> +5576--> +5577--> +5578--> +5579--> +558--> +5580--> +5581--> +5582--> +5583--> +5584--> +5585--> +5586--> +5587--> +5588--> +5589--> +559--> +5590--> +5591--> +5592--> +5593--> +5594--> +5595--> +5596--> +5597--> +5598--> +5599--> +56--> +560--> +5600--> +5601--> +5602--> +5603--> +5604--> +5605--> +5606--> +5607--> +5608--> +5609--> +561--> +5610--> +5611--> +5612--> +5613--> +5614--> +5615--> +5616--> +5617--> +5618--> +5619--> +562--> +5620--> +5621--> +5622--> +5623--> +5624--> +5625--> +5626--> +5627--> +5628--> +5629--> +563--> +5630--> +5631--> +5632--> +5633--> +5634--> +5635--> +5636--> +5637--> +5638--> +5639--> +564--> +5640--> +5641--> +5642--> +5643--> +5644--> +5645--> +5646--> +5647--> +5648--> +5649--> +565--> +5650--> +5651--> +5652--> +5653--> +5654--> +5655--> +5656--> +5657--> +5658--> +5659--> +566--> +5660--> +5661--> +5662--> +5663--> +5664--> +5665--> +5666--> +5667--> +5668--> +5669--> +567--> +5670--> +5671--> +5672--> +5673--> +5674--> +5675--> +5676--> +5677--> +5678--> +5679--> +568--> +5680--> +5681--> +5682--> +5683--> +5684--> +5685--> +5686--> +5687--> +5688--> +5689--> +569--> +5690--> +5691--> +5692--> +5693--> +5694--> +5695--> +5696--> +5697--> +5698--> +5699--> +57--> +570--> +5700--> +5701--> +5702--> +5703--> +5704--> +5705--> +5706--> +5707--> +5708--> +5709--> +571--> +5710--> +5711--> +5712--> +5713--> +5714--> +5715--> +5716--> +5717--> +5718--> +5719--> +572--> +5720--> +5721--> +5722--> +5723--> +5724--> +5725--> +5726--> +5727--> +5728--> +5729--> +573--> +5730--> +5731--> +5732--> +5733--> +5734--> +5735--> +5736--> +5737--> +5738--> +5739--> +574--> +5740--> +5741--> +5742--> +5743--> +5744--> +5745--> +5746--> +5747--> +5748--> +5749--> +575--> +5750--> +5751--> +5752--> +5753--> +5754--> +5755--> +5756--> +5757--> +5758--> +5759--> +576--> +5760--> +5761--> +5762--> +5763--> +5764--> +5765--> +5766--> +5767--> +5768--> +5769--> +577--> +5770--> +5771--> +5772--> +5773--> +5774--> +5775--> +5776--> +5777--> +5778--> +5779--> +578--> +5780--> +5781--> +5782--> +5783--> +5784--> +5785--> +5786--> +5787--> +5788--> +5789--> +579--> +5790--> +5791--> +5792--> +5793--> +5794--> +5795--> +5796--> +5797--> +5798--> +5799--> +58--> +580--> +5800--> +5801--> +5802--> +5803--> +5804--> +5805--> +5806--> +5807--> +5808--> +5809--> +581--> +5810--> +5811--> +5812--> +5813--> +5814--> +5815--> +5816--> +5817--> +5818--> +5819--> +582--> +5820--> +5821--> +5822--> +5823--> +5824--> +5825--> +5826--> +5827--> +5828--> +5829--> +583--> +5830--> +5831--> +5832--> +5833--> +5834--> +5835--> +5836--> +5837--> +5838--> +5839--> +584--> +5840--> +5841--> +5842--> +5843--> +5844--> +5845--> +5846--> +5847--> +5848--> +5849--> +585--> +5850--> +5851--> +5852--> +5853--> +5854--> +5855--> +5856--> +5857--> +5858--> +5859--> +586--> +5860--> +5861--> +5862--> +5863--> +5864--> +5865--> +5866--> +5867--> +5868--> +5869--> +587--> +5870--> +5871--> +5872--> +5873--> +5874--> +5875--> +5876--> +5877--> +5878--> +5879--> +588--> +5880--> +5881--> +5882--> +5883--> +5884--> +5885--> +5886--> +5887--> +5888--> +5889--> +589--> +5890--> +5891--> +5892--> +5893--> +5894--> +5895--> +5896--> +5897--> +5898--> +5899--> +59--> +590--> +5900--> +5901--> +5902--> +5903--> +5904--> +5905--> +5906--> +5907--> +5908--> +5909--> +591--> +5910--> +5911--> +5912--> +5913--> +5914--> +5915--> +5916--> +5917--> +5918--> +5919--> +592--> +5920--> +5921--> +5922--> +5923--> +5924--> +5925--> +5926--> +5927--> +5928--> +5929--> +593--> +5930--> +5931--> +5932--> +5933--> +5934--> +5935--> +5936--> +5937--> +5938--> +5939--> +594--> +5940--> +5941--> +5942--> +5943--> +5944--> +5945--> +5946--> +5947--> +5948--> +5949--> +595--> +5950--> +5951--> +5952--> +5953--> +5954--> +5955--> +5956--> +5957--> +5958--> +5959--> +596--> +5960--> +5961--> +5962--> +5963--> +5964--> +5965--> +5966--> +5967--> +5968--> +5969--> +597--> +5970--> +5971--> +5972--> +5973--> +5974--> +5975--> +5976--> +5977--> +5978--> +5979--> +598--> +5980--> +5981--> +5982--> +5983--> +5984--> +5985--> +5986--> +5987--> +5988--> +5989--> +599--> +5990--> +5991--> +5992--> +5993--> +5994--> +5995--> +5996--> +5997--> +5998--> +5999--> +6--> +60--> +600--> +6000--> +6001--> +6002--> +6003--> +6004--> +6005--> +6006--> +6007--> +6008--> +6009--> +601--> +6010--> +6011--> +6012--> +6013--> +6014--> +6015--> +6016--> +6017--> +6018--> +6019--> +602--> +6020--> +6021--> +6022--> +6023--> +6024--> +6025--> +6026--> +6027--> +6028--> +6029--> +603--> +6030--> +6031--> +6032--> +6033--> +6034--> +6035--> +6036--> +6037--> +6038--> +6039--> +604--> +6040--> +6041--> +6042--> +6043--> +6044--> +6045--> +6046--> +6047--> +6048--> +6049--> +605--> +6050--> +6051--> +6052--> +6053--> +6054--> +6055--> +6056--> +6057--> +6058--> +6059--> +606--> +6060--> +6061--> +6062--> +6063--> +6064--> +6065--> +6066--> +6067--> +6068--> +6069--> +607--> +6070--> +6071--> +6072--> +6073--> +6074--> +6075--> +6076--> +6077--> +6078--> +6079--> +608--> +6080--> +6081--> +6082--> +6083--> +6084--> +6085--> +6086--> +6087--> +6088--> +6089--> +609--> +6090--> +6091--> +6092--> +6093--> +6094--> +6095--> +6096--> +6097--> +6098--> +6099--> +61--> +610--> +6100--> +6101--> +6102--> +6103--> +6104--> +6105--> +6106--> +6107--> +6108--> +6109--> +611--> +6110--> +6111--> +6112--> +6113--> +6114--> +6115--> +6116--> +6117--> +6118--> +6119--> +612--> +6120--> +6121--> +6122--> +6123--> +6124--> +6125--> +6126--> +6127--> +6128--> +6129--> +613--> +6130--> +6131--> +6132--> +6133--> +6134--> +6135--> +6136--> +6137--> +6138--> +6139--> +614--> +6140--> +6141--> +6142--> +6143--> +6144--> +6145--> +6146--> +6147--> +6148--> +6149--> +615--> +6150--> +6151--> +6152--> +6153--> +6154--> +6155--> +6156--> +6157--> +6158--> +6159--> +616--> +6160--> +6161--> +6162--> +6163--> +6164--> +6165--> +6166--> +6167--> +6168--> +6169--> +617--> +6170--> +6171--> +6172--> +6173--> +6174--> +6175--> +6176--> +6177--> +6178--> +6179--> +618--> +6180--> +6181--> +6182--> +6183--> +6184--> +6185--> +6186--> +6187--> +6188--> +6189--> +619--> +6190--> +6191--> +6192--> +6193--> +6194--> +6195--> +6196--> +6197--> +6198--> +6199--> +62--> +620--> +6200--> +6201--> +6202--> +6203--> +6204--> +6205--> +6206--> +6207--> +6208--> +6209--> +621--> +6210--> +6211--> +6212--> +6213--> +6214--> +6215--> +6216--> +6217--> +6218--> +6219--> +622--> +6220--> +6221--> +6222--> +6223--> +6224--> +6225--> +6226--> +6227--> +6228--> +6229--> +623--> +6230--> +6231--> +6232--> +6233--> +6234--> +6235--> +6236--> +6237--> +6238--> +6239--> +624--> +6240--> +6241--> +6242--> +6243--> +6244--> +6245--> +6246--> +6247--> +6248--> +6249--> +625--> +6250--> +6251--> +6252--> +6253--> +6254--> +6255--> +6256--> +6257--> +6258--> +6259--> +626--> +6260--> +6261--> +6262--> +6263--> +6264--> +6265--> +6266--> +6267--> +6268--> +6269--> +627--> +6270--> +6271--> +6272--> +6273--> +6274--> +6275--> +6276--> +6277--> +6278--> +6279--> +628--> +6280--> +6281--> +6282--> +6283--> +6284--> +6285--> +6286--> +6287--> +6288--> +6289--> +629--> +6290--> +6291--> +6292--> +6293--> +6294--> +6295--> +6296--> +6297--> +6298--> +6299--> +63--> +630--> +6300--> +6301--> +6302--> +6303--> +6304--> +6305--> +6306--> +6307--> +6308--> +6309--> +631--> +6310--> +6311--> +6312--> +6313--> +6314--> +6315--> +6316--> +6317--> +6318--> +6319--> +632--> +6320--> +6321--> +6322--> +6323--> +6324--> +6325--> +6326--> +6327--> +6328--> +6329--> +633--> +6330--> +6331--> +6332--> +6333--> +6334--> +6335--> +6336--> +6337--> +6338--> +6339--> +634--> +6340--> +6341--> +6342--> +6343--> +6344--> +6345--> +6346--> +6347--> +6348--> +6349--> +635--> +6350--> +6351--> +6352--> +6353--> +6354--> +6355--> +6356--> +6357--> +6358--> +6359--> +636--> +6360--> +6361--> +6362--> +6363--> +6364--> +6365--> +6366--> +6367--> +6368--> +6369--> +637--> +6370--> +6371--> +6372--> +6373--> +6374--> +6375--> +6376--> +6377--> +6378--> +6379--> +638--> +6380--> +6381--> +6382--> +6383--> +6384--> +6385--> +6386--> +6387--> +6388--> +6389--> +639--> +6390--> +6391--> +6392--> +6393--> +6394--> +6395--> +6396--> +6397--> +6398--> +6399--> +64--> +640--> +6400--> +6401--> +6402--> +6403--> +6404--> +6405--> +6406--> +6407--> +6408--> +6409--> +641--> +6410--> +6411--> +6412--> +6413--> +6414--> +6415--> +6416--> +6417--> +6418--> +6419--> +642--> +6420--> +6421--> +6422--> +6423--> +6424--> +6425--> +6426--> +6427--> +6428--> +6429--> +643--> +6430--> +6431--> +6432--> +6433--> +6434--> +6435--> +6436--> +6437--> +6438--> +6439--> +644--> +6440--> +6441--> +6442--> +6443--> +6444--> +6445--> +6446--> +6447--> +6448--> +6449--> +645--> +6450--> +6451--> +6452--> +6453--> +6454--> +6455--> +6456--> +6457--> +6458--> +6459--> +646--> +6460--> +6461--> +6462--> +6463--> +6464--> +6465--> +6466--> +6467--> +6468--> +6469--> +647--> +6470--> +6471--> +6472--> +6473--> +6474--> +6475--> +6476--> +6477--> +6478--> +6479--> +648--> +6480--> +6481--> +6482--> +6483--> +6484--> +6485--> +6486--> +6487--> +6488--> +6489--> +649--> +6490--> +6491--> +6492--> +6493--> +6494--> +6495--> +6496--> +6497--> +6498--> +6499--> +65--> +650--> +6500--> +6501--> +6502--> +6503--> +6504--> +6505--> +6506--> +6507--> +6508--> +6509--> +651--> +6510--> +6511--> +6512--> +6513--> +6514--> +6515--> +6516--> +6517--> +6518--> +6519--> +652--> +6520--> +6521--> +6522--> +6523--> +6524--> +6525--> +6526--> +6527--> +6528--> +6529--> +653--> +6530--> +6531--> +6532--> +6533--> +6534--> +6535--> +6536--> +6537--> +6538--> +6539--> +654--> +6540--> +6541--> +6542--> +6543--> +6544--> +6545--> +6546--> +6547--> +6548--> +6549--> +655--> +6550--> +6551--> +6552--> +6553--> +6554--> +6555--> +6556--> +6557--> +6558--> +6559--> +656--> +6560--> +6561--> +6562--> +6563--> +6564--> +6565--> +6566--> +6567--> +6568--> +6569--> +657--> +6570--> +6571--> +6572--> +6573--> +6574--> +6575--> +6576--> +6577--> +6578--> +6579--> +658--> +6580--> +6581--> +6582--> +6583--> +6584--> +6585--> +6586--> +6587--> +6588--> +6589--> +659--> +6590--> +6591--> +6592--> +6593--> +6594--> +6595--> +6596--> +6597--> +6598--> +6599--> +66--> +660--> +6600--> +6601--> +6602--> +6603--> +6604--> +6605--> +6606--> +6607--> +6608--> +6609--> +661--> +6610--> +6611--> +6612--> +6613--> +6614--> +6615--> +6616--> +6617--> +6618--> +6619--> +662--> +6620--> +6621--> +6622--> +6623--> +6624--> +6625--> +6626--> +6627--> +6628--> +6629--> +663--> +6630--> +6631--> +6632--> +6633--> +6634--> +6635--> +6636--> +6637--> +6638--> +6639--> +664--> +6640--> +6641--> +6642--> +6643--> +6644--> +6645--> +6646--> +6647--> +6648--> +6649--> +665--> +6650--> +6651--> +6652--> +6653--> +6654--> +6655--> +6656--> +6657--> +6658--> +6659--> +666--> +6660--> +6661--> +6662--> +6663--> +6664--> +6665--> +6666--> +6667--> +6668--> +6669--> +667--> +6670--> +6671--> +6672--> +6673--> +6674--> +6675--> +6676--> +6677--> +6678--> +6679--> +668--> +6680--> +6681--> +6682--> +6683--> +6684--> +6685--> +6686--> +6687--> +6688--> +6689--> +669--> +6690--> +6691--> +6692--> +6693--> +6694--> +6695--> +6696--> +6697--> +6698--> +6699--> +67--> +670--> +6700--> +6701--> +6702--> +6703--> +6704--> +6705--> +6706--> +6707--> +6708--> +6709--> +671--> +6710--> +6711--> +6712--> +6713--> +6714--> +6715--> +6716--> +6717--> +6718--> +6719--> +672--> +6720--> +6721--> +6722--> +6723--> +6724--> +6725--> +6726--> +6727--> +6728--> +6729--> +673--> +6730--> +6731--> +6732--> +6733--> +6734--> +6735--> +6736--> +6737--> +6738--> +6739--> +674--> +6740--> +6741--> +6742--> +6743--> +6744--> +6745--> +6746--> +6747--> +6748--> +6749--> +675--> +6750--> +6751--> +6752--> +6753--> +6754--> +6755--> +6756--> +6757--> +6758--> +6759--> +676--> +6760--> +6761--> +6762--> +6763--> +6764--> +6765--> +6766--> +6767--> +6768--> +6769--> +677--> +6770--> +6771--> +6772--> +6773--> +6774--> +6775--> +6776--> +6777--> +6778--> +6779--> +678--> +6780--> +6781--> +6782--> +6783--> +6784--> +6785--> +6786--> +6787--> +6788--> +6789--> +679--> +6790--> +6791--> +6792--> +6793--> +6794--> +6795--> +6796--> +6797--> +6798--> +6799--> +68--> +680--> +6800--> +6801--> +6802--> +6803--> +6804--> +6805--> +6806--> +6807--> +6808--> +6809--> +681--> +6810--> +6811--> +6812--> +6813--> +6814--> +6815--> +6816--> +6817--> +6818--> +6819--> +682--> +6820--> +6821--> +6822--> +6823--> +6824--> +6825--> +6826--> +6827--> +6828--> +6829--> +683--> +6830--> +6831--> +6832--> +6833--> +6834--> +6835--> +6836--> +6837--> +6838--> +6839--> +684--> +6840--> +6841--> +6842--> +6843--> +6844--> +6845--> +6846--> +6847--> +6848--> +6849--> +685--> +6850--> +6851--> +6852--> +6853--> +6854--> +6855--> +6856--> +6857--> +6858--> +6859--> +686--> +6860--> +6861--> +6862--> +6863--> +6864--> +6865--> +6866--> +6867--> +6868--> +6869--> +687--> +6870--> +6871--> +6872--> +6873--> +6874--> +6875--> +6876--> +6877--> +6878--> +6879--> +688--> +6880--> +6881--> +6882--> +6883--> +6884--> +6885--> +6886--> +6887--> +6888--> +6889--> +689--> +6890--> +6891--> +6892--> +6893--> +6894--> +6895--> +6896--> +6897--> +6898--> +6899--> +69--> +690--> +6900--> +6901--> +6902--> +6903--> +6904--> +6905--> +6906--> +6907--> +6908--> +6909--> +691--> +6910--> +6911--> +6912--> +6913--> +6914--> +6915--> +6916--> +6917--> +6918--> +6919--> +692--> +6920--> +6921--> +6922--> +6923--> +6924--> +6925--> +6926--> +6927--> +6928--> +6929--> +693--> +6930--> +6931--> +6932--> +6933--> +6934--> +6935--> +6936--> +6937--> +6938--> +6939--> +694--> +6940--> +6941--> +6942--> +6943--> +6944--> +6945--> +6946--> +6947--> +6948--> +6949--> +695--> +6950--> +6951--> +6952--> +6953--> +6954--> +6955--> +6956--> +6957--> +6958--> +6959--> +696--> +6960--> +6961--> +6962--> +6963--> +6964--> +6965--> +6966--> +6967--> +6968--> +6969--> +697--> +6970--> +6971--> +6972--> +6973--> +6974--> +6975--> +6976--> +6977--> +6978--> +6979--> +698--> +6980--> +6981--> +6982--> +6983--> +6984--> +6985--> +6986--> +6987--> +6988--> +6989--> +699--> +6990--> +6991--> +6992--> +6993--> +6994--> +6995--> +6996--> +6997--> +6998--> +6999--> +7--> +70--> +700--> +7000--> +7001--> +7002--> +7003--> +7004--> +7005--> +7006--> +7007--> +7008--> +7009--> +701--> +7010--> +7011--> +7012--> +7013--> +7014--> +7015--> +7016--> +7017--> +7018--> +7019--> +702--> +7020--> +7021--> +7022--> +7023--> +7024--> +7025--> +7026--> +7027--> +7028--> +7029--> +703--> +7030--> +7031--> +7032--> +7033--> +7034--> +7035--> +7036--> +7037--> +7038--> +7039--> +704--> +7040--> +7041--> +7042--> +7043--> +7044--> +7045--> +7046--> +7047--> +7048--> +7049--> +705--> +7050--> +7051--> +7052--> +7053--> +7054--> +7055--> +7056--> +7057--> +7058--> +7059--> +706--> +7060--> +7061--> +7062--> +7063--> +7064--> +7065--> +7066--> +7067--> +7068--> +7069--> +707--> +7070--> +7071--> +7072--> +7073--> +7074--> +7075--> +7076--> +7077--> +7078--> +7079--> +708--> +7080--> +7081--> +7082--> +7083--> +7084--> +7085--> +7086--> +7087--> +7088--> +7089--> +709--> +7090--> +7091--> +7092--> +7093--> +7094--> +7095--> +7096--> +7097--> +7098--> +7099--> +71--> +710--> +7100--> +7101--> +7102--> +7103--> +7104--> +7105--> +7106--> +7107--> +7108--> +7109--> +711--> +7110--> +7111--> +7112--> +7113--> +7114--> +7115--> +7116--> +7117--> +7118--> +7119--> +712--> +7120--> +7121--> +7122--> +7123--> +7124--> +7125--> +7126--> +7127--> +7128--> +7129--> +713--> +7130--> +7131--> +7132--> +7133--> +7134--> +7135--> +7136--> +7137--> +7138--> +7139--> +714--> +7140--> +7141--> +7142--> +7143--> +7144--> +7145--> +7146--> +7147--> +7148--> +7149--> +715--> +7150--> +7151--> +7152--> +7153--> +7154--> +7155--> +7156--> +7157--> +7158--> +7159--> +716--> +7160--> +7161--> +7162--> +7163--> +7164--> +7165--> +7166--> +7167--> +7168--> +7169--> +717--> +7170--> +7171--> +7172--> +7173--> +7174--> +7175--> +7176--> +7177--> +7178--> +7179--> +718--> +7180--> +7181--> +7182--> +7183--> +7184--> +7185--> +7186--> +7187--> +7188--> +7189--> +719--> +7190--> +7191--> +7192--> +7193--> +7194--> +7195--> +7196--> +7197--> +7198--> +7199--> +72--> +720--> +7200--> +7201--> +7202--> +7203--> +7204--> +7205--> +7206--> +7207--> +7208--> +7209--> +721--> +7210--> +7211--> +7212--> +7213--> +7214--> +7215--> +7216--> +7217--> +7218--> +7219--> +722--> +7220--> +7221--> +7222--> +7223--> +7224--> +7225--> +7226--> +7227--> +7228--> +7229--> +723--> +7230--> +7231--> +7232--> +7233--> +7234--> +7235--> +7236--> +7237--> +7238--> +7239--> +724--> +7240--> +7241--> +7242--> +7243--> +7244--> +7245--> +7246--> +7247--> +7248--> +7249--> +725--> +7250--> +7251--> +7252--> +7253--> +7254--> +7255--> +7256--> +7257--> +7258--> +7259--> +726--> +7260--> +7261--> +7262--> +7263--> +7264--> +7265--> +7266--> +7267--> +7268--> +7269--> +727--> +7270--> +7271--> +7272--> +7273--> +7274--> +7275--> +7276--> +7277--> +7278--> +7279--> +728--> +7280--> +7281--> +7282--> +7283--> +7284--> +7285--> +7286--> +7287--> +7288--> +7289--> +729--> +7290--> +7291--> +7292--> +7293--> +7294--> +7295--> +7296--> +7297--> +7298--> +7299--> +73--> +730--> +7300--> +7301--> +7302--> +7303--> +7304--> +7305--> +7306--> +7307--> +7308--> +7309--> +731--> +7310--> +7311--> +7312--> +7313--> +7314--> +7315--> +7316--> +7317--> +7318--> +7319--> +732--> +7320--> +7321--> +7322--> +7323--> +7324--> +7325--> +7326--> +7327--> +7328--> +7329--> +733--> +7330--> +7331--> +7332--> +7333--> +7334--> +7335--> +7336--> +7337--> +7338--> +7339--> +734--> +7340--> +7341--> +7342--> +7343--> +7344--> +7345--> +7346--> +7347--> +7348--> +7349--> +735--> +7350--> +7351--> +7352--> +7353--> +7354--> +7355--> +7356--> +7357--> +7358--> +7359--> +736--> +7360--> +7361--> +7362--> +7363--> +7364--> +7365--> +7366--> +7367--> +7368--> +7369--> +737--> +7370--> +7371--> +7372--> +7373--> +7374--> +7375--> +7376--> +7377--> +7378--> +7379--> +738--> +7380--> +7381--> +7382--> +7383--> +7384--> +7385--> +7386--> +7387--> +7388--> +7389--> +739--> +7390--> +7391--> +7392--> +7393--> +7394--> +7395--> +7396--> +7397--> +7398--> +7399--> +74--> +740--> +7400--> +7401--> +7402--> +7403--> +7404--> +7405--> +7406--> +7407--> +7408--> +7409--> +741--> +7410--> +7411--> +7412--> +7413--> +7414--> +7415--> +7416--> +7417--> +7418--> +7419--> +742--> +7420--> +7421--> +7422--> +7423--> +7424--> +7425--> +7426--> +7427--> +7428--> +7429--> +743--> +7430--> +7431--> +7432--> +7433--> +7434--> +7435--> +7436--> +7437--> +7438--> +7439--> +744--> +7440--> +7441--> +7442--> +7443--> +7444--> +7445--> +7446--> +7447--> +7448--> +7449--> +745--> +7450--> +7451--> +7452--> +7453--> +7454--> +7455--> +7456--> +7457--> +7458--> +7459--> +746--> +7460--> +7461--> +7462--> +7463--> +7464--> +7465--> +7466--> +7467--> +7468--> +7469--> +747--> +7470--> +7471--> +7472--> +7473--> +7474--> +7475--> +7476--> +7477--> +7478--> +7479--> +748--> +7480--> +7481--> +7482--> +7483--> +7484--> +7485--> +7486--> +7487--> +7488--> +7489--> +749--> +7490--> +7491--> +7492--> +7493--> +7494--> +7495--> +7496--> +7497--> +7498--> +7499--> +75--> +750--> +7500--> +7501--> +7502--> +7503--> +7504--> +7505--> +7506--> +7507--> +7508--> +7509--> +751--> +7510--> +7511--> +7512--> +7513--> +7514--> +7515--> +7516--> +7517--> +7518--> +7519--> +752--> +7520--> +7521--> +7522--> +7523--> +7524--> +7525--> +7526--> +7527--> +7528--> +7529--> +753--> +7530--> +7531--> +7532--> +7533--> +7534--> +7535--> +7536--> +7537--> +7538--> +7539--> +754--> +7540--> +7541--> +7542--> +7543--> +7544--> +7545--> +7546--> +7547--> +7548--> +7549--> +755--> +7550--> +7551--> +7552--> +7553--> +7554--> +7555--> +7556--> +7557--> +7558--> +7559--> +756--> +7560--> +7561--> +7562--> +7563--> +7564--> +7565--> +7566--> +7567--> +7568--> +7569--> +757--> +7570--> +7571--> +7572--> +7573--> +7574--> +7575--> +7576--> +7577--> +7578--> +7579--> +758--> +7580--> +7581--> +7582--> +7583--> +7584--> +7585--> +7586--> +7587--> +7588--> +7589--> +759--> +7590--> +7591--> +7592--> +7593--> +7594--> +7595--> +7596--> +7597--> +7598--> +7599--> +76--> +760--> +7600--> +7601--> +7602--> +7603--> +7604--> +7605--> +7606--> +7607--> +7608--> +7609--> +761--> +7610--> +7611--> +7612--> +7613--> +7614--> +7615--> +7616--> +7617--> +7618--> +7619--> +762--> +7620--> +7621--> +7622--> +7623--> +7624--> +7625--> +7626--> +7627--> +7628--> +7629--> +763--> +7630--> +7631--> +7632--> +7633--> +7634--> +7635--> +7636--> +7637--> +7638--> +7639--> +764--> +7640--> +7641--> +7642--> +7643--> +7644--> +7645--> +7646--> +7647--> +7648--> +7649--> +765--> +7650--> +7651--> +7652--> +7653--> +7654--> +7655--> +7656--> +7657--> +7658--> +7659--> +766--> +7660--> +7661--> +7662--> +7663--> +7664--> +7665--> +7666--> +7667--> +7668--> +7669--> +767--> +7670--> +7671--> +7672--> +7673--> +7674--> +7675--> +7676--> +7677--> +7678--> +7679--> +768--> +7680--> +7681--> +7682--> +7683--> +7684--> +7685--> +7686--> +7687--> +7688--> +7689--> +769--> +7690--> +7691--> +7692--> +7693--> +7694--> +7695--> +7696--> +7697--> +7698--> +7699--> +77--> +770--> +7700--> +7701--> +7702--> +7703--> +7704--> +7705--> +7706--> +7707--> +7708--> +7709--> +771--> +7710--> +7711--> +7712--> +7713--> +7714--> +7715--> +7716--> +7717--> +7718--> +7719--> +772--> +7720--> +7721--> +7722--> +7723--> +7724--> +7725--> +7726--> +7727--> +7728--> +7729--> +773--> +7730--> +7731--> +7732--> +7733--> +7734--> +7735--> +7736--> +7737--> +7738--> +7739--> +774--> +7740--> +7741--> +7742--> +7743--> +7744--> +7745--> +7746--> +7747--> +7748--> +7749--> +775--> +7750--> +7751--> +7752--> +7753--> +7754--> +7755--> +7756--> +7757--> +7758--> +7759--> +776--> +7760--> +7761--> +7762--> +7763--> +7764--> +7765--> +7766--> +7767--> +7768--> +7769--> +777--> +7770--> +7771--> +7772--> +7773--> +7774--> +7775--> +7776--> +7777--> +7778--> +7779--> +778--> +7780--> +7781--> +7782--> +7783--> +7784--> +7785--> +7786--> +7787--> +7788--> +7789--> +779--> +7790--> +7791--> +7792--> +7793--> +7794--> +7795--> +7796--> +7797--> +7798--> +7799--> +78--> +780--> +7800--> +7801--> +7802--> +7803--> +7804--> +7805--> +7806--> +7807--> +7808--> +7809--> +781--> +7810--> +7811--> +7812--> +7813--> +7814--> +7815--> +7816--> +7817--> +7818--> +7819--> +782--> +7820--> +7821--> +7822--> +7823--> +7824--> +7825--> +7826--> +7827--> +7828--> +7829--> +783--> +7830--> +7831--> +7832--> +7833--> +7834--> +7835--> +7836--> +7837--> +7838--> +7839--> +784--> +7840--> +7841--> +7842--> +7843--> +7844--> +7845--> +7846--> +7847--> +7848--> +7849--> +785--> +7850--> +7851--> +7852--> +7853--> +7854--> +7855--> +7856--> +7857--> +7858--> +7859--> +786--> +7860--> +7861--> +7862--> +7863--> +7864--> +7865--> +7866--> +7867--> +7868--> +7869--> +787--> +7870--> +7871--> +7872--> +7873--> +7874--> +7875--> +7876--> +7877--> +7878--> +7879--> +788--> +7880--> +7881--> +7882--> +7883--> +7884--> +7885--> +7886--> +7887--> +7888--> +7889--> +789--> +7890--> +7891--> +7892--> +7893--> +7894--> +7895--> +7896--> +7897--> +7898--> +7899--> +79--> +790--> +7900--> +7901--> +7902--> +7903--> +7904--> +7905--> +7906--> +7907--> +7908--> +7909--> +791--> +7910--> +7911--> +7912--> +7913--> +7914--> +7915--> +7916--> +7917--> +7918--> +7919--> +792--> +7920--> +7921--> +7922--> +7923--> +7924--> +7925--> +7926--> +7927--> +7928--> +7929--> +793--> +7930--> +7931--> +7932--> +7933--> +7934--> +7935--> +7936--> +7937--> +7938--> +7939--> +794--> +7940--> +7941--> +7942--> +7943--> +7944--> +7945--> +7946--> +7947--> +7948--> +7949--> +795--> +7950--> +7951--> +7952--> +7953--> +7954--> +7955--> +7956--> +7957--> +7958--> +7959--> +796--> +7960--> +7961--> +7962--> +7963--> +7964--> +7965--> +7966--> +7967--> +7968--> +7969--> +797--> +7970--> +7971--> +7972--> +7973--> +7974--> +7975--> +7976--> +7977--> +7978--> +7979--> +798--> +7980--> +7981--> +7982--> +7983--> +7984--> +7985--> +7986--> +7987--> +7988--> +7989--> +799--> +7990--> +7991--> +7992--> +7993--> +7994--> +7995--> +7996--> +7997--> +7998--> +7999--> +8--> +80--> +800--> +8000--> +8001--> +8002--> +8003--> +8004--> +8005--> +8006--> +8007--> +8008--> +8009--> +801--> +8010--> +8011--> +8012--> +8013--> +8014--> +8015--> +8016--> +8017--> +8018--> +8019--> +802--> +8020--> +8021--> +8022--> +8023--> +8024--> +8025--> +8026--> +8027--> +8028--> +8029--> +803--> +8030--> +8031--> +8032--> +8033--> +8034--> +8035--> +8036--> +8037--> +8038--> +8039--> +804--> +8040--> +8041--> +8042--> +8043--> +8044--> +8045--> +8046--> +8047--> +8048--> +8049--> +805--> +8050--> +8051--> +8052--> +8053--> +8054--> +8055--> +8056--> +8057--> +8058--> +8059--> +806--> +8060--> +8061--> +8062--> +8063--> +8064--> +8065--> +8066--> +8067--> +8068--> +8069--> +807--> +8070--> +8071--> +8072--> +8073--> +8074--> +8075--> +8076--> +8077--> +8078--> +8079--> +808--> +8080--> +8081--> +8082--> +8083--> +8084--> +8085--> +8086--> +8087--> +8088--> +8089--> +809--> +8090--> +8091--> +8092--> +8093--> +8094--> +8095--> +8096--> +8097--> +8098--> +8099--> +81--> +810--> +8100--> +8101--> +8102--> +8103--> +8104--> +8105--> +8106--> +8107--> +8108--> +8109--> +811--> +8110--> +8111--> +8112--> +8113--> +8114--> +8115--> +8116--> +8117--> +8118--> +8119--> +812--> +8120--> +8121--> +8122--> +8123--> +8124--> +8125--> +8126--> +8127--> +8128--> +8129--> +813--> +8130--> +8131--> +8132--> +8133--> +8134--> +8135--> +8136--> +8137--> +8138--> +8139--> +814--> +8140--> +8141--> +8142--> +8143--> +8144--> +8145--> +8146--> +8147--> +8148--> +8149--> +815--> +8150--> +8151--> +8152--> +8153--> +8154--> +8155--> +8156--> +8157--> +8158--> +8159--> +816--> +8160--> +8161--> +8162--> +8163--> +8164--> +8165--> +8166--> +8167--> +8168--> +8169--> +817--> +8170--> +8171--> +8172--> +8173--> +8174--> +8175--> +8176--> +8177--> +8178--> +8179--> +818--> +8180--> +8181--> +8182--> +8183--> +8184--> +8185--> +8186--> +8187--> +8188--> +8189--> +819--> +8190--> +8191--> +8192--> +8193--> +8194--> +8195--> +8196--> +8197--> +8198--> +8199--> +82--> +820--> +8200--> +8201--> +8202--> +8203--> +8204--> +8205--> +8206--> +8207--> +8208--> +8209--> +821--> +8210--> +8211--> +8212--> +8213--> +8214--> +8215--> +8216--> +8217--> +8218--> +8219--> +822--> +8220--> +8221--> +8222--> +8223--> +8224--> +8225--> +8226--> +8227--> +8228--> +8229--> +823--> +8230--> +8231--> +8232--> +8233--> +8234--> +8235--> +8236--> +8237--> +8238--> +8239--> +824--> +8240--> +8241--> +8242--> +8243--> +8244--> +8245--> +8246--> +8247--> +8248--> +8249--> +825--> +8250--> +8251--> +8252--> +8253--> +8254--> +8255--> +8256--> +8257--> +8258--> +8259--> +826--> +8260--> +8261--> +8262--> +8263--> +8264--> +8265--> +8266--> +8267--> +8268--> +8269--> +827--> +8270--> +8271--> +8272--> +8273--> +8274--> +8275--> +8276--> +8277--> +8278--> +8279--> +828--> +8280--> +8281--> +8282--> +8283--> +8284--> +8285--> +8286--> +8287--> +8288--> +8289--> +829--> +8290--> +8291--> +8292--> +8293--> +8294--> +8295--> +8296--> +8297--> +8298--> +8299--> +83--> +830--> +8300--> +8301--> +8302--> +8303--> +8304--> +8305--> +8306--> +8307--> +8308--> +8309--> +831--> +8310--> +8311--> +8312--> +8313--> +8314--> +8315--> +8316--> +8317--> +8318--> +8319--> +832--> +8320--> +8321--> +8322--> +8323--> +8324--> +8325--> +8326--> +8327--> +8328--> +8329--> +833--> +8330--> +8331--> +8332--> +8333--> +8334--> +8335--> +8336--> +8337--> +8338--> +8339--> +834--> +8340--> +8341--> +8342--> +8343--> +8344--> +8345--> +8346--> +8347--> +8348--> +8349--> +835--> +8350--> +8351--> +8352--> +8353--> +8354--> +8355--> +8356--> +8357--> +8358--> +8359--> +836--> +8360--> +8361--> +8362--> +8363--> +8364--> +8365--> +8366--> +8367--> +8368--> +8369--> +837--> +8370--> +8371--> +8372--> +8373--> +8374--> +8375--> +8376--> +8377--> +8378--> +8379--> +838--> +8380--> +8381--> +8382--> +8383--> +8384--> +8385--> +8386--> +8387--> +8388--> +8389--> +839--> +8390--> +8391--> +8392--> +8393--> +8394--> +8395--> +8396--> +8397--> +8398--> +8399--> +84--> +840--> +8400--> +8401--> +8402--> +8403--> +8404--> +8405--> +8406--> +8407--> +8408--> +8409--> +841--> +8410--> +8411--> +8412--> +8413--> +8414--> +8415--> +8416--> +8417--> +8418--> +8419--> +842--> +8420--> +8421--> +8422--> +8423--> +8424--> +8425--> +8426--> +8427--> +8428--> +8429--> +843--> +8430--> +8431--> +8432--> +8433--> +8434--> +8435--> +8436--> +8437--> +8438--> +8439--> +844--> +8440--> +8441--> +8442--> +8443--> +8444--> +8445--> +8446--> +8447--> +8448--> +8449--> +845--> +8450--> +8451--> +8452--> +8453--> +8454--> +8455--> +8456--> +8457--> +8458--> +8459--> +846--> +8460--> +8461--> +8462--> +8463--> +8464--> +8465--> +8466--> +8467--> +8468--> +8469--> +847--> +8470--> +8471--> +8472--> +8473--> +8474--> +8475--> +8476--> +8477--> +8478--> +8479--> +848--> +8480--> +8481--> +8482--> +8483--> +8484--> +8485--> +8486--> +8487--> +8488--> +8489--> +849--> +8490--> +8491--> +8492--> +8493--> +8494--> +8495--> +8496--> +8497--> +8498--> +8499--> +85--> +850--> +8500--> +8501--> +8502--> +8503--> +8504--> +8505--> +8506--> +8507--> +8508--> +8509--> +851--> +8510--> +8511--> +8512--> +8513--> +8514--> +8515--> +8516--> +8517--> +8518--> +8519--> +852--> +8520--> +8521--> +8522--> +8523--> +8524--> +8525--> +8526--> +8527--> +8528--> +8529--> +853--> +8530--> +8531--> +8532--> +8533--> +8534--> +8535--> +8536--> +8537--> +8538--> +8539--> +854--> +8540--> +8541--> +8542--> +8543--> +8544--> +8545--> +8546--> +8547--> +8548--> +8549--> +855--> +8550--> +8551--> +8552--> +8553--> +8554--> +8555--> +8556--> +8557--> +8558--> +8559--> +856--> +8560--> +8561--> +8562--> +8563--> +8564--> +8565--> +8566--> +8567--> +8568--> +8569--> +857--> +8570--> +8571--> +8572--> +8573--> +8574--> +8575--> +8576--> +8577--> +8578--> +8579--> +858--> +8580--> +8581--> +8582--> +8583--> +8584--> +8585--> +8586--> +8587--> +8588--> +8589--> +859--> +8590--> +8591--> +8592--> +8593--> +8594--> +8595--> +8596--> +8597--> +8598--> +8599--> +86--> +860--> +8600--> +8601--> +8602--> +8603--> +8604--> +8605--> +8606--> +8607--> +8608--> +8609--> +861--> +8610--> +8611--> +8612--> +8613--> +8614--> +8615--> +8616--> +8617--> +8618--> +8619--> +862--> +8620--> +8621--> +8622--> +8623--> +8624--> +8625--> +8626--> +8627--> +8628--> +8629--> +863--> +8630--> +8631--> +8632--> +8633--> +8634--> +8635--> +8636--> +8637--> +8638--> +8639--> +864--> +8640--> +8641--> +8642--> +8643--> +8644--> +8645--> +8646--> +8647--> +8648--> +8649--> +865--> +8650--> +8651--> +8652--> +8653--> +8654--> +8655--> +8656--> +8657--> +8658--> +8659--> +866--> +8660--> +8661--> +8662--> +8663--> +8664--> +8665--> +8666--> +8667--> +8668--> +8669--> +867--> +8670--> +8671--> +8672--> +8673--> +8674--> +8675--> +8676--> +8677--> +8678--> +8679--> +868--> +8680--> +8681--> +8682--> +8683--> +8684--> +8685--> +8686--> +8687--> +8688--> +8689--> +869--> +8690--> +8691--> +8692--> +8693--> +8694--> +8695--> +8696--> +8697--> +8698--> +8699--> +87--> +870--> +8700--> +8701--> +8702--> +8703--> +8704--> +8705--> +8706--> +8707--> +8708--> +8709--> +871--> +8710--> +8711--> +8712--> +8713--> +8714--> +8715--> +8716--> +8717--> +8718--> +8719--> +872--> +8720--> +8721--> +8722--> +8723--> +8724--> +8725--> +8726--> +8727--> +8728--> +8729--> +873--> +8730--> +8731--> +8732--> +8733--> +8734--> +8735--> +8736--> +8737--> +8738--> +8739--> +874--> +8740--> +8741--> +8742--> +8743--> +8744--> +8745--> +8746--> +8747--> +8748--> +8749--> +875--> +8750--> +8751--> +8752--> +8753--> +8754--> +8755--> +8756--> +8757--> +8758--> +8759--> +876--> +8760--> +8761--> +8762--> +8763--> +8764--> +8765--> +8766--> +8767--> +8768--> +8769--> +877--> +8770--> +8771--> +8772--> +8773--> +8774--> +8775--> +8776--> +8777--> +8778--> +8779--> +878--> +8780--> +8781--> +8782--> +8783--> +8784--> +8785--> +8786--> +8787--> +8788--> +8789--> +879--> +8790--> +8791--> +8792--> +8793--> +8794--> +8795--> +8796--> +8797--> +8798--> +8799--> +88--> +880--> +8800--> +8801--> +8802--> +8803--> +8804--> +8805--> +8806--> +8807--> +8808--> +8809--> +881--> +8810--> +8811--> +8812--> +8813--> +8814--> +8815--> +8816--> +8817--> +8818--> +8819--> +882--> +8820--> +8821--> +8822--> +8823--> +8824--> +8825--> +8826--> +8827--> +8828--> +8829--> +883--> +8830--> +8831--> +8832--> +8833--> +8834--> +8835--> +8836--> +8837--> +8838--> +8839--> +884--> +8840--> +8841--> +8842--> +8843--> +8844--> +8845--> +8846--> +8847--> +8848--> +8849--> +885--> +8850--> +8851--> +8852--> +8853--> +8854--> +8855--> +8856--> +8857--> +8858--> +8859--> +886--> +8860--> +8861--> +8862--> +8863--> +8864--> +8865--> +8866--> +8867--> +8868--> +8869--> +887--> +8870--> +8871--> +8872--> +8873--> +8874--> +8875--> +8876--> +8877--> +8878--> +8879--> +888--> +8880--> +8881--> +8882--> +8883--> +8884--> +8885--> +8886--> +8887--> +8888--> +8889--> +889--> +8890--> +8891--> +8892--> +8893--> +8894--> +8895--> +8896--> +8897--> +8898--> +8899--> +89--> +890--> +8900--> +8901--> +8902--> +8903--> +8904--> +8905--> +8906--> +8907--> +8908--> +8909--> +891--> +8910--> +8911--> +8912--> +8913--> +8914--> +8915--> +8916--> +8917--> +8918--> +8919--> +892--> +8920--> +8921--> +8922--> +8923--> +8924--> +8925--> +8926--> +8927--> +8928--> +8929--> +893--> +8930--> +8931--> +8932--> +8933--> +8934--> +8935--> +8936--> +8937--> +8938--> +8939--> +894--> +8940--> +8941--> +8942--> +8943--> +8944--> +8945--> +8946--> +8947--> +8948--> +8949--> +895--> +8950--> +8951--> +8952--> +8953--> +8954--> +8955--> +8956--> +8957--> +8958--> +8959--> +896--> +8960--> +8961--> +8962--> +8963--> +8964--> +8965--> +8966--> +8967--> +8968--> +8969--> +897--> +8970--> +8971--> +8972--> +8973--> +8974--> +8975--> +8976--> +8977--> +8978--> +8979--> +898--> +8980--> +8981--> +8982--> +8983--> +8984--> +8985--> +8986--> +8987--> +8988--> +8989--> +899--> +8990--> +8991--> +8992--> +8993--> +8994--> +8995--> +8996--> +8997--> +8998--> +8999--> +9--> +90--> +900--> +9000--> +9001--> +9002--> +9003--> +9004--> +9005--> +9006--> +9007--> +9008--> +9009--> +901--> +9010--> +9011--> +9012--> +9013--> +9014--> +9015--> +9016--> +9017--> +9018--> +9019--> +902--> +9020--> +9021--> +9022--> +9023--> +9024--> +9025--> +9026--> +9027--> +9028--> +9029--> +903--> +9030--> +9031--> +9032--> +9033--> +9034--> +9035--> +9036--> +9037--> +9038--> +9039--> +904--> +9040--> +9041--> +9042--> +9043--> +9044--> +9045--> +9046--> +9047--> +9048--> +9049--> +905--> +9050--> +9051--> +9052--> +9053--> +9054--> +9055--> +9056--> +9057--> +9058--> +9059--> +906--> +9060--> +9061--> +9062--> +9063--> +9064--> +9065--> +9066--> +9067--> +9068--> +9069--> +907--> +9070--> +9071--> +9072--> +9073--> +9074--> +9075--> +9076--> +9077--> +9078--> +9079--> +908--> +9080--> +9081--> +9082--> +9083--> +9084--> +9085--> +9086--> +9087--> +9088--> +9089--> +909--> +9090--> +9091--> +9092--> +9093--> +9094--> +9095--> +9096--> +9097--> +9098--> +9099--> +91--> +910--> +9100--> +9101--> +9102--> +9103--> +9104--> +9105--> +9106--> +9107--> +9108--> +9109--> +911--> +9110--> +9111--> +9112--> +9113--> +9114--> +9115--> +9116--> +9117--> +9118--> +9119--> +912--> +9120--> +9121--> +9122--> +9123--> +9124--> +9125--> +9126--> +9127--> +9128--> +9129--> +913--> +9130--> +9131--> +9132--> +9133--> +9134--> +9135--> +9136--> +9137--> +9138--> +9139--> +914--> +9140--> +9141--> +9142--> +9143--> +9144--> +9145--> +9146--> +9147--> +9148--> +9149--> +915--> +9150--> +9151--> +9152--> +9153--> +9154--> +9155--> +9156--> +9157--> +9158--> +9159--> +916--> +9160--> +9161--> +9162--> +9163--> +9164--> +9165--> +9166--> +9167--> +9168--> +9169--> +917--> +9170--> +9171--> +9172--> +9173--> +9174--> +9175--> +9176--> +9177--> +9178--> +9179--> +918--> +9180--> +9181--> +9182--> +9183--> +9184--> +9185--> +9186--> +9187--> +9188--> +9189--> +919--> +9190--> +9191--> +9192--> +9193--> +9194--> +9195--> +9196--> +9197--> +9198--> +9199--> +92--> +920--> +9200--> +9201--> +9202--> +9203--> +9204--> +9205--> +9206--> +9207--> +9208--> +9209--> +921--> +9210--> +9211--> +9212--> +9213--> +9214--> +9215--> +9216--> +9217--> +9218--> +9219--> +922--> +9220--> +9221--> +9222--> +9223--> +9224--> +9225--> +9226--> +9227--> +9228--> +9229--> +923--> +9230--> +9231--> +9232--> +9233--> +9234--> +9235--> +9236--> +9237--> +9238--> +9239--> +924--> +9240--> +9241--> +9242--> +9243--> +9244--> +9245--> +9246--> +9247--> +9248--> +9249--> +925--> +9250--> +9251--> +9252--> +9253--> +9254--> +9255--> +9256--> +9257--> +9258--> +9259--> +926--> +9260--> +9261--> +9262--> +9263--> +9264--> +9265--> +9266--> +9267--> +9268--> +9269--> +927--> +9270--> +9271--> +9272--> +9273--> +9274--> +9275--> +9276--> +9277--> +9278--> +9279--> +928--> +9280--> +9281--> +9282--> +9283--> +9284--> +9285--> +9286--> +9287--> +9288--> +9289--> +929--> +9290--> +9291--> +9292--> +9293--> +9294--> +9295--> +9296--> +9297--> +9298--> +9299--> +93--> +930--> +9300--> +9301--> +9302--> +9303--> +9304--> +9305--> +9306--> +9307--> +9308--> +9309--> +931--> +9310--> +9311--> +9312--> +9313--> +9314--> +9315--> +9316--> +9317--> +9318--> +9319--> +932--> +9320--> +9321--> +9322--> +9323--> +9324--> +9325--> +9326--> +9327--> +9328--> +9329--> +933--> +9330--> +9331--> +9332--> +9333--> +9334--> +9335--> +9336--> +9337--> +9338--> +9339--> +934--> +9340--> +9341--> +9342--> +9343--> +9344--> +9345--> +9346--> +9347--> +9348--> +9349--> +935--> +9350--> +9351--> +9352--> +9353--> +9354--> +9355--> +9356--> +9357--> +9358--> +9359--> +936--> +9360--> +9361--> +9362--> +9363--> +9364--> +9365--> +9366--> +9367--> +9368--> +9369--> +937--> +9370--> +9371--> +9372--> +9373--> +9374--> +9375--> +9376--> +9377--> +9378--> +9379--> +938--> +9380--> +9381--> +9382--> +9383--> +9384--> +9385--> +9386--> +9387--> +9388--> +9389--> +939--> +9390--> +9391--> +9392--> +9393--> +9394--> +9395--> +9396--> +9397--> +9398--> +9399--> +94--> +940--> +9400--> +9401--> +9402--> +9403--> +9404--> +9405--> +9406--> +9407--> +9408--> +9409--> +941--> +9410--> +9411--> +9412--> +9413--> +9414--> +9415--> +9416--> +9417--> +9418--> +9419--> +942--> +9420--> +9421--> +9422--> +9423--> +9424--> +9425--> +9426--> +9427--> +9428--> +9429--> +943--> +9430--> +9431--> +9432--> +9433--> +9434--> +9435--> +9436--> +9437--> +9438--> +9439--> +944--> +9440--> +9441--> +9442--> +9443--> +9444--> +9445--> +9446--> +9447--> +9448--> +9449--> +945--> +9450--> +9451--> +9452--> +9453--> +9454--> +9455--> +9456--> +9457--> +9458--> +9459--> +946--> +9460--> +9461--> +9462--> +9463--> +9464--> +9465--> +9466--> +9467--> +9468--> +9469--> +947--> +9470--> +9471--> +9472--> +9473--> +9474--> +9475--> +9476--> +9477--> +9478--> +9479--> +948--> +9480--> +9481--> +9482--> +9483--> +9484--> +9485--> +9486--> +9487--> +9488--> +9489--> +949--> +9490--> +9491--> +9492--> +9493--> +9494--> +9495--> +9496--> +9497--> +9498--> +9499--> +95--> +950--> +9500--> +9501--> +9502--> +9503--> +9504--> +9505--> +9506--> +9507--> +9508--> +9509--> +951--> +9510--> +9511--> +9512--> +9513--> +9514--> +9515--> +9516--> +9517--> +9518--> +9519--> +952--> +9520--> +9521--> +9522--> +9523--> +9524--> +9525--> +9526--> +9527--> +9528--> +9529--> +953--> +9530--> +9531--> +9532--> +9533--> +9534--> +9535--> +9536--> +9537--> +9538--> +9539--> +954--> +9540--> +9541--> +9542--> +9543--> +9544--> +9545--> +9546--> +9547--> +9548--> +9549--> +955--> +9550--> +9551--> +9552--> +9553--> +9554--> +9555--> +9556--> +9557--> +9558--> +9559--> +956--> +9560--> +9561--> +9562--> +9563--> +9564--> +9565--> +9566--> +9567--> +9568--> +9569--> +957--> +9570--> +9571--> +9572--> +9573--> +9574--> +9575--> +9576--> +9577--> +9578--> +9579--> +958--> +9580--> +9581--> +9582--> +9583--> +9584--> +9585--> +9586--> +9587--> +9588--> +9589--> +959--> +9590--> +9591--> +9592--> +9593--> +9594--> +9595--> +9596--> +9597--> +9598--> +9599--> +96--> +960--> +9600--> +9601--> +9602--> +9603--> +9604--> +9605--> +9606--> +9607--> +9608--> +9609--> +961--> +9610--> +9611--> +9612--> +9613--> +9614--> +9615--> +9616--> +9617--> +9618--> +9619--> +962--> +9620--> +9621--> +9622--> +9623--> +9624--> +9625--> +9626--> +9627--> +9628--> +9629--> +963--> +9630--> +9631--> +9632--> +9633--> +9634--> +9635--> +9636--> +9637--> +9638--> +9639--> +964--> +9640--> +9641--> +9642--> +9643--> +9644--> +9645--> +9646--> +9647--> +9648--> +9649--> +965--> +9650--> +9651--> +9652--> +9653--> +9654--> +9655--> +9656--> +9657--> +9658--> +9659--> +966--> +9660--> +9661--> +9662--> +9663--> +9664--> +9665--> +9666--> +9667--> +9668--> +9669--> +967--> +9670--> +9671--> +9672--> +9673--> +9674--> +9675--> +9676--> +9677--> +9678--> +9679--> +968--> +9680--> +9681--> +9682--> +9683--> +9684--> +9685--> +9686--> +9687--> +9688--> +9689--> +969--> +9690--> +9691--> +9692--> +9693--> +9694--> +9695--> +9696--> +9697--> +9698--> +9699--> +97--> +970--> +9700--> +9701--> +9702--> +9703--> +9704--> +9705--> +9706--> +9707--> +9708--> +9709--> +971--> +9710--> +9711--> +9712--> +9713--> +9714--> +9715--> +9716--> +9717--> +9718--> +9719--> +972--> +9720--> +9721--> +9722--> +9723--> +9724--> +9725--> +9726--> +9727--> +9728--> +9729--> +973--> +9730--> +9731--> +9732--> +9733--> +9734--> +9735--> +9736--> +9737--> +9738--> +9739--> +974--> +9740--> +9741--> +9742--> +9743--> +9744--> +9745--> +9746--> +9747--> +9748--> +9749--> +975--> +9750--> +9751--> +9752--> +9753--> +9754--> +9755--> +9756--> +9757--> +9758--> +9759--> +976--> +9760--> +9761--> +9762--> +9763--> +9764--> +9765--> +9766--> +9767--> +9768--> +9769--> +977--> +9770--> +9771--> +9772--> +9773--> +9774--> +9775--> +9776--> +9777--> +9778--> +9779--> +978--> +9780--> +9781--> +9782--> +9783--> +9784--> +9785--> +9786--> +9787--> +9788--> +9789--> +979--> +9790--> +9791--> +9792--> +9793--> +9794--> +9795--> +9796--> +9797--> +9798--> +9799--> +98--> +980--> +9800--> +9801--> +9802--> +9803--> +9804--> +9805--> +9806--> +9807--> +9808--> +9809--> +981--> +9810--> +9811--> +9812--> +9813--> +9814--> +9815--> +9816--> +9817--> +9818--> +9819--> +982--> +9820--> +9821--> +9822--> +9823--> +9824--> +9825--> +9826--> +9827--> +9828--> +9829--> +983--> +9830--> +9831--> +9832--> +9833--> +9834--> +9835--> +9836--> +9837--> +9838--> +9839--> +984--> +9840--> +9841--> +9842--> +9843--> +9844--> +9845--> +9846--> +9847--> +9848--> +9849--> +985--> +9850--> +9851--> +9852--> +9853--> +9854--> +9855--> +9856--> +9857--> +9858--> +9859--> +986--> +9860--> +9861--> +9862--> +9863--> +9864--> +9865--> +9866--> +9867--> +9868--> +9869--> +987--> +9870--> +9871--> +9872--> +9873--> +9874--> +9875--> +9876--> +9877--> +9878--> +9879--> +988--> +9880--> +9881--> +9882--> +9883--> +9884--> +9885--> +9886--> +9887--> +9888--> +9889--> +989--> +9890--> +9891--> +9892--> +9893--> +9894--> +9895--> +9896--> +9897--> +9898--> +9899--> +99--> +990--> +9900--> +9901--> +9902--> +9903--> +9904--> +9905--> +9906--> +9907--> +9908--> +9909--> +991--> +9910--> +9911--> +9912--> +9913--> +9914--> +9915--> +9916--> +9917--> +9918--> +9919--> +992--> +9920--> +9921--> +9922--> +9923--> +9924--> +9925--> +9926--> +9927--> +9928--> +9929--> +993--> +9930--> +9931--> +9932--> +9933--> +9934--> +9935--> +9936--> +9937--> +9938--> +9939--> +994--> +9940--> +9941--> +9942--> +9943--> +9944--> +9945--> +9946--> +9947--> +9948--> +9949--> +995--> +9950--> +9951--> +9952--> +9953--> +9954--> +9955--> +9956--> +9957--> +9958--> +9959--> +996--> +9960--> +9961--> +9962--> +9963--> +9964--> +9965--> +9966--> +9967--> +9968--> +9969--> +997--> +9970--> +9971--> +9972--> +9973--> +9974--> +9975--> +9976--> +9977--> +9978--> +9979--> +998--> +9980--> +9981--> +9982--> +9983--> +9984--> +9985--> +9986--> +9987--> +9988--> +9989--> +999--> +9990--> +9991--> +9992--> +9993--> +9994--> +9995--> +9996--> +9997--> +9998--> +9999--> diff --git a/testsuite/tests/lib-threads/test2.checker b/testsuite/tests/lib-threads/test2.checker new file mode 100644 index 00000000..df7f5ee6 --- /dev/null +++ b/testsuite/tests/lib-threads/test2.checker @@ -0,0 +1 @@ +head -1 test2.result | grep -q '^[ab]*' \ No newline at end of file diff --git a/testsuite/tests/lib-threads/test2.ml b/testsuite/tests/lib-threads/test2.ml new file mode 100644 index 00000000..926f0907 --- /dev/null +++ b/testsuite/tests/lib-threads/test2.ml @@ -0,0 +1,15 @@ +let yield = ref false + +let print_message c = + for i = 1 to 10000 do + print_char c; flush stdout; + if !yield then Thread.yield() + done + +let _ = yield := (Array.length Sys.argv > 1) +let t1 = Thread.create print_message 'a' +let t2 = Thread.create print_message 'b' +let _ = Thread.join t1 +let _ = Thread.join t2 + +;; diff --git a/testsuite/tests/lib-threads/test3.checker b/testsuite/tests/lib-threads/test3.checker new file mode 100644 index 00000000..514ab307 --- /dev/null +++ b/testsuite/tests/lib-threads/test3.checker @@ -0,0 +1 @@ +head -1 test3.result | grep -q '^[ab]*' \ No newline at end of file diff --git a/testsuite/tests/lib-threads/test3.ml b/testsuite/tests/lib-threads/test3.ml new file mode 100644 index 00000000..c6df3326 --- /dev/null +++ b/testsuite/tests/lib-threads/test3.ml @@ -0,0 +1,8 @@ +let print_message delay c = + while true do + print_char c; flush stdout; Thread.delay delay + done + +let _ = + Thread.create (print_message 0.6666666666) 'a'; + print_message 1.0 'b' diff --git a/testsuite/tests/lib-threads/test3.runner b/testsuite/tests/lib-threads/test3.runner new file mode 100644 index 00000000..907135b6 --- /dev/null +++ b/testsuite/tests/lib-threads/test3.runner @@ -0,0 +1,4 @@ +./program > test3.result & +pid=$! +sleep 5 +kill -9 $pid \ No newline at end of file diff --git a/testsuite/tests/lib-threads/test4.checker b/testsuite/tests/lib-threads/test4.checker new file mode 100644 index 00000000..ae27a0d5 --- /dev/null +++ b/testsuite/tests/lib-threads/test4.checker @@ -0,0 +1 @@ +sort -u test4.result | diff -q test4.reference - diff --git a/testsuite/tests/lib-threads/test4.data b/testsuite/tests/lib-threads/test4.data new file mode 100644 index 00000000..8edb37e3 --- /dev/null +++ b/testsuite/tests/lib-threads/test4.data @@ -0,0 +1,3 @@ +abc +def +ghi diff --git a/testsuite/tests/lib-threads/test4.ml b/testsuite/tests/lib-threads/test4.ml new file mode 100644 index 00000000..3acd9c60 --- /dev/null +++ b/testsuite/tests/lib-threads/test4.ml @@ -0,0 +1,20 @@ +let output_lock = Mutex.create() + +let rec fib n = if n <= 2 then 1 else fib(n-1) + fib(n-2) + +let fibtask n = + while true do + Mutex.lock output_lock; + print_int(fib n); print_newline(); + Mutex.unlock output_lock + done + +let _ = + Thread.create fibtask 28; + Thread.delay 1.0; + while true do + let l = read_line () in + Mutex.lock output_lock; + print_string ">> "; print_string l; print_newline(); + Mutex.unlock output_lock + done diff --git a/testsuite/tests/lib-threads/test4.reference b/testsuite/tests/lib-threads/test4.reference new file mode 100644 index 00000000..dfcd2b52 --- /dev/null +++ b/testsuite/tests/lib-threads/test4.reference @@ -0,0 +1,4 @@ +317811 +>> abc +>> def +>> ghi diff --git a/testsuite/tests/lib-threads/test4.runner b/testsuite/tests/lib-threads/test4.runner new file mode 100644 index 00000000..4f1a16d0 --- /dev/null +++ b/testsuite/tests/lib-threads/test4.runner @@ -0,0 +1 @@ +./program < test4.data > test4.result 2> /dev/null || true \ No newline at end of file diff --git a/testsuite/tests/lib-threads/test5.checker b/testsuite/tests/lib-threads/test5.checker new file mode 100644 index 00000000..030fcc91 --- /dev/null +++ b/testsuite/tests/lib-threads/test5.checker @@ -0,0 +1 @@ +sort -u test5.result | diff -q test5.reference - diff --git a/testsuite/tests/lib-threads/test5.ml b/testsuite/tests/lib-threads/test5.ml new file mode 100644 index 00000000..3534d03b --- /dev/null +++ b/testsuite/tests/lib-threads/test5.ml @@ -0,0 +1,19 @@ +open Event + +let ch = (new_channel() : string channel) + +let rec sender msg = + sync (send ch msg); + sender msg + +let rec receiver name = + print_string (name ^ ": " ^ sync (receive ch) ^ "\n"); + flush stdout; + receiver name + +let _ = + Thread.create sender "hello"; + Thread.create sender "world"; + Thread.create receiver "A"; + receiver "B"; + exit 0 diff --git a/testsuite/tests/lib-threads/test5.reference b/testsuite/tests/lib-threads/test5.reference new file mode 100644 index 00000000..a66a57b2 --- /dev/null +++ b/testsuite/tests/lib-threads/test5.reference @@ -0,0 +1,4 @@ +A: hello +A: world +B: hello +B: world diff --git a/testsuite/tests/lib-threads/test5.runner b/testsuite/tests/lib-threads/test5.runner new file mode 100644 index 00000000..877d176e --- /dev/null +++ b/testsuite/tests/lib-threads/test5.runner @@ -0,0 +1,4 @@ +./program > test5.result & +pid=$! +sleep 1 +kill -9 $pid \ No newline at end of file diff --git a/testsuite/tests/lib-threads/test6.checker b/testsuite/tests/lib-threads/test6.checker new file mode 100644 index 00000000..40ab24f8 --- /dev/null +++ b/testsuite/tests/lib-threads/test6.checker @@ -0,0 +1 @@ +sort -u test6.result | diff -q test6.reference - diff --git a/testsuite/tests/lib-threads/test6.ml b/testsuite/tests/lib-threads/test6.ml new file mode 100644 index 00000000..9573a661 --- /dev/null +++ b/testsuite/tests/lib-threads/test6.ml @@ -0,0 +1,15 @@ +open Event + +let ch = (new_channel() : string channel) + +let rec f tag msg = + select [ + send ch msg; + wrap (receive ch) (fun x -> print_string(tag ^ ": " ^ x); print_newline()) + ]; + f tag msg + +let _ = + Thread.create (f "A") "hello"; + f "B" "world"; + exit 0 diff --git a/testsuite/tests/lib-threads/test6.reference b/testsuite/tests/lib-threads/test6.reference new file mode 100644 index 00000000..e4a14898 --- /dev/null +++ b/testsuite/tests/lib-threads/test6.reference @@ -0,0 +1,2 @@ +A: world +B: hello diff --git a/testsuite/tests/lib-threads/test6.runner b/testsuite/tests/lib-threads/test6.runner new file mode 100644 index 00000000..96bca7d7 --- /dev/null +++ b/testsuite/tests/lib-threads/test6.runner @@ -0,0 +1,4 @@ +./program > test6.result & +pid=$! +sleep 1 +kill -9 $pid diff --git a/testsuite/tests/lib-threads/test7.checker b/testsuite/tests/lib-threads/test7.checker new file mode 100644 index 00000000..c5eb2dcd --- /dev/null +++ b/testsuite/tests/lib-threads/test7.checker @@ -0,0 +1 @@ +test `grep -E '^-?[0123456789]+$' test7.result | wc -l` = `cat test7.result | wc -l` \ No newline at end of file diff --git a/testsuite/tests/lib-threads/test7.ml b/testsuite/tests/lib-threads/test7.ml new file mode 100644 index 00000000..0ac34742 --- /dev/null +++ b/testsuite/tests/lib-threads/test7.ml @@ -0,0 +1,26 @@ +open Event + +let add_ch = new_channel() +let sub_ch = new_channel() +let read_ch = new_channel() + +let rec accu n = + select [ + wrap (receive add_ch) (fun x -> accu (n+x)); + wrap (receive sub_ch) (fun x -> accu (n-x)); + wrap (send read_ch n) (fun () -> accu n) + ] + +let rec sender chan value = + sync(send chan value); sender chan value + +let read () = + print_int(sync(receive read_ch)); print_newline() + +let main () = + Thread.create accu 0; + Thread.create (sender add_ch) 1; + Thread.create (sender sub_ch) 1; + while true do read() done + +let _ = Printexc.catch main () diff --git a/testsuite/tests/lib-threads/test7.runner b/testsuite/tests/lib-threads/test7.runner new file mode 100644 index 00000000..c1e163db --- /dev/null +++ b/testsuite/tests/lib-threads/test7.runner @@ -0,0 +1,4 @@ +./program > test7.result & +pid=$! +sleep 1 +kill -9 $pid diff --git a/testsuite/tests/lib-threads/test8.ml b/testsuite/tests/lib-threads/test8.ml new file mode 100644 index 00000000..897fd09e --- /dev/null +++ b/testsuite/tests/lib-threads/test8.ml @@ -0,0 +1,44 @@ +open Event + +type 'a buffer_channel = { input: 'a channel; output: 'a channel } + +let new_buffer_channel() = + let ic = new_channel() in + let oc = new_channel() in + let buff = Queue.create() in + let rec buffer_process front rear = + match (front, rear) with + ([], []) -> buffer_process [sync(receive ic)] [] + | (hd::tl, _) -> + select [ + wrap (receive ic) (fun x -> buffer_process front (x::rear)); + wrap (send oc hd) (fun () -> buffer_process tl rear) + ] + | ([], _) -> buffer_process (List.rev rear) [] in + Thread.create (buffer_process []) []; + { input = ic; output = oc } + +let buffer_send bc data = + sync(send bc.input data) + +let buffer_receive bc = + receive bc.output + +(* Test *) + +let box = new_buffer_channel() +let ch = new_channel() + +let f () = + buffer_send box "un"; + buffer_send box "deux"; + sync (send ch 3) + +let g () = + print_int (sync(receive ch)); print_newline(); + print_string (sync(buffer_receive box)); print_newline(); + print_string (sync(buffer_receive box)); print_newline() + +let _ = + Thread.create f (); + g() diff --git a/testsuite/tests/lib-threads/test8.reference b/testsuite/tests/lib-threads/test8.reference new file mode 100644 index 00000000..35c80454 --- /dev/null +++ b/testsuite/tests/lib-threads/test8.reference @@ -0,0 +1,3 @@ +3 +un +deux diff --git a/testsuite/tests/lib-threads/test9.ml b/testsuite/tests/lib-threads/test9.ml new file mode 100644 index 00000000..1f80beb8 --- /dev/null +++ b/testsuite/tests/lib-threads/test9.ml @@ -0,0 +1,26 @@ +open Event + +type 'a swap_chan = ('a * 'a channel) channel + +let swap msg_out ch = + guard (fun () -> + let ic = new_channel() in + choose [ + wrap (receive ch) (fun (msg_in, oc) -> sync (send oc msg_out); msg_in); + wrap (send ch (msg_out, ic)) (fun () -> sync (receive ic)) + ]) + +let ch = new_channel() + +let f () = + let res = sync (swap "F" ch) in + print_string "f "; print_string res; print_newline() + +let g () = + let res = sync (swap "G" ch) in + print_string "g "; print_string res; print_newline() + +let _ = + let id = Thread.create f () in + g (); + Thread.join id diff --git a/testsuite/tests/lib-threads/test9.reference b/testsuite/tests/lib-threads/test9.reference new file mode 100644 index 00000000..0be61d12 --- /dev/null +++ b/testsuite/tests/lib-threads/test9.reference @@ -0,0 +1,2 @@ +g F +f G diff --git a/testsuite/tests/lib-threads/testA.checker b/testsuite/tests/lib-threads/testA.checker new file mode 100644 index 00000000..4c309401 --- /dev/null +++ b/testsuite/tests/lib-threads/testA.checker @@ -0,0 +1 @@ +sort testA.result | diff -q testA.reference - diff --git a/testsuite/tests/lib-threads/testA.ml b/testsuite/tests/lib-threads/testA.ml new file mode 100644 index 00000000..25c2f6e0 --- /dev/null +++ b/testsuite/tests/lib-threads/testA.ml @@ -0,0 +1,26 @@ +let private_data = (Hashtbl.create 17 : (Thread.t, string) Hashtbl.t) +let private_data_lock = Mutex.create() +let output_lock = Mutex.create() + +let set_private_data data = + Mutex.lock private_data_lock; + Hashtbl.add private_data (Thread.self()) data; + Mutex.unlock private_data_lock + +let get_private_data () = + Hashtbl.find private_data (Thread.self()) + +let process id data = + set_private_data data; + Mutex.lock output_lock; + print_int id; print_string " --> "; print_string(get_private_data()); + Mutex.unlock output_lock; + print_newline() + +let _ = + let t1 = Thread.create (process 1) "un" in + let t2 = Thread.create (process 2) "deux" in + let t3 = Thread.create (process 3) "trois" in + let t4 = Thread.create (process 4) "quatre" in + let t5 = Thread.create (process 5) "cinq" in + List.iter Thread.join [t1;t2;t3;t4;t5] diff --git a/testsuite/tests/lib-threads/testA.reference b/testsuite/tests/lib-threads/testA.reference new file mode 100644 index 00000000..5ff9295d --- /dev/null +++ b/testsuite/tests/lib-threads/testA.reference @@ -0,0 +1,5 @@ +1 --> un +2 --> deux +3 --> trois +4 --> quatre +5 --> cinq diff --git a/testsuite/tests/lib-threads/testexit.checker b/testsuite/tests/lib-threads/testexit.checker new file mode 100644 index 00000000..5834e5d0 --- /dev/null +++ b/testsuite/tests/lib-threads/testexit.checker @@ -0,0 +1 @@ +sort testexit.result | diff -q testexit.reference - diff --git a/testsuite/tests/lib-threads/testexit.ml b/testsuite/tests/lib-threads/testexit.ml new file mode 100644 index 00000000..4564a483 --- /dev/null +++ b/testsuite/tests/lib-threads/testexit.ml @@ -0,0 +1,21 @@ +(* Test Thread.exit *) + +let somethread (name, limit, last) = + let counter = ref 0 in + while true do + incr counter; + if !counter >= limit then begin + print_string (name ^ " exiting\n"); + flush stdout; + if last then exit 0 else Thread.exit() + end; + print_string (name ^ ": " ^ string_of_int !counter ^ "\n"); + flush stdout; + Thread.delay 0.5 + done + +let _ = + let _ = Thread.create somethread ("A", 5, false) in + let _ = Thread.create somethread ("B", 8, false) in + let _ = Thread.create somethread ("C", 11, true) in + somethread ("Main", 3, false) diff --git a/testsuite/tests/lib-threads/testexit.reference b/testsuite/tests/lib-threads/testexit.reference new file mode 100644 index 00000000..46ee7622 --- /dev/null +++ b/testsuite/tests/lib-threads/testexit.reference @@ -0,0 +1,27 @@ +A exiting +A: 1 +A: 2 +A: 3 +A: 4 +B exiting +B: 1 +B: 2 +B: 3 +B: 4 +B: 5 +B: 6 +B: 7 +C exiting +C: 1 +C: 10 +C: 2 +C: 3 +C: 4 +C: 5 +C: 6 +C: 7 +C: 8 +C: 9 +Main exiting +Main: 1 +Main: 2 diff --git a/testsuite/tests/lib-threads/testio.ml b/testsuite/tests/lib-threads/testio.ml new file mode 100644 index 00000000..80eac296 --- /dev/null +++ b/testsuite/tests/lib-threads/testio.ml @@ -0,0 +1,120 @@ +(* Test a file copy function *) + +let test msg producer consumer src dst = + print_string msg; print_newline(); + let ic = open_in_bin src in + let oc = open_out_bin dst in + let (in_fd, out_fd) = Unix.pipe() in + let ipipe = Unix.in_channel_of_descr in_fd in + let opipe = Unix.out_channel_of_descr out_fd in + let prod = Thread.create producer (ic, opipe) in + let cons = Thread.create consumer (ipipe, oc) in + Thread.join prod; + Thread.join cons; + if Unix.system ("cmp " ^ src ^ " " ^ dst) = Unix.WEXITED 0 + then print_string "passed" + else print_string "FAILED"; + print_newline() + +(* File copy with constant-sized chunks *) + +let copy_file sz (ic, oc) = + let buffer = String.create sz in + let rec copy () = + let n = input ic buffer 0 sz in + if n = 0 then () else begin + output oc buffer 0 n; + copy () + end in + copy(); + close_in ic; + close_out oc + +(* File copy with random-sized chunks *) + +let copy_random sz (ic, oc) = + let buffer = String.create sz in + let rec copy () = + let s = 1 + Random.int sz in + let n = input ic buffer 0 s in + if n = 0 then () else begin + output oc buffer 0 n; + copy () + end in + copy(); + close_in ic; + close_out oc + +(* File copy line per line *) + +let copy_line (ic, oc) = + try + while true do + output_string oc (input_line ic); output_char oc '\n' + done + with End_of_file -> + close_in ic; + close_out oc + +(* Create long lines of text *) + +let make_lines ofile = + let oc = open_out ofile in + for i = 1 to 256 do + output_string oc (String.make (i*16) '.'); output_char oc '\n' + done; + close_out oc + +(* Test input_line on truncated lines *) + +let test_trunc_line ofile = + print_string "truncated line"; print_newline(); + let oc = open_out ofile in + output_string oc "A line without newline!"; + close_out oc; + try + let ic = open_in ofile in + let s = input_line ic in + close_in ic; + if s = "A line without newline!" + then print_string "passed" + else print_string "FAILED"; + print_newline() + with End_of_file -> + print_string "FAILED"; print_newline() + +(* The test *) + +let main() = + let ifile = try Sys.argv.(1) with _ -> "testio.ml" in + let ofile = Filename.temp_file "testio" "" in + test "256-byte chunks, 256-byte chunks" + (copy_file 256) (copy_file 256) ifile ofile; + test "4096-byte chunks, 4096-byte chunks" + (copy_file 4096) (copy_file 4096) ifile ofile; + test "65536-byte chunks, 65536-byte chunks" + (copy_file 65536) (copy_file 65536) ifile ofile; + test "256-byte chunks, 4096-byte chunks" + (copy_file 256) (copy_file 4096) ifile ofile; + test "4096-byte chunks, 256-byte chunks" + (copy_file 4096) (copy_file 256) ifile ofile; + test "4096-byte chunks, 65536-byte chunks" + (copy_file 4096) (copy_file 65536) ifile ofile; + test "263-byte chunks, 4011-byte chunks" + (copy_file 263) (copy_file 4011) ifile ofile; + test "613-byte chunks, 1027-byte chunks" + (copy_file 613) (copy_file 1027) ifile ofile; + test "0...8192 byte chunks" + (copy_random 8192) (copy_random 8192) ifile ofile; + test "line per line, short lines" + copy_line copy_line "/etc/hosts" ofile; + let linesfile = Filename.temp_file "lines" "" in + make_lines linesfile; + test "line per line, short and long lines" + copy_line copy_line linesfile ofile; + test_trunc_line ofile; + Sys.remove linesfile; + Sys.remove ofile; + exit 0 + +let _ = Unix.handle_unix_error main (); exit 0 diff --git a/testsuite/tests/lib-threads/testio.reference b/testsuite/tests/lib-threads/testio.reference new file mode 100644 index 00000000..26de848f --- /dev/null +++ b/testsuite/tests/lib-threads/testio.reference @@ -0,0 +1,24 @@ +256-byte chunks, 256-byte chunks +passed +4096-byte chunks, 4096-byte chunks +passed +65536-byte chunks, 65536-byte chunks +passed +256-byte chunks, 4096-byte chunks +passed +4096-byte chunks, 256-byte chunks +passed +4096-byte chunks, 65536-byte chunks +passed +263-byte chunks, 4011-byte chunks +passed +613-byte chunks, 1027-byte chunks +passed +0...8192 byte chunks +passed +line per line, short lines +passed +line per line, short and long lines +passed +truncated line +passed diff --git a/testsuite/tests/lib-threads/testsieve.ml b/testsuite/tests/lib-threads/testsieve.ml new file mode 100644 index 00000000..6079d8a8 --- /dev/null +++ b/testsuite/tests/lib-threads/testsieve.ml @@ -0,0 +1,42 @@ +let sieve primes= + Event.sync (Event.send primes 0); + Event.sync (Event.send primes 1); + Event.sync (Event.send primes 2); + let integers = Event.new_channel () in + let rec enumerate n= + Event.sync (Event.send integers n); + enumerate (n + 2) + and filter inpout = + let n = Event.sync (Event.receive inpout) + (* On prepare le terrain pour l'appel recursif *) + and output = Event.new_channel () in + (* Celui qui etait en tete du crible est premier *) + Event.sync (Event.send primes n); + Thread.create filter output; + (* On elimine de la sortie ceux qui sont des multiples de n *) + while true do + let m = Event.sync (Event.receive inpout) in + (* print_int n; print_string ": "; print_int m; print_newline(); *) + if (m mod n) = 0 + then () + else ((Event.sync (Event.send output m));()) + done in + Thread.create filter integers; + Thread.create enumerate 3 + +let premiers = Event.new_channel () + +let main _ = + Thread.create sieve premiers; + while true do + for i = 1 to 100 do + let n = Event.sync (Event.receive premiers) in + print_int n; print_newline() + done; + exit 0 + done + + +let _ = + try main () + with _ -> exit 0;; diff --git a/testsuite/tests/lib-threads/testsieve.reference b/testsuite/tests/lib-threads/testsieve.reference new file mode 100644 index 00000000..b6b8c06e --- /dev/null +++ b/testsuite/tests/lib-threads/testsieve.reference @@ -0,0 +1,100 @@ +0 +1 +2 +3 +5 +7 +11 +13 +17 +19 +23 +29 +31 +37 +41 +43 +47 +53 +59 +61 +67 +71 +73 +79 +83 +89 +97 +101 +103 +107 +109 +113 +127 +131 +137 +139 +149 +151 +157 +163 +167 +173 +179 +181 +191 +193 +197 +199 +211 +223 +227 +229 +233 +239 +241 +251 +257 +263 +269 +271 +277 +281 +283 +293 +307 +311 +313 +317 +331 +337 +347 +349 +353 +359 +367 +373 +379 +383 +389 +397 +401 +409 +419 +421 +431 +433 +439 +443 +449 +457 +461 +463 +467 +479 +487 +491 +499 +503 +509 +521 diff --git a/testsuite/tests/lib-threads/testsignal.checker b/testsuite/tests/lib-threads/testsignal.checker new file mode 100644 index 00000000..92ef9c82 --- /dev/null +++ b/testsuite/tests/lib-threads/testsignal.checker @@ -0,0 +1 @@ +head -1 testsignal.result | grep -q '^[ab]*Got ctrl-C, exiting...$' \ No newline at end of file diff --git a/testsuite/tests/lib-threads/testsignal.ml b/testsuite/tests/lib-threads/testsignal.ml new file mode 100644 index 00000000..7781f337 --- /dev/null +++ b/testsuite/tests/lib-threads/testsignal.ml @@ -0,0 +1,13 @@ +let sighandler _ = + print_string "Got ctrl-C, exiting..."; print_newline(); + exit 0 + +let print_message delay c = + while true do + print_char c; flush stdout; Thread.delay delay + done + +let _ = + Sys.signal Sys.sigint (Sys.Signal_handle sighandler); + Thread.create (print_message 0.6666666666) 'a'; + print_message 1.0 'b' diff --git a/testsuite/tests/lib-threads/testsignal.runner b/testsuite/tests/lib-threads/testsignal.runner new file mode 100644 index 00000000..897ef173 --- /dev/null +++ b/testsuite/tests/lib-threads/testsignal.runner @@ -0,0 +1,4 @@ +./program > testsignal.result & +pid=$! +sleep 3 +kill -INT $pid \ No newline at end of file diff --git a/testsuite/tests/lib-threads/testsignal2.checker b/testsuite/tests/lib-threads/testsignal2.checker new file mode 100644 index 00000000..c7ed8d15 --- /dev/null +++ b/testsuite/tests/lib-threads/testsignal2.checker @@ -0,0 +1 @@ +head -1 testsignal2.result | grep -q '^[ab]*' \ No newline at end of file diff --git a/testsuite/tests/lib-threads/testsignal2.ml b/testsuite/tests/lib-threads/testsignal2.ml new file mode 100644 index 00000000..c73bdb99 --- /dev/null +++ b/testsuite/tests/lib-threads/testsignal2.ml @@ -0,0 +1,11 @@ +let print_message delay c = + while true do + print_char c; flush stdout; Thread.delay delay + done + +let _ = + Thread.sigmask Unix.SIG_BLOCK [Sys.sigint; Sys.sigterm]; + let th1 = Thread.create (print_message 0.6666666666) 'a' in + let th2 = Thread.create (print_message 1.0) 'b' in + let s = Thread.wait_signal [Sys.sigint; Sys.sigterm] in + Printf.printf "Got signal %d, exiting...\n" s diff --git a/testsuite/tests/lib-threads/testsignal2.runner b/testsuite/tests/lib-threads/testsignal2.runner new file mode 100644 index 00000000..0e368a92 --- /dev/null +++ b/testsuite/tests/lib-threads/testsignal2.runner @@ -0,0 +1,6 @@ +./program > testsignal2.result & +pid=$! +sleep 3 +kill -INT $pid +sleep 1 +kill -9 $pid || true diff --git a/testsuite/tests/lib-threads/testsocket.ml b/testsuite/tests/lib-threads/testsocket.ml new file mode 100644 index 00000000..c5fc40b1 --- /dev/null +++ b/testsuite/tests/lib-threads/testsocket.ml @@ -0,0 +1,34 @@ +open Unix + +let engine verbose number address = + print_int number; print_string "> connecting"; print_newline(); + let (ic, oc) = open_connection (ADDR_INET(address, 80)) in + print_int number; print_string "> connected"; print_newline(); + output_string oc "GET / HTTP1.0\r\n\r\n"; flush oc; + try + while true do + let s = input_line ic in + if verbose then (print_int number; print_string ">"; print_string s; print_newline()) + done; + with End_of_file -> + close_out oc; + print_int number; print_string "> data retrieved"; print_newline() + +let main() = + let verbose, argv = + match Sys.argv with + | [| _ |] -> false, [| Sys.argv.(0); "caml.inria.fr" |] + | _ -> true, Sys.argv in + let addresses = Array.create (Array.length argv - 1) inet_addr_any in + for i = 1 to Array.length argv - 1 do + addresses.(i - 1) <- (gethostbyname argv.(i)).h_addr_list.(0) + done; + let processes = Array.create (Array.length addresses) (Thread.self()) in + for i = 0 to Array.length addresses - 1 do + processes.(i) <- Thread.create (engine verbose i) addresses.(i) + done; + for i = 0 to Array.length processes - 1 do + Thread.join processes.(i) + done + +let _ = Printexc.catch main (); exit 0 diff --git a/testsuite/tests/lib-threads/testsocket.reference b/testsuite/tests/lib-threads/testsocket.reference new file mode 100644 index 00000000..ce521418 --- /dev/null +++ b/testsuite/tests/lib-threads/testsocket.reference @@ -0,0 +1,3 @@ +0> connecting +0> connected +0> data retrieved diff --git a/testsuite/tests/lib-threads/token1.ml b/testsuite/tests/lib-threads/token1.ml new file mode 100644 index 00000000..5dab410b --- /dev/null +++ b/testsuite/tests/lib-threads/token1.ml @@ -0,0 +1,36 @@ +(* Performance test for mutexes and conditions *) + +let mut = Mutex.create() + +let niter = ref 0 + +let token = ref 0 + +let process (n, conds, nprocs) = + while true do + Mutex.lock mut; + while !token <> n do + (* Printf.printf "Thread %d waiting (token = %d)\n" n !token; *) + Condition.wait conds.(n) mut + done; + (* Printf.printf "Thread %d got token %d\n" n !token; *) + incr token; + if !token >= nprocs then token := 0; + if n = 0 then begin + decr niter; + if !niter <= 0 then exit 0 + end; + Condition.signal conds.(!token); + Mutex.unlock mut + done + +let main() = + let nprocs = try int_of_string Sys.argv.(1) with _ -> 100 in + let iter = try int_of_string Sys.argv.(2) with _ -> 1000 in + let conds = Array.create nprocs (Condition.create()) in + for i = 1 to nprocs - 1 do conds.(i) <- Condition.create() done; + niter := iter; + for i = 0 to nprocs - 1 do Thread.create process (i, conds, nprocs) done; + Thread.delay 3600. + +let _ = main() diff --git a/testsuite/tests/lib-threads/token1.reference b/testsuite/tests/lib-threads/token1.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/lib-threads/token2.ml b/testsuite/tests/lib-threads/token2.ml new file mode 100644 index 00000000..32f2c6ed --- /dev/null +++ b/testsuite/tests/lib-threads/token2.ml @@ -0,0 +1,36 @@ +(* Performance test for I/O scheduling *) + +let mut = Mutex.create() + +let niter = ref 0 + +let token = ref 0 + +let process (n, ins, outs, nprocs) = + let buf = String.create 1 in + while true do + Unix.read ins.(n) buf 0 1; + (* Printf.printf "Thread %d got the token\n" n; *) + if n = 0 then begin + decr niter; + if !niter <= 0 then exit 0 + end; + let next = if n + 1 >= nprocs then 0 else n + 1 in + (* Printf.printf "Thread %d sending token to thread %d\n" n next; *) + Unix.write outs.(next) buf 0 1 + done + +let main() = + let nprocs = try int_of_string Sys.argv.(1) with _ -> 100 in + let iter = try int_of_string Sys.argv.(2) with _ -> 1000 in + let ins = Array.create nprocs Unix.stdin in + let outs = Array.create nprocs Unix.stdout in + for n = 0 to nprocs - 1 do + let (i, o) = Unix.pipe() in ins.(n) <- i; outs.(n) <- o + done; + niter := iter; + for i = 0 to nprocs - 1 do Thread.create process (i, ins, outs, nprocs) done; + Unix.write outs.(0) "X" 0 1; + Thread.delay 3600. + +let _ = main() diff --git a/testsuite/tests/lib-threads/token2.reference b/testsuite/tests/lib-threads/token2.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/lib-threads/torture.data b/testsuite/tests/lib-threads/torture.data new file mode 100644 index 00000000..8edb37e3 --- /dev/null +++ b/testsuite/tests/lib-threads/torture.data @@ -0,0 +1,3 @@ +abc +def +ghi diff --git a/testsuite/tests/lib-threads/torture.ml b/testsuite/tests/lib-threads/torture.ml new file mode 100644 index 00000000..cfc57833 --- /dev/null +++ b/testsuite/tests/lib-threads/torture.ml @@ -0,0 +1,45 @@ +(* Torture test - lots of GC *) + +let gc_thread () = + while true do +(* print_string "gc"; print_newline(); *) + Gc.minor(); + Thread.yield() + done + +let stdin_thread () = + while true do + print_string "> "; flush stdout; + let s = read_line() in + print_string ">>> "; print_string s; print_newline() + done + +let writer_thread (oc, size) = + while true do +(* print_string "writer "; print_int size; print_newline(); *) + let buff = String.make size 'a' in + Unix.write oc buff 0 size + done + +let reader_thread (ic, size) = + while true do +(* print_string "reader "; print_int size; print_newline(); *) + let buff = String.create size in + let n = Unix.read ic buff 0 size in +(* print_string "reader "; print_int n; print_newline(); *) + for i = 0 to n-1 do + if buff.[i] <> 'a' then prerr_endline "error in reader_thread" + done + done + +let main() = + Thread.create gc_thread (); + let (out1, in1) = Unix.pipe() in + Thread.create writer_thread (in1, 4096); + Thread.create reader_thread (out1, 4096); + let (out2, in2) = Unix.pipe() in + Thread.create writer_thread (in2, 16); + Thread.create reader_thread (out2, 16); + stdin_thread() + +let _ = main() diff --git a/testsuite/tests/lib-threads/torture.reference b/testsuite/tests/lib-threads/torture.reference new file mode 100644 index 00000000..cd5f474f --- /dev/null +++ b/testsuite/tests/lib-threads/torture.reference @@ -0,0 +1,4 @@ +> >>> abc +> >>> def +> >>> ghi +> \ No newline at end of file diff --git a/testsuite/tests/lib-threads/torture.runner b/testsuite/tests/lib-threads/torture.runner new file mode 100644 index 00000000..f4ad597b --- /dev/null +++ b/testsuite/tests/lib-threads/torture.runner @@ -0,0 +1 @@ +./program < torture.data > torture.result 2> /dev/null || true \ No newline at end of file diff --git a/testsuite/tests/misc-kb/Makefile b/testsuite/tests/misc-kb/Makefile new file mode 100644 index 00000000..b5f5eaec --- /dev/null +++ b/testsuite/tests/misc-kb/Makefile @@ -0,0 +1,6 @@ +MODULES=terms equations orderings kb +MAIN_MODULE=kbmain +ADD_COMPFLAGS=-w a + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/misc-kb/equations.ml b/testsuite/tests/misc-kb/equations.ml new file mode 100644 index 00000000..3feeada7 --- /dev/null +++ b/testsuite/tests/misc-kb/equations.ml @@ -0,0 +1,115 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: equations.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + +(****************** Equation manipulations *************) + +open Terms + +type rule = + { number: int; + numvars: int; + lhs: term; + rhs: term } + +(* standardizes an equation so its variables are 1,2,... *) + +let mk_rule num m n = + let all_vars = union (vars m) (vars n) in + let counter = ref 0 in + let subst = + List.map (fun v -> incr counter; (v, Var !counter)) (List.rev all_vars) in + { number = num; + numvars = !counter; + lhs = substitute subst m; + rhs = substitute subst n } + + +(* checks that rules are numbered in sequence and returns their number *) + +let check_rules rules = + let counter = ref 0 in + List.iter (fun r -> incr counter; + if r.number <> !counter + then failwith "Rule numbers not in sequence") + rules; + !counter + + +let pretty_rule rule = + print_int rule.number; print_string " : "; + pretty_term rule.lhs; print_string " = "; pretty_term rule.rhs; + print_newline() + + +let pretty_rules rules = List.iter pretty_rule rules + +(****************** Rewriting **************************) + +(* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. + With sigma = matching L M, we define the image of M by eq as sigma(R) *) +let reduce l m r = + substitute (matching l m) r + +(* Test whether m can be reduced by l, i.e. m contains an instance of l. *) + +let can_match l m = + try let _ = matching l m in true + with Failure _ -> false + +let rec reducible l m = + can_match l m || + (match m with + | Term(_,sons) -> List.exists (reducible l) sons + | _ -> false) + +(* Top-level rewriting with multiple rules. *) + +let rec mreduce rules m = + match rules with + [] -> failwith "mreduce" + | rule::rest -> + try + reduce rule.lhs m rule.rhs + with Failure _ -> + mreduce rest m + + +(* One step of rewriting in leftmost-outermost strategy, + with multiple rules. Fails if no redex is found *) + +let rec mrewrite1 rules m = + try + mreduce rules m + with Failure _ -> + match m with + Var n -> failwith "mrewrite1" + | Term(f, sons) -> Term(f, mrewrite1_sons rules sons) + +and mrewrite1_sons rules = function + [] -> failwith "mrewrite1" + | son::rest -> + try + mrewrite1 rules son :: rest + with Failure _ -> + son :: mrewrite1_sons rules rest + + +(* Iterating rewrite1. Returns a normal form. May loop forever *) + +let rec mrewrite_all rules m = + try + mrewrite_all rules (mrewrite1 rules m) + with Failure _ -> + m + diff --git a/testsuite/tests/misc-kb/equations.mli b/testsuite/tests/misc-kb/equations.mli new file mode 100644 index 00000000..665b739e --- /dev/null +++ b/testsuite/tests/misc-kb/equations.mli @@ -0,0 +1,32 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: equations.mli 2553 1999-11-17 18:59:06Z xleroy $ *) + +open Terms + +type rule = + { number: int; + numvars: int; + lhs: term; + rhs: term } + +val mk_rule: int -> term -> term -> rule +val check_rules: rule list -> int +val pretty_rule: rule -> unit +val pretty_rules: rule list -> unit +val reduce: term -> term -> term -> term +val reducible: term -> term -> bool +val mreduce: rule list -> term -> term +val mrewrite1: rule list -> term -> term +val mrewrite1_sons: rule list -> term list -> term list +val mrewrite_all: rule list -> term -> term diff --git a/testsuite/tests/misc-kb/kb.ml b/testsuite/tests/misc-kb/kb.ml new file mode 100644 index 00000000..1e369bd1 --- /dev/null +++ b/testsuite/tests/misc-kb/kb.ml @@ -0,0 +1,188 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: kb.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + +open Terms +open Equations + +(****************** Critical pairs *********************) + +(* All (u,subst) such that N/u (&var) unifies with M, + with principal unifier subst *) + +let rec super m = function + Term(_,sons) as n -> + let rec collate n = function + [] -> [] + | son::rest -> + List.map (fun (u, subst) -> (n::u, subst)) (super m son) + @ collate (n+1) rest in + let insides = collate 1 sons in + begin try + ([], unify m n) :: insides + with Failure _ -> + insides + end + | _ -> [] + + +(* Ex : +let (m,_) = <> +and (n,_) = <> in super m n +==> [[1],[2,Term ("B",[])]; x <- B + [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B +*) + +(* All (u,subst), u&[], such that n/u unifies with m *) + +let super_strict m = function + Term(_,sons) -> + let rec collate n = function + [] -> [] + | son::rest -> + List.map (fun (u, subst) -> (n::u, subst)) (super m son) + @ collate (n+1) rest in + collate 1 sons + | _ -> [] + + +(* Critical pairs of l1=r1 with l2=r2 *) +(* critical_pairs : term_pair -> term_pair -> term_pair list *) +let critical_pairs (l1,r1) (l2,r2) = + let mk_pair (u,subst) = + substitute subst (replace l2 u r1), substitute subst r2 in + List.map mk_pair (super l1 l2) + +(* Strict critical pairs of l1=r1 with l2=r2 *) +(* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) +let strict_critical_pairs (l1,r1) (l2,r2) = + let mk_pair (u,subst) = + substitute subst (replace l2 u r1), substitute subst r2 in + List.map mk_pair (super_strict l1 l2) + + +(* All critical pairs of eq1 with eq2 *) +let mutual_critical_pairs eq1 eq2 = + (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) + +(* Renaming of variables *) + +let rename n (t1,t2) = + let rec ren_rec = function + Var k -> Var(k+n) + | Term(op,sons) -> Term(op, List.map ren_rec sons) in + (ren_rec t1, ren_rec t2) + + +(************************ Completion ******************************) + +let deletion_message rule = + print_string "Rule ";print_int rule.number; print_string " deleted"; + print_newline() + + +(* Generate failure message *) +let non_orientable (m,n) = + pretty_term m; print_string " = "; pretty_term n; print_newline() + + +let rec partition p = function + [] -> ([], []) + | x::l -> let (l1, l2) = partition p l in + if p x then (x::l1, l2) else (l1, x::l2) + + +let rec get_rule n = function + [] -> raise Not_found + | r::l -> if n = r.number then r else get_rule n l + + +(* Improved Knuth-Bendix completion procedure *) + +let kb_completion greater = + let rec kbrec j rules = + let rec process failures (k,l) eqs = +(**** + print_string "***kb_completion "; print_int j; print_newline(); + pretty_rules rules; + List.iter non_orientable failures; + print_int k; print_string " "; print_int l; print_newline(); + List.iter non_orientable eqs; +***) + match eqs with + [] -> + if k rules (* successful completion *) + | _ -> print_string "Non-orientable equations :"; print_newline(); + List.iter non_orientable failures; + failwith "kb_completion" + end + | (m,n)::eqs -> + let m' = mrewrite_all rules m + and n' = mrewrite_all rules n + and enter_rule(left,right) = + let new_rule = mk_rule (j+1) left right in + pretty_rule new_rule; + let left_reducible rule = reducible left rule.lhs in + let (redl,irredl) = partition left_reducible rules in + List.iter deletion_message redl; + let right_reduce rule = + mk_rule rule.number rule.lhs + (mrewrite_all (new_rule::rules) rule.rhs) in + let irreds = List.map right_reduce irredl in + let eqs' = List.map (fun rule -> (rule.lhs, rule.rhs)) redl in + kbrec (j+1) (new_rule::irreds) [] (k,l) (eqs @ eqs' @ failures) in +(*** + print_string "--- Considering "; non_orientable (m', n'); +***) + if m' = n' then process failures (k,l) eqs else + if greater(m',n') then enter_rule(m',n') else + if greater(n',m') then enter_rule(n',m') else + process ((m',n')::failures) (k,l) eqs + + and next_criticals failures (k,l) = +(**** + print_string "***next_criticals "; + print_int k; print_string " "; print_int l ; print_newline(); +****) + try + let rl = get_rule l rules in + let el = (rl.lhs, rl.rhs) in + if k=l then + process failures (k,l) + (strict_critical_pairs el (rename rl.numvars el)) + else + try + let rk = get_rule k rules in + let ek = (rk.lhs, rk.rhs) in + process failures (k,l) + (mutual_critical_pairs el (rename rl.numvars ek)) + with Not_found -> next_criticals failures (k+1,l) + with Not_found -> next_criticals failures (1,l+1) + in process + in kbrec + + +(* complete_rules is assumed locally confluent, and checked Noetherian with + ordering greater, rules is any list of rules *) + +let kb_complete greater complete_rules rules = + let n = check_rules complete_rules + and eqs = List.map (fun rule -> (rule.lhs, rule.rhs)) rules in + let completed_rules = + kb_completion greater n complete_rules [] (n,n) eqs in + print_string "Canonical set found :"; print_newline(); + pretty_rules (List.rev completed_rules) + diff --git a/testsuite/tests/misc-kb/kb.mli b/testsuite/tests/misc-kb/kb.mli new file mode 100644 index 00000000..bd02de4b --- /dev/null +++ b/testsuite/tests/misc-kb/kb.mli @@ -0,0 +1,29 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: kb.mli 2553 1999-11-17 18:59:06Z xleroy $ *) + +open Terms +open Equations + +val super: term -> term -> (int list * (int * term) list) list +val super_strict: term -> term -> (int list * (int * term) list) list +val critical_pairs: term * term -> term * term -> (term * term) list +val strict_critical_pairs: term * term -> term * term -> (term * term) list +val mutual_critical_pairs: term * term -> term * term -> (term * term) list +val rename: int -> term * term -> term * term +val deletion_message: rule -> unit +val non_orientable: term * term -> unit +val partition: ('a -> bool) -> 'a list -> 'a list * 'a list +val get_rule: int -> rule list -> rule +val kb_completion: (term * term -> bool) -> int -> rule list -> (term * term) list -> int * int -> (term * term) list -> rule list +val kb_complete: (term * term -> bool) -> rule list -> rule list -> unit diff --git a/testsuite/tests/misc-kb/kbmain.ml b/testsuite/tests/misc-kb/kbmain.ml new file mode 100644 index 00000000..7d9e5baf --- /dev/null +++ b/testsuite/tests/misc-kb/kbmain.ml @@ -0,0 +1,82 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: kbmain.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +open Terms +open Equations +open Orderings +open Kb + +(**** +let group_rules = [ + { number = 1; numvars = 1; + lhs = Term("*", [Term("U",[]); Var 1]); rhs = Var 1 }; + { number = 2; numvars = 1; + lhs = Term("*", [Term("I",[Var 1]); Var 1]); rhs = Term("U",[]) }; + { number = 3; numvars = 3; + lhs = Term("*", [Term("*", [Var 1; Var 2]); Var 3]); + rhs = Term("*", [Var 1; Term("*", [Var 2; Var 3])]) } +] +****) + +let geom_rules = [ + { number = 1; numvars = 1; + lhs = Term ("*",[(Term ("U",[])); (Var 1)]); + rhs = Var 1 }; + { number = 2; numvars = 1; + lhs = Term ("*",[(Term ("I",[(Var 1)])); (Var 1)]); + rhs = Term ("U",[]) }; + { number = 3; numvars = 3; + lhs = Term ("*",[(Term ("*",[(Var 1); (Var 2)])); (Var 3)]); + rhs = Term ("*",[(Var 1); (Term ("*",[(Var 2); (Var 3)]))]) }; + { number = 4; numvars = 0; + lhs = Term ("*",[(Term ("A",[])); (Term ("B",[]))]); + rhs = Term ("*",[(Term ("B",[])); (Term ("A",[]))]) }; + { number = 5; numvars = 0; + lhs = Term ("*",[(Term ("C",[])); (Term ("C",[]))]); + rhs = Term ("U",[]) }; + { number = 6; numvars = 0; + lhs = Term("*", + [(Term ("C",[])); + (Term ("*",[(Term ("A",[])); (Term ("I",[(Term ("C",[]))]))]))]); + rhs = Term ("I",[(Term ("A",[]))]) }; + { number = 7; numvars = 0; + lhs = Term("*", + [(Term ("C",[])); + (Term ("*",[(Term ("B",[])); (Term ("I",[(Term ("C",[]))]))]))]); + rhs = Term ("B",[]) } +] + +let group_rank = function + "U" -> 0 + | "*" -> 1 + | "I" -> 2 + | "B" -> 3 + | "C" -> 4 + | "A" -> 5 + | _ -> assert false + +let group_precedence op1 op2 = + let r1 = group_rank op1 + and r2 = group_rank op2 in + if r1 = r2 then Equal else + if r1 > r2 then Greater else NotGE + +let group_order = rpo group_precedence lex_ext + +let greater pair = + match group_order pair with Greater -> true | _ -> false + +let _ = + for i = 1 to 20 do kb_complete greater [] geom_rules done + diff --git a/testsuite/tests/misc-kb/kbmain.reference b/testsuite/tests/misc-kb/kbmain.reference new file mode 100644 index 00000000..2789a669 --- /dev/null +++ b/testsuite/tests/misc-kb/kbmain.reference @@ -0,0 +1,5460 @@ +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*I(C)) +7 : C*(B*I(C)) = B +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +11 : C*(A*(I(C)*A)) = U +12 : C*(B*(I(C)*v1)) = B*v1 +13 : I(U)*v1 = v1 +14 : I(I(v1))*U = v1 +15 : I(v3*v2)*(v3*(v2*v1)) = v1 +16 : C*(A*(I(C)*(B*A))) = B +17 : I(C)*U = C +18 : C*(A*(I(C)*(A*v1))) = v1 +19 : I(C)*B = B*I(C) +20 : I(I(v2))*v1 = v2*v1 +Rule 14 deleted +21 : v1*U = v1 +Rule 17 deleted +22 : I(C) = C +Rule 19 deleted +Rule 18 deleted +Rule 16 deleted +Rule 12 deleted +Rule 11 deleted +Rule 7 deleted +23 : C*B = B*C +24 : C*(A*(C*(A*v1))) = v1 +25 : C*(A*(C*(B*A))) = B +26 : C*(B*(C*v1)) = B*v1 +27 : C*(A*(C*A)) = U +28 : C*(B*C) = B +29 : C*(A*(C*(B*(A*v1)))) = B*v1 +30 : I(I(v2*v1)*v2) = v1 +31 : I(v2*I(v1))*v2 = v1 +32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 +33 : I(v1*A)*(v1*(B*A)) = B +34 : I(v1*C)*v1 = C +35 : I(v3*I(v2))*(v3*v1) = v2*v1 +36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 +37 : I(v2*C)*(v2*v1) = C*v1 +38 : v1*I(v1) = U +39 : I(C*(A*C))*v1 = A*v1 +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +Rule 13 deleted +42 : I(I(v1)) = v1 +Rule 20 deleted +43 : C*(B*v1) = B*(C*v1) +Rule 29 deleted +Rule 28 deleted +Rule 26 deleted +Rule 25 deleted +44 : A*(C*(A*v1)) = C*v1 +Rule 24 deleted +45 : A*(C*A) = C +Rule 27 deleted +46 : v2*(I(v1*v2)*v1) = U +47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 +48 : I(I(B*A)*A) = B +49 : v3*(I(v2*v3)*(v2*v1)) = v1 +50 : I(I(v1)*I(v2)) = v2*v1 +51 : I(I(B*(A*v1))*A) = B*v1 +52 : I(I(v1)*C) = C*v1 +53 : I(v2*I(v1*v2)) = v1 +54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 +55 : I(v1*(C*(A*C)))*v1 = A +56 : v2*I(I(v1)*v2) = v1 +57 : I(v2*(I(v3*v1)*v3))*v2 = v1 +58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 +59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B +60 : I(v2*(v1*C))*(v2*v1) = C +61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 +62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 +63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 +64 : I(v3*(I(v4*v2)*v4))*(v3*v1) = v2*v1 +65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 +66 : I(I(B)*A)*A = B +67 : I(A*A)*(B*(A*A)) = B +68 : v1*(I(A*v1)*(B*A)) = B +69 : I(I(v1*A)*(v1*B))*B = A +70 : v1*I(C*v1) = C +71 : I(A*I(v1))*(B*A) = v1*B +72 : I(C*I(v1)) = v1*C +73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 +74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) +75 : v3*(I(I(v2)*v3)*v1) = v2*v1 +76 : I(I(B*I(v1))*A)*(v1*A) = B +77 : I(v1*A)*(v1*(B*(B*A))) = B*B +78 : I(I(B)*A)*(A*v1) = B*v1 +79 : I(A*A)*(B*(A*(A*v1))) = B*v1 +80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) +81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 +82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 +83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 +84 : I(A*C)*(B*A) = B*C +85 : I(A*C)*(B*(A*v1)) = B*(C*v1) +86 : v2*(I(C*v2)*v1) = C*v1 +87 : I(I(B*C)*A)*(C*A) = B +88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 +89 : v2*(v1*I(v2*v1)) = U +90 : B*(A*I(B)) = A +91 : I(v2*v1)*v2 = I(v1) +Rule 64 deleted +Rule 57 deleted +Rule 55 deleted +Rule 46 deleted +Rule 34 deleted +Rule 31 deleted +Rule 30 deleted +92 : I(C*(A*C)) = A +Rule 39 deleted +93 : I(v3*(v2*v1))*(v3*v2) = I(v1) +Rule 60 deleted +Rule 54 deleted +Rule 47 deleted +94 : I(v1*I(v2)) = v2*I(v1) +Rule 83 deleted +Rule 76 deleted +Rule 74 deleted +Rule 72 deleted +Rule 71 deleted +Rule 53 deleted +Rule 50 deleted +Rule 35 deleted +95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 +96 : I(v1*(I(B)*A))*(v1*A) = B +97 : I(v1*A)*(v1*B) = B*(C*(A*C)) +Rule 82 deleted +Rule 69 deleted +98 : I(v1*C) = C*I(v1) +Rule 88 deleted +Rule 87 deleted +Rule 85 deleted +Rule 84 deleted +Rule 52 deleted +Rule 37 deleted +99 : v3*(v2*(I(v3*v2)*v1)) = v1 +100 : B*(A*(I(B)*v1)) = A*v1 +101 : I(v3*v2)*(v3*v1) = I(v2)*v1 +Rule 97 deleted +Rule 96 deleted +Rule 95 deleted +Rule 93 deleted +Rule 80 deleted +Rule 77 deleted +Rule 73 deleted +Rule 65 deleted +Rule 63 deleted +Rule 62 deleted +Rule 61 deleted +Rule 59 deleted +Rule 58 deleted +Rule 49 deleted +Rule 36 deleted +Rule 33 deleted +Rule 32 deleted +Rule 15 deleted +102 : B*(C*I(B)) = C +103 : B*(C*(I(B)*v1)) = C*v1 +104 : B*(I(B*A)*A) = U +105 : B*(I(B*A)*(A*v1)) = v1 +106 : I(B*A)*A = I(B) +Rule 104 deleted +Rule 48 deleted +107 : B*(v1*(I(B*(A*v1))*A)) = U +108 : I(I(B*(B*A))*A) = B*B +109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 +110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) +111 : I(I(B)*A) = B*(C*(A*C)) +Rule 78 deleted +Rule 66 deleted +112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) +Rule 110 deleted +Rule 108 deleted +Rule 51 deleted +113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 +114 : v1*I(C*(A*(C*v1))) = A +115 : I(I(v1)*v2) = I(v2)*v1 +Rule 113 deleted +Rule 112 deleted +Rule 111 deleted +Rule 75 deleted +Rule 56 deleted +116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B +117 : I(A*v1)*(B*A) = I(v1)*B +Rule 116 deleted +Rule 68 deleted +118 : v2*(v1*I(C*(v2*v1))) = C +119 : I(C*v1) = I(v1)*C +Rule 118 deleted +Rule 114 deleted +Rule 92 deleted +Rule 86 deleted +Rule 70 deleted +120 : v1*(I(A*(C*v1))*C) = A +121 : I(A*A)*(B*(B*(A*A))) = B*B +122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) +123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) +Rule 79 deleted +Rule 67 deleted +124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 +125 : v1*(I(A*v1)*(B*(B*A))) = B*B +126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) +Rule 124 deleted +Rule 123 deleted +Rule 81 deleted +127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U +128 : v2*I(v1*v2) = I(v1) +Rule 89 deleted +129 : A*I(B) = I(B)*A +Rule 90 deleted +130 : I(v1*v2) = I(v2)*I(v1) +Rule 128 deleted +Rule 127 deleted +Rule 126 deleted +Rule 125 deleted +Rule 122 deleted +Rule 121 deleted +Rule 120 deleted +Rule 119 deleted +Rule 117 deleted +Rule 115 deleted +Rule 109 deleted +Rule 107 deleted +Rule 106 deleted +Rule 105 deleted +Rule 101 deleted +Rule 99 deleted +Rule 98 deleted +Rule 94 deleted +Rule 91 deleted +131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 +132 : B*(C*(A*(C*(I(B)*A)))) = U +133 : C*(A*(C*(I(B)*A))) = I(B) +Rule 132 deleted +134 : A*(I(B)*v1) = I(B)*(A*v1) +Rule 100 deleted +135 : C*I(B) = I(B)*C +Rule 102 deleted +136 : C*(I(B)*v1) = I(B)*(C*v1) +Rule 133 deleted +Rule 131 deleted +Rule 103 deleted +Canonical set found : +1 : U*v1 = v1 +2 : I(v1)*v1 = U +3 : (v3*v2)*v1 = v3*(v2*v1) +4 : A*B = B*A +5 : C*C = U +6 : I(A) = C*(A*C) +8 : I(v2)*(v2*v1) = v1 +9 : A*(B*v1) = B*(A*v1) +10 : C*(C*v1) = v1 +21 : v1*U = v1 +22 : I(C) = C +23 : C*B = B*C +38 : v1*I(v1) = U +40 : v2*(I(v2)*v1) = v1 +41 : I(U) = U +42 : I(I(v1)) = v1 +43 : C*(B*v1) = B*(C*v1) +44 : A*(C*(A*v1)) = C*v1 +45 : A*(C*A) = C +129 : A*I(B) = I(B)*A +130 : I(v1*v2) = I(v2)*I(v1) +134 : A*(I(B)*v1) = I(B)*(A*v1) +135 : C*I(B) = I(B)*C +136 : C*(I(B)*v1) = I(B)*(C*v1) diff --git a/testsuite/tests/misc-kb/orderings.ml b/testsuite/tests/misc-kb/orderings.ml new file mode 100644 index 00000000..2f3ee973 --- /dev/null +++ b/testsuite/tests/misc-kb/orderings.ml @@ -0,0 +1,99 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: orderings.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + +(*********************** Recursive Path Ordering ****************************) + +open Terms + +type ordering = + Greater + | Equal + | NotGE + +let ge_ord order pair = match order pair with NotGE -> false | _ -> true +and gt_ord order pair = match order pair with Greater -> true | _ -> false +and eq_ord order pair = match order pair with Equal -> true | _ -> false + + +let rec rem_eq equiv x = function + [] -> failwith "rem_eq" + | y::l -> if equiv (x,y) then l else y :: rem_eq equiv x l + + +let diff_eq equiv (x,y) = + let rec diffrec = function + ([],_) as p -> p + | (h::t, y) -> try + diffrec (t, rem_eq equiv h y) + with Failure _ -> + let (x',y') = diffrec (t,y) in (h::x',y') in + if List.length x > List.length y then diffrec(y,x) else diffrec(x,y) + + +(* Multiset extension of order *) + +let mult_ext order = function + Term(_,sons1), Term(_,sons2) -> + begin match diff_eq (eq_ord order) (sons1,sons2) with + ([],[]) -> Equal + | (l1,l2) -> + if List.for_all + (fun n -> List.exists (fun m -> gt_ord order (m,n)) l1) l2 + then Greater else NotGE + end + | _ -> failwith "mult_ext" + + +(* Lexicographic extension of order *) + +let lex_ext order = function + (Term(_,sons1) as m), (Term(_,sons2) as n) -> + let rec lexrec = function + ([] , []) -> Equal + | ([] , _ ) -> NotGE + | ( _ , []) -> Greater + | (x1::l1, x2::l2) -> + match order (x1,x2) with + Greater -> if List.for_all (fun n' -> gt_ord order (m,n')) l2 + then Greater else NotGE + | Equal -> lexrec (l1,l2) + | NotGE -> if List.exists (fun m' -> ge_ord order (m',n)) l1 + then Greater else NotGE in + lexrec (sons1, sons2) + | _ -> failwith "lex_ext" + + +(* Recursive path ordering *) + +let rpo op_order ext = + let rec rporec (m,n) = + if m = n then Equal else + match m with + Var vm -> NotGE + | Term(op1,sons1) -> + match n with + Var vn -> + if occurs vn m then Greater else NotGE + | Term(op2,sons2) -> + match (op_order op1 op2) with + Greater -> + if List.for_all (fun n' -> gt_ord rporec (m,n')) sons2 + then Greater else NotGE + | Equal -> + ext rporec (m,n) + | NotGE -> + if List.exists (fun m' -> ge_ord rporec (m',n)) sons1 + then Greater else NotGE + in rporec + diff --git a/testsuite/tests/misc-kb/orderings.mli b/testsuite/tests/misc-kb/orderings.mli new file mode 100644 index 00000000..b68ceda3 --- /dev/null +++ b/testsuite/tests/misc-kb/orderings.mli @@ -0,0 +1,31 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: orderings.mli 2553 1999-11-17 18:59:06Z xleroy $ *) + +open Terms + +type ordering = + Greater + | Equal + | NotGE + +val ge_ord: ('a -> ordering) -> 'a -> bool +val gt_ord: ('a -> ordering) -> 'a -> bool +val eq_ord: ('a -> ordering) -> 'a -> bool +val rem_eq: ('a * 'b -> bool) -> 'a -> 'b list -> 'b list +val diff_eq: ('a * 'a -> bool) -> 'a list * 'a list -> 'a list * 'a list +val mult_ext: (term * term -> ordering) -> term * term -> ordering +val lex_ext: (term * term -> ordering) -> term * term -> ordering +val rpo: (string -> string -> ordering) -> + ((term * term -> ordering) -> term * term -> ordering) -> + term * term -> ordering diff --git a/testsuite/tests/misc-kb/terms.ml b/testsuite/tests/misc-kb/terms.ml new file mode 100644 index 00000000..1b182f75 --- /dev/null +++ b/testsuite/tests/misc-kb/terms.ml @@ -0,0 +1,137 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: terms.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + +(****************** Term manipulations *****************) + +type term = + Var of int + | Term of string * term list + +let rec union l1 l2 = + match l1 with + [] -> l2 + | a::r -> if List.mem a l2 then union r l2 else a :: union r l2 + + +let rec vars = function + Var n -> [n] + | Term(_,l) -> vars_of_list l +and vars_of_list = function + [] -> [] + | t::r -> union (vars t) (vars_of_list r) + + +let rec substitute subst = function + Term(oper,sons) -> Term(oper, List.map (substitute subst) sons) + | Var(n) as t -> try List.assoc n subst with Not_found -> t + + +(* Term replacement: replace M u N is M[u<-N]. *) + +let rec replace m u n = + match (u, m) with + [], _ -> n + | i::u, Term(oper, sons) -> Term(oper, replace_nth i sons u n) + | _ -> failwith "replace" + +and replace_nth i sons u n = + match sons with + s::r -> if i = 1 + then replace s u n :: r + else s :: replace_nth (i-1) r u n + | [] -> failwith "replace_nth" + + +(* Term matching. *) + +let matching term1 term2 = + let rec match_rec subst t1 t2 = + match (t1, t2) with + Var v, _ -> + if List.mem_assoc v subst then + if t2 = List.assoc v subst then subst else failwith "matching" + else + (v, t2) :: subst + | Term(op1,sons1), Term(op2,sons2) -> + if op1 = op2 + then List.fold_left2 match_rec subst sons1 sons2 + else failwith "matching" + | _ -> failwith "matching" in + match_rec [] term1 term2 + + +(* A naive unification algorithm. *) + +let compsubst subst1 subst2 = + (List.map (fun (v,t) -> (v, substitute subst1 t)) subst2) @ subst1 + + +let rec occurs n = function + Var m -> m = n + | Term(_,sons) -> List.exists (occurs n) sons + + +let rec unify term1 term2 = + match (term1, term2) with + Var n1, _ -> + if term1 = term2 then [] + else if occurs n1 term2 then failwith "unify" + else [n1, term2] + | term1, Var n2 -> + if occurs n2 term1 then failwith "unify" + else [n2, term1] + | Term(op1,sons1), Term(op2,sons2) -> + if op1 = op2 then + List.fold_left2 (fun s t1 t2 -> compsubst (unify (substitute s t1) + (substitute s t2)) s) + [] sons1 sons2 + else failwith "unify" + + +(* We need to print terms with variables independently from input terms + obtained by parsing. We give arbitrary names v1,v2,... to their variables. +*) + +let infixes = ["+";"*"] + +let rec pretty_term = function + Var n -> + print_string "v"; print_int n + | Term (oper,sons) -> + if List.mem oper infixes then begin + match sons with + [s1;s2] -> + pretty_close s1; print_string oper; pretty_close s2 + | _ -> + failwith "pretty_term : infix arity <> 2" + end else begin + print_string oper; + match sons with + [] -> () + | t::lt -> print_string "("; + pretty_term t; + List.iter (fun t -> print_string ","; pretty_term t) lt; + print_string ")" + end + +and pretty_close = function + Term(oper, _) as m -> + if List.mem oper infixes then begin + print_string "("; pretty_term m; print_string ")" + end else + pretty_term m + | m -> + pretty_term m + + diff --git a/testsuite/tests/misc-kb/terms.mli b/testsuite/tests/misc-kb/terms.mli new file mode 100644 index 00000000..a71e139c --- /dev/null +++ b/testsuite/tests/misc-kb/terms.mli @@ -0,0 +1,31 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: terms.mli 2553 1999-11-17 18:59:06Z xleroy $ *) + +type term = + Var of int + | Term of string * term list + +val union: 'a list -> 'a list -> 'a list +val vars: term -> int list +val vars_of_list: term list -> int list +val substitute: (int * term) list -> term -> term +val replace: term -> int list -> term -> term +val replace_nth: int -> term list -> int list -> term -> term list +val matching: term -> term -> (int * term) list +val compsubst: (int * term) list -> (int * term) list -> (int * term) list +val occurs: int -> term -> bool +val unify: term -> term -> (int * term) list +val infixes: string list +val pretty_term: term -> unit +val pretty_close: term -> unit diff --git a/testsuite/tests/misc-unsafe/Makefile b/testsuite/tests/misc-unsafe/Makefile new file mode 100644 index 00000000..82f7a72d --- /dev/null +++ b/testsuite/tests/misc-unsafe/Makefile @@ -0,0 +1,3 @@ +UNSAFE=ON +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/misc-unsafe/almabench.ml b/testsuite/tests/misc-unsafe/almabench.ml new file mode 100644 index 00000000..b2130472 --- /dev/null +++ b/testsuite/tests/misc-unsafe/almabench.ml @@ -0,0 +1,324 @@ +(* + * ALMABENCH 1.0.1 + * Objective Caml version + * + * A number-crunching benchmark designed for cross-language and vendor + * comparisons. + * + * Written by Shawn Wagner, from Scott Robert Ladd's versions for + * C++ and java. + * + * No rights reserved. This is public domain software, for use by anyone. + * + * This program calculates the daily ephemeris (at noon) for the years + * 2000-2099 using an algorithm developed by J.L. Simon, P. Bretagnon, J. + * Chapront, M. Chapront-Touze, G. Francou and J. Laskar of the Bureau des + * Longitudes, Paris, France), as detailed in Astronomy & Astrophysics + * 282, 663 (1994) + * + * Note that the code herein is design for the purpose of testing + * computational performance; error handling and other such "niceties" + * is virtually non-existent. + * + * Actual (and oft-updated) benchmark results can be found at: + * http://www.coyotegulch.com + * + * Please do not use this information or algorithm in any way that might + * upset the balance of the universe or otherwise cause planets to impact + * upon one another. + *) + +let pic = 3.14159265358979323846 +and j2000 = 2451545.0 +and jcentury = 36525.0 +and jmillenia = 365250.0 + +let twopi = 2.0 *. pic +and a2r = pic /. 648000.0 +and r2h = 12.0 /. pic +and r2d = 180.0 /. pic +and gaussk = 0.01720209895 + +(* number of days to include in test *) +let test_loops = 5 (* was: 20 *) +and test_length = 36525 + +(* sin and cos of j2000 mean obliquity (iau 1976) *) +and sineps = 0.3977771559319137 +and coseps = 0.9174820620691818 + +and amas = [| 6023600.0; 408523.5; 328900.5; 3098710.0; 1047.355; 3498.5; 22869.0; 19314.0 |] + +(* + * tables giving the mean keplerian elements, limited to t**2 terms: + * a semi-major axis (au) + * dlm mean longitude (degree and arcsecond) + * e eccentricity + * pi longitude of the perihelion (degree and arcsecond) + * dinc inclination (degree and arcsecond) + * omega longitude of the ascending node (degree and arcsecond) + *) +and a = [| + [| 0.3870983098; 0.0; 0.0 |]; + [| 0.7233298200; 0.0; 0.0 |]; + [| 1.0000010178; 0.0; 0.0 |]; + [| 1.5236793419; 3e-10; 0.0 |]; + [| 5.2026032092; 19132e-10; -39e-10 |]; + [| 9.5549091915; -0.0000213896; 444e-10 |]; + [| 19.2184460618; -3716e-10; 979e-10 |]; + [| 30.1103868694; -16635e-10; 686e-10 |] |] + +and dlm = + [| [| 252.25090552; 5381016286.88982; -1.92789 |]; + [| 181.97980085; 2106641364.33548; 0.59381 |]; + [| 100.46645683; 1295977422.83429; -2.04411 |]; + [| 355.43299958; 689050774.93988; 0.94264 |]; + [| 34.35151874; 109256603.77991; -30.60378 |]; + [| 50.07744430; 43996098.55732; 75.61614 |]; + [| 314.05500511; 15424811.93933; -1.75083 |]; + [| 304.34866548; 7865503.20744; 0.21103 |] |] + +and e = + [| [| 0.2056317526; 0.0002040653; -28349e-10 |]; + [| 0.0067719164; -0.0004776521; 98127e-10 |]; + [| 0.0167086342; -0.0004203654; -0.0000126734 |]; + [| 0.0934006477; 0.0009048438; -80641e-10 |]; + [| 0.0484979255; 0.0016322542; -0.0000471366 |]; + [| 0.0555481426; -0.0034664062; -0.0000643639 |]; + [| 0.0463812221; -0.0002729293; 0.0000078913 |]; + [| 0.0094557470; 0.0000603263; 0.0 |] |] + +and pi = + [| [| 77.45611904; 5719.11590; -4.83016 |]; + [| 131.56370300; 175.48640; -498.48184 |]; + [| 102.93734808; 11612.35290; 53.27577 |]; + [| 336.06023395; 15980.45908; -62.32800 |]; + [| 14.33120687; 7758.75163; 259.95938 |]; + [| 93.05723748; 20395.49439; 190.25952 |]; + [| 173.00529106; 3215.56238; -34.09288 |]; + [| 48.12027554; 1050.71912; 27.39717 |] |] +and dinc = + [| [| 7.00498625; -214.25629; 0.28977 |]; + [| 3.39466189; -30.84437; -11.67836 |]; + [| 0.0; 469.97289; -3.35053 |]; + [| 1.84972648; -293.31722; -8.11830 |]; + [| 1.30326698; -71.55890; 11.95297 |]; + [| 2.48887878; 91.85195; -17.66225 |]; + [| 0.77319689; -60.72723; 1.25759 |]; + [| 1.76995259; 8.12333; 0.08135 |] |] + +and omega = + [| [| 48.33089304; -4515.21727; -31.79892 |]; + [| 76.67992019; -10008.48154; -51.32614 |]; + [| 174.87317577; -8679.27034; 15.34191 |]; + [| 49.55809321; -10620.90088; -230.57416 |]; + [| 100.46440702; 6362.03561; 326.52178 |]; + [| 113.66550252; -9240.19942; -66.23743 |]; + [| 74.00595701; 2669.15033; 145.93964 |]; + [| 131.78405702; -221.94322; -0.78728 |] |] + +(* tables for trigonometric terms to be added to the mean elements + of the semi-major axes. *) +and kp = + [| [| 69613.0; 75645.0; 88306.0; 59899.0; 15746.0; 71087.0; 142173.0; 3086.0; 0.0 |]; + [| 21863.0; 32794.0; 26934.0; 10931.0; 26250.0; 43725.0; 53867.0; 28939.0; 0.0 |]; + [| 16002.0; 21863.0; 32004.0; 10931.0; 14529.0; 16368.0; 15318.0; 32794.0; 0.0 |]; + [| 6345.0; 7818.0; 15636.0; 7077.0; 8184.0; 14163.0; 1107.0; 4872.0; 0.0 |]; + [| 1760.0; 1454.0; 1167.0; 880.0; 287.0; 2640.0; 19.0; 2047.0; 1454.0 |]; + [| 574.0; 0.0; 880.0; 287.0; 19.0; 1760.0; 1167.0; 306.0; 574.0 |]; + [| 204.0; 0.0; 177.0; 1265.0; 4.0; 385.0; 200.0; 208.0; 204.0 |]; + [| 0.0; 102.0; 106.0; 4.0; 98.0; 1367.0; 487.0; 204.0; 0.0 |] |] + +and ca = + [| [| 4.0; -13.0; 11.0; -9.0; -9.0; -3.0; -1.0; 4.0; 0.0 |]; + [| -156.0; 59.0; -42.0; 6.0; 19.0; -20.0; -10.0; -12.0; 0.0 |]; + [| 64.0; -152.0; 62.0; -8.0; 32.0; -41.0; 19.0; -11.0; 0.0 |]; + [| 124.0; 621.0; -145.0; 208.0; 54.0; -57.0; 30.0; 15.0; 0.0 |]; + [| -23437.0; -2634.0; 6601.0; 6259.0; -1507.0; -1821.0; 2620.0; -2115.0;-1489.0 |]; + [| 62911.0;-119919.0; 79336.0; 17814.0;-24241.0; 12068.0; 8306.0; -4893.0; 8902.0 |]; + [| 389061.0;-262125.0;-44088.0; 8387.0;-22976.0; -2093.0; -615.0; -9720.0; 6633.0 |]; + [| -412235.0;-157046.0;-31430.0; 37817.0; -9740.0; -13.0; -7449.0; 9644.0; 0.0 |] |] + +and sa = + [| [| -29.0; -1.0; 9.0; 6.0; -6.0; 5.0; 4.0; 0.0; 0.0 |]; + [| -48.0; -125.0; -26.0; -37.0; 18.0; -13.0; -20.0; -2.0; 0.0 |]; + [| -150.0; -46.0; 68.0; 54.0; 14.0; 24.0; -28.0; 22.0; 0.0 |]; + [| -621.0; 532.0; -694.0; -20.0; 192.0; -94.0; 71.0; -73.0; 0.0 |]; + [| -14614.0;-19828.0; -5869.0; 1881.0; -4372.0; -2255.0; 782.0; 930.0; 913.0 |]; + [| 139737.0; 0.0; 24667.0; 51123.0; -5102.0; 7429.0; -4095.0; -1976.0;-9566.0 |]; + [| -138081.0; 0.0; 37205.0;-49039.0;-41901.0;-33872.0;-27037.0;-12474.0;18797.0 |]; + [| 0.0; 28492.0;133236.0; 69654.0; 52322.0;-49577.0;-26430.0; -3593.0; 0.0 |] |] + +(* tables giving the trigonometric terms to be added to the mean elements of + the mean longitudes . *) +and kq = + [| [| 3086.0; 15746.0; 69613.0; 59899.0; 75645.0; 88306.0; 12661.0; 2658.0; 0.0; 0.0 |]; + [| 21863.0; 32794.0; 10931.0; 73.0; 4387.0; 26934.0; 1473.0; 2157.0; 0.0; 0.0 |]; + [| 10.0; 16002.0; 21863.0; 10931.0; 1473.0; 32004.0; 4387.0; 73.0; 0.0; 0.0 |]; + [| 10.0; 6345.0; 7818.0; 1107.0; 15636.0; 7077.0; 8184.0; 532.0; 10.0; 0.0 |]; + [| 19.0; 1760.0; 1454.0; 287.0; 1167.0; 880.0; 574.0; 2640.0; 19.0;1454.0 |]; + [| 19.0; 574.0; 287.0; 306.0; 1760.0; 12.0; 31.0; 38.0; 19.0; 574.0 |]; + [| 4.0; 204.0; 177.0; 8.0; 31.0; 200.0; 1265.0; 102.0; 4.0; 204.0 |]; + [| 4.0; 102.0; 106.0; 8.0; 98.0; 1367.0; 487.0; 204.0; 4.0; 102.0 |] |] + +and cl = + [| [| 21.0; -95.0; -157.0; 41.0; -5.0; 42.0; 23.0; 30.0; 0.0; 0.0 |]; + [| -160.0; -313.0; -235.0; 60.0; -74.0; -76.0; -27.0; 34.0; 0.0; 0.0 |]; + [| -325.0; -322.0; -79.0; 232.0; -52.0; 97.0; 55.0; -41.0; 0.0; 0.0 |]; + [| 2268.0; -979.0; 802.0; 602.0; -668.0; -33.0; 345.0; 201.0; -55.0; 0.0 |]; + [| 7610.0; -4997.0;-7689.0;-5841.0;-2617.0; 1115.0; -748.0; -607.0; 6074.0; 354.0 |]; + [| -18549.0; 30125.0;20012.0; -730.0; 824.0; 23.0; 1289.0; -352.0;-14767.0;-2062.0 |]; + [| -135245.0;-14594.0; 4197.0;-4030.0;-5630.0;-2898.0; 2540.0; -306.0; 2939.0; 1986.0 |]; + [| 89948.0; 2103.0; 8963.0; 2695.0; 3682.0; 1648.0; 866.0; -154.0; -1963.0; -283.0 |] |] + +and sl = + [| [| -342.0; 136.0; -23.0; 62.0; 66.0; -52.0; -33.0; 17.0; 0.0; 0.0 |]; + [| 524.0; -149.0; -35.0; 117.0; 151.0; 122.0; -71.0; -62.0; 0.0; 0.0 |]; + [| -105.0; -137.0; 258.0; 35.0; -116.0; -88.0; -112.0; -80.0; 0.0; 0.0 |]; + [| 854.0; -205.0; -936.0; -240.0; 140.0; -341.0; -97.0; -232.0; 536.0; 0.0 |]; + [| -56980.0; 8016.0; 1012.0; 1448.0;-3024.0;-3710.0; 318.0; 503.0; 3767.0; 577.0 |]; + [| 138606.0;-13478.0;-4964.0; 1441.0;-1319.0;-1482.0; 427.0; 1236.0; -9167.0;-1918.0 |]; + [| 71234.0;-41116.0; 5334.0;-4935.0;-1848.0; 66.0; 434.0;-1748.0; 3780.0; -701.0 |]; + [| -47645.0; 11647.0; 2166.0; 3194.0; 679.0; 0.0; -244.0; -419.0; -2531.0; 48.0 |] |] + + +(* Normalize angle into the range -pi <= A < +pi. *) +let anpm a = + let w = mod_float a twopi in + if abs_float w >= pic then begin + if a < 0.0 then + w +. twopi + else + w -. twopi + end else + w + +(* The reference frame is equatorial and is with respect to the + * mean equator and equinox of epoch j2000. *) +let planetpv epoch np pv = + (* time: julian millennia since j2000. *) + let t = ((epoch.(0) -. j2000) +. epoch.(1)) /. jmillenia in + (* compute the mean elements. *) + let da = ref (a.(np).(0) +. (a.(np).(1) +. a.(np).(2) *. t ) *. t) + and dl = ref ((3600.0 *. dlm.(np).(0) +. (dlm.(np).(1) +. dlm.(np).(2) *. t ) *. t) *. a2r) + and de = e.(np).(0) +. (e.(np).(1) +. e.(np).(2) *. t ) *. t + and dp = anpm ((3600.0 *. pi.(np).(0) +. (pi.(np).(1) +. pi.(np).(2) *. t ) *. t ) *. a2r ) + and di = (3600.0 *. dinc.(np).(0) +. (dinc.(np).(1) +. dinc.(np).(2) *. t ) *. t ) *. a2r + and doh = anpm ((3600.0 *. omega.(np).(0) +. (omega.(np).(1) +. omega.(np).(2) *. t ) *. t ) *. a2r ) + (* apply the trigonometric terms. *) + and dmu = 0.35953620 *. t in + + (* loop invariant *) + let kp = kp.(np) and kq = kq.(np) and ca = ca.(np) and sa = sa.(np) + and cl = cl.(np) and sl = sl.(np) in + for k = 0 to 7 do + let arga = kp.(k) *. dmu + and argl = kq.(k) *. dmu in + da := !da +. (ca.(k) *. cos arga +. sa.(k) *. sin arga) *. 0.0000001; + dl := !dl +. (cl.(k) *. cos argl +. sl.(k) *. sin argl) *. 0.0000001 + done; + begin let arga = kp.(8) *. dmu in + da := !da +. t *. (ca.(8) *. cos arga +. sa.(8) *. sin arga ) *. 0.0000001; + for k = 8 to 9 do + let argl = kq.(k) *. dmu in + dl := !dl +. t *. ( cl.(k) *. cos argl +. sl.(k) *. sin argl ) *. 0.0000001 + done; + end; + + + dl := mod_float !dl twopi; + + (* iterative solution of kepler's equation to get eccentric anomaly. *) + let am = !dl -. dp in + let ae = ref (am +. de *. sin am) + and k = ref 0 in + let dae = ref ((am -. !ae +. de *. sin !ae) /. (1.0 -. de *. cos !ae)) in + ae := !ae +. !dae; + incr k; + while !k < 10 or abs_float !dae >= 1e-12 do + dae := (am -. !ae +. de *. sin !ae) /. (1.0 -. de *. cos !ae); + ae := !ae +. !dae; + incr k + done; + + (* true anomaly. *) + let ae2 = !ae /. 2.0 in + let at = 2.0 *. atan2 (sqrt ((1.0 +. de) /. (1.0 -. de)) *. sin ae2) (cos ae2) + (* distance (au) and speed (radians per day). *) + and r = !da *. (1.0 -. de *. cos !ae) + and v = gaussk *. sqrt ((1.0 +. 1.0 /. amas.(np) ) /. (!da *. !da *. !da)) + and si2 = sin (di /. 2.0) in + let xq = si2 *. cos doh + and xp = si2 *. sin doh + and tl = at +. dp in + let xsw = sin tl + and xcw = cos tl in + let xm2 = 2.0 *. (xp *. xcw -. xq *. xsw ) + and xf = !da /. sqrt (1.0 -. de *. de) + and ci2 = cos (di /. 2.0) in + let xms = (de *. sin dp +. xsw) *. xf + and xmc = (de *. cos dp +. xcw) *. xf + and xpxq2 = 2.0 *. xp *. xq in + + (* position (j2000 ecliptic x,y,z in au). *) + let x = r *. (xcw -. xm2 *. xp) + and y = r *. (xsw +. xm2 *. xq) + and z = r *. (-.xm2 *. ci2) in + + (* rotate to equatorial. *) + pv.(0).(0) <- x; + pv.(0).(1) <- y *. coseps -. z *. sineps; + pv.(0).(2) <- y *. sineps +. z *. coseps; + + (* velocity (j2000 ecliptic xdot,ydot,zdot in au/d). *) + let x = v *. ((-1.0 +. 2.0 *. xp *. xp) *. xms +. xpxq2 *. xmc) + and y = v *. (( 1.0 -. 2.0 *. xq *. xq ) *. xmc -. xpxq2 *. xms) + and z = v *. (2.0 *. ci2 *. (xp *. xms +. xq *. xmc)) in + + (* rotate to equatorial *) + pv.(1).(0) <- x; + pv.(1).(1) <- y *. coseps -. z *. sineps; + pv.(1).(2) <- y *. sineps +. z *. coseps + + +(* Computes RA, Declination, and distance from a state vector returned by + * planetpv. *) +let radecdist state rdd = + (* Distance *) + rdd.(2) <- sqrt (state.(0).(0) *. state.(0).(0) + +. state.(0).(1) *. state.(0).(1) + +. state.(0).(2) *. state.(0).(2)); + (* RA *) + rdd.(0) <- atan2 state.(0).(1) state.(0).(0) *. r2h; + if rdd.(0) < 0.0 then rdd.(0) <- rdd.(0) +. 24.0; + + (* Declination *) + rdd.(1) <- asin (state.(0).(2) /. rdd.(2)) *. r2d + + + +(* Entry point. Calculate RA and Dec for noon on every day in 1900-2100 *) +let _ = + let jd = [| 0.0; 0.0 |] + and pv = [| [| 0.0; 0.0; 0.0 |]; [| 0.0; 0.0; 0.0 |] |] + and position = [| 0.0; 0.0; 0.0 |] in + (* Test *) + jd.(0) <- j2000; + jd.(1) <- 1.0; + for p = 0 to 7 do + planetpv jd p pv; + radecdist pv position; + Printf.printf "%d %.2f %.2f\n%!" p position.(0) position.(1) + done; + (* Benchmark *) + for i = 0 to test_loops - 1 do + jd.(0) <- j2000; + jd.(1) <- 0.0; + for n = 0 to test_length - 1 do + jd.(0) <- jd.(0) +. 1.0; + for p = 0 to 7 do + planetpv jd p pv; + radecdist pv position; + done + done + done diff --git a/testsuite/tests/misc-unsafe/almabench.reference b/testsuite/tests/misc-unsafe/almabench.reference new file mode 100644 index 00000000..5c1d8b89 --- /dev/null +++ b/testsuite/tests/misc-unsafe/almabench.reference @@ -0,0 +1,8 @@ +0 17.00 -26.06 +1 12.34 1.29 +2 6.83 22.95 +3 0.04 -1.26 +4 2.30 12.54 +5 2.93 14.35 +6 21.27 -16.57 +7 20.41 -19.04 diff --git a/testsuite/tests/misc-unsafe/fft.ml b/testsuite/tests/misc-unsafe/fft.ml new file mode 100644 index 00000000..6a5f4dff --- /dev/null +++ b/testsuite/tests/misc-unsafe/fft.ml @@ -0,0 +1,189 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: fft.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +let pi = 3.14159265358979323846 + +let tpi = 2.0 *. pi + +let fft px py np = + let i = ref 2 in + let m = ref 1 in + + while (!i < np) do + i := !i + !i; + m := !m + 1 + done; + + let n = !i in + + if n <> np then begin + for i = np+1 to n do + px.(i) <- 0.0; + py.(i) <- 0.0 + done; + print_string "Use "; print_int n; + print_string " point fft"; print_newline() + end; + + let n2 = ref(n+n) in + for k = 1 to !m-1 do + n2 := !n2 / 2; + let n4 = !n2 / 4 in + let e = tpi /. float !n2 in + + for j = 1 to n4 do + let a = e *. float(j - 1) in + let a3 = 3.0 *. a in + let cc1 = cos(a) in + let ss1 = sin(a) in + let cc3 = cos(a3) in + let ss3 = sin(a3) in + let is = ref j in + let id = ref(2 * !n2) in + + while !is < n do + let i0r = ref !is in + while !i0r < n do + let i0 = !i0r in + let i1 = i0 + n4 in + let i2 = i1 + n4 in + let i3 = i2 + n4 in + let r1 = px.(i0) -. px.(i2) in + px.(i0) <- px.(i0) +. px.(i2); + let r2 = px.(i1) -. px.(i3) in + px.(i1) <- px.(i1) +. px.(i3); + let s1 = py.(i0) -. py.(i2) in + py.(i0) <- py.(i0) +. py.(i2); + let s2 = py.(i1) -. py.(i3) in + py.(i1) <- py.(i1) +. py.(i3); + let s3 = r1 -. s2 in + let r1 = r1 +. s2 in + let s2 = r2 -. s1 in + let r2 = r2 +. s1 in + px.(i2) <- r1*.cc1 -. s2*.ss1; + py.(i2) <- -.s2*.cc1 -. r1*.ss1; + px.(i3) <- s3*.cc3 +. r2*.ss3; + py.(i3) <- r2*.cc3 -. s3*.ss3; + i0r := i0 + !id + done; + is := 2 * !id - !n2 + j; + id := 4 * !id + done + done + done; + +(************************************) +(* Last stage, length=2 butterfly *) +(************************************) + + let is = ref 1 in + let id = ref 4 in + + while !is < n do + let i0r = ref !is in + while !i0r <= n do + let i0 = !i0r in + let i1 = i0 + 1 in + let r1 = px.(i0) in + px.(i0) <- r1 +. px.(i1); + px.(i1) <- r1 -. px.(i1); + let r1 = py.(i0) in + py.(i0) <- r1 +. py.(i1); + py.(i1) <- r1 -. py.(i1); + i0r := i0 + !id + done; + is := 2 * !id - 1; + id := 4 * !id + done; + +(*************************) +(* Bit reverse counter *) +(*************************) + + let j = ref 1 in + + for i = 1 to n - 1 do + if i < !j then begin + let xt = px.(!j) in + px.(!j) <- px.(i); + px.(i) <- xt; + let xt = py.(!j) in + py.(!j) <- py.(i); + py.(i) <- xt + end; + let k = ref(n / 2) in + while !k < !j do + j := !j - !k; + k := !k / 2 + done; + j := !j + !k + done; + + n + + +let test np = + print_int np; print_string "... "; flush stdout; + let enp = float np in + let npm = np / 2 - 1 in + let pxr = Array.create (np+2) 0.0 + and pxi = Array.create (np+2) 0.0 in + let t = pi /. enp in + pxr.(1) <- (enp -. 1.0) *. 0.5; + pxi.(1) <- 0.0; + let n2 = np / 2 in + pxr.(n2+1) <- -0.5; + pxi.(n2+1) <- 0.0; + + for i = 1 to npm do + let j = np - i in + pxr.(i+1) <- -0.5; + pxr.(j+1) <- -0.5; + let z = t *. float i in + let y = -0.5*.(cos(z)/.sin(z)) in + pxi.(i+1) <- y; + pxi.(j+1) <- -.y + done; +(** + print_newline(); + for i=0 to 15 do Printf.printf "%d %f %f\n" i pxr.(i+1) pxi.(i+1) done; +**) + let _ = fft pxr pxi np in +(** + for i=0 to 15 do Printf.printf "%d %f %f\n" i pxr.(i+1) pxi.(i+1) done; +**) + let zr = ref 0.0 in + let zi = ref 0.0 in + let kr = ref 0 in + let ki = ref 0 in + for i = 0 to np-1 do + let a = abs_float(pxr.(i+1) -. float i) in + if !zr < a then begin + zr := a; + kr := i + end; + let a = abs_float(pxi.(i+1)) in + if !zi < a then begin + zi := a; + ki := i + end + done; + if abs_float !zr <= 1e-9 && abs_float !zi <= 1e-9 + then print_string "ok" + else print_string "ERROR"; + print_newline() + +let _ = + let np = ref 16 in for i = 1 to 16 do test !np; np := !np*2 done + diff --git a/testsuite/tests/misc-unsafe/fft.reference b/testsuite/tests/misc-unsafe/fft.reference new file mode 100644 index 00000000..b0f1238b --- /dev/null +++ b/testsuite/tests/misc-unsafe/fft.reference @@ -0,0 +1,16 @@ +16... ok +32... ok +64... ok +128... ok +256... ok +512... ok +1024... ok +2048... ok +4096... ok +8192... ok +16384... ok +32768... ok +65536... ok +131072... ok +262144... ok +524288... ok diff --git a/testsuite/tests/misc-unsafe/quicksort.ml b/testsuite/tests/misc-unsafe/quicksort.ml new file mode 100644 index 00000000..cfc68068 --- /dev/null +++ b/testsuite/tests/misc-unsafe/quicksort.ml @@ -0,0 +1,92 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: quicksort.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +(* Good test for loops. Best compiled with -unsafe. *) + +let rec qsort lo hi (a : int array) = + if lo < hi then begin + let i = ref lo in + let j = ref hi in + let pivot = a.(hi) in + while !i < !j do + while !i < hi && a.(!i) <= pivot do incr i done; + while !j > lo && a.(!j) >= pivot do decr j done; + if !i < !j then begin + let temp = a.(!i) in a.(!i) <- a.(!j); a.(!j) <- temp + end + done; + let temp = a.(!i) in a.(!i) <- a.(hi); a.(hi) <- temp; + qsort lo (!i-1) a; + qsort (!i+1) hi a + end + + +(* Same but abstract over the comparison to force spilling *) + +let cmp i j = i - j + +let rec qsort2 lo hi (a : int array) = + if lo < hi then begin + let i = ref lo in + let j = ref hi in + let pivot = a.(hi) in + while !i < !j do + while !i < hi && cmp a.(!i) pivot <= 0 do incr i done; + while !j > lo && cmp a.(!j) pivot >= 0 do decr j done; + if !i < !j then begin + let temp = a.(!i) in a.(!i) <- a.(!j); a.(!j) <- temp + end + done; + let temp = a.(!i) in a.(!i) <- a.(hi); a.(hi) <- temp; + qsort2 lo (!i-1) a; + qsort2 (!i+1) hi a + end + + +(* Test *) + +let seed = ref 0 + +let random() = + seed := !seed * 25173 + 17431; !seed land 0xFFF + + +exception Failed + +let test_sort sort_fun size = + let a = Array.create size 0 in + let check = Array.create 4096 0 in + for i = 0 to size-1 do + let n = random() in a.(i) <- n; check.(n) <- check.(n)+1 + done; + sort_fun 0 (size-1) a; + try + check.(a.(0)) <- check.(a.(0)) - 1; + for i = 1 to size-1 do + if a.(i-1) > a.(i) then raise Failed; + check.(a.(i)) <- check.(a.(i)) - 1 + done; + for i = 0 to 4095 do + if check.(i) <> 0 then raise Failed + done; + print_string "OK"; print_newline() + with Failed -> + print_string "failed"; print_newline() + + +let main () = + test_sort qsort 500000; + test_sort qsort2 500000 + +let _ = main(); exit 0 diff --git a/testsuite/tests/misc-unsafe/quicksort.reference b/testsuite/tests/misc-unsafe/quicksort.reference new file mode 100644 index 00000000..2c94e483 --- /dev/null +++ b/testsuite/tests/misc-unsafe/quicksort.reference @@ -0,0 +1,2 @@ +OK +OK diff --git a/testsuite/tests/misc-unsafe/soli.ml b/testsuite/tests/misc-unsafe/soli.ml new file mode 100644 index 00000000..45dfd9d1 --- /dev/null +++ b/testsuite/tests/misc-unsafe/soli.ml @@ -0,0 +1,111 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: soli.ml 2553 1999-11-17 18:59:06Z xleroy $ *) + + +type peg = Out | Empty | Peg + +let board = [| + [| Out; Out; Out; Out; Out; Out; Out; Out; Out|]; + [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|]; + [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|]; + [| Out; Peg; Peg; Peg; Peg; Peg; Peg; Peg; Out|]; + [| Out; Peg; Peg; Peg; Empty; Peg; Peg; Peg; Out|]; + [| Out; Peg; Peg; Peg; Peg; Peg; Peg; Peg; Out|]; + [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|]; + [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|]; + [| Out; Out; Out; Out; Out; Out; Out; Out; Out|] +|] + + +let print_peg = function + Out -> print_string "." + | Empty -> print_string " " + | Peg -> print_string "$" + + +let print_board board = + for i=0 to 8 do + for j=0 to 8 do + print_peg board.(i).(j) + done; + print_newline() + done + + +type direction = { dx: int; dy: int } + +let dir = [| {dx = 0; dy = 1}; {dx = 1; dy = 0}; + {dx = 0; dy = -1}; {dx = -1; dy = 0} |] + +type move = { x1: int; y1: int; x2: int; y2: int } + +let moves = Array.create 31 {x1=0;y1=0;x2=0;y2=0} + +let counter = ref 0 + +exception Found + +let rec solve m = + counter := !counter + 1; + if m = 31 then + begin match board.(4).(4) with Peg -> true | _ -> false end + else + try + if !counter mod 500 = 0 then begin + print_int !counter; print_newline() + end; + for i=1 to 7 do + for j=1 to 7 do + match board.(i).(j) with + Peg -> + for k=0 to 3 do + let d1 = dir.(k).dx in + let d2 = dir.(k).dy in + let i1 = i+d1 in + let i2 = i1+d1 in + let j1 = j+d2 in + let j2 = j1+d2 in + match board.(i1).(j1) with + Peg -> + begin match board.(i2).(j2) with + Empty -> +(* + print_int i; print_string ", "; + print_int j; print_string ") dir "; + print_int k; print_string "\n"; +*) + board.(i).(j) <- Empty; + board.(i1).(j1) <- Empty; + board.(i2).(j2) <- Peg; + if solve(m+1) then begin + moves.(m) <- { x1=i; y1=j; x2=i2; y2=j2 }; + raise Found + end; + board.(i).(j) <- Peg; + board.(i1).(j1) <- Peg; + board.(i2).(j2) <- Empty + | _ -> () + end + | _ -> () + done + | _ -> + () + done + done; + false + with Found -> + true + + +let _ = if solve 0 then (print_string "\n"; print_board board) diff --git a/testsuite/tests/misc-unsafe/soli.reference b/testsuite/tests/misc-unsafe/soli.reference new file mode 100644 index 00000000..b94045c3 --- /dev/null +++ b/testsuite/tests/misc-unsafe/soli.reference @@ -0,0 +1,50 @@ +500 +1000 +1500 +2000 +2500 +3000 +3500 +4000 +4500 +5000 +5500 +6000 +6500 +7000 +7500 +8000 +8500 +9000 +9500 +10000 +10500 +11000 +11500 +12000 +12500 +13000 +13500 +14000 +14500 +15000 +15500 +16000 +16500 +17000 +17500 +18000 +18500 +19000 +19500 +20000 + +......... +... ... +... ... +. . +. $ . +. . +... ... +... ... +......... diff --git a/testsuite/tests/misc/Makefile b/testsuite/tests/misc/Makefile new file mode 100644 index 00000000..a226dd11 --- /dev/null +++ b/testsuite/tests/misc/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/misc/bdd.ml b/testsuite/tests/misc/bdd.ml new file mode 100644 index 00000000..2926e947 --- /dev/null +++ b/testsuite/tests/misc/bdd.ml @@ -0,0 +1,231 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: bdd.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +(* Translated to Caml by Xavier Leroy *) +(* Original code written in SML by ... *) + +type bdd = One | Zero | Node of bdd * int * int * bdd + +let rec eval bdd vars = + match bdd with + Zero -> false + | One -> true + | Node(l, v, _, h) -> + if vars.(v) then eval h vars else eval l vars + +let getId bdd = + match bdd with + Node(_,_,id,_) -> id + | Zero -> 0 + | One -> 1 + +let initSize_1 = 8*1024 - 1 +let nodeC = ref 1 +let sz_1 = ref initSize_1 +let htab = ref(Array.create (!sz_1+1) []) +let n_items = ref 0 +let hashVal x y v = x lsl 1 + y + v lsl 2 + +let resize newSize = + let arr = !htab in + let newSz_1 = newSize-1 in + let newArr = Array.create newSize [] in + let rec copyBucket bucket = + match bucket with + [] -> () + | n :: ns -> + match n with + | Node(l,v,_,h) -> + let ind = hashVal (getId l) (getId h) v land newSz_1 + in + newArr.(ind) <- (n :: newArr.(ind)); + copyBucket ns + | _ -> assert false + in + for n = 0 to !sz_1 do + copyBucket(arr.(n)) + done; + htab := newArr; + sz_1 := newSz_1 + + +let rec insert idl idh v ind bucket newNode = + if !n_items <= !sz_1 + then ( (!htab).(ind) <- (newNode :: bucket); + incr n_items ) + else ( resize(!sz_1 + !sz_1 + 2); + let ind = hashVal idl idh v land (!sz_1) + in + (!htab).(ind) <- newNode :: (!htab).(ind) + ) + + +let resetUnique () = ( + sz_1 := initSize_1; + htab := Array.create (!sz_1+1) []; + n_items := 0; + nodeC := 1 + ) + +let mkNode low v high = + let idl = getId low in + let idh = getId high + in + if idl = idh + then low + else let ind = hashVal idl idh v land (!sz_1) in + let bucket = (!htab).(ind) in + let rec lookup b = + match b with + [] -> let n = Node(low, v, (incr nodeC; !nodeC), high) + in + insert (getId low) (getId high) v ind bucket n; n + | n :: ns -> + match n with + | Node(l,v',id,h) -> + if v = v' && idl = getId l && idh = getId h + then n else lookup ns + | _ -> assert false + in + lookup bucket + + +type ordering = LESS | EQUAL | GREATER + +let cmpVar (x : int) (y : int) = + if xy then GREATER else EQUAL + +let zero = Zero +let one = One + +let mkVar x = mkNode zero x one + + +let cacheSize = 1999 +let andslot1 = Array.create cacheSize 0 +let andslot2 = Array.create cacheSize 0 +let andslot3 = Array.create cacheSize zero +let xorslot1 = Array.create cacheSize 0 +let xorslot2 = Array.create cacheSize 0 +let xorslot3 = Array.create cacheSize zero +let notslot1 = Array.create cacheSize 0 +let notslot2 = Array.create cacheSize one +let hash x y = ((x lsl 1)+y) mod cacheSize + +let rec not n = +match n with + Zero -> One +| One -> Zero +| Node(l, v, id, r) -> let h = id mod cacheSize + in + if id=notslot1.(h) then notslot2.(h) + else let f = mkNode (not l) v (not r) + in + notslot1.(h) <- id; notslot2.(h) <- f; f + +let rec and2 n1 n2 = +match n1 with + Node(l1, v1, i1, r1) + -> (match n2 with + Node(l2, v2, i2, r2) + -> let h = hash i1 i2 + in + if i1=andslot1.(h) && i2=andslot2.(h) then andslot3.(h) + else let f = match cmpVar v1 v2 with + EQUAL -> mkNode (and2 l1 l2) v1 (and2 r1 r2) + | LESS -> mkNode (and2 l1 n2) v1 (and2 r1 n2) + | GREATER -> mkNode (and2 n1 l2) v2 (and2 n1 r2) + in + andslot1.(h) <- i1; + andslot2.(h) <- i2; + andslot3.(h) <- f; + f + | Zero -> Zero + | One -> n1) +| Zero -> Zero +| One -> n2 + + +let rec xor n1 n2 = +match n1 with + Node(l1, v1, i1, r1) + -> (match n2 with + Node(l2, v2, i2, r2) + -> let h = hash i1 i2 + in + if i1=andslot1.(h) && i2=andslot2.(h) then andslot3.(h) + else let f = match cmpVar v1 v2 with + EQUAL -> mkNode (xor l1 l2) v1 (xor r1 r2) + | LESS -> mkNode (xor l1 n2) v1 (xor r1 n2) + | GREATER -> mkNode (xor n1 l2) v2 (xor n1 r2) + in + andslot1.(h) <- i1; + andslot2.(h) <- i2; + andslot3.(h) <- f; + f + | Zero -> n1 + | One -> not n1) +| Zero -> n2 +| One -> not n2 + +let hwb n = + let rec h i j = if i=j + then mkVar i + else xor (and2 (not(mkVar j)) (h i (j-1))) + (and2 (mkVar j) (g i (j-1))) + and g i j = if i=j + then mkVar i + else xor (and2 (not(mkVar i)) (h (i+1) j)) + (and2 (mkVar i) (g (i+1) j)) + in + h 0 (n-1) + +(* Testing *) +let seed = ref 0 + +let random() = + seed := !seed * 25173 + 17431; !seed land 1 > 0 + +let random_vars n = + let vars = Array.create n false in + for i = 0 to n - 1 do vars.(i) <- random() done; + vars + +let test_hwb bdd vars = + (* We should have + eval bdd vars = vars.(n-1) if n > 0 + eval bdd vars = false if n = 0 + where n is the number of "true" elements in vars. *) + let ntrue = ref 0 in + for i = 0 to Array.length vars - 1 do + if vars.(i) then incr ntrue + done; + eval bdd vars = (if !ntrue > 0 then vars.(!ntrue-1) else false) + +let main () = + let n = + if Array.length Sys.argv >= 2 then int_of_string Sys.argv.(1) else 22 in + let ntests = + if Array.length Sys.argv >= 3 then int_of_string Sys.argv.(2) else 100 in + let bdd = hwb n in + let succeeded = ref true in + for i = 1 to ntests do + succeeded := !succeeded && test_hwb bdd (random_vars n) + done; + if !succeeded + then print_string "OK\n" + else print_string "FAILED\n"; + exit 0 + +let _ = main() diff --git a/testsuite/tests/misc/bdd.reference b/testsuite/tests/misc/bdd.reference new file mode 100644 index 00000000..d86bac9d --- /dev/null +++ b/testsuite/tests/misc/bdd.reference @@ -0,0 +1 @@ +OK diff --git a/testsuite/tests/misc/boyer.ml b/testsuite/tests/misc/boyer.ml new file mode 100644 index 00000000..c2c76896 --- /dev/null +++ b/testsuite/tests/misc/boyer.ml @@ -0,0 +1,911 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: boyer.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +(* Manipulations over terms *) + +type term = + Var of int + | Prop of head * term list +and head = + { name: string; + mutable props: (term * term) list } + +let rec print_term = function + Var v -> + print_string "v"; print_int v + | Prop (head,argl) -> + print_string "("; + print_string head.name; + List.iter (fun t -> print_string " "; print_term t) argl; + print_string ")" + +let lemmas = ref ([] : head list) + +(* Replacement for property lists *) + +let get name = + let rec get_rec = function + hd1::hdl -> + if hd1.name = name then hd1 else get_rec hdl + | [] -> + let entry = {name = name; props = []} in + lemmas := entry :: !lemmas; + entry + in get_rec !lemmas + +let add_lemma = function + | Prop(_, [(Prop(headl,_) as left); right]) -> + headl.props <- (left, right) :: headl.props + | _ -> assert false + +(* Substitutions *) + +type subst = Bind of int * term + +let get_binding v list = + let rec get_rec = function + [] -> failwith "unbound" + | Bind(w,t)::rest -> if v = w then t else get_rec rest + in get_rec list + +let apply_subst alist term = + let rec as_rec = function + Var v -> begin try get_binding v alist with Failure _ -> term end + | Prop (head,argl) -> Prop (head, List.map as_rec argl) + in as_rec term + +exception Unify + +let rec unify term1 term2 = + unify1 term1 term2 [] + +and unify1 term1 term2 unify_subst = + match term2 with + Var v -> + begin try + if get_binding v unify_subst = term1 + then unify_subst + else raise Unify + with Failure _ -> + Bind(v,term1) :: unify_subst + end + | Prop (head2, argl2) -> + match term1 with + Var _ -> raise Unify + | Prop (head1,argl1) -> + if head1 == head2 + then unify1_lst argl1 argl2 unify_subst + else raise Unify + +and unify1_lst l1 l2 unify_subst = + match (l1, l2) with + ([], []) -> unify_subst + | (h1::r1, h2::r2) -> unify1_lst r1 r2 (unify1 h1 h2 unify_subst) + | _ -> raise Unify + + +let rec rewrite = function + Var _ as term -> term + | Prop (head, argl) -> + rewrite_with_lemmas (Prop (head, List.map rewrite argl)) head.props +and rewrite_with_lemmas term lemmas = + match lemmas with + [] -> + term + | (t1,t2)::rest -> + try + rewrite (apply_subst (unify term t1) t2) + with Unify -> + rewrite_with_lemmas term rest + +type cterm = CVar of int | CProp of string * cterm list + +let rec cterm_to_term = function + CVar v -> Var v + | CProp(p, l) -> Prop(get p, List.map cterm_to_term l) + +let add t = add_lemma (cterm_to_term t) + +let _ = +add (CProp +("equal", + [CProp ("compile",[CVar 5]); + CProp + ("reverse", + [CProp ("codegen",[CProp ("optimize",[CVar 5]); CProp ("nil",[])])])])); +add (CProp +("equal", + [CProp ("eqp",[CVar 23; CVar 24]); + CProp ("equal",[CProp ("fix",[CVar 23]); CProp ("fix",[CVar 24])])])); +add (CProp +("equal", + [CProp ("gt",[CVar 23; CVar 24]); CProp ("lt",[CVar 24; CVar 23])])); +add (CProp +("equal", + [CProp ("le",[CVar 23; CVar 24]); CProp ("ge",[CVar 24; CVar 23])])); +add (CProp +("equal", + [CProp ("ge",[CVar 23; CVar 24]); CProp ("le",[CVar 24; CVar 23])])); +add (CProp +("equal", + [CProp ("boolean",[CVar 23]); + CProp + ("or", + [CProp ("equal",[CVar 23; CProp ("true",[])]); + CProp ("equal",[CVar 23; CProp ("false",[])])])])); +add (CProp +("equal", + [CProp ("iff",[CVar 23; CVar 24]); + CProp + ("and", + [CProp ("implies",[CVar 23; CVar 24]); + CProp ("implies",[CVar 24; CVar 23])])])); +add (CProp +("equal", + [CProp ("even1",[CVar 23]); + CProp + ("if", + [CProp ("zerop",[CVar 23]); CProp ("true",[]); + CProp ("odd",[CProp ("sub1",[CVar 23])])])])); +add (CProp +("equal", + [CProp ("countps_",[CVar 11; CVar 15]); + CProp ("countps_loop",[CVar 11; CVar 15; CProp ("zero",[])])])); +add (CProp +("equal", + [CProp ("fact_",[CVar 8]); + CProp ("fact_loop",[CVar 8; CProp ("one",[])])])); +add (CProp +("equal", + [CProp ("reverse_",[CVar 23]); + CProp ("reverse_loop",[CVar 23; CProp ("nil",[])])])); +add (CProp +("equal", + [CProp ("divides",[CVar 23; CVar 24]); + CProp ("zerop",[CProp ("remainder",[CVar 24; CVar 23])])])); +add (CProp +("equal", + [CProp ("assume_true",[CVar 21; CVar 0]); + CProp ("cons",[CProp ("cons",[CVar 21; CProp ("true",[])]); CVar 0])])); +add (CProp +("equal", + [CProp ("assume_false",[CVar 21; CVar 0]); + CProp ("cons",[CProp ("cons",[CVar 21; CProp ("false",[])]); CVar 0])])); +add (CProp +("equal", + [CProp ("tautology_checker",[CVar 23]); + CProp ("tautologyp",[CProp ("normalize",[CVar 23]); CProp ("nil",[])])])); +add (CProp +("equal", + [CProp ("falsify",[CVar 23]); + CProp ("falsify1",[CProp ("normalize",[CVar 23]); CProp ("nil",[])])])); +add (CProp +("equal", + [CProp ("prime",[CVar 23]); + CProp + ("and", + [CProp ("not",[CProp ("zerop",[CVar 23])]); + CProp + ("not", + [CProp ("equal",[CVar 23; CProp ("add1",[CProp ("zero",[])])])]); + CProp ("prime1",[CVar 23; CProp ("sub1",[CVar 23])])])])); +add (CProp +("equal", + [CProp ("and",[CVar 15; CVar 16]); + CProp + ("if", + [CVar 15; + CProp ("if",[CVar 16; CProp ("true",[]); CProp ("false",[])]); + CProp ("false",[])])])); +add (CProp +("equal", + [CProp ("or",[CVar 15; CVar 16]); + CProp + ("if", + [CVar 15; CProp ("true",[]); + CProp ("if",[CVar 16; CProp ("true",[]); CProp ("false",[])]); + CProp ("false",[])])])); +add (CProp +("equal", + [CProp ("not",[CVar 15]); + CProp ("if",[CVar 15; CProp ("false",[]); CProp ("true",[])])])); +add (CProp +("equal", + [CProp ("implies",[CVar 15; CVar 16]); + CProp + ("if", + [CVar 15; + CProp ("if",[CVar 16; CProp ("true",[]); CProp ("false",[])]); + CProp ("true",[])])])); +add (CProp +("equal", + [CProp ("fix",[CVar 23]); + CProp ("if",[CProp ("numberp",[CVar 23]); CVar 23; CProp ("zero",[])])])); +add (CProp +("equal", + [CProp ("if",[CProp ("if",[CVar 0; CVar 1; CVar 2]); CVar 3; CVar 4]); + CProp + ("if", + [CVar 0; CProp ("if",[CVar 1; CVar 3; CVar 4]); + CProp ("if",[CVar 2; CVar 3; CVar 4])])])); +add (CProp +("equal", + [CProp ("zerop",[CVar 23]); + CProp + ("or", + [CProp ("equal",[CVar 23; CProp ("zero",[])]); + CProp ("not",[CProp ("numberp",[CVar 23])])])])); +add (CProp +("equal", + [CProp ("plus",[CProp ("plus",[CVar 23; CVar 24]); CVar 25]); + CProp ("plus",[CVar 23; CProp ("plus",[CVar 24; CVar 25])])])); +add (CProp +("equal", + [CProp ("equal",[CProp ("plus",[CVar 0; CVar 1]); CProp ("zero",[])]); + CProp ("and",[CProp ("zerop",[CVar 0]); CProp ("zerop",[CVar 1])])])); +add (CProp +("equal",[CProp ("difference",[CVar 23; CVar 23]); CProp ("zero",[])])); +add (CProp +("equal", + [CProp + ("equal", + [CProp ("plus",[CVar 0; CVar 1]); CProp ("plus",[CVar 0; CVar 2])]); + CProp ("equal",[CProp ("fix",[CVar 1]); CProp ("fix",[CVar 2])])])); +add (CProp +("equal", + [CProp + ("equal",[CProp ("zero",[]); CProp ("difference",[CVar 23; CVar 24])]); + CProp ("not",[CProp ("gt",[CVar 24; CVar 23])])])); +add (CProp +("equal", + [CProp ("equal",[CVar 23; CProp ("difference",[CVar 23; CVar 24])]); + CProp + ("and", + [CProp ("numberp",[CVar 23]); + CProp + ("or", + [CProp ("equal",[CVar 23; CProp ("zero",[])]); + CProp ("zerop",[CVar 24])])])])); +add (CProp +("equal", + [CProp + ("meaning", + [CProp ("plus_tree",[CProp ("append",[CVar 23; CVar 24])]); CVar 0]); + CProp + ("plus", + [CProp ("meaning",[CProp ("plus_tree",[CVar 23]); CVar 0]); + CProp ("meaning",[CProp ("plus_tree",[CVar 24]); CVar 0])])])); +add (CProp +("equal", + [CProp + ("meaning", + [CProp ("plus_tree",[CProp ("plus_fringe",[CVar 23])]); CVar 0]); + CProp ("fix",[CProp ("meaning",[CVar 23; CVar 0])])])); +add (CProp +("equal", + [CProp ("append",[CProp ("append",[CVar 23; CVar 24]); CVar 25]); + CProp ("append",[CVar 23; CProp ("append",[CVar 24; CVar 25])])])); +add (CProp +("equal", + [CProp ("reverse",[CProp ("append",[CVar 0; CVar 1])]); + CProp + ("append",[CProp ("reverse",[CVar 1]); CProp ("reverse",[CVar 0])])])); +add (CProp +("equal", + [CProp ("times",[CVar 23; CProp ("plus",[CVar 24; CVar 25])]); + CProp + ("plus", + [CProp ("times",[CVar 23; CVar 24]); + CProp ("times",[CVar 23; CVar 25])])])); +add (CProp +("equal", + [CProp ("times",[CProp ("times",[CVar 23; CVar 24]); CVar 25]); + CProp ("times",[CVar 23; CProp ("times",[CVar 24; CVar 25])])])); +add (CProp +("equal", + [CProp + ("equal",[CProp ("times",[CVar 23; CVar 24]); CProp ("zero",[])]); + CProp ("or",[CProp ("zerop",[CVar 23]); CProp ("zerop",[CVar 24])])])); +add (CProp +("equal", + [CProp ("exec",[CProp ("append",[CVar 23; CVar 24]); CVar 15; CVar 4]); + CProp + ("exec",[CVar 24; CProp ("exec",[CVar 23; CVar 15; CVar 4]); CVar 4])])); +add (CProp +("equal", + [CProp ("mc_flatten",[CVar 23; CVar 24]); + CProp ("append",[CProp ("flatten",[CVar 23]); CVar 24])])); +add (CProp +("equal", + [CProp ("member",[CVar 23; CProp ("append",[CVar 0; CVar 1])]); + CProp + ("or", + [CProp ("member",[CVar 23; CVar 0]); + CProp ("member",[CVar 23; CVar 1])])])); +add (CProp +("equal", + [CProp ("member",[CVar 23; CProp ("reverse",[CVar 24])]); + CProp ("member",[CVar 23; CVar 24])])); +add (CProp +("equal", + [CProp ("length",[CProp ("reverse",[CVar 23])]); + CProp ("length",[CVar 23])])); +add (CProp +("equal", + [CProp ("member",[CVar 0; CProp ("intersect",[CVar 1; CVar 2])]); + CProp + ("and", + [CProp ("member",[CVar 0; CVar 1]); CProp ("member",[CVar 0; CVar 2])])])); +add (CProp +("equal",[CProp ("nth",[CProp ("zero",[]); CVar 8]); CProp ("zero",[])])); +add (CProp +("equal", + [CProp ("exp",[CVar 8; CProp ("plus",[CVar 9; CVar 10])]); + CProp + ("times", + [CProp ("exp",[CVar 8; CVar 9]); CProp ("exp",[CVar 8; CVar 10])])])); +add (CProp +("equal", + [CProp ("exp",[CVar 8; CProp ("times",[CVar 9; CVar 10])]); + CProp ("exp",[CProp ("exp",[CVar 8; CVar 9]); CVar 10])])); +add (CProp +("equal", + [CProp ("reverse_loop",[CVar 23; CVar 24]); + CProp ("append",[CProp ("reverse",[CVar 23]); CVar 24])])); +add (CProp +("equal", + [CProp ("reverse_loop",[CVar 23; CProp ("nil",[])]); + CProp ("reverse",[CVar 23])])); +add (CProp +("equal", + [CProp ("count_list",[CVar 25; CProp ("sort_lp",[CVar 23; CVar 24])]); + CProp + ("plus", + [CProp ("count_list",[CVar 25; CVar 23]); + CProp ("count_list",[CVar 25; CVar 24])])])); +add (CProp +("equal", + [CProp + ("equal", + [CProp ("append",[CVar 0; CVar 1]); CProp ("append",[CVar 0; CVar 2])]); + CProp ("equal",[CVar 1; CVar 2])])); +add (CProp +("equal", + [CProp + ("plus", + [CProp ("remainder",[CVar 23; CVar 24]); + CProp ("times",[CVar 24; CProp ("quotient",[CVar 23; CVar 24])])]); + CProp ("fix",[CVar 23])])); +add (CProp +("equal", + [CProp + ("power_eval",[CProp ("big_plus",[CVar 11; CVar 8; CVar 1]); CVar 1]); + CProp ("plus",[CProp ("power_eval",[CVar 11; CVar 1]); CVar 8])])); +add (CProp +("equal", + [CProp + ("power_eval", + [CProp ("big_plus",[CVar 23; CVar 24; CVar 8; CVar 1]); CVar 1]); + CProp + ("plus", + [CVar 8; + CProp + ("plus", + [CProp ("power_eval",[CVar 23; CVar 1]); + CProp ("power_eval",[CVar 24; CVar 1])])])])); +add (CProp +("equal", + [CProp ("remainder",[CVar 24; CProp ("one",[])]); CProp ("zero",[])])); +add (CProp +("equal", + [CProp ("lt",[CProp ("remainder",[CVar 23; CVar 24]); CVar 24]); + CProp ("not",[CProp ("zerop",[CVar 24])])])); +add (CProp +("equal",[CProp ("remainder",[CVar 23; CVar 23]); CProp ("zero",[])])); +add (CProp +("equal", + [CProp ("lt",[CProp ("quotient",[CVar 8; CVar 9]); CVar 8]); + CProp + ("and", + [CProp ("not",[CProp ("zerop",[CVar 8])]); + CProp + ("or", + [CProp ("zerop",[CVar 9]); + CProp ("not",[CProp ("equal",[CVar 9; CProp ("one",[])])])])])])); +add (CProp +("equal", + [CProp ("lt",[CProp ("remainder",[CVar 23; CVar 24]); CVar 23]); + CProp + ("and", + [CProp ("not",[CProp ("zerop",[CVar 24])]); + CProp ("not",[CProp ("zerop",[CVar 23])]); + CProp ("not",[CProp ("lt",[CVar 23; CVar 24])])])])); +add (CProp +("equal", + [CProp ("power_eval",[CProp ("power_rep",[CVar 8; CVar 1]); CVar 1]); + CProp ("fix",[CVar 8])])); +add (CProp +("equal", + [CProp + ("power_eval", + [CProp + ("big_plus", + [CProp ("power_rep",[CVar 8; CVar 1]); + CProp ("power_rep",[CVar 9; CVar 1]); CProp ("zero",[]); + CVar 1]); + CVar 1]); + CProp ("plus",[CVar 8; CVar 9])])); +add (CProp +("equal", + [CProp ("gcd",[CVar 23; CVar 24]); CProp ("gcd",[CVar 24; CVar 23])])); +add (CProp +("equal", + [CProp ("nth",[CProp ("append",[CVar 0; CVar 1]); CVar 8]); + CProp + ("append", + [CProp ("nth",[CVar 0; CVar 8]); + CProp + ("nth", + [CVar 1; CProp ("difference",[CVar 8; CProp ("length",[CVar 0])])])])])); +add (CProp +("equal", + [CProp ("difference",[CProp ("plus",[CVar 23; CVar 24]); CVar 23]); + CProp ("fix",[CVar 24])])); +add (CProp +("equal", + [CProp ("difference",[CProp ("plus",[CVar 24; CVar 23]); CVar 23]); + CProp ("fix",[CVar 24])])); +add (CProp +("equal", + [CProp + ("difference", + [CProp ("plus",[CVar 23; CVar 24]); CProp ("plus",[CVar 23; CVar 25])]); + CProp ("difference",[CVar 24; CVar 25])])); +add (CProp +("equal", + [CProp ("times",[CVar 23; CProp ("difference",[CVar 2; CVar 22])]); + CProp + ("difference", + [CProp ("times",[CVar 2; CVar 23]); + CProp ("times",[CVar 22; CVar 23])])])); +add (CProp +("equal", + [CProp ("remainder",[CProp ("times",[CVar 23; CVar 25]); CVar 25]); + CProp ("zero",[])])); +add (CProp +("equal", + [CProp + ("difference", + [CProp ("plus",[CVar 1; CProp ("plus",[CVar 0; CVar 2])]); CVar 0]); + CProp ("plus",[CVar 1; CVar 2])])); +add (CProp +("equal", + [CProp + ("difference", + [CProp ("add1",[CProp ("plus",[CVar 24; CVar 25])]); CVar 25]); + CProp ("add1",[CVar 24])])); +add (CProp +("equal", + [CProp + ("lt", + [CProp ("plus",[CVar 23; CVar 24]); CProp ("plus",[CVar 23; CVar 25])]); + CProp ("lt",[CVar 24; CVar 25])])); +add (CProp +("equal", + [CProp + ("lt", + [CProp ("times",[CVar 23; CVar 25]); + CProp ("times",[CVar 24; CVar 25])]); + CProp + ("and", + [CProp ("not",[CProp ("zerop",[CVar 25])]); + CProp ("lt",[CVar 23; CVar 24])])])); +add (CProp +("equal", + [CProp ("lt",[CVar 24; CProp ("plus",[CVar 23; CVar 24])]); + CProp ("not",[CProp ("zerop",[CVar 23])])])); +add (CProp +("equal", + [CProp + ("gcd", + [CProp ("times",[CVar 23; CVar 25]); + CProp ("times",[CVar 24; CVar 25])]); + CProp ("times",[CVar 25; CProp ("gcd",[CVar 23; CVar 24])])])); +add (CProp +("equal", + [CProp ("value",[CProp ("normalize",[CVar 23]); CVar 0]); + CProp ("value",[CVar 23; CVar 0])])); +add (CProp +("equal", + [CProp + ("equal", + [CProp ("flatten",[CVar 23]); + CProp ("cons",[CVar 24; CProp ("nil",[])])]); + CProp + ("and", + [CProp ("nlistp",[CVar 23]); CProp ("equal",[CVar 23; CVar 24])])])); +add (CProp +("equal", + [CProp ("listp",[CProp ("gother",[CVar 23])]); + CProp ("listp",[CVar 23])])); +add (CProp +("equal", + [CProp ("samefringe",[CVar 23; CVar 24]); + CProp + ("equal",[CProp ("flatten",[CVar 23]); CProp ("flatten",[CVar 24])])])); +add (CProp +("equal", + [CProp + ("equal", + [CProp ("greatest_factor",[CVar 23; CVar 24]); CProp ("zero",[])]); + CProp + ("and", + [CProp + ("or", + [CProp ("zerop",[CVar 24]); + CProp ("equal",[CVar 24; CProp ("one",[])])]); + CProp ("equal",[CVar 23; CProp ("zero",[])])])])); +add (CProp +("equal", + [CProp + ("equal", + [CProp ("greatest_factor",[CVar 23; CVar 24]); CProp ("one",[])]); + CProp ("equal",[CVar 23; CProp ("one",[])])])); +add (CProp +("equal", + [CProp ("numberp",[CProp ("greatest_factor",[CVar 23; CVar 24])]); + CProp + ("not", + [CProp + ("and", + [CProp + ("or", + [CProp ("zerop",[CVar 24]); + CProp ("equal",[CVar 24; CProp ("one",[])])]); + CProp ("not",[CProp ("numberp",[CVar 23])])])])])); +add (CProp +("equal", + [CProp ("times_list",[CProp ("append",[CVar 23; CVar 24])]); + CProp + ("times", + [CProp ("times_list",[CVar 23]); CProp ("times_list",[CVar 24])])])); +add (CProp +("equal", + [CProp ("prime_list",[CProp ("append",[CVar 23; CVar 24])]); + CProp + ("and", + [CProp ("prime_list",[CVar 23]); CProp ("prime_list",[CVar 24])])])); +add (CProp +("equal", + [CProp ("equal",[CVar 25; CProp ("times",[CVar 22; CVar 25])]); + CProp + ("and", + [CProp ("numberp",[CVar 25]); + CProp + ("or", + [CProp ("equal",[CVar 25; CProp ("zero",[])]); + CProp ("equal",[CVar 22; CProp ("one",[])])])])])); +add (CProp +("equal", + [CProp ("ge",[CVar 23; CVar 24]); + CProp ("not",[CProp ("lt",[CVar 23; CVar 24])])])); +add (CProp +("equal", + [CProp ("equal",[CVar 23; CProp ("times",[CVar 23; CVar 24])]); + CProp + ("or", + [CProp ("equal",[CVar 23; CProp ("zero",[])]); + CProp + ("and", + [CProp ("numberp",[CVar 23]); + CProp ("equal",[CVar 24; CProp ("one",[])])])])])); +add (CProp +("equal", + [CProp ("remainder",[CProp ("times",[CVar 24; CVar 23]); CVar 24]); + CProp ("zero",[])])); +add (CProp +("equal", + [CProp ("equal",[CProp ("times",[CVar 0; CVar 1]); CProp ("one",[])]); + CProp + ("and", + [CProp ("not",[CProp ("equal",[CVar 0; CProp ("zero",[])])]); + CProp ("not",[CProp ("equal",[CVar 1; CProp ("zero",[])])]); + CProp ("numberp",[CVar 0]); CProp ("numberp",[CVar 1]); + CProp ("equal",[CProp ("sub1",[CVar 0]); CProp ("zero",[])]); + CProp ("equal",[CProp ("sub1",[CVar 1]); CProp ("zero",[])])])])); +add (CProp +("equal", + [CProp + ("lt", + [CProp ("length",[CProp ("delete",[CVar 23; CVar 11])]); + CProp ("length",[CVar 11])]); + CProp ("member",[CVar 23; CVar 11])])); +add (CProp +("equal", + [CProp ("sort2",[CProp ("delete",[CVar 23; CVar 11])]); + CProp ("delete",[CVar 23; CProp ("sort2",[CVar 11])])])); +add (CProp ("equal",[CProp ("dsort",[CVar 23]); CProp ("sort2",[CVar 23])])); +add (CProp +("equal", + [CProp + ("length", + [CProp + ("cons", + [CVar 0; + CProp + ("cons", + [CVar 1; + CProp + ("cons", + [CVar 2; + CProp + ("cons", + [CVar 3; + CProp ("cons",[CVar 4; CProp ("cons",[CVar 5; CVar 6])])])])])])]) + ; CProp ("plus",[CProp ("six",[]); CProp ("length",[CVar 6])])])); +add (CProp +("equal", + [CProp + ("difference", + [CProp ("add1",[CProp ("add1",[CVar 23])]); CProp ("two",[])]); + CProp ("fix",[CVar 23])])); +add (CProp +("equal", + [CProp + ("quotient", + [CProp ("plus",[CVar 23; CProp ("plus",[CVar 23; CVar 24])]); + CProp ("two",[])]); + CProp + ("plus",[CVar 23; CProp ("quotient",[CVar 24; CProp ("two",[])])])])); +add (CProp +("equal", + [CProp ("sigma",[CProp ("zero",[]); CVar 8]); + CProp + ("quotient", + [CProp ("times",[CVar 8; CProp ("add1",[CVar 8])]); CProp ("two",[])])])); +add (CProp +("equal", + [CProp ("plus",[CVar 23; CProp ("add1",[CVar 24])]); + CProp + ("if", + [CProp ("numberp",[CVar 24]); + CProp ("add1",[CProp ("plus",[CVar 23; CVar 24])]); + CProp ("add1",[CVar 23])])])); +add (CProp +("equal", + [CProp + ("equal", + [CProp ("difference",[CVar 23; CVar 24]); + CProp ("difference",[CVar 25; CVar 24])]); + CProp + ("if", + [CProp ("lt",[CVar 23; CVar 24]); + CProp ("not",[CProp ("lt",[CVar 24; CVar 25])]); + CProp + ("if", + [CProp ("lt",[CVar 25; CVar 24]); + CProp ("not",[CProp ("lt",[CVar 24; CVar 23])]); + CProp ("equal",[CProp ("fix",[CVar 23]); CProp ("fix",[CVar 25])])])])]) +); +add (CProp +("equal", + [CProp + ("meaning", + [CProp ("plus_tree",[CProp ("delete",[CVar 23; CVar 24])]); CVar 0]); + CProp + ("if", + [CProp ("member",[CVar 23; CVar 24]); + CProp + ("difference", + [CProp ("meaning",[CProp ("plus_tree",[CVar 24]); CVar 0]); + CProp ("meaning",[CVar 23; CVar 0])]); + CProp ("meaning",[CProp ("plus_tree",[CVar 24]); CVar 0])])])); +add (CProp +("equal", + [CProp ("times",[CVar 23; CProp ("add1",[CVar 24])]); + CProp + ("if", + [CProp ("numberp",[CVar 24]); + CProp + ("plus", + [CVar 23; CProp ("times",[CVar 23; CVar 24]); + CProp ("fix",[CVar 23])])])])); +add (CProp +("equal", + [CProp ("nth",[CProp ("nil",[]); CVar 8]); + CProp + ("if",[CProp ("zerop",[CVar 8]); CProp ("nil",[]); CProp ("zero",[])])])); +add (CProp +("equal", + [CProp ("last",[CProp ("append",[CVar 0; CVar 1])]); + CProp + ("if", + [CProp ("listp",[CVar 1]); CProp ("last",[CVar 1]); + CProp + ("if", + [CProp ("listp",[CVar 0]); + CProp ("cons",[CProp ("car",[CProp ("last",[CVar 0])]); CVar 1]); + CVar 1])])])); +add (CProp +("equal", + [CProp ("equal",[CProp ("lt",[CVar 23; CVar 24]); CVar 25]); + CProp + ("if", + [CProp ("lt",[CVar 23; CVar 24]); + CProp ("equal",[CProp ("true",[]); CVar 25]); + CProp ("equal",[CProp ("false",[]); CVar 25])])])); +add (CProp +("equal", + [CProp ("assignment",[CVar 23; CProp ("append",[CVar 0; CVar 1])]); + CProp + ("if", + [CProp ("assignedp",[CVar 23; CVar 0]); + CProp ("assignment",[CVar 23; CVar 0]); + CProp ("assignment",[CVar 23; CVar 1])])])); +add (CProp +("equal", + [CProp ("car",[CProp ("gother",[CVar 23])]); + CProp + ("if", + [CProp ("listp",[CVar 23]); + CProp ("car",[CProp ("flatten",[CVar 23])]); CProp ("zero",[])])])); +add (CProp +("equal", + [CProp ("flatten",[CProp ("cdr",[CProp ("gother",[CVar 23])])]); + CProp + ("if", + [CProp ("listp",[CVar 23]); + CProp ("cdr",[CProp ("flatten",[CVar 23])]); + CProp ("cons",[CProp ("zero",[]); CProp ("nil",[])])])])); +add (CProp +("equal", + [CProp ("quotient",[CProp ("times",[CVar 24; CVar 23]); CVar 24]); + CProp + ("if", + [CProp ("zerop",[CVar 24]); CProp ("zero",[]); + CProp ("fix",[CVar 23])])])); +add (CProp +("equal", + [CProp ("get",[CVar 9; CProp ("set",[CVar 8; CVar 21; CVar 12])]); + CProp + ("if", + [CProp ("eqp",[CVar 9; CVar 8]); CVar 21; + CProp ("get",[CVar 9; CVar 12])])])) + +(* Tautology checker *) + +let truep x lst = + match x with + Prop(head, _) -> + head.name = "true" || List.mem x lst + | _ -> + List.mem x lst + +and falsep x lst = + match x with + Prop(head, _) -> + head.name = "false" || List.mem x lst + | _ -> + List.mem x lst + + +let rec tautologyp x true_lst false_lst = + if truep x true_lst then true else + if falsep x false_lst then false else begin +(* + print_term x; print_newline(); +*) + match x with + Var _ -> false + | Prop (head,[test; yes; no]) -> + if head.name = "if" then + if truep test true_lst then + tautologyp yes true_lst false_lst + else if falsep test false_lst then + tautologyp no true_lst false_lst + else tautologyp yes (test::true_lst) false_lst && + tautologyp no true_lst (test::false_lst) + else + false + | _ -> assert false + end + + +let tautp x = +(* print_term x; print_string"\n"; *) + let y = rewrite x in +(* print_term y; print_string "\n"; *) + tautologyp y [] [] + +(* the benchmark *) + +let subst = +[Bind(23, cterm_to_term( + CProp + ("f", + [CProp + ("plus", + [CProp ("plus",[CVar 0; CVar 1]); + CProp ("plus",[CVar 2; CProp ("zero",[])])])]))); + Bind(24, cterm_to_term( + CProp + ("f", + [CProp + ("times", + [CProp ("times",[CVar 0; CVar 1]); + CProp ("plus",[CVar 2; CVar 3])])]))); + Bind(25, cterm_to_term( + CProp + ("f", + [CProp + ("reverse", + [CProp + ("append", + [CProp ("append",[CVar 0; CVar 1]); + CProp ("nil",[])])])]))); + Bind(20, cterm_to_term( + CProp + ("equal", + [CProp ("plus",[CVar 0; CVar 1]); + CProp ("difference",[CVar 23; CVar 24])]))); + Bind(22, cterm_to_term( + CProp + ("lt", + [CProp ("remainder",[CVar 0; CVar 1]); + CProp ("member",[CVar 0; CProp ("length",[CVar 1])])])))] + +let term = cterm_to_term( + CProp + ("implies", + [CProp + ("and", + [CProp ("implies",[CVar 23; CVar 24]); + CProp + ("and", + [CProp ("implies",[CVar 24; CVar 25]); + CProp + ("and", + [CProp ("implies",[CVar 25; CVar 20]); + CProp ("implies",[CVar 20; CVar 22])])])]); + CProp ("implies",[CVar 23; CVar 22])])) + +let _ = + let ok = ref true in + for i = 1 to 50 do + if not (tautp (apply_subst subst term)) then ok := false + done; + if !ok then + print_string "Proved!\n" + else + print_string "Cannot prove!\n"; + exit 0 + +(********* +with + failure s -> + print_string "Exception failure("; print_string s; print_string ")\n" + | Unify -> + print_string "Exception Unify\n" + | match_failure(file,start,stop) -> + print_string "Exception match_failure("; + print_string file; + print_string ","; + print_int start; + print_string ","; + print_int stop; + print_string ")\n" + | _ -> + print_string "Exception ?\n" + +**********) diff --git a/testsuite/tests/misc/boyer.reference b/testsuite/tests/misc/boyer.reference new file mode 100644 index 00000000..f38e3263 --- /dev/null +++ b/testsuite/tests/misc/boyer.reference @@ -0,0 +1 @@ +Proved! diff --git a/testsuite/tests/misc/fib.ml b/testsuite/tests/misc/fib.ml new file mode 100644 index 00000000..c7e75058 --- /dev/null +++ b/testsuite/tests/misc/fib.ml @@ -0,0 +1,24 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: fib.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +let rec fib n = + if n < 2 then 1 else fib(n-1) + fib(n-2) + +let _ = + let n = + if Array.length Sys.argv >= 2 + then int_of_string Sys.argv.(1) + else 40 in + print_int(fib n); print_newline(); exit 0 + diff --git a/testsuite/tests/misc/fib.reference b/testsuite/tests/misc/fib.reference new file mode 100644 index 00000000..1d7ca9c6 --- /dev/null +++ b/testsuite/tests/misc/fib.reference @@ -0,0 +1 @@ +165580141 diff --git a/testsuite/tests/misc/hamming.ml b/testsuite/tests/misc/hamming.ml new file mode 100644 index 00000000..2b85bdde --- /dev/null +++ b/testsuite/tests/misc/hamming.ml @@ -0,0 +1,105 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Damien Doligez, projet Moscova, INRIA Rocquencourt *) +(* *) +(* Copyright 2002 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: hamming.ml 4303 2002-01-23 17:50:20Z doligez $ *) + +(* We cannot use bignums because we don't do custom runtimes, but + int64 is a bit short, so we roll our own 37-digit numbers... +*) + +let n0 = Int64.of_int 0;; +let n1 = Int64.of_int 1;; +let n2 = Int64.of_int 2;; +let n3 = Int64.of_int 3;; +let n5 = Int64.of_int 5;; + +let ( % ) = Int64.rem;; +let ( * ) = Int64.mul;; +let ( / ) = Int64.div;; +let ( + ) = Int64.add;; +let digit = Int64.of_string "1000000000000000000";; + +let mul n (pl, ph) = ((n * pl) % digit, n * ph + (n * pl) / digit);; +let cmp (nl, nh) (pl, ph) = + if nh < ph then -1 + else if nh > ph then 1 + else if nl < pl then -1 + else if nl > pl then 1 + else 0 +;; + +let x2 = fun p -> mul n2 p;; +let x3 = fun p -> mul n3 p;; +let x5 = fun p -> mul n5 p;; + +let nn1 = (n1, n0);; + +let pr (nl, nh) = + if compare nh n0 = 0 + then Printf.printf "%Ld\n" nl + else Printf.printf "%Ld%018Ld\n" nh nl +;; + +(* + (* bignum version *) +open Num;; +let nn1 = num_of_int 1;; +let x2 = fun p -> (num_of_int 2) */ p;; +let x3 = fun p -> (num_of_int 3) */ p;; +let x5 = fun p -> (num_of_int 5) */ p;; +let cmp n p = sign_num (n -/ p);; +let pr n = Printf.printf "%s\n" (string_of_num n);; +*) + + +(* This is where the interesting stuff begins. *) + +open Lazy;; + +type 'a lcons = Cons of 'a * 'a lcons Lazy.t;; +type 'a llist = 'a lcons Lazy.t;; + +let rec map f l = + lazy ( + match force l with + | Cons (x, ll) -> Cons (f x, map f ll) + ) +;; + +let rec merge cmp l1 l2 = + lazy ( + match force l1, force l2 with + | Cons (x1, ll1), Cons (x2, ll2) + -> let c = cmp x1 x2 in + if c = 0 + then Cons (x1, merge cmp ll1 ll2) + else if c < 0 + then Cons (x1, merge cmp ll1 l2) + else Cons (x2, merge cmp l1 ll2) + ) +;; + +let rec iter_interval f l (start, stop) = + if stop = 0 then () + else match force l with + | Cons (x, ll) + -> if start <= 0 then f x; + iter_interval f ll (start-1, stop-1) +;; + +let rec hamming = lazy (Cons (nn1, merge cmp ham2 (merge cmp ham3 ham5))) + and ham2 = lazy (force (map x2 hamming)) + and ham3 = lazy (force (map x3 hamming)) + and ham5 = lazy (force (map x5 hamming)) +;; + +iter_interval pr hamming (88000, 88100);; diff --git a/testsuite/tests/misc/hamming.reference b/testsuite/tests/misc/hamming.reference new file mode 100644 index 00000000..af1339ef --- /dev/null +++ b/testsuite/tests/misc/hamming.reference @@ -0,0 +1,100 @@ +6726050156250000000000000000000000000 +6729216728661136606575523242669244416 +6730293634611118019721084375000000000 +6731430439413948088320000000000000000 +6733644878411293029785156250000000000 +6736815026358904613608094481682268160 +6739031236724077363200000000000000000 +6743282904874568941599068856042651648 +6744421903677486140423997176256921600 +6746640616477458432000000000000000000 +6750000000000000000000000000000000000 +6750897085400702945836103937453588480 +6752037370304563380023474956271616000 +6754258588364960445000000000000000000 +6755399441055744000000000000000000000 +6757621765136718750000000000000000000 +6758519863481752323552044362431792300 +6759661435938757375539248533340160000 +6761885162088395001166534423828125000 +6763027302973440000000000000000000000 +6765252136392518877983093261718750000 +6767294110289640371843415775641600000 +6768437164792816653010961694720000000 +6770663777894400000000000000000000000 +6774935403077748181101173538816000000 +6776079748261363229431903027200000000 +6778308875544000000000000000000000000 +6782585324034592562287109312160000000 +6783730961356018699387011072000000000 +6785962605658597412109375000000000000 +6789341568946838378906250000000000000 +6791390813820928754681118720000000000 +6794772480000000000000000000000000000 +6799059315411241693033267200000000000 +6800207735332289107722240000000000000 +6802444800000000000000000000000000000 +6806736475893120841673472000000000000 +6807886192552970708582400000000000000 +6810125783203125000000000000000000000 +6814422305043756994967597929687500000 +6815573319906622439424000000000000000 +6817815439391434192657470703125000000 +6821025214188390921278195662703296512 +6821210263296961784362792968750000000 +6823269127183128330240000000000000000 +6828727177473454717179297140960133120 +6830973624183426662400000000000000000 +6834375000000000000000000000000000000 +6835283298968211732659055236671758336 +6836437837433370422273768393225011200 +6838686820719522450562500000000000000 +6839841934068940800000000000000000000 +6842092037200927734375000000000000000 +6844157203887991842733489140006912000 +6845313241232438768082197309030400000 +6847565144260608000000000000000000000 +6849817788097425363957881927490234375 +6851885286668260876491458472837120000 +6853042629352726861173598715904000000 +6855297075118080000000000000000000000 +6859622095616220033364938208051200000 +6860780745114630269799801815040000000 +6863037736488300000000000000000000000 +6866455078125000000000000000000000000 +6867367640585024969315698178562000000 +6868527598372968933129348710400000000 +6870787138229329879760742187500000000 +6871947673600000000000000000000000000 +6874208338558673858642578125000000000 +6876283198993690364114632704000000000 +6879707136000000000000000000000000000 +6884047556853882214196183040000000000 +6885210332023942721568768000000000000 +6887475360000000000000000000000000000 +6891820681841784852194390400000000000 +6892984769959882842439680000000000000 +6895252355493164062500000000000000000 +6899602583856803957404692903808593750 +6900767986405455219916800000000000000 +6903038132383827120065689086914062500 +6906475391588173806667327880859375000 +6908559991272917434368000000000000000 +6912000000000000000000000000000000000 +6914086267191872901144038355222134784 +6916360794485719495680000000000000000 +6917529027641081856000000000000000000 +6919804687500000000000000000000000000 +6921893310401287552552190498140323840 +6924170405978516481194531250000000000 +6925339958244802560000000000000000000 +6927618187665939331054687500000000000 +6929709168936591740767657754256998400 +6930879656747844252683224775393280000 +6933159708563865600000000000000000000 +6937533852751614137447601703747584000 +6938705662219635946938268699852800000 +6940988288557056000000000000000000000 +6945367371811422783781999935651840000 +6946540504428563148172299337728000000 +6948825708194403750000000000000000000 diff --git a/testsuite/tests/misc/nucleic.ml b/testsuite/tests/misc/nucleic.ml new file mode 100644 index 00000000..665e3ceb --- /dev/null +++ b/testsuite/tests/misc/nucleic.ml @@ -0,0 +1,3238 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: nucleic.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +(* Use floating-point arithmetic *) + +external (+) : float -> float -> float = "%addfloat" +external (-) : float -> float -> float = "%subfloat" +external ( * ) : float -> float -> float = "%mulfloat" +external (/) : float -> float -> float = "%divfloat" + +(* -- MATH UTILITIES --------------------------------------------------------*) + +let constant_pi = 3.14159265358979323846 +let constant_minus_pi = -3.14159265358979323846 +let constant_pi2 = 1.57079632679489661923 +let constant_minus_pi2 = -1.57079632679489661923 + +(* -- POINTS ----------------------------------------------------------------*) + +type pt = { x : float; y : float; z : float } + +let +pt_sub p1 p2 + = { x = p1.x - p2.x; y = p1.y - p2.y; z = p1.z - p2.z } + +let +pt_dist p1 p2 + = let dx = p1.x - p2.x + and dy = p1.y - p2.y + and dz = p1.z - p2.z + in + sqrt ((dx * dx) + (dy * dy) + (dz * dz)) + +let +pt_phi p + = let b = atan2 p.x p.z + in + atan2 ((cos b) * p.z + (sin b) * p.x) p.y + +let +pt_theta p + = atan2 p.x p.z + +(* -- COORDINATE TRANSFORMATIONS --------------------------------------------*) + +(* + The notation for the transformations follows "Paul, R.P. (1981) Robot + Manipulators. MIT Press." with the exception that our transformation + matrices don't have the perspective terms and are the transpose of + Paul's one. See also "M\"antyl\"a, M. (1985) An Introduction to + Solid Modeling, Computer Science Press" Appendix A. + + The components of a transformation matrix are named like this: + + a b c + d e f + g h i + tx ty tz + + The components tx, ty, and tz are the translation vector. +*) + +type tfo = + {a: float; b: float; c: float; + d: float; e: float; f: float; + g: float; h: float; i: float; + tx: float; ty: float; tz: float} + +let tfo_id = + {a=1.0; b=0.0; c=0.0; + d=0.0; e=1.0; f=0.0; + g=0.0; h=0.0; i=1.0; + tx=0.0; ty=0.0; tz=0.0} + +(* + The function "tfo-apply" multiplies a transformation matrix, tfo, by a + point vector, p. The result is a new point. +*) + +let +tfo_apply t p + = { x = ((p.x * t.a) + (p.y * t.d) + (p.z * t.g) + t.tx); + y = ((p.x * t.b) + (p.y * t.e) + (p.z * t.h) + t.ty); + z = ((p.x * t.c) + (p.y * t.f) + (p.z * t.i) + t.tz) } + +(* + The function "tfo-combine" multiplies two transformation matrices A and B. + The result is a new matrix which cumulates the transformations described + by A and B. +*) + +let +tfo_combine a b = +(* *) + (* Hand elimination of common subexpressions. + Assumes lots of float registers (32 is perfect, 16 still OK). + Loses on the I386, of course. *) + let a_a = a.a and a_b = a.b and a_c = a.c and a_d = a.d + and a_e = a.e and a_f = a.f and a_g = a.g and a_h = a.h + and a_i = a.i and a_tx = a.tx and a_ty = a.ty and a_tz = a.tz + and b_a = b.a and b_b = b.b and b_c = b.c and b_d = b.d + and b_e = b.e and b_f = b.f and b_g = b.g and b_h = b.h + and b_i = b.i and b_tx = b.tx and b_ty = b.ty and b_tz = b.tz in + { a = ((a_a * b_a) + (a_b * b_d) + (a_c * b_g)); + b = ((a_a * b_b) + (a_b * b_e) + (a_c * b_h)); + c = ((a_a * b_c) + (a_b * b_f) + (a_c * b_i)); + d = ((a_d * b_a) + (a_e * b_d) + (a_f * b_g)); + e = ((a_d * b_b) + (a_e * b_e) + (a_f * b_h)); + f = ((a_d * b_c) + (a_e * b_f) + (a_f * b_i)); + g = ((a_g * b_a) + (a_h * b_d) + (a_i * b_g)); + h = ((a_g * b_b) + (a_h * b_e) + (a_i * b_h)); + i = ((a_g * b_c) + (a_h * b_f) + (a_i * b_i)); + tx = ((a_tx * b_a) + (a_ty * b_d) + (a_tz * b_g) + b_tx); + ty = ((a_tx * b_b) + (a_ty * b_e) + (a_tz * b_h) + b_ty); + tz = ((a_tx * b_c) + (a_ty * b_f) + (a_tz * b_i) + b_tz) + } +(* *) + (* Original without CSE *) +(* *) (*** + { a = ((a.a * b.a) + (a.b * b.d) + (a.c * b.g)); + b = ((a.a * b.b) + (a.b * b.e) + (a.c * b.h)); + c = ((a.a * b.c) + (a.b * b.f) + (a.c * b.i)); + d = ((a.d * b.a) + (a.e * b.d) + (a.f * b.g)); + e = ((a.d * b.b) + (a.e * b.e) + (a.f * b.h)); + f = ((a.d * b.c) + (a.e * b.f) + (a.f * b.i)); + g = ((a.g * b.a) + (a.h * b.d) + (a.i * b.g)); + h = ((a.g * b.b) + (a.h * b.e) + (a.i * b.h)); + i = ((a.g * b.c) + (a.h * b.f) + (a.i * b.i)); + tx = ((a.tx * b.a) + (a.ty * b.d) + (a.tz * b.g) + b.tx); + ty = ((a.tx * b.b) + (a.ty * b.e) + (a.tz * b.h) + b.ty); + tz = ((a.tx * b.c) + (a.ty * b.f) + (a.tz * b.i) + b.tz) + } + ***) (* *) + +(* + The function "tfo-inv-ortho" computes the inverse of a homogeneous + transformation matrix. +*) + +let +tfo_inv_ortho t = + { a = t.a; b = t.d; c = t.g; + d = t.b; e = t.e; f = t.h; + g = t.c; h = t.f; i = t.i; + tx = (-.((t.a * t.tx) + (t.b * t.ty) + (t.c * t.tz))); + ty = (-.((t.d * t.tx) + (t.e * t.ty) + (t.f * t.tz))); + tz = (-.((t.g * t.tx) + (t.h * t.ty) + (t.i * t.tz))) + } + +(* + Given three points p1, p2, and p3, the function "tfo-align" computes + a transformation matrix such that point p1 gets mapped to (0,0,0), p2 gets + mapped to the Y axis and p3 gets mapped to the YZ plane. +*) + +let +tfo_align p1 p2 p3 + = let x31 = p3.x - p1.x in + let y31 = p3.y - p1.y in + let z31 = p3.z - p1.z in + let rotpy = pt_sub p2 p1 in + let phi = pt_phi rotpy in + let theta = pt_theta rotpy in + let sinp = sin phi in + let sint = sin theta in + let cosp = cos phi in + let cost = cos theta in + let sinpsint = sinp * sint in + let sinpcost = sinp * cost in + let cospsint = cosp * sint in + let cospcost = cosp * cost in + let rotpz = + { x = ((cost * x31) - (sint * z31)); + y = ((sinpsint * x31) + (cosp * y31) + (sinpcost * z31)); + z = ((cospsint * x31) + (-.(sinp * y31)) + (cospcost * z31)) } in + let rho = pt_theta rotpz in + let cosr = cos rho in + let sinr = sin rho in + let x = (-.(p1.x * cost)) + (p1.z * sint) in + let y = ((-.(p1.x * sinpsint)) - (p1.y * cosp)) - (p1.z * sinpcost) in + let z = ((-.(p1.x * cospsint) + (p1.y * sinp))) - (p1.z * cospcost) in + { a = ((cost * cosr) - (cospsint * sinr)); + b = sinpsint; + c = ((cost * sinr) + (cospsint * cosr)); + d = (sinp * sinr); + e = cosp; + f = (-.(sinp * cosr)); + g = ((-.(sint * cosr)) - (cospcost * sinr)); + h = sinpcost; + i = ((-.(sint * sinr) + (cospcost * cosr))); + tx = ((x * cosr) - (z * sinr)); + ty = y; + tz = ((x * sinr + (z * cosr))) + } + +(* -- NUCLEIC ACID CONFORMATIONS DATA BASE ----------------------------------*) + +(* + Numbering of atoms follows the paper: + + IUPAC-IUB Joint Commission on Biochemical Nomenclature (JCBN) + (1983) Abbreviations and Symbols for the Description of + Conformations of Polynucleotide Chains. Eur. J. Biochem 131, + 9-15. +*) + +(* Define remaining atoms for each nucleotide type. *) + +type nuc_specific = + A of pt*pt*pt*pt*pt*pt*pt*pt +| C of pt*pt*pt*pt*pt*pt +| G of pt*pt*pt*pt*pt*pt*pt*pt*pt +| U of pt*pt*pt*pt*pt + +(* + A n6 n7 n9 c8 h2 h61 h62 h8 + C n4 o2 h41 h42 h5 h6 + G n2 n7 n9 c8 o6 h1 h21 h22 h8 + U o2 o4 h3 h5 h6 +*) + +(* Define part common to all 4 nucleotide types. *) + +type nuc = + N of tfo*tfo*tfo*tfo* + pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt* + pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt* + pt*nuc_specific + +(* + dgf_base_tfo ; defines the standard position for wc and wc_dumas + p_o3'_275_tfo ; defines the standard position for the connect function + p_o3'_180_tfo + p_o3'_60_tfo + p o1p o2p o5' c5' h5' h5'' c4' h4' o4' c1' h1' c2' h2'' o2' h2' c3' + h3' o3' n1 n3 c2 c4 c5 c6 +*) + +let is_A = function + N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,A(_,_,_,_,_,_,_,_)) -> true + | _ -> false + +let is_C = function + N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,C(_,_,_,_,_,_)) -> true + | _ -> false + +let is_G = function + N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,G(_,_,_,_,_,_,_,_,_)) -> true + | _ -> false + +let +nuc_C1' +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = c1' + +let +nuc_C2 +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = c2 + +let +nuc_C3' +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = c3' + +let +nuc_C4 +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = c4 + +let +nuc_C4' +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = c4' + +let +nuc_N1 +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = n1 + +let +nuc_O3' +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = o3' + +let +nuc_P +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = p + +let +nuc_dgf_base_tfo +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = dgf_base_tfo + +let +nuc_p_o3'_180_tfo +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = p_o3'_180_tfo + +let +nuc_p_o3'_275_tfo +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = p_o3'_275_tfo + +let +nuc_p_o3'_60_tfo +(N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,_)) + = p_o3'_60_tfo + +let +rA_N9 = function +| (N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8))) -> n9 +| _ -> assert false + + +let +rG_N9 = function +| (N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8))) -> n9 +| _ -> assert false + +(* Database of nucleotide conformations: *) + +let rA + = N( + { a= -0.0018; b= -0.8207; c=0.5714; (* dgf_base_tfo *) + d=0.2679; e= -0.5509; f= -0.7904; + g=0.9634; h=0.1517; i=0.2209; + tx=0.0073; ty=8.4030; tz=0.6232 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 5.4550; y = 8.2120; z = -2.8810 }, (* C5' *) + { x = 5.4546; y = 8.8508; z = -1.9978 }, (* H5' *) + { x = 5.7588; y = 8.6625; z = -3.8259 }, (* H5'' *) + { x = 6.4970; y = 7.1480; z = -2.5980 }, (* C4' *) + { x = 7.4896; y = 7.5919; z = -2.5214 }, (* H4' *) + { x = 6.1630; y = 6.4860; z = -1.3440 }, (* O4' *) + { x = 6.5400; y = 5.1200; z = -1.4190 }, (* C1' *) + { x = 7.2763; y = 4.9681; z = -0.6297 }, (* H1' *) + { x = 7.1940; y = 4.8830; z = -2.7770 }, (* C2' *) + { x = 6.8667; y = 3.9183; z = -3.1647 }, (* H2'' *) + { x = 8.5860; y = 5.0910; z = -2.6140 }, (* O2' *) + { x = 8.9510; y = 4.7626; z = -1.7890 }, (* H2' *) + { x = 6.5720; y = 6.0040; z = -3.6090 }, (* C3' *) + { x = 5.5636; y = 5.7066; z = -3.8966 }, (* H3' *) + { x = 7.3801; y = 6.3562; z = -4.7350 }, (* O3' *) + { x = 4.7150; y = 0.4910; z = -0.1360 }, (* N1 *) + { x = 6.3490; y = 2.1730; z = -0.6020 }, (* N3 *) + { x = 5.9530; y = 0.9650; z = -0.2670 }, (* C2 *) + { x = 5.2900; y = 2.9790; z = -0.8260 }, (* C4 *) + { x = 3.9720; y = 2.6390; z = -0.7330 }, (* C5 *) + { x = 3.6770; y = 1.3160; z = -0.3660 }, (* C6 *) + (A ( + { x = 2.4280; y = 0.8450; z = -0.2360 }, (* N6 *) + { x = 3.1660; y = 3.7290; z = -1.0360 }, (* N7 *) + { x = 5.3170; y = 4.2990; z = -1.1930 }, (* N9 *) + { x = 4.0100; y = 4.6780; z = -1.2990 }, (* C8 *) + { x = 6.6890; y = 0.1903; z = -0.0518 }, (* H2 *) + { x = 1.6470; y = 1.4460; z = -0.4040 }, (* H61 *) + { x = 2.2780; y = -0.1080; z = -0.0280 }, (* H62 *) + { x = 3.4421; y = 5.5744; z = -1.5482 }) (* H8 *) + ) + ) + +let rA01 + = N( + { a= -0.0043; b= -0.8175; c=0.5759; (* dgf_base_tfo *) + d=0.2617; e= -0.5567; f= -0.7884; + g=0.9651; h=0.1473; i=0.2164; + tx=0.0359; ty=8.3929; tz=0.5532 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 5.4352; y = 8.2183; z = -2.7757 }, (* C5' *) + { x = 5.3830; y = 8.7883; z = -1.8481 }, (* H5' *) + { x = 5.7729; y = 8.7436; z = -3.6691 }, (* H5'' *) + { x = 6.4830; y = 7.1518; z = -2.5252 }, (* C4' *) + { x = 7.4749; y = 7.5972; z = -2.4482 }, (* H4' *) + { x = 6.1626; y = 6.4620; z = -1.2827 }, (* O4' *) + { x = 6.5431; y = 5.0992; z = -1.3905 }, (* C1' *) + { x = 7.2871; y = 4.9328; z = -0.6114 }, (* H1' *) + { x = 7.1852; y = 4.8935; z = -2.7592 }, (* C2' *) + { x = 6.8573; y = 3.9363; z = -3.1645 }, (* H2'' *) + { x = 8.5780; y = 5.1025; z = -2.6046 }, (* O2' *) + { x = 8.9516; y = 4.7577; z = -1.7902 }, (* H2' *) + { x = 6.5522; y = 6.0300; z = -3.5612 }, (* C3' *) + { x = 5.5420; y = 5.7356; z = -3.8459 }, (* H3' *) + { x = 7.3487; y = 6.4089; z = -4.6867 }, (* O3' *) + { x = 4.7442; y = 0.4514; z = -0.1390 }, (* N1 *) + { x = 6.3687; y = 2.1459; z = -0.5926 }, (* N3 *) + { x = 5.9795; y = 0.9335; z = -0.2657 }, (* C2 *) + { x = 5.3052; y = 2.9471; z = -0.8125 }, (* C4 *) + { x = 3.9891; y = 2.5987; z = -0.7230 }, (* C5 *) + { x = 3.7016; y = 1.2717; z = -0.3647 }, (* C6 *) + (A ( + { x = 2.4553; y = 0.7925; z = -0.2390 }, (* N6 *) + { x = 3.1770; y = 3.6859; z = -1.0198 }, (* N7 *) + { x = 5.3247; y = 4.2695; z = -1.1710 }, (* N9 *) + { x = 4.0156; y = 4.6415; z = -1.2759 }, (* C8 *) + { x = 6.7198; y = 0.1618; z = -0.0547 }, (* H2 *) + { x = 1.6709; y = 1.3900; z = -0.4039 }, (* H61 *) + { x = 2.3107; y = -0.1627; z = -0.0373 }, (* H62 *) + { x = 3.4426; y = 5.5361; z = -1.5199 }) (* H8 *) + ) + ) + +let rA02 + = N( + { a=0.5566; b=0.0449; c=0.8296; (* dgf_base_tfo *) + d=0.5125; e=0.7673; f= -0.3854; + g= -0.6538; h=0.6397; i=0.4041; + tx= -9.1161; ty= -3.7679; tz= -2.9968 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.5778; y = 6.6594; z = -4.0364 }, (* C5' *) + { x = 4.9220; y = 7.1963; z = -4.9204 }, (* H5' *) + { x = 3.7996; y = 5.9091; z = -4.1764 }, (* H5'' *) + { x = 5.7873; y = 5.8869; z = -3.5482 }, (* C4' *) + { x = 6.0405; y = 5.0875; z = -4.2446 }, (* H4' *) + { x = 6.9135; y = 6.8036; z = -3.4310 }, (* O4' *) + { x = 7.7293; y = 6.4084; z = -2.3392 }, (* C1' *) + { x = 8.7078; y = 6.1815; z = -2.7624 }, (* H1' *) + { x = 7.1305; y = 5.1418; z = -1.7347 }, (* C2' *) + { x = 7.2040; y = 5.1982; z = -0.6486 }, (* H2'' *) + { x = 7.7417; y = 4.0392; z = -2.3813 }, (* O2' *) + { x = 8.6785; y = 4.1443; z = -2.5630 }, (* H2' *) + { x = 5.6666; y = 5.2728; z = -2.1536 }, (* C3' *) + { x = 5.1747; y = 5.9805; z = -1.4863 }, (* H3' *) + { x = 4.9997; y = 4.0086; z = -2.1973 }, (* O3' *) + { x = 10.3245; y = 8.5459; z = 1.5467 }, (* N1 *) + { x = 9.8051; y = 6.9432; z = -0.1497 }, (* N3 *) + { x = 10.5175; y = 7.4328; z = 0.8408 }, (* C2 *) + { x = 8.7523; y = 7.7422; z = -0.4228 }, (* C4 *) + { x = 8.4257; y = 8.9060; z = 0.2099 }, (* C5 *) + { x = 9.2665; y = 9.3242; z = 1.2540 }, (* C6 *) + (A ( + { x = 9.0664; y = 10.4462; z = 1.9610 }, (* N6 *) + { x = 7.2750; y = 9.4537; z = -0.3428 }, (* N7 *) + { x = 7.7962; y = 7.5519; z = -1.3859 }, (* N9 *) + { x = 6.9479; y = 8.6157; z = -1.2771 }, (* C8 *) + { x = 11.4063; y = 6.9047; z = 1.1859 }, (* H2 *) + { x = 8.2845; y = 11.0341; z = 1.7552 }, (* H61 *) + { x = 9.6584; y = 10.6647; z = 2.7198 }, (* H62 *) + { x = 6.0430; y = 8.9853; z = -1.7594 }) (* H8 *) + ) + ) +let rA03 + = N( + { a= -0.5021; b=0.0731; c=0.8617; (* dgf_base_tfo *) + d= -0.8112; e=0.3054; f= -0.4986; + g= -0.2996; h= -0.9494; i= -0.0940; + tx=6.4273; ty= -5.1944; tz= -3.7807 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.1214; y = 6.7116; z = -1.9049 }, (* C5' *) + { x = 3.3465; y = 5.9610; z = -2.0607 }, (* H5' *) + { x = 4.0789; y = 7.2928; z = -0.9837 }, (* H5'' *) + { x = 5.4170; y = 5.9293; z = -1.8186 }, (* C4' *) + { x = 5.4506; y = 5.3400; z = -0.9023 }, (* H4' *) + { x = 5.5067; y = 5.0417; z = -2.9703 }, (* O4' *) + { x = 6.8650; y = 4.9152; z = -3.3612 }, (* C1' *) + { x = 7.1090; y = 3.8577; z = -3.2603 }, (* H1' *) + { x = 7.7152; y = 5.7282; z = -2.3894 }, (* C2' *) + { x = 8.5029; y = 6.2356; z = -2.9463 }, (* H2'' *) + { x = 8.1036; y = 4.8568; z = -1.3419 }, (* O2' *) + { x = 8.3270; y = 3.9651; z = -1.6184 }, (* H2' *) + { x = 6.7003; y = 6.7565; z = -1.8911 }, (* C3' *) + { x = 6.5898; y = 7.5329; z = -2.6482 }, (* H3' *) + { x = 7.0505; y = 7.2878; z = -0.6105 }, (* O3' *) + { x = 9.6740; y = 4.7656; z = -7.6614 }, (* N1 *) + { x = 9.0739; y = 4.3013; z = -5.3941 }, (* N3 *) + { x = 9.8416; y = 4.2192; z = -6.4581 }, (* C2 *) + { x = 7.9885; y = 5.0632; z = -5.6446 }, (* C4 *) + { x = 7.6822; y = 5.6856; z = -6.8194 }, (* C5 *) + { x = 8.5831; y = 5.5215; z = -7.8840 }, (* C6 *) + (A ( + { x = 8.4084; y = 6.0747; z = -9.0933 }, (* N6 *) + { x = 6.4857; y = 6.3816; z = -6.7035 }, (* N7 *) + { x = 6.9740; y = 5.3703; z = -4.7760 }, (* N9 *) + { x = 6.1133; y = 6.1613; z = -5.4808 }, (* C8 *) + { x = 10.7627; y = 3.6375; z = -6.4220 }, (* H2 *) + { x = 7.6031; y = 6.6390; z = -9.2733 }, (* H61 *) + { x = 9.1004; y = 5.9708; z = -9.7893 }, (* H62 *) + { x = 5.1705; y = 6.6830; z = -5.3167 }) (* H8 *) + ) + ) + +let rA04 + = N( + { a= -0.5426; b= -0.8175; c=0.1929; (* dgf_base_tfo *) + d=0.8304; e= -0.5567; f= -0.0237; + g=0.1267; h=0.1473; i=0.9809; + tx= -0.5075; ty=8.3929; tz=0.2229 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 5.4352; y = 8.2183; z = -2.7757 }, (* C5' *) + { x = 5.3830; y = 8.7883; z = -1.8481 }, (* H5' *) + { x = 5.7729; y = 8.7436; z = -3.6691 }, (* H5'' *) + { x = 6.4830; y = 7.1518; z = -2.5252 }, (* C4' *) + { x = 7.4749; y = 7.5972; z = -2.4482 }, (* H4' *) + { x = 6.1626; y = 6.4620; z = -1.2827 }, (* O4' *) + { x = 6.5431; y = 5.0992; z = -1.3905 }, (* C1' *) + { x = 7.2871; y = 4.9328; z = -0.6114 }, (* H1' *) + { x = 7.1852; y = 4.8935; z = -2.7592 }, (* C2' *) + { x = 6.8573; y = 3.9363; z = -3.1645 }, (* H2'' *) + { x = 8.5780; y = 5.1025; z = -2.6046 }, (* O2' *) + { x = 8.9516; y = 4.7577; z = -1.7902 }, (* H2' *) + { x = 6.5522; y = 6.0300; z = -3.5612 }, (* C3' *) + { x = 5.5420; y = 5.7356; z = -3.8459 }, (* H3' *) + { x = 7.3487; y = 6.4089; z = -4.6867 }, (* O3' *) + { x = 3.6343; y = 2.6680; z = 2.0783 }, (* N1 *) + { x = 5.4505; y = 3.9805; z = 1.2446 }, (* N3 *) + { x = 4.7540; y = 3.3816; z = 2.1851 }, (* C2 *) + { x = 4.8805; y = 3.7951; z = 0.0354 }, (* C4 *) + { x = 3.7416; y = 3.0925; z = -0.2305 }, (* C5 *) + { x = 3.0873; y = 2.4980; z = 0.8606 }, (* C6 *) + (A ( + { x = 1.9600; y = 1.7805; z = 0.7462 }, (* N6 *) + { x = 3.4605; y = 3.1184; z = -1.5906 }, (* N7 *) + { x = 5.3247; y = 4.2695; z = -1.1710 }, (* N9 *) + { x = 4.4244; y = 3.8244; z = -2.0953 }, (* C8 *) + { x = 5.0814; y = 3.4352; z = 3.2234 }, (* H2 *) + { x = 1.5423; y = 1.6454; z = -0.1520 }, (* H61 *) + { x = 1.5716; y = 1.3398; z = 1.5392 }, (* H62 *) + { x = 4.2675; y = 3.8876; z = -3.1721 }) (* H8 *) + ) + ) + +let rA05 + = N( + { a= -0.5891; b=0.0449; c=0.8068; (* dgf_base_tfo *) + d=0.5375; e=0.7673; f=0.3498; + g= -0.6034; h=0.6397; i= -0.4762; + tx= -0.3019; ty= -3.7679; tz= -9.5913 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.5778; y = 6.6594; z = -4.0364 }, (* C5' *) + { x = 4.9220; y = 7.1963; z = -4.9204 }, (* H5' *) + { x = 3.7996; y = 5.9091; z = -4.1764 }, (* H5'' *) + { x = 5.7873; y = 5.8869; z = -3.5482 }, (* C4' *) + { x = 6.0405; y = 5.0875; z = -4.2446 }, (* H4' *) + { x = 6.9135; y = 6.8036; z = -3.4310 }, (* O4' *) + { x = 7.7293; y = 6.4084; z = -2.3392 }, (* C1' *) + { x = 8.7078; y = 6.1815; z = -2.7624 }, (* H1' *) + { x = 7.1305; y = 5.1418; z = -1.7347 }, (* C2' *) + { x = 7.2040; y = 5.1982; z = -0.6486 }, (* H2'' *) + { x = 7.7417; y = 4.0392; z = -2.3813 }, (* O2' *) + { x = 8.6785; y = 4.1443; z = -2.5630 }, (* H2' *) + { x = 5.6666; y = 5.2728; z = -2.1536 }, (* C3' *) + { x = 5.1747; y = 5.9805; z = -1.4863 }, (* H3' *) + { x = 4.9997; y = 4.0086; z = -2.1973 }, (* O3' *) + { x = 10.2594; y = 10.6774; z = -1.0056 }, (* N1 *) + { x = 9.7528; y = 8.7080; z = -2.2631 }, (* N3 *) + { x = 10.4471; y = 9.7876; z = -1.9791 }, (* C2 *) + { x = 8.7271; y = 8.5575; z = -1.3991 }, (* C4 *) + { x = 8.4100; y = 9.3803; z = -0.3580 }, (* C5 *) + { x = 9.2294; y = 10.5030; z = -0.1574 }, (* C6 *) + (A ( + { x = 9.0349; y = 11.3951; z = 0.8250 }, (* N6 *) + { x = 7.2891; y = 8.9068; z = 0.3121 }, (* N7 *) + { x = 7.7962; y = 7.5519; z = -1.3859 }, (* N9 *) + { x = 6.9702; y = 7.8292; z = -0.3353 }, (* C8 *) + { x = 11.3132; y = 10.0537; z = -2.5851 }, (* H2 *) + { x = 8.2741; y = 11.2784; z = 1.4629 }, (* H61 *) + { x = 9.6733; y = 12.1368; z = 0.9529 }, (* H62 *) + { x = 6.0888; y = 7.3990; z = 0.1403 }) (* H8 *) + ) + ) + +let rA06 + = N( + { a= -0.9815; b=0.0731; c= -0.1772; (* dgf_base_tfo *) + d=0.1912; e=0.3054; f= -0.9328; + g= -0.0141; h= -0.9494; i= -0.3137; + tx=5.7506; ty= -5.1944; tz=4.7470 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.1214; y = 6.7116; z = -1.9049 }, (* C5' *) + { x = 3.3465; y = 5.9610; z = -2.0607 }, (* H5' *) + { x = 4.0789; y = 7.2928; z = -0.9837 }, (* H5'' *) + { x = 5.4170; y = 5.9293; z = -1.8186 }, (* C4' *) + { x = 5.4506; y = 5.3400; z = -0.9023 }, (* H4' *) + { x = 5.5067; y = 5.0417; z = -2.9703 }, (* O4' *) + { x = 6.8650; y = 4.9152; z = -3.3612 }, (* C1' *) + { x = 7.1090; y = 3.8577; z = -3.2603 }, (* H1' *) + { x = 7.7152; y = 5.7282; z = -2.3894 }, (* C2' *) + { x = 8.5029; y = 6.2356; z = -2.9463 }, (* H2'' *) + { x = 8.1036; y = 4.8568; z = -1.3419 }, (* O2' *) + { x = 8.3270; y = 3.9651; z = -1.6184 }, (* H2' *) + { x = 6.7003; y = 6.7565; z = -1.8911 }, (* C3' *) + { x = 6.5898; y = 7.5329; z = -2.6482 }, (* H3' *) + { x = 7.0505; y = 7.2878; z = -0.6105 }, (* O3' *) + { x = 6.6624; y = 3.5061; z = -8.2986 }, (* N1 *) + { x = 6.5810; y = 3.2570; z = -5.9221 }, (* N3 *) + { x = 6.5151; y = 2.8263; z = -7.1625 }, (* C2 *) + { x = 6.8364; y = 4.5817; z = -5.8882 }, (* C4 *) + { x = 7.0116; y = 5.4064; z = -6.9609 }, (* C5 *) + { x = 6.9173; y = 4.8260; z = -8.2361 }, (* C6 *) + (A ( + { x = 7.0668; y = 5.5163; z = -9.3763 }, (* N6 *) + { x = 7.2573; y = 6.7070; z = -6.5394 }, (* N7 *) + { x = 6.9740; y = 5.3703; z = -4.7760 }, (* N9 *) + { x = 7.2238; y = 6.6275; z = -5.2453 }, (* C8 *) + { x = 6.3146; y = 1.7741; z = -7.3641 }, (* H2 *) + { x = 7.2568; y = 6.4972; z = -9.3456 }, (* H61 *) + { x = 7.0437; y = 5.0478; z = -10.2446 }, (* H62 *) + { x = 7.4108; y = 7.6227; z = -4.8418 }) (* H8 *) + ) + ) + +let rA07 + = N( + { a=0.2379; b=0.1310; c= -0.9624; (* dgf_base_tfo *) + d= -0.5876; e= -0.7696; f= -0.2499; + g= -0.7734; h=0.6249; i= -0.1061; + tx=30.9870; ty= -26.9344; tz=42.6416 }, + { a=0.7529; b=0.1548; c=0.6397; (* P_O3'_275_tfo *) + d=0.2952; e= -0.9481; f= -0.1180; + g=0.5882; h=0.2777; i= -0.7595; + tx= -58.8919; ty= -11.3095; tz=6.0866 }, + { a= -0.0239; b=0.9667; c= -0.2546; (* P_O3'_180_tfo *) + d=0.9731; e= -0.0359; f= -0.2275; + g= -0.2290; h= -0.2532; i= -0.9399; + tx=3.5401; ty= -29.7913; tz=52.2796 }, + { a= -0.8912; b= -0.4531; c=0.0242; (* P_O3'_60_tfo *) + d= -0.1183; e=0.1805; f= -0.9764; + g=0.4380; h= -0.8730; i= -0.2145; + tx=19.9023; ty=54.8054; tz=15.2799 }, + { x = 41.8210; y = 8.3880; z = 43.5890 }, (* P *) + { x = 42.5400; y = 8.0450; z = 44.8330 }, (* O1P *) + { x = 42.2470; y = 9.6920; z = 42.9910 }, (* O2P *) + { x = 40.2550; y = 8.2030; z = 43.7340 }, (* O5' *) + { x = 39.3505; y = 8.4697; z = 42.6565 }, (* C5' *) + { x = 39.1377; y = 7.5433; z = 42.1230 }, (* H5' *) + { x = 39.7203; y = 9.3119; z = 42.0717 }, (* H5'' *) + { x = 38.0405; y = 8.9195; z = 43.2869 }, (* C4' *) + { x = 37.3687; y = 9.3036; z = 42.5193 }, (* H4' *) + { x = 37.4319; y = 7.8146; z = 43.9387 }, (* O4' *) + { x = 37.1959; y = 8.1354; z = 45.3237 }, (* C1' *) + { x = 36.1788; y = 8.5202; z = 45.3970 }, (* H1' *) + { x = 38.1721; y = 9.2328; z = 45.6504 }, (* C2' *) + { x = 39.1555; y = 8.7939; z = 45.8188 }, (* H2'' *) + { x = 37.7862; y = 10.0617; z = 46.7013 }, (* O2' *) + { x = 37.3087; y = 9.6229; z = 47.4092 }, (* H2' *) + { x = 38.1844; y = 10.0268; z = 44.3367 }, (* C3' *) + { x = 39.1578; y = 10.5054; z = 44.2289 }, (* H3' *) + { x = 37.0547; y = 10.9127; z = 44.3441 }, (* O3' *) + { x = 34.8811; y = 4.2072; z = 47.5784 }, (* N1 *) + { x = 35.1084; y = 6.1336; z = 46.1818 }, (* N3 *) + { x = 34.4108; y = 5.1360; z = 46.7207 }, (* C2 *) + { x = 36.3908; y = 6.1224; z = 46.6053 }, (* C4 *) + { x = 36.9819; y = 5.2334; z = 47.4697 }, (* C5 *) + { x = 36.1786; y = 4.1985; z = 48.0035 }, (* C6 *) + (A ( + { x = 36.6103; y = 3.2749; z = 48.8452 }, (* N6 *) + { x = 38.3236; y = 5.5522; z = 47.6595 }, (* N7 *) + { x = 37.3887; y = 7.0024; z = 46.2437 }, (* N9 *) + { x = 38.5055; y = 6.6096; z = 46.9057 }, (* C8 *) + { x = 33.3553; y = 5.0152; z = 46.4771 }, (* H2 *) + { x = 37.5730; y = 3.2804; z = 49.1507 }, (* H61 *) + { x = 35.9775; y = 2.5638; z = 49.1828 }, (* H62 *) + { x = 39.5461; y = 6.9184; z = 47.0041 }) (* H8 *) + ) + ) + +let rA08 + = N( + { a=0.1084; b= -0.0895; c= -0.9901; (* dgf_base_tfo *) + d=0.9789; e= -0.1638; f=0.1220; + g= -0.1731; h= -0.9824; i=0.0698; + tx= -2.9039; ty=47.2655; tz=33.0094 }, + { a=0.7529; b=0.1548; c=0.6397; (* P_O3'_275_tfo *) + d=0.2952; e= -0.9481; f= -0.1180; + g=0.5882; h=0.2777; i= -0.7595; + tx= -58.8919; ty= -11.3095; tz=6.0866 }, + { a= -0.0239; b=0.9667; c= -0.2546; (* P_O3'_180_tfo *) + d=0.9731; e= -0.0359; f= -0.2275; + g= -0.2290; h= -0.2532; i= -0.9399; + tx=3.5401; ty= -29.7913; tz=52.2796 }, + { a= -0.8912; b= -0.4531; c=0.0242; (* P_O3'_60_tfo *) + d= -0.1183; e=0.1805; f= -0.9764; + g=0.4380; h= -0.8730; i= -0.2145; + tx=19.9023; ty=54.8054; tz=15.2799 }, + { x = 41.8210; y = 8.3880; z = 43.5890 }, (* P *) + { x = 42.5400; y = 8.0450; z = 44.8330 }, (* O1P *) + { x = 42.2470; y = 9.6920; z = 42.9910 }, (* O2P *) + { x = 40.2550; y = 8.2030; z = 43.7340 }, (* O5' *) + { x = 39.4850; y = 8.9301; z = 44.6977 }, (* C5' *) + { x = 39.0638; y = 9.8199; z = 44.2296 }, (* H5' *) + { x = 40.0757; y = 9.0713; z = 45.6029 }, (* H5'' *) + { x = 38.3102; y = 8.0414; z = 45.0789 }, (* C4' *) + { x = 37.7842; y = 8.4637; z = 45.9351 }, (* H4' *) + { x = 37.4200; y = 7.9453; z = 43.9769 }, (* O4' *) + { x = 37.2249; y = 6.5609; z = 43.6273 }, (* C1' *) + { x = 36.3360; y = 6.2168; z = 44.1561 }, (* H1' *) + { x = 38.4347; y = 5.8414; z = 44.1590 }, (* C2' *) + { x = 39.2688; y = 5.9974; z = 43.4749 }, (* H2'' *) + { x = 38.2344; y = 4.4907; z = 44.4348 }, (* O2' *) + { x = 37.6374; y = 4.0386; z = 43.8341 }, (* H2' *) + { x = 38.6926; y = 6.6079; z = 45.4637 }, (* C3' *) + { x = 39.7585; y = 6.5640; z = 45.6877 }, (* H3' *) + { x = 37.8238; y = 6.0705; z = 46.4723 }, (* O3' *) + { x = 33.9162; y = 6.2598; z = 39.7758 }, (* N1 *) + { x = 34.6709; y = 6.5759; z = 42.0215 }, (* N3 *) + { x = 33.7257; y = 6.5186; z = 41.0858 }, (* C2 *) + { x = 35.8935; y = 6.3324; z = 41.5018 }, (* C4 *) + { x = 36.2105; y = 6.0601; z = 40.1932 }, (* C5 *) + { x = 35.1538; y = 6.0151; z = 39.2537 }, (* C6 *) + (A ( + { x = 35.3088; y = 5.7642; z = 37.9649 }, (* N6 *) + { x = 37.5818; y = 5.8677; z = 40.0507 }, (* N7 *) + { x = 37.0932; y = 6.3197; z = 42.1810 }, (* N9 *) + { x = 38.0509; y = 6.0354; z = 41.2635 }, (* C8 *) + { x = 32.6830; y = 6.6898; z = 41.3532 }, (* H2 *) + { x = 36.2305; y = 5.5855; z = 37.5925 }, (* H61 *) + { x = 34.5056; y = 5.7512; z = 37.3528 }, (* H62 *) + { x = 39.1318; y = 5.8993; z = 41.2285 }) (* H8 *) + ) + ) + +let rA09 + = N( + { a=0.8467; b=0.4166; c= -0.3311; (* dgf_base_tfo *) + d= -0.3962; e=0.9089; f=0.1303; + g=0.3552; h=0.0209; i=0.9346; + tx= -42.7319; ty= -26.6223; tz= -29.8163 }, + { a=0.7529; b=0.1548; c=0.6397; (* P_O3'_275_tfo *) + d=0.2952; e= -0.9481; f= -0.1180; + g=0.5882; h=0.2777; i= -0.7595; + tx= -58.8919; ty= -11.3095; tz=6.0866 }, + { a= -0.0239; b=0.9667; c= -0.2546; (* P_O3'_180_tfo *) + d=0.9731; e= -0.0359; f= -0.2275; + g= -0.2290; h= -0.2532; i= -0.9399; + tx=3.5401; ty= -29.7913; tz=52.2796 }, + { a= -0.8912; b= -0.4531; c=0.0242; (* P_O3'_60_tfo *) + d= -0.1183; e=0.1805; f= -0.9764; + g=0.4380; h= -0.8730; i= -0.2145; + tx=19.9023; ty=54.8054; tz=15.2799 }, + { x = 41.8210; y = 8.3880; z = 43.5890 }, (* P *) + { x = 42.5400; y = 8.0450; z = 44.8330 }, (* O1P *) + { x = 42.2470; y = 9.6920; z = 42.9910 }, (* O2P *) + { x = 40.2550; y = 8.2030; z = 43.7340 }, (* O5' *) + { x = 39.3505; y = 8.4697; z = 42.6565 }, (* C5' *) + { x = 39.1377; y = 7.5433; z = 42.1230 }, (* H5' *) + { x = 39.7203; y = 9.3119; z = 42.0717 }, (* H5'' *) + { x = 38.0405; y = 8.9195; z = 43.2869 }, (* C4' *) + { x = 37.6479; y = 8.1347; z = 43.9335 }, (* H4' *) + { x = 38.2691; y = 10.0933; z = 44.0524 }, (* O4' *) + { x = 37.3999; y = 11.1488; z = 43.5973 }, (* C1' *) + { x = 36.5061; y = 11.1221; z = 44.2206 }, (* H1' *) + { x = 37.0364; y = 10.7838; z = 42.1836 }, (* C2' *) + { x = 37.8636; y = 11.0489; z = 41.5252 }, (* H2'' *) + { x = 35.8275; y = 11.3133; z = 41.7379 }, (* O2' *) + { x = 35.6214; y = 12.1896; z = 42.0714 }, (* H2' *) + { x = 36.9316; y = 9.2556; z = 42.2837 }, (* C3' *) + { x = 37.1778; y = 8.8260; z = 41.3127 }, (* H3' *) + { x = 35.6285; y = 8.9334; z = 42.7926 }, (* O3' *) + { x = 38.1482; y = 15.2833; z = 46.4641 }, (* N1 *) + { x = 37.3641; y = 13.0968; z = 45.9007 }, (* N3 *) + { x = 37.5032; y = 14.1288; z = 46.7300 }, (* C2 *) + { x = 37.9570; y = 13.3377; z = 44.7113 }, (* C4 *) + { x = 38.6397; y = 14.4660; z = 44.3267 }, (* C5 *) + { x = 38.7473; y = 15.5229; z = 45.2609 }, (* C6 *) + (A ( + { x = 39.3720; y = 16.6649; z = 45.0297 }, (* N6 *) + { x = 39.1079; y = 14.3351; z = 43.0223 }, (* N7 *) + { x = 38.0132; y = 12.4868; z = 43.6280 }, (* N9 *) + { x = 38.7058; y = 13.1402; z = 42.6620 }, (* C8 *) + { x = 37.0731; y = 14.0857; z = 47.7306 }, (* H2 *) + { x = 39.8113; y = 16.8281; z = 44.1350 }, (* H61 *) + { x = 39.4100; y = 17.3741; z = 45.7478 }, (* H62 *) + { x = 39.0412; y = 12.9660; z = 41.6397 }) (* H8 *) + ) + ) + +let rA10 + = N( + { a=0.7063; b=0.6317; c= -0.3196; (* dgf_base_tfo *) + d= -0.0403; e= -0.4149; f= -0.9090; + g= -0.7068; h=0.6549; i= -0.2676; + tx=6.4402; ty= -52.1496; tz=30.8246 }, + { a=0.7529; b=0.1548; c=0.6397; (* P_O3'_275_tfo *) + d=0.2952; e= -0.9481; f= -0.1180; + g=0.5882; h=0.2777; i= -0.7595; + tx= -58.8919; ty= -11.3095; tz=6.0866 }, + { a= -0.0239; b=0.9667; c= -0.2546; (* P_O3'_180_tfo *) + d=0.9731; e= -0.0359; f= -0.2275; + g= -0.2290; h= -0.2532; i= -0.9399; + tx=3.5401; ty= -29.7913; tz=52.2796 }, + { a= -0.8912; b= -0.4531; c=0.0242; (* P_O3'_60_tfo *) + d= -0.1183; e=0.1805; f= -0.9764; + g=0.4380; h= -0.8730; i= -0.2145; + tx=19.9023; ty=54.8054; tz=15.2799 }, + { x = 41.8210; y = 8.3880; z = 43.5890 }, (* P *) + { x = 42.5400; y = 8.0450; z = 44.8330 }, (* O1P *) + { x = 42.2470; y = 9.6920; z = 42.9910 }, (* O2P *) + { x = 40.2550; y = 8.2030; z = 43.7340 }, (* O5' *) + { x = 39.4850; y = 8.9301; z = 44.6977 }, (* C5' *) + { x = 39.0638; y = 9.8199; z = 44.2296 }, (* H5' *) + { x = 40.0757; y = 9.0713; z = 45.6029 }, (* H5'' *) + { x = 38.3102; y = 8.0414; z = 45.0789 }, (* C4' *) + { x = 37.7099; y = 7.8166; z = 44.1973 }, (* H4' *) + { x = 38.8012; y = 6.8321; z = 45.6380 }, (* O4' *) + { x = 38.2431; y = 6.6413; z = 46.9529 }, (* C1' *) + { x = 37.3505; y = 6.0262; z = 46.8385 }, (* H1' *) + { x = 37.8484; y = 8.0156; z = 47.4214 }, (* C2' *) + { x = 38.7381; y = 8.5406; z = 47.7690 }, (* H2'' *) + { x = 36.8286; y = 8.0368; z = 48.3701 }, (* O2' *) + { x = 36.8392; y = 7.3063; z = 48.9929 }, (* H2' *) + { x = 37.3576; y = 8.6512; z = 46.1132 }, (* C3' *) + { x = 37.5207; y = 9.7275; z = 46.1671 }, (* H3' *) + { x = 35.9985; y = 8.2392; z = 45.9032 }, (* O3' *) + { x = 39.9117; y = 2.2278; z = 48.8527 }, (* N1 *) + { x = 38.6207; y = 3.6941; z = 47.4757 }, (* N3 *) + { x = 38.9872; y = 2.4888; z = 47.9057 }, (* C2 *) + { x = 39.2961; y = 4.6720; z = 48.1174 }, (* C4 *) + { x = 40.2546; y = 4.5307; z = 49.0912 }, (* C5 *) + { x = 40.5932; y = 3.2189; z = 49.4985 }, (* C6 *) + (A ( + { x = 41.4938; y = 2.9317; z = 50.4229 }, (* N6 *) + { x = 40.7195; y = 5.7755; z = 49.5060 }, (* N7 *) + { x = 39.1730; y = 6.0305; z = 47.9170 }, (* N9 *) + { x = 40.0413; y = 6.6250; z = 48.7728 }, (* C8 *) + { x = 38.5257; y = 1.5960; z = 47.4838 }, (* H2 *) + { x = 41.9907; y = 3.6753; z = 50.8921 }, (* H61 *) + { x = 41.6848; y = 1.9687; z = 50.6599 }, (* H62 *) + { x = 40.3571; y = 7.6321; z = 49.0452 }) (* H8 *) + ) + ) + +let rAs = [rA01;rA02;rA03;rA04;rA05;rA06;rA07;rA08;rA09;rA10] + +let rC + = N( + { a= -0.0359; b= -0.8071; c=0.5894; (* dgf_base_tfo *) + d= -0.2669; e=0.5761; f=0.7726; + g= -0.9631; h= -0.1296; i= -0.2361; + tx=0.1584; ty=8.3434; tz=0.5434 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2430; y = -8.2420; z = 2.8260 }, (* C5' *) + { x = 5.1974; y = -8.8497; z = 1.9223 }, (* H5' *) + { x = 5.5548; y = -8.7348; z = 3.7469 }, (* H5'' *) + { x = 6.3140; y = -7.2060; z = 2.5510 }, (* C4' *) + { x = 7.2954; y = -7.6762; z = 2.4898 }, (* H4' *) + { x = 6.0140; y = -6.5420; z = 1.2890 }, (* O4' *) + { x = 6.4190; y = -5.1840; z = 1.3620 }, (* C1' *) + { x = 7.1608; y = -5.0495; z = 0.5747 }, (* H1' *) + { x = 7.0760; y = -4.9560; z = 2.7270 }, (* C2' *) + { x = 6.7770; y = -3.9803; z = 3.1099 }, (* H2'' *) + { x = 8.4500; y = -5.1930; z = 2.5810 }, (* O2' *) + { x = 8.8309; y = -4.8755; z = 1.7590 }, (* H2' *) + { x = 6.4060; y = -6.0590; z = 3.5580 }, (* C3' *) + { x = 5.4021; y = -5.7313; z = 3.8281 }, (* H3' *) + { x = 7.1570; y = -6.4240; z = 4.7070 }, (* O3' *) + { x = 5.2170; y = -4.3260; z = 1.1690 }, (* N1 *) + { x = 4.2960; y = -2.2560; z = 0.6290 }, (* N3 *) + { x = 5.4330; y = -3.0200; z = 0.7990 }, (* C2 *) + { x = 2.9930; y = -2.6780; z = 0.7940 }, (* C4 *) + { x = 2.8670; y = -4.0630; z = 1.1830 }, (* C5 *) + { x = 3.9570; y = -4.8300; z = 1.3550 }, (* C6 *) + (C ( + { x = 2.0187; y = -1.8047; z = 0.5874 }, (* N4 *) + { x = 6.5470; y = -2.5560; z = 0.6290 }, (* O2 *) + { x = 1.0684; y = -2.1236; z = 0.7109 }, (* H41 *) + { x = 2.2344; y = -0.8560; z = 0.3162 }, (* H42 *) + { x = 1.8797; y = -4.4972; z = 1.3404 }, (* H5 *) + { x = 3.8479; y = -5.8742; z = 1.6480 }) (* H6 *) + ) + ) + +let rC01 + = N( + { a= -0.0137; b= -0.8012; c=0.5983; (* dgf_base_tfo *) + d= -0.2523; e=0.5817; f=0.7733; + g= -0.9675; h= -0.1404; i= -0.2101; + tx=0.2031; ty=8.3874; tz=0.4228 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2416; y = -8.2422; z = 2.8181 }, (* C5' *) + { x = 5.2050; y = -8.8128; z = 1.8901 }, (* H5' *) + { x = 5.5368; y = -8.7738; z = 3.7227 }, (* H5'' *) + { x = 6.3232; y = -7.2037; z = 2.6002 }, (* C4' *) + { x = 7.3048; y = -7.6757; z = 2.5577 }, (* H4' *) + { x = 6.0635; y = -6.5092; z = 1.3456 }, (* O4' *) + { x = 6.4697; y = -5.1547; z = 1.4629 }, (* C1' *) + { x = 7.2354; y = -5.0043; z = 0.7018 }, (* H1' *) + { x = 7.0856; y = -4.9610; z = 2.8521 }, (* C2' *) + { x = 6.7777; y = -3.9935; z = 3.2487 }, (* H2'' *) + { x = 8.4627; y = -5.1992; z = 2.7423 }, (* O2' *) + { x = 8.8693; y = -4.8638; z = 1.9399 }, (* H2' *) + { x = 6.3877; y = -6.0809; z = 3.6362 }, (* C3' *) + { x = 5.3770; y = -5.7562; z = 3.8834 }, (* H3' *) + { x = 7.1024; y = -6.4754; z = 4.7985 }, (* O3' *) + { x = 5.2764; y = -4.2883; z = 1.2538 }, (* N1 *) + { x = 4.3777; y = -2.2062; z = 0.7229 }, (* N3 *) + { x = 5.5069; y = -2.9779; z = 0.9088 }, (* C2 *) + { x = 3.0693; y = -2.6246; z = 0.8500 }, (* C4 *) + { x = 2.9279; y = -4.0146; z = 1.2149 }, (* C5 *) + { x = 4.0101; y = -4.7892; z = 1.4017 }, (* C6 *) + (C ( + { x = 2.1040; y = -1.7437; z = 0.6331 }, (* N4 *) + { x = 6.6267; y = -2.5166; z = 0.7728 }, (* O2 *) + { x = 1.1496; y = -2.0600; z = 0.7287 }, (* H41 *) + { x = 2.3303; y = -0.7921; z = 0.3815 }, (* H42 *) + { x = 1.9353; y = -4.4465; z = 1.3419 }, (* H5 *) + { x = 3.8895; y = -5.8371; z = 1.6762 }) (* H6 *) + ) + ) + +let rC02 + = N( + { a=0.5141; b=0.0246; c=0.8574; (* dgf_base_tfo *) + d= -0.5547; e= -0.7529; f=0.3542; + g=0.6542; h= -0.6577; i= -0.3734; + tx= -9.1111; ty= -3.4598; tz= -3.2939 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 4.3825; y = -6.6585; z = 4.0489 }, (* C5' *) + { x = 4.6841; y = -7.2019; z = 4.9443 }, (* H5' *) + { x = 3.6189; y = -5.8889; z = 4.1625 }, (* H5'' *) + { x = 5.6255; y = -5.9175; z = 3.5998 }, (* C4' *) + { x = 5.8732; y = -5.1228; z = 4.3034 }, (* H4' *) + { x = 6.7337; y = -6.8605; z = 3.5222 }, (* O4' *) + { x = 7.5932; y = -6.4923; z = 2.4548 }, (* C1' *) + { x = 8.5661; y = -6.2983; z = 2.9064 }, (* H1' *) + { x = 7.0527; y = -5.2012; z = 1.8322 }, (* C2' *) + { x = 7.1627; y = -5.2525; z = 0.7490 }, (* H2'' *) + { x = 7.6666; y = -4.1249; z = 2.4880 }, (* O2' *) + { x = 8.5944; y = -4.2543; z = 2.6981 }, (* H2' *) + { x = 5.5661; y = -5.3029; z = 2.2009 }, (* C3' *) + { x = 5.0841; y = -6.0018; z = 1.5172 }, (* H3' *) + { x = 4.9062; y = -4.0452; z = 2.2042 }, (* O3' *) + { x = 7.6298; y = -7.6136; z = 1.4752 }, (* N1 *) + { x = 8.6945; y = -8.7046; z = -0.2857 }, (* N3 *) + { x = 8.6943; y = -7.6514; z = 0.6066 }, (* C2 *) + { x = 7.7426; y = -9.6987; z = -0.3801 }, (* C4 *) + { x = 6.6642; y = -9.5742; z = 0.5722 }, (* C5 *) + { x = 6.6391; y = -8.5592; z = 1.4526 }, (* C6 *) + (C ( + { x = 7.9033; y = -10.6371; z = -1.3010 }, (* N4 *) + { x = 9.5840; y = -6.8186; z = 0.6136 }, (* O2 *) + { x = 7.2009; y = -11.3604; z = -1.3619 }, (* H41 *) + { x = 8.7058; y = -10.6168; z = -1.9140 }, (* H42 *) + { x = 5.8585; y = -10.3083; z = 0.5822 }, (* H5 *) + { x = 5.8197; y = -8.4773; z = 2.1667 }) (* H6 *) + ) + ) + +let rC03 + = N( + { a= -0.4993; b=0.0476; c=0.8651; (* dgf_base_tfo *) + d=0.8078; e= -0.3353; f=0.4847; + g=0.3132; h=0.9409; i=0.1290; + tx=6.2989; ty= -5.2303; tz= -3.8577 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 3.9938; y = -6.7042; z = 1.9023 }, (* C5' *) + { x = 3.2332; y = -5.9343; z = 2.0319 }, (* H5' *) + { x = 3.9666; y = -7.2863; z = 0.9812 }, (* H5'' *) + { x = 5.3098; y = -5.9546; z = 1.8564 }, (* C4' *) + { x = 5.3863; y = -5.3702; z = 0.9395 }, (* H4' *) + { x = 5.3851; y = -5.0642; z = 3.0076 }, (* O4' *) + { x = 6.7315; y = -4.9724; z = 3.4462 }, (* C1' *) + { x = 7.0033; y = -3.9202; z = 3.3619 }, (* H1' *) + { x = 7.5997; y = -5.8018; z = 2.4948 }, (* C2' *) + { x = 8.3627; y = -6.3254; z = 3.0707 }, (* H2'' *) + { x = 8.0410; y = -4.9501; z = 1.4724 }, (* O2' *) + { x = 8.2781; y = -4.0644; z = 1.7570 }, (* H2' *) + { x = 6.5701; y = -6.8129; z = 1.9714 }, (* C3' *) + { x = 6.4186; y = -7.5809; z = 2.7299 }, (* H3' *) + { x = 6.9357; y = -7.3841; z = 0.7235 }, (* O3' *) + { x = 6.8024; y = -5.4718; z = 4.8475 }, (* N1 *) + { x = 7.9218; y = -5.5700; z = 6.8877 }, (* N3 *) + { x = 7.8908; y = -5.0886; z = 5.5944 }, (* C2 *) + { x = 6.9789; y = -6.3827; z = 7.4823 }, (* C4 *) + { x = 5.8742; y = -6.7319; z = 6.6202 }, (* C5 *) + { x = 5.8182; y = -6.2769; z = 5.3570 }, (* C6 *) + (C ( + { x = 7.1702; y = -6.7511; z = 8.7402 }, (* N4 *) + { x = 8.7747; y = -4.3728; z = 5.1568 }, (* O2 *) + { x = 6.4741; y = -7.3461; z = 9.1662 }, (* H41 *) + { x = 7.9889; y = -6.4396; z = 9.2429 }, (* H42 *) + { x = 5.0736; y = -7.3713; z = 6.9922 }, (* H5 *) + { x = 4.9784; y = -6.5473; z = 4.7170 }) (* H6 *) + ) + ) + +let rC04 + = N( + { a= -0.5669; b= -0.8012; c=0.1918; (* dgf_base_tfo *) + d= -0.8129; e=0.5817; f=0.0273; + g= -0.1334; h= -0.1404; i= -0.9811; + tx= -0.3279; ty=8.3874; tz=0.3355 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2416; y = -8.2422; z = 2.8181 }, (* C5' *) + { x = 5.2050; y = -8.8128; z = 1.8901 }, (* H5' *) + { x = 5.5368; y = -8.7738; z = 3.7227 }, (* H5'' *) + { x = 6.3232; y = -7.2037; z = 2.6002 }, (* C4' *) + { x = 7.3048; y = -7.6757; z = 2.5577 }, (* H4' *) + { x = 6.0635; y = -6.5092; z = 1.3456 }, (* O4' *) + { x = 6.4697; y = -5.1547; z = 1.4629 }, (* C1' *) + { x = 7.2354; y = -5.0043; z = 0.7018 }, (* H1' *) + { x = 7.0856; y = -4.9610; z = 2.8521 }, (* C2' *) + { x = 6.7777; y = -3.9935; z = 3.2487 }, (* H2'' *) + { x = 8.4627; y = -5.1992; z = 2.7423 }, (* O2' *) + { x = 8.8693; y = -4.8638; z = 1.9399 }, (* H2' *) + { x = 6.3877; y = -6.0809; z = 3.6362 }, (* C3' *) + { x = 5.3770; y = -5.7562; z = 3.8834 }, (* H3' *) + { x = 7.1024; y = -6.4754; z = 4.7985 }, (* O3' *) + { x = 5.2764; y = -4.2883; z = 1.2538 }, (* N1 *) + { x = 3.8961; y = -3.0896; z = -0.1893 }, (* N3 *) + { x = 5.0095; y = -3.8907; z = -0.0346 }, (* C2 *) + { x = 3.0480; y = -2.6632; z = 0.8116 }, (* C4 *) + { x = 3.4093; y = -3.1310; z = 2.1292 }, (* C5 *) + { x = 4.4878; y = -3.9124; z = 2.3088 }, (* C6 *) + (C ( + { x = 2.0216; y = -1.8941; z = 0.4804 }, (* N4 *) + { x = 5.7005; y = -4.2164; z = -0.9842 }, (* O2 *) + { x = 1.4067; y = -1.5873; z = 1.2205 }, (* H41 *) + { x = 1.8721; y = -1.6319; z = -0.4835 }, (* H42 *) + { x = 2.8048; y = -2.8507; z = 2.9918 }, (* H5 *) + { x = 4.7491; y = -4.2593; z = 3.3085 }) (* H6 *) + ) + ) + +let rC05 + = N( + { a= -0.6298; b=0.0246; c=0.7763; (* dgf_base_tfo *) + d= -0.5226; e= -0.7529; f= -0.4001; + g=0.5746; h= -0.6577; i=0.4870; + tx= -0.0208; ty= -3.4598; tz= -9.6882 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 4.3825; y = -6.6585; z = 4.0489 }, (* C5' *) + { x = 4.6841; y = -7.2019; z = 4.9443 }, (* H5' *) + { x = 3.6189; y = -5.8889; z = 4.1625 }, (* H5'' *) + { x = 5.6255; y = -5.9175; z = 3.5998 }, (* C4' *) + { x = 5.8732; y = -5.1228; z = 4.3034 }, (* H4' *) + { x = 6.7337; y = -6.8605; z = 3.5222 }, (* O4' *) + { x = 7.5932; y = -6.4923; z = 2.4548 }, (* C1' *) + { x = 8.5661; y = -6.2983; z = 2.9064 }, (* H1' *) + { x = 7.0527; y = -5.2012; z = 1.8322 }, (* C2' *) + { x = 7.1627; y = -5.2525; z = 0.7490 }, (* H2'' *) + { x = 7.6666; y = -4.1249; z = 2.4880 }, (* O2' *) + { x = 8.5944; y = -4.2543; z = 2.6981 }, (* H2' *) + { x = 5.5661; y = -5.3029; z = 2.2009 }, (* C3' *) + { x = 5.0841; y = -6.0018; z = 1.5172 }, (* H3' *) + { x = 4.9062; y = -4.0452; z = 2.2042 }, (* O3' *) + { x = 7.6298; y = -7.6136; z = 1.4752 }, (* N1 *) + { x = 8.5977; y = -9.5977; z = 0.7329 }, (* N3 *) + { x = 8.5951; y = -8.5745; z = 1.6594 }, (* C2 *) + { x = 7.7372; y = -9.7371; z = -0.3364 }, (* C4 *) + { x = 6.7596; y = -8.6801; z = -0.4476 }, (* C5 *) + { x = 6.7338; y = -7.6721; z = 0.4408 }, (* C6 *) + (C ( + { x = 7.8849; y = -10.7881; z = -1.1289 }, (* N4 *) + { x = 9.3993; y = -8.5377; z = 2.5743 }, (* O2 *) + { x = 7.2499; y = -10.8809; z = -1.9088 }, (* H41 *) + { x = 8.6122; y = -11.4649; z = -0.9468 }, (* H42 *) + { x = 6.0317; y = -8.6941; z = -1.2588 }, (* H5 *) + { x = 5.9901; y = -6.8809; z = 0.3459 }) (* H6 *) + ) + ) + +let rC06 + = N( + { a= -0.9837; b=0.0476; c= -0.1733; (* dgf_base_tfo *) + d= -0.1792; e= -0.3353; f=0.9249; + g= -0.0141; h=0.9409; i=0.3384; + tx=5.7793; ty= -5.2303; tz=4.5997 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 3.9938; y = -6.7042; z = 1.9023 }, (* C5' *) + { x = 3.2332; y = -5.9343; z = 2.0319 }, (* H5' *) + { x = 3.9666; y = -7.2863; z = 0.9812 }, (* H5'' *) + { x = 5.3098; y = -5.9546; z = 1.8564 }, (* C4' *) + { x = 5.3863; y = -5.3702; z = 0.9395 }, (* H4' *) + { x = 5.3851; y = -5.0642; z = 3.0076 }, (* O4' *) + { x = 6.7315; y = -4.9724; z = 3.4462 }, (* C1' *) + { x = 7.0033; y = -3.9202; z = 3.3619 }, (* H1' *) + { x = 7.5997; y = -5.8018; z = 2.4948 }, (* C2' *) + { x = 8.3627; y = -6.3254; z = 3.0707 }, (* H2'' *) + { x = 8.0410; y = -4.9501; z = 1.4724 }, (* O2' *) + { x = 8.2781; y = -4.0644; z = 1.7570 }, (* H2' *) + { x = 6.5701; y = -6.8129; z = 1.9714 }, (* C3' *) + { x = 6.4186; y = -7.5809; z = 2.7299 }, (* H3' *) + { x = 6.9357; y = -7.3841; z = 0.7235 }, (* O3' *) + { x = 6.8024; y = -5.4718; z = 4.8475 }, (* N1 *) + { x = 6.6920; y = -5.0495; z = 7.1354 }, (* N3 *) + { x = 6.6201; y = -4.5500; z = 5.8506 }, (* C2 *) + { x = 6.9254; y = -6.3614; z = 7.4926 }, (* C4 *) + { x = 7.1046; y = -7.2543; z = 6.3718 }, (* C5 *) + { x = 7.0391; y = -6.7951; z = 5.1106 }, (* C6 *) + (C ( + { x = 6.9614; y = -6.6648; z = 8.7815 }, (* N4 *) + { x = 6.4083; y = -3.3696; z = 5.6340 }, (* O2 *) + { x = 7.1329; y = -7.6280; z = 9.0324 }, (* H41 *) + { x = 6.8204; y = -5.9469; z = 9.4777 }, (* H42 *) + { x = 7.2954; y = -8.3135; z = 6.5440 }, (* H5 *) + { x = 7.1753; y = -7.4798; z = 4.2735 }) (* H6 *) + ) + ) + +let rC07 + = N( + { a=0.0033; b=0.2720; c= -0.9623; (* dgf_base_tfo *) + d=0.3013; e= -0.9179; f= -0.2584; + g= -0.9535; h= -0.2891; i= -0.0850; + tx=43.0403; ty=13.7233; tz=34.5710 }, + { a=0.9187; b=0.2887; c=0.2694; (* P_O3'_275_tfo *) + d=0.0302; e= -0.7316; f=0.6811; + g=0.3938; h= -0.6176; i= -0.6808; + tx= -48.4330; ty=26.3254; tz=13.6383 }, + { a= -0.1504; b=0.7744; c= -0.6145; (* P_O3'_180_tfo *) + d=0.7581; e=0.4893; f=0.4311; + g=0.6345; h= -0.4010; i= -0.6607; + tx= -31.9784; ty= -13.4285; tz=44.9650 }, + { a= -0.6236; b= -0.7810; c= -0.0337; (* P_O3'_60_tfo *) + d= -0.6890; e=0.5694; f= -0.4484; + g=0.3694; h= -0.2564; i= -0.8932; + tx=12.1105; ty=30.8774; tz=46.0946 }, + { x = 33.3400; y = 11.0980; z = 46.1750 }, (* P *) + { x = 34.5130; y = 10.2320; z = 46.4660 }, (* O1P *) + { x = 33.4130; y = 12.3960; z = 46.9340 }, (* O2P *) + { x = 31.9810; y = 10.3390; z = 46.4820 }, (* O5' *) + { x = 30.8152; y = 11.1619; z = 46.2003 }, (* C5' *) + { x = 30.4519; y = 10.9454; z = 45.1957 }, (* H5' *) + { x = 31.0379; y = 12.2016; z = 46.4400 }, (* H5'' *) + { x = 29.7081; y = 10.7448; z = 47.1428 }, (* C4' *) + { x = 28.8710; y = 11.4416; z = 47.0982 }, (* H4' *) + { x = 29.2550; y = 9.4394; z = 46.8162 }, (* O4' *) + { x = 29.3907; y = 8.5625; z = 47.9460 }, (* C1' *) + { x = 28.4416; y = 8.5669; z = 48.4819 }, (* H1' *) + { x = 30.4468; y = 9.2031; z = 48.7952 }, (* C2' *) + { x = 31.4222; y = 8.9651; z = 48.3709 }, (* H2'' *) + { x = 30.3701; y = 8.9157; z = 50.1624 }, (* O2' *) + { x = 30.0652; y = 8.0304; z = 50.3740 }, (* H2' *) + { x = 30.1622; y = 10.6879; z = 48.6120 }, (* C3' *) + { x = 31.0952; y = 11.2399; z = 48.7254 }, (* H3' *) + { x = 29.1076; y = 11.1535; z = 49.4702 }, (* O3' *) + { x = 29.7883; y = 7.2209; z = 47.5235 }, (* N1 *) + { x = 29.1825; y = 5.0438; z = 46.8275 }, (* N3 *) + { x = 28.8008; y = 6.2912; z = 47.2263 }, (* C2 *) + { x = 30.4888; y = 4.6890; z = 46.7186 }, (* C4 *) + { x = 31.5034; y = 5.6405; z = 47.0249 }, (* C5 *) + { x = 31.1091; y = 6.8691; z = 47.4156 }, (* C6 *) + (C ( + { x = 30.8109; y = 3.4584; z = 46.3336 }, (* N4 *) + { x = 27.6171; y = 6.5989; z = 47.3189 }, (* O2 *) + { x = 31.7923; y = 3.2301; z = 46.2638 }, (* H41 *) + { x = 30.0880; y = 2.7857; z = 46.1215 }, (* H42 *) + { x = 32.5542; y = 5.3634; z = 46.9395 }, (* H5 *) + { x = 31.8523; y = 7.6279; z = 47.6603 }) (* H6 *) + ) + ) + +let rC08 + = N( + { a=0.0797; b= -0.6026; c= -0.7941; (* dgf_base_tfo *) + d=0.7939; e=0.5201; f= -0.3150; + g=0.6028; h= -0.6054; i=0.5198; + tx= -36.8341; ty=41.5293; tz=1.6628 }, + { a=0.9187; b=0.2887; c=0.2694; (* P_O3'_275_tfo *) + d=0.0302; e= -0.7316; f=0.6811; + g=0.3938; h= -0.6176; i= -0.6808; + tx= -48.4330; ty=26.3254; tz=13.6383 }, + { a= -0.1504; b=0.7744; c= -0.6145; (* P_O3'_180_tfo *) + d=0.7581; e=0.4893; f=0.4311; + g=0.6345; h= -0.4010; i= -0.6607; + tx= -31.9784; ty= -13.4285; tz=44.9650 }, + { a= -0.6236; b= -0.7810; c= -0.0337; (* P_O3'_60_tfo *) + d= -0.6890; e=0.5694; f= -0.4484; + g=0.3694; h= -0.2564; i= -0.8932; + tx=12.1105; ty=30.8774; tz=46.0946 }, + { x = 33.3400; y = 11.0980; z = 46.1750 }, (* P *) + { x = 34.5130; y = 10.2320; z = 46.4660 }, (* O1P *) + { x = 33.4130; y = 12.3960; z = 46.9340 }, (* O2P *) + { x = 31.9810; y = 10.3390; z = 46.4820 }, (* O5' *) + { x = 31.8779; y = 9.9369; z = 47.8760 }, (* C5' *) + { x = 31.3239; y = 10.6931; z = 48.4322 }, (* H5' *) + { x = 32.8647; y = 9.6624; z = 48.2489 }, (* H5'' *) + { x = 31.0429; y = 8.6773; z = 47.9401 }, (* C4' *) + { x = 31.0779; y = 8.2331; z = 48.9349 }, (* H4' *) + { x = 29.6956; y = 8.9669; z = 47.5983 }, (* O4' *) + { x = 29.2784; y = 8.1700; z = 46.4782 }, (* C1' *) + { x = 28.8006; y = 7.2731; z = 46.8722 }, (* H1' *) + { x = 30.5544; y = 7.7940; z = 45.7875 }, (* C2' *) + { x = 30.8837; y = 8.6410; z = 45.1856 }, (* H2'' *) + { x = 30.5100; y = 6.6007; z = 45.0582 }, (* O2' *) + { x = 29.6694; y = 6.4168; z = 44.6326 }, (* H2' *) + { x = 31.5146; y = 7.5954; z = 46.9527 }, (* C3' *) + { x = 32.5255; y = 7.8261; z = 46.6166 }, (* H3' *) + { x = 31.3876; y = 6.2951; z = 47.5516 }, (* O3' *) + { x = 28.3976; y = 8.9302; z = 45.5933 }, (* N1 *) + { x = 26.2155; y = 9.6135; z = 44.9910 }, (* N3 *) + { x = 27.0281; y = 8.8961; z = 45.8192 }, (* C2 *) + { x = 26.7044; y = 10.3489; z = 43.9595 }, (* C4 *) + { x = 28.1088; y = 10.3837; z = 43.7247 }, (* C5 *) + { x = 28.8978; y = 9.6708; z = 44.5535 }, (* C6 *) + (C ( + { x = 25.8715; y = 11.0249; z = 43.1749 }, (* N4 *) + { x = 26.5733; y = 8.2371; z = 46.7484 }, (* O2 *) + { x = 26.2707; y = 11.5609; z = 42.4177 }, (* H41 *) + { x = 24.8760; y = 10.9939; z = 43.3427 }, (* H42 *) + { x = 28.5089; y = 10.9722; z = 42.8990 }, (* H5 *) + { x = 29.9782; y = 9.6687; z = 44.4097 }) (* H6 *) + ) + ) + +let rC09 + = N( + { a=0.8727; b=0.4760; c= -0.1091; (* dgf_base_tfo *) + d= -0.4188; e=0.6148; f= -0.6682; + g= -0.2510; h=0.6289; i=0.7359; + tx= -8.1687; ty= -52.0761; tz= -25.0726 }, + { a=0.9187; b=0.2887; c=0.2694; (* P_O3'_275_tfo *) + d=0.0302; e= -0.7316; f=0.6811; + g=0.3938; h= -0.6176; i= -0.6808; + tx= -48.4330; ty=26.3254; tz=13.6383 }, + { a= -0.1504; b=0.7744; c= -0.6145; (* P_O3'_180_tfo *) + d=0.7581; e=0.4893; f=0.4311; + g=0.6345; h= -0.4010; i= -0.6607; + tx= -31.9784; ty= -13.4285; tz=44.9650 }, + { a= -0.6236; b= -0.7810; c= -0.0337; (* P_O3'_60_tfo *) + d= -0.6890; e=0.5694; f= -0.4484; + g=0.3694; h= -0.2564; i= -0.8932; + tx=12.1105; ty=30.8774; tz=46.0946 }, + { x = 33.3400; y = 11.0980; z = 46.1750 }, (* P *) + { x = 34.5130; y = 10.2320; z = 46.4660 }, (* O1P *) + { x = 33.4130; y = 12.3960; z = 46.9340 }, (* O2P *) + { x = 31.9810; y = 10.3390; z = 46.4820 }, (* O5' *) + { x = 30.8152; y = 11.1619; z = 46.2003 }, (* C5' *) + { x = 30.4519; y = 10.9454; z = 45.1957 }, (* H5' *) + { x = 31.0379; y = 12.2016; z = 46.4400 }, (* H5'' *) + { x = 29.7081; y = 10.7448; z = 47.1428 }, (* C4' *) + { x = 29.4506; y = 9.6945; z = 47.0059 }, (* H4' *) + { x = 30.1045; y = 10.9634; z = 48.4885 }, (* O4' *) + { x = 29.1794; y = 11.8418; z = 49.1490 }, (* C1' *) + { x = 28.4388; y = 11.2210; z = 49.6533 }, (* H1' *) + { x = 28.5211; y = 12.6008; z = 48.0367 }, (* C2' *) + { x = 29.1947; y = 13.3949; z = 47.7147 }, (* H2'' *) + { x = 27.2316; y = 13.0683; z = 48.3134 }, (* O2' *) + { x = 27.0851; y = 13.3391; z = 49.2227 }, (* H2' *) + { x = 28.4131; y = 11.5507; z = 46.9391 }, (* C3' *) + { x = 28.4451; y = 12.0512; z = 45.9713 }, (* H3' *) + { x = 27.2707; y = 10.6955; z = 47.1097 }, (* O3' *) + { x = 29.8751; y = 12.7405; z = 50.0682 }, (* N1 *) + { x = 30.7172; y = 13.1841; z = 52.2328 }, (* N3 *) + { x = 30.0617; y = 12.3404; z = 51.3847 }, (* C2 *) + { x = 31.1834; y = 14.3941; z = 51.8297 }, (* C4 *) + { x = 30.9913; y = 14.8074; z = 50.4803 }, (* C5 *) + { x = 30.3434; y = 13.9610; z = 49.6548 }, (* C6 *) + (C ( + { x = 31.8090; y = 15.1847; z = 52.6957 }, (* N4 *) + { x = 29.6470; y = 11.2494; z = 51.7616 }, (* O2 *) + { x = 32.1422; y = 16.0774; z = 52.3606 }, (* H41 *) + { x = 31.9392; y = 14.8893; z = 53.6527 }, (* H42 *) + { x = 31.3632; y = 15.7771; z = 50.1491 }, (* H5 *) + { x = 30.1742; y = 14.2374; z = 48.6141 }) (* H6 *) + ) + ) + +let rC10 + = N( + { a=0.1549; b=0.8710; c= -0.4663; (* dgf_base_tfo *) + d=0.6768; e= -0.4374; f= -0.5921; + g= -0.7197; h= -0.2239; i= -0.6572; + tx=25.2447; ty= -14.1920; tz=50.3201 }, + { a=0.9187; b=0.2887; c=0.2694; (* P_O3'_275_tfo *) + d=0.0302; e= -0.7316; f=0.6811; + g=0.3938; h= -0.6176; i= -0.6808; + tx= -48.4330; ty=26.3254; tz=13.6383 }, + { a= -0.1504; b=0.7744; c= -0.6145; (* P_O3'_180_tfo *) + d=0.7581; e=0.4893; f=0.4311; + g=0.6345; h= -0.4010; i= -0.6607; + tx= -31.9784; ty= -13.4285; tz=44.9650 }, + { a= -0.6236; b= -0.7810; c= -0.0337; (* P_O3'_60_tfo *) + d= -0.6890; e=0.5694; f= -0.4484; + g=0.3694; h= -0.2564; i= -0.8932; + tx=12.1105; ty=30.8774; tz=46.0946 }, + { x = 33.3400; y = 11.0980; z = 46.1750 }, (* P *) + { x = 34.5130; y = 10.2320; z = 46.4660 }, (* O1P *) + { x = 33.4130; y = 12.3960; z = 46.9340 }, (* O2P *) + { x = 31.9810; y = 10.3390; z = 46.4820 }, (* O5' *) + { x = 31.8779; y = 9.9369; z = 47.8760 }, (* C5' *) + { x = 31.3239; y = 10.6931; z = 48.4322 }, (* H5' *) + { x = 32.8647; y = 9.6624; z = 48.2489 }, (* H5'' *) + { x = 31.0429; y = 8.6773; z = 47.9401 }, (* C4' *) + { x = 30.0440; y = 8.8473; z = 47.5383 }, (* H4' *) + { x = 31.6749; y = 7.6351; z = 47.2119 }, (* O4' *) + { x = 31.9159; y = 6.5022; z = 48.0616 }, (* C1' *) + { x = 31.0691; y = 5.8243; z = 47.9544 }, (* H1' *) + { x = 31.9300; y = 7.0685; z = 49.4493 }, (* C2' *) + { x = 32.9024; y = 7.5288; z = 49.6245 }, (* H2'' *) + { x = 31.5672; y = 6.1750; z = 50.4632 }, (* O2' *) + { x = 31.8416; y = 5.2663; z = 50.3200 }, (* H2' *) + { x = 30.8618; y = 8.1514; z = 49.3749 }, (* C3' *) + { x = 31.1122; y = 8.9396; z = 50.0850 }, (* H3' *) + { x = 29.5351; y = 7.6245; z = 49.5409 }, (* O3' *) + { x = 33.1890; y = 5.8629; z = 47.7343 }, (* N1 *) + { x = 34.4004; y = 4.2636; z = 46.4828 }, (* N3 *) + { x = 33.2062; y = 4.8497; z = 46.7851 }, (* C2 *) + { x = 35.5600; y = 4.6374; z = 47.0822 }, (* C4 *) + { x = 35.5444; y = 5.6751; z = 48.0577 }, (* C5 *) + { x = 34.3565; y = 6.2450; z = 48.3432 }, (* C6 *) + (C ( + { x = 36.6977; y = 4.0305; z = 46.7598 }, (* N4 *) + { x = 32.1661; y = 4.5034; z = 46.2348 }, (* O2 *) + { x = 37.5405; y = 4.3347; z = 47.2259 }, (* H41 *) + { x = 36.7033; y = 3.2923; z = 46.0706 }, (* H42 *) + { x = 36.4713; y = 5.9811; z = 48.5428 }, (* H5 *) + { x = 34.2986; y = 7.0426; z = 49.0839 }) (* H6 *) + ) + ) + +let rCs = [rC01;rC02;rC03;rC04;rC05;rC06;rC07;rC08;rC09;rC10] + +let rG + = N( + { a= -0.0018; b= -0.8207; c=0.5714; (* dgf_base_tfo *) + d=0.2679; e= -0.5509; f= -0.7904; + g=0.9634; h=0.1517; i=0.2209; + tx=0.0073; ty=8.4030; tz=0.6232 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 5.4550; y = 8.2120; z = -2.8810 }, (* C5' *) + { x = 5.4546; y = 8.8508; z = -1.9978 }, (* H5' *) + { x = 5.7588; y = 8.6625; z = -3.8259 }, (* H5'' *) + { x = 6.4970; y = 7.1480; z = -2.5980 }, (* C4' *) + { x = 7.4896; y = 7.5919; z = -2.5214 }, (* H4' *) + { x = 6.1630; y = 6.4860; z = -1.3440 }, (* O4' *) + { x = 6.5400; y = 5.1200; z = -1.4190 }, (* C1' *) + { x = 7.2763; y = 4.9681; z = -0.6297 }, (* H1' *) + { x = 7.1940; y = 4.8830; z = -2.7770 }, (* C2' *) + { x = 6.8667; y = 3.9183; z = -3.1647 }, (* H2'' *) + { x = 8.5860; y = 5.0910; z = -2.6140 }, (* O2' *) + { x = 8.9510; y = 4.7626; z = -1.7890 }, (* H2' *) + { x = 6.5720; y = 6.0040; z = -3.6090 }, (* C3' *) + { x = 5.5636; y = 5.7066; z = -3.8966 }, (* H3' *) + { x = 7.3801; y = 6.3562; z = -4.7350 }, (* O3' *) + { x = 4.7150; y = 0.4910; z = -0.1360 }, (* N1 *) + { x = 6.3490; y = 2.1730; z = -0.6020 }, (* N3 *) + { x = 5.9530; y = 0.9650; z = -0.2670 }, (* C2 *) + { x = 5.2900; y = 2.9790; z = -0.8260 }, (* C4 *) + { x = 3.9720; y = 2.6390; z = -0.7330 }, (* C5 *) + { x = 3.6770; y = 1.3160; z = -0.3660 }, (* C6 *) + (G ( + { x = 6.8426; y = 0.0056; z = -0.0019 }, (* N2 *) + { x = 3.1660; y = 3.7290; z = -1.0360 }, (* N7 *) + { x = 5.3170; y = 4.2990; z = -1.1930 }, (* N9 *) + { x = 4.0100; y = 4.6780; z = -1.2990 }, (* C8 *) + { x = 2.4280; y = 0.8450; z = -0.2360 }, (* O6 *) + { x = 4.6151; y = -0.4677; z = 0.1305 }, (* H1 *) + { x = 6.6463; y = -0.9463; z = 0.2729 }, (* H21 *) + { x = 7.8170; y = 0.2642; z = -0.0640 }, (* H22 *) + { x = 3.4421; y = 5.5744; z = -1.5482 }) (* H8 *) + ) + ) + +let rG01 + = N( + { a= -0.0043; b= -0.8175; c=0.5759; (* dgf_base_tfo *) + d=0.2617; e= -0.5567; f= -0.7884; + g=0.9651; h=0.1473; i=0.2164; + tx=0.0359; ty=8.3929; tz=0.5532 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 5.4352; y = 8.2183; z = -2.7757 }, (* C5' *) + { x = 5.3830; y = 8.7883; z = -1.8481 }, (* H5' *) + { x = 5.7729; y = 8.7436; z = -3.6691 }, (* H5'' *) + { x = 6.4830; y = 7.1518; z = -2.5252 }, (* C4' *) + { x = 7.4749; y = 7.5972; z = -2.4482 }, (* H4' *) + { x = 6.1626; y = 6.4620; z = -1.2827 }, (* O4' *) + { x = 6.5431; y = 5.0992; z = -1.3905 }, (* C1' *) + { x = 7.2871; y = 4.9328; z = -0.6114 }, (* H1' *) + { x = 7.1852; y = 4.8935; z = -2.7592 }, (* C2' *) + { x = 6.8573; y = 3.9363; z = -3.1645 }, (* H2'' *) + { x = 8.5780; y = 5.1025; z = -2.6046 }, (* O2' *) + { x = 8.9516; y = 4.7577; z = -1.7902 }, (* H2' *) + { x = 6.5522; y = 6.0300; z = -3.5612 }, (* C3' *) + { x = 5.5420; y = 5.7356; z = -3.8459 }, (* H3' *) + { x = 7.3487; y = 6.4089; z = -4.6867 }, (* O3' *) + { x = 4.7442; y = 0.4514; z = -0.1390 }, (* N1 *) + { x = 6.3687; y = 2.1459; z = -0.5926 }, (* N3 *) + { x = 5.9795; y = 0.9335; z = -0.2657 }, (* C2 *) + { x = 5.3052; y = 2.9471; z = -0.8125 }, (* C4 *) + { x = 3.9891; y = 2.5987; z = -0.7230 }, (* C5 *) + { x = 3.7016; y = 1.2717; z = -0.3647 }, (* C6 *) + (G ( + { x = 6.8745; y = -0.0224; z = -0.0058 }, (* N2 *) + { x = 3.1770; y = 3.6859; z = -1.0198 }, (* N7 *) + { x = 5.3247; y = 4.2695; z = -1.1710 }, (* N9 *) + { x = 4.0156; y = 4.6415; z = -1.2759 }, (* C8 *) + { x = 2.4553; y = 0.7925; z = -0.2390 }, (* O6 *) + { x = 4.6497; y = -0.5095; z = 0.1212 }, (* H1 *) + { x = 6.6836; y = -0.9771; z = 0.2627 }, (* H21 *) + { x = 7.8474; y = 0.2424; z = -0.0653 }, (* H22 *) + { x = 3.4426; y = 5.5361; z = -1.5199 }) (* H8 *) + ) + ) + +let rG02 + = N( + { a=0.5566; b=0.0449; c=0.8296; (* dgf_base_tfo *) + d=0.5125; e=0.7673; f= -0.3854; + g= -0.6538; h=0.6397; i=0.4041; + tx= -9.1161; ty= -3.7679; tz= -2.9968 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.5778; y = 6.6594; z = -4.0364 }, (* C5' *) + { x = 4.9220; y = 7.1963; z = -4.9204 }, (* H5' *) + { x = 3.7996; y = 5.9091; z = -4.1764 }, (* H5'' *) + { x = 5.7873; y = 5.8869; z = -3.5482 }, (* C4' *) + { x = 6.0405; y = 5.0875; z = -4.2446 }, (* H4' *) + { x = 6.9135; y = 6.8036; z = -3.4310 }, (* O4' *) + { x = 7.7293; y = 6.4084; z = -2.3392 }, (* C1' *) + { x = 8.7078; y = 6.1815; z = -2.7624 }, (* H1' *) + { x = 7.1305; y = 5.1418; z = -1.7347 }, (* C2' *) + { x = 7.2040; y = 5.1982; z = -0.6486 }, (* H2'' *) + { x = 7.7417; y = 4.0392; z = -2.3813 }, (* O2' *) + { x = 8.6785; y = 4.1443; z = -2.5630 }, (* H2' *) + { x = 5.6666; y = 5.2728; z = -2.1536 }, (* C3' *) + { x = 5.1747; y = 5.9805; z = -1.4863 }, (* H3' *) + { x = 4.9997; y = 4.0086; z = -2.1973 }, (* O3' *) + { x = 10.3245; y = 8.5459; z = 1.5467 }, (* N1 *) + { x = 9.8051; y = 6.9432; z = -0.1497 }, (* N3 *) + { x = 10.5175; y = 7.4328; z = 0.8408 }, (* C2 *) + { x = 8.7523; y = 7.7422; z = -0.4228 }, (* C4 *) + { x = 8.4257; y = 8.9060; z = 0.2099 }, (* C5 *) + { x = 9.2665; y = 9.3242; z = 1.2540 }, (* C6 *) + (G ( + { x = 11.6077; y = 6.7966; z = 1.2752 }, (* N2 *) + { x = 7.2750; y = 9.4537; z = -0.3428 }, (* N7 *) + { x = 7.7962; y = 7.5519; z = -1.3859 }, (* N9 *) + { x = 6.9479; y = 8.6157; z = -1.2771 }, (* C8 *) + { x = 9.0664; y = 10.4462; z = 1.9610 }, (* O6 *) + { x = 10.9838; y = 8.7524; z = 2.2697 }, (* H1 *) + { x = 12.2274; y = 7.0896; z = 2.0170 }, (* H21 *) + { x = 11.8502; y = 5.9398; z = 0.7984 }, (* H22 *) + { x = 6.0430; y = 8.9853; z = -1.7594 }) (* H8 *) + ) + ) + +let rG03 + = N( + { a= -0.5021; b=0.0731; c=0.8617; (* dgf_base_tfo *) + d= -0.8112; e=0.3054; f= -0.4986; + g= -0.2996; h= -0.9494; i= -0.0940; + tx=6.4273; ty= -5.1944; tz= -3.7807 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.1214; y = 6.7116; z = -1.9049 }, (* C5' *) + { x = 3.3465; y = 5.9610; z = -2.0607 }, (* H5' *) + { x = 4.0789; y = 7.2928; z = -0.9837 }, (* H5'' *) + { x = 5.4170; y = 5.9293; z = -1.8186 }, (* C4' *) + { x = 5.4506; y = 5.3400; z = -0.9023 }, (* H4' *) + { x = 5.5067; y = 5.0417; z = -2.9703 }, (* O4' *) + { x = 6.8650; y = 4.9152; z = -3.3612 }, (* C1' *) + { x = 7.1090; y = 3.8577; z = -3.2603 }, (* H1' *) + { x = 7.7152; y = 5.7282; z = -2.3894 }, (* C2' *) + { x = 8.5029; y = 6.2356; z = -2.9463 }, (* H2'' *) + { x = 8.1036; y = 4.8568; z = -1.3419 }, (* O2' *) + { x = 8.3270; y = 3.9651; z = -1.6184 }, (* H2' *) + { x = 6.7003; y = 6.7565; z = -1.8911 }, (* C3' *) + { x = 6.5898; y = 7.5329; z = -2.6482 }, (* H3' *) + { x = 7.0505; y = 7.2878; z = -0.6105 }, (* O3' *) + { x = 9.6740; y = 4.7656; z = -7.6614 }, (* N1 *) + { x = 9.0739; y = 4.3013; z = -5.3941 }, (* N3 *) + { x = 9.8416; y = 4.2192; z = -6.4581 }, (* C2 *) + { x = 7.9885; y = 5.0632; z = -5.6446 }, (* C4 *) + { x = 7.6822; y = 5.6856; z = -6.8194 }, (* C5 *) + { x = 8.5831; y = 5.5215; z = -7.8840 }, (* C6 *) + (G ( + { x = 10.9733; y = 3.5117; z = -6.4286 }, (* N2 *) + { x = 6.4857; y = 6.3816; z = -6.7035 }, (* N7 *) + { x = 6.9740; y = 5.3703; z = -4.7760 }, (* N9 *) + { x = 6.1133; y = 6.1613; z = -5.4808 }, (* C8 *) + { x = 8.4084; y = 6.0747; z = -9.0933 }, (* O6 *) + { x = 10.3759; y = 4.5855; z = -8.3504 }, (* H1 *) + { x = 11.6254; y = 3.3761; z = -7.1879 }, (* H21 *) + { x = 11.1917; y = 3.0460; z = -5.5593 }, (* H22 *) + { x = 5.1705; y = 6.6830; z = -5.3167 }) (* H8 *) + ) + ) + +let rG04 + = N( + { a= -0.5426; b= -0.8175; c=0.1929; (* dgf_base_tfo *) + d=0.8304; e= -0.5567; f= -0.0237; + g=0.1267; h=0.1473; i=0.9809; + tx= -0.5075; ty=8.3929; tz=0.2229 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 5.4352; y = 8.2183; z = -2.7757 }, (* C5' *) + { x = 5.3830; y = 8.7883; z = -1.8481 }, (* H5' *) + { x = 5.7729; y = 8.7436; z = -3.6691 }, (* H5'' *) + { x = 6.4830; y = 7.1518; z = -2.5252 }, (* C4' *) + { x = 7.4749; y = 7.5972; z = -2.4482 }, (* H4' *) + { x = 6.1626; y = 6.4620; z = -1.2827 }, (* O4' *) + { x = 6.5431; y = 5.0992; z = -1.3905 }, (* C1' *) + { x = 7.2871; y = 4.9328; z = -0.6114 }, (* H1' *) + { x = 7.1852; y = 4.8935; z = -2.7592 }, (* C2' *) + { x = 6.8573; y = 3.9363; z = -3.1645 }, (* H2'' *) + { x = 8.5780; y = 5.1025; z = -2.6046 }, (* O2' *) + { x = 8.9516; y = 4.7577; z = -1.7902 }, (* H2' *) + { x = 6.5522; y = 6.0300; z = -3.5612 }, (* C3' *) + { x = 5.5420; y = 5.7356; z = -3.8459 }, (* H3' *) + { x = 7.3487; y = 6.4089; z = -4.6867 }, (* O3' *) + { x = 3.6343; y = 2.6680; z = 2.0783 }, (* N1 *) + { x = 5.4505; y = 3.9805; z = 1.2446 }, (* N3 *) + { x = 4.7540; y = 3.3816; z = 2.1851 }, (* C2 *) + { x = 4.8805; y = 3.7951; z = 0.0354 }, (* C4 *) + { x = 3.7416; y = 3.0925; z = -0.2305 }, (* C5 *) + { x = 3.0873; y = 2.4980; z = 0.8606 }, (* C6 *) + (G ( + { x = 5.1433; y = 3.4373; z = 3.4609 }, (* N2 *) + { x = 3.4605; y = 3.1184; z = -1.5906 }, (* N7 *) + { x = 5.3247; y = 4.2695; z = -1.1710 }, (* N9 *) + { x = 4.4244; y = 3.8244; z = -2.0953 }, (* C8 *) + { x = 1.9600; y = 1.7805; z = 0.7462 }, (* O6 *) + { x = 3.2489; y = 2.2879; z = 2.9191 }, (* H1 *) + { x = 4.6785; y = 3.0243; z = 4.2568 }, (* H21 *) + { x = 5.9823; y = 3.9654; z = 3.6539 }, (* H22 *) + { x = 4.2675; y = 3.8876; z = -3.1721 }) (* H8 *) + ) + ) + +let rG05 + = N( + { a= -0.5891; b=0.0449; c=0.8068; (* dgf_base_tfo *) + d=0.5375; e=0.7673; f=0.3498; + g= -0.6034; h=0.6397; i= -0.4762; + tx= -0.3019; ty= -3.7679; tz= -9.5913 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.5778; y = 6.6594; z = -4.0364 }, (* C5' *) + { x = 4.9220; y = 7.1963; z = -4.9204 }, (* H5' *) + { x = 3.7996; y = 5.9091; z = -4.1764 }, (* H5'' *) + { x = 5.7873; y = 5.8869; z = -3.5482 }, (* C4' *) + { x = 6.0405; y = 5.0875; z = -4.2446 }, (* H4' *) + { x = 6.9135; y = 6.8036; z = -3.4310 }, (* O4' *) + { x = 7.7293; y = 6.4084; z = -2.3392 }, (* C1' *) + { x = 8.7078; y = 6.1815; z = -2.7624 }, (* H1' *) + { x = 7.1305; y = 5.1418; z = -1.7347 }, (* C2' *) + { x = 7.2040; y = 5.1982; z = -0.6486 }, (* H2'' *) + { x = 7.7417; y = 4.0392; z = -2.3813 }, (* O2' *) + { x = 8.6785; y = 4.1443; z = -2.5630 }, (* H2' *) + { x = 5.6666; y = 5.2728; z = -2.1536 }, (* C3' *) + { x = 5.1747; y = 5.9805; z = -1.4863 }, (* H3' *) + { x = 4.9997; y = 4.0086; z = -2.1973 }, (* O3' *) + { x = 10.2594; y = 10.6774; z = -1.0056 }, (* N1 *) + { x = 9.7528; y = 8.7080; z = -2.2631 }, (* N3 *) + { x = 10.4471; y = 9.7876; z = -1.9791 }, (* C2 *) + { x = 8.7271; y = 8.5575; z = -1.3991 }, (* C4 *) + { x = 8.4100; y = 9.3803; z = -0.3580 }, (* C5 *) + { x = 9.2294; y = 10.5030; z = -0.1574 }, (* C6 *) + (G ( + { x = 11.5110; y = 10.1256; z = -2.7114 }, (* N2 *) + { x = 7.2891; y = 8.9068; z = 0.3121 }, (* N7 *) + { x = 7.7962; y = 7.5519; z = -1.3859 }, (* N9 *) + { x = 6.9702; y = 7.8292; z = -0.3353 }, (* C8 *) + { x = 9.0349; y = 11.3951; z = 0.8250 }, (* O6 *) + { x = 10.9013; y = 11.4422; z = -0.9512 }, (* H1 *) + { x = 12.1031; y = 10.9341; z = -2.5861 }, (* H21 *) + { x = 11.7369; y = 9.5180; z = -3.4859 }, (* H22 *) + { x = 6.0888; y = 7.3990; z = 0.1403 }) (* H8 *) + ) + ) + +let rG06 + = N( + { a= -0.9815; b=0.0731; c= -0.1772; (* dgf_base_tfo *) + d=0.1912; e=0.3054; f= -0.9328; + g= -0.0141; h= -0.9494; i= -0.3137; + tx=5.7506; ty= -5.1944; tz=4.7470 }, + { a= -0.8143; b= -0.5091; c= -0.2788; (* P_O3'_275_tfo *) + d= -0.0433; e= -0.4257; f=0.9038; + g= -0.5788; h=0.7480; i=0.3246; + tx=1.5227; ty=6.9114; tz= -7.0765 }, + { a=0.3822; b= -0.7477; c=0.5430; (* P_O3'_180_tfo *) + d=0.4552; e=0.6637; f=0.5935; + g= -0.8042; h=0.0203; i=0.5941; + tx= -6.9472; ty= -4.1186; tz= -5.9108 }, + { a=0.5640; b=0.8007; c= -0.2022; (* P_O3'_60_tfo *) + d= -0.8247; e=0.5587; f= -0.0878; + g=0.0426; h=0.2162; i=0.9754; + tx=6.2694; ty= -7.0540; tz=3.3316 }, + { x = 2.8930; y = 8.5380; z = -3.3280 }, (* P *) + { x = 1.6980; y = 7.6960; z = -3.5570 }, (* O1P *) + { x = 3.2260; y = 9.5010; z = -4.4020 }, (* O2P *) + { x = 4.1590; y = 7.6040; z = -3.0340 }, (* O5' *) + { x = 4.1214; y = 6.7116; z = -1.9049 }, (* C5' *) + { x = 3.3465; y = 5.9610; z = -2.0607 }, (* H5' *) + { x = 4.0789; y = 7.2928; z = -0.9837 }, (* H5'' *) + { x = 5.4170; y = 5.9293; z = -1.8186 }, (* C4' *) + { x = 5.4506; y = 5.3400; z = -0.9023 }, (* H4' *) + { x = 5.5067; y = 5.0417; z = -2.9703 }, (* O4' *) + { x = 6.8650; y = 4.9152; z = -3.3612 }, (* C1' *) + { x = 7.1090; y = 3.8577; z = -3.2603 }, (* H1' *) + { x = 7.7152; y = 5.7282; z = -2.3894 }, (* C2' *) + { x = 8.5029; y = 6.2356; z = -2.9463 }, (* H2'' *) + { x = 8.1036; y = 4.8568; z = -1.3419 }, (* O2' *) + { x = 8.3270; y = 3.9651; z = -1.6184 }, (* H2' *) + { x = 6.7003; y = 6.7565; z = -1.8911 }, (* C3' *) + { x = 6.5898; y = 7.5329; z = -2.6482 }, (* H3' *) + { x = 7.0505; y = 7.2878; z = -0.6105 }, (* O3' *) + { x = 6.6624; y = 3.5061; z = -8.2986 }, (* N1 *) + { x = 6.5810; y = 3.2570; z = -5.9221 }, (* N3 *) + { x = 6.5151; y = 2.8263; z = -7.1625 }, (* C2 *) + { x = 6.8364; y = 4.5817; z = -5.8882 }, (* C4 *) + { x = 7.0116; y = 5.4064; z = -6.9609 }, (* C5 *) + { x = 6.9173; y = 4.8260; z = -8.2361 }, (* C6 *) + (G ( + { x = 6.2717; y = 1.5402; z = -7.4250 }, (* N2 *) + { x = 7.2573; y = 6.7070; z = -6.5394 }, (* N7 *) + { x = 6.9740; y = 5.3703; z = -4.7760 }, (* N9 *) + { x = 7.2238; y = 6.6275; z = -5.2453 }, (* C8 *) + { x = 7.0668; y = 5.5163; z = -9.3763 }, (* O6 *) + { x = 6.5754; y = 2.9964; z = -9.1545 }, (* H1 *) + { x = 6.1908; y = 1.1105; z = -8.3354 }, (* H21 *) + { x = 6.1346; y = 0.9352; z = -6.6280 }, (* H22 *) + { x = 7.4108; y = 7.6227; z = -4.8418 }) (* H8 *) + ) + ) + +let rG07 + = N( + { a=0.0894; b= -0.6059; c=0.7905; (* dgf_base_tfo *) + d= -0.6810; e=0.5420; f=0.4924; + g= -0.7268; h= -0.5824; i= -0.3642; + tx=34.1424; ty=45.9610; tz= -11.8600 }, + { a= -0.8644; b= -0.4956; c= -0.0851; (* P_O3'_275_tfo *) + d= -0.0427; e=0.2409; f= -0.9696; + g=0.5010; h= -0.8345; i= -0.2294; + tx=4.0167; ty=54.5377; tz=12.4779 }, + { a=0.3706; b= -0.6167; c=0.6945; (* P_O3'_180_tfo *) + d= -0.2867; e= -0.7872; f= -0.5460; + g=0.8834; h=0.0032; i= -0.4686; + tx= -52.9020; ty=18.6313; tz= -0.6709 }, + { a=0.4155; b=0.9025; c= -0.1137; (* P_O3'_60_tfo *) + d=0.9040; e= -0.4236; f= -0.0582; + g= -0.1007; h= -0.0786; i= -0.9918; + tx= -7.6624; ty= -25.2080; tz=49.5181 }, + { x = 31.3810; y = 0.1400; z = 47.5810 }, (* P *) + { x = 29.9860; y = 0.6630; z = 47.6290 }, (* O1P *) + { x = 31.7210; y = -0.6460; z = 48.8090 }, (* O2P *) + { x = 32.4940; y = 1.2540; z = 47.2740 }, (* O5' *) + { x = 33.8709; y = 0.7918; z = 47.2113 }, (* C5' *) + { x = 34.1386; y = 0.5870; z = 46.1747 }, (* H5' *) + { x = 34.0186; y = -0.0095; z = 47.9353 }, (* H5'' *) + { x = 34.7297; y = 1.9687; z = 47.6685 }, (* C4' *) + { x = 35.7723; y = 1.6845; z = 47.8113 }, (* H4' *) + { x = 34.6455; y = 2.9768; z = 46.6660 }, (* O4' *) + { x = 34.1690; y = 4.1829; z = 47.2627 }, (* C1' *) + { x = 35.0437; y = 4.7633; z = 47.5560 }, (* H1' *) + { x = 33.4145; y = 3.7532; z = 48.4954 }, (* C2' *) + { x = 32.4340; y = 3.3797; z = 48.2001 }, (* H2'' *) + { x = 33.3209; y = 4.6953; z = 49.5217 }, (* O2' *) + { x = 33.2374; y = 5.6059; z = 49.2295 }, (* H2' *) + { x = 34.2724; y = 2.5970; z = 48.9773 }, (* C3' *) + { x = 33.6373; y = 1.8935; z = 49.5157 }, (* H3' *) + { x = 35.3453; y = 3.1884; z = 49.7285 }, (* O3' *) + { x = 34.0511; y = 7.8930; z = 43.7791 }, (* N1 *) + { x = 34.9937; y = 6.3369; z = 45.3199 }, (* N3 *) + { x = 35.0882; y = 7.3126; z = 44.4200 }, (* C2 *) + { x = 33.7190; y = 5.9650; z = 45.5374 }, (* C4 *) + { x = 32.5845; y = 6.4770; z = 44.9458 }, (* C5 *) + { x = 32.7430; y = 7.5179; z = 43.9914 }, (* C6 *) + (G ( + { x = 36.3030; y = 7.7827; z = 44.1036 }, (* N2 *) + { x = 31.4499; y = 5.8335; z = 45.4368 }, (* N7 *) + { x = 33.2760; y = 4.9817; z = 46.4043 }, (* N9 *) + { x = 31.9235; y = 4.9639; z = 46.2934 }, (* C8 *) + { x = 31.8602; y = 8.1000; z = 43.3695 }, (* O6 *) + { x = 34.2623; y = 8.6223; z = 43.1283 }, (* H1 *) + { x = 36.5188; y = 8.5081; z = 43.4347 }, (* H21 *) + { x = 37.0888; y = 7.3524; z = 44.5699 }, (* H22 *) + { x = 31.0815; y = 4.4201; z = 46.7218 }) (* H8 *) + ) + ) + +let rG08 + = N( + { a=0.2224; b=0.6335; c=0.7411; (* dgf_base_tfo *) + d= -0.3644; e= -0.6510; f=0.6659; + g=0.9043; h= -0.4181; i=0.0861; + tx= -47.6824; ty= -0.5823; tz= -31.7554 }, + { a= -0.8644; b= -0.4956; c= -0.0851; (* P_O3'_275_tfo *) + d= -0.0427; e=0.2409; f= -0.9696; + g=0.5010; h= -0.8345; i= -0.2294; + tx=4.0167; ty=54.5377; tz=12.4779 }, + { a=0.3706; b= -0.6167; c=0.6945; (* P_O3'_180_tfo *) + d= -0.2867; e= -0.7872; f= -0.5460; + g=0.8834; h=0.0032; i= -0.4686; + tx= -52.9020; ty=18.6313; tz= -0.6709 }, + { a=0.4155; b=0.9025; c= -0.1137; (* P_O3'_60_tfo *) + d=0.9040; e= -0.4236; f= -0.0582; + g= -0.1007; h= -0.0786; i= -0.9918; + tx= -7.6624; ty= -25.2080; tz=49.5181 }, + { x = 31.3810; y = 0.1400; z = 47.5810 }, (* P *) + { x = 29.9860; y = 0.6630; z = 47.6290 }, (* O1P *) + { x = 31.7210; y = -0.6460; z = 48.8090 }, (* O2P *) + { x = 32.4940; y = 1.2540; z = 47.2740 }, (* O5' *) + { x = 32.5924; y = 2.3488; z = 48.2255 }, (* C5' *) + { x = 33.3674; y = 2.1246; z = 48.9584 }, (* H5' *) + { x = 31.5994; y = 2.5917; z = 48.6037 }, (* H5'' *) + { x = 33.0722; y = 3.5577; z = 47.4258 }, (* C4' *) + { x = 33.0310; y = 4.4778; z = 48.0089 }, (* H4' *) + { x = 34.4173; y = 3.3055; z = 47.0316 }, (* O4' *) + { x = 34.5056; y = 3.3910; z = 45.6094 }, (* C1' *) + { x = 34.7881; y = 4.4152; z = 45.3663 }, (* H1' *) + { x = 33.1122; y = 3.1198; z = 45.1010 }, (* C2' *) + { x = 32.9230; y = 2.0469; z = 45.1369 }, (* H2'' *) + { x = 32.7946; y = 3.6590; z = 43.8529 }, (* O2' *) + { x = 33.5170; y = 3.6707; z = 43.2207 }, (* H2' *) + { x = 32.2730; y = 3.8173; z = 46.1566 }, (* C3' *) + { x = 31.3094; y = 3.3123; z = 46.2244 }, (* H3' *) + { x = 32.2391; y = 5.2039; z = 45.7807 }, (* O3' *) + { x = 39.3337; y = 2.7157; z = 44.1441 }, (* N1 *) + { x = 37.4430; y = 3.8242; z = 45.0824 }, (* N3 *) + { x = 38.7276; y = 3.7646; z = 44.7403 }, (* C2 *) + { x = 36.7791; y = 2.6963; z = 44.7704 }, (* C4 *) + { x = 37.2860; y = 1.5653; z = 44.1678 }, (* C5 *) + { x = 38.6647; y = 1.5552; z = 43.8235 }, (* C6 *) + (G ( + { x = 39.5123; y = 4.8216; z = 44.9936 }, (* N2 *) + { x = 36.2829; y = 0.6110; z = 44.0078 }, (* N7 *) + { x = 35.4394; y = 2.4314; z = 44.9931 }, (* N9 *) + { x = 35.2180; y = 1.1815; z = 44.5128 }, (* C8 *) + { x = 39.2907; y = 0.6514; z = 43.2796 }, (* O6 *) + { x = 40.3076; y = 2.8048; z = 43.9352 }, (* H1 *) + { x = 40.4994; y = 4.9066; z = 44.7977 }, (* H21 *) + { x = 39.0738; y = 5.6108; z = 45.4464 }, (* H22 *) + { x = 34.3856; y = 0.4842; z = 44.4185 }) (* H8 *) + ) + ) + +let rG09 + = N( + { a= -0.9699; b= -0.1688; c= -0.1753; (* dgf_base_tfo *) + d= -0.1050; e= -0.3598; f=0.9271; + g= -0.2196; h=0.9176; i=0.3312; + tx=45.6217; ty= -38.9484; tz= -12.3208 }, + { a= -0.8644; b= -0.4956; c= -0.0851; (* P_O3'_275_tfo *) + d= -0.0427; e=0.2409; f= -0.9696; + g=0.5010; h= -0.8345; i= -0.2294; + tx=4.0167; ty=54.5377; tz=12.4779 }, + { a=0.3706; b= -0.6167; c=0.6945; (* P_O3'_180_tfo *) + d= -0.2867; e= -0.7872; f= -0.5460; + g=0.8834; h=0.0032; i= -0.4686; + tx= -52.9020; ty=18.6313; tz= -0.6709 }, + { a=0.4155; b=0.9025; c= -0.1137; (* P_O3'_60_tfo *) + d=0.9040; e= -0.4236; f= -0.0582; + g= -0.1007; h= -0.0786; i= -0.9918; + tx= -7.6624; ty= -25.2080; tz=49.5181 }, + { x = 31.3810; y = 0.1400; z = 47.5810 }, (* P *) + { x = 29.9860; y = 0.6630; z = 47.6290 }, (* O1P *) + { x = 31.7210; y = -0.6460; z = 48.8090 }, (* O2P *) + { x = 32.4940; y = 1.2540; z = 47.2740 }, (* O5' *) + { x = 33.8709; y = 0.7918; z = 47.2113 }, (* C5' *) + { x = 34.1386; y = 0.5870; z = 46.1747 }, (* H5' *) + { x = 34.0186; y = -0.0095; z = 47.9353 }, (* H5'' *) + { x = 34.7297; y = 1.9687; z = 47.6685 }, (* C4' *) + { x = 34.5880; y = 2.8482; z = 47.0404 }, (* H4' *) + { x = 34.3575; y = 2.2770; z = 49.0081 }, (* O4' *) + { x = 35.5157; y = 2.1993; z = 49.8389 }, (* C1' *) + { x = 35.9424; y = 3.2010; z = 49.8893 }, (* H1' *) + { x = 36.4701; y = 1.2820; z = 49.1169 }, (* C2' *) + { x = 36.1545; y = 0.2498; z = 49.2683 }, (* H2'' *) + { x = 37.8262; y = 1.4547; z = 49.4008 }, (* O2' *) + { x = 38.0227; y = 1.6945; z = 50.3094 }, (* H2' *) + { x = 36.2242; y = 1.6797; z = 47.6725 }, (* C3' *) + { x = 36.4297; y = 0.8197; z = 47.0351 }, (* H3' *) + { x = 37.0289; y = 2.8480; z = 47.4426 }, (* O3' *) + { x = 34.3005; y = 3.5042; z = 54.6070 }, (* N1 *) + { x = 34.7693; y = 3.7936; z = 52.2874 }, (* N3 *) + { x = 34.4484; y = 4.2541; z = 53.4939 }, (* C2 *) + { x = 34.9354; y = 2.4584; z = 52.2785 }, (* C4 *) + { x = 34.8092; y = 1.5915; z = 53.3422 }, (* C5 *) + { x = 34.4646; y = 2.1367; z = 54.6085 }, (* C6 *) + (G ( + { x = 34.2514; y = 5.5708; z = 53.6503 }, (* N2 *) + { x = 35.0641; y = 0.2835; z = 52.9337 }, (* N7 *) + { x = 35.2669; y = 1.6690; z = 51.1915 }, (* N9 *) + { x = 35.3288; y = 0.3954; z = 51.6563 }, (* C8 *) + { x = 34.3151; y = 1.5317; z = 55.6650 }, (* O6 *) + { x = 34.0623; y = 3.9797; z = 55.4539 }, (* H1 *) + { x = 33.9950; y = 6.0502; z = 54.5016 }, (* H21 *) + { x = 34.3512; y = 6.1432; z = 52.8242 }, (* H22 *) + { x = 35.5414; y = -0.6006; z = 51.2679 }) (* H8 *) + ) + ) + +let rG10 + = N( + { a= -0.0980; b= -0.9723; c=0.2122; (* dgf_base_tfo *) + d= -0.9731; e=0.1383; f=0.1841; + g= -0.2083; h= -0.1885; i= -0.9597; + tx=17.8469; ty=38.8265; tz=37.0475 }, + { a= -0.8644; b= -0.4956; c= -0.0851; (* P_O3'_275_tfo *) + d= -0.0427; e=0.2409; f= -0.9696; + g=0.5010; h= -0.8345; i= -0.2294; + tx=4.0167; ty=54.5377; tz=12.4779 }, + { a=0.3706; b= -0.6167; c=0.6945; (* P_O3'_180_tfo *) + d= -0.2867; e= -0.7872; f= -0.5460; + g=0.8834; h=0.0032; i= -0.4686; + tx= -52.9020; ty=18.6313; tz= -0.6709 }, + { a=0.4155; b=0.9025; c= -0.1137; (* P_O3'_60_tfo *) + d=0.9040; e= -0.4236; f= -0.0582; + g= -0.1007; h= -0.0786; i= -0.9918; + tx= -7.6624; ty= -25.2080; tz=49.5181 }, + { x = 31.3810; y = 0.1400; z = 47.5810 }, (* P *) + { x = 29.9860; y = 0.6630; z = 47.6290 }, (* O1P *) + { x = 31.7210; y = -0.6460; z = 48.8090 }, (* O2P *) + { x = 32.4940; y = 1.2540; z = 47.2740 }, (* O5' *) + { x = 32.5924; y = 2.3488; z = 48.2255 }, (* C5' *) + { x = 33.3674; y = 2.1246; z = 48.9584 }, (* H5' *) + { x = 31.5994; y = 2.5917; z = 48.6037 }, (* H5'' *) + { x = 33.0722; y = 3.5577; z = 47.4258 }, (* C4' *) + { x = 34.0333; y = 3.3761; z = 46.9447 }, (* H4' *) + { x = 32.0890; y = 3.8338; z = 46.4332 }, (* O4' *) + { x = 31.6377; y = 5.1787; z = 46.5914 }, (* C1' *) + { x = 32.2499; y = 5.8016; z = 45.9392 }, (* H1' *) + { x = 31.9167; y = 5.5319; z = 48.0305 }, (* C2' *) + { x = 31.1507; y = 5.0820; z = 48.6621 }, (* H2'' *) + { x = 32.0865; y = 6.8890; z = 48.3114 }, (* O2' *) + { x = 31.5363; y = 7.4819; z = 47.7942 }, (* H2' *) + { x = 33.2398; y = 4.8224; z = 48.2563 }, (* C3' *) + { x = 33.3166; y = 4.5570; z = 49.3108 }, (* H3' *) + { x = 34.2528; y = 5.7056; z = 47.7476 }, (* O3' *) + { x = 28.2782; y = 6.3049; z = 42.9364 }, (* N1 *) + { x = 30.4001; y = 5.8547; z = 43.9258 }, (* N3 *) + { x = 29.6195; y = 6.1568; z = 42.8913 }, (* C2 *) + { x = 29.7005; y = 5.7006; z = 45.0649 }, (* C4 *) + { x = 28.3383; y = 5.8221; z = 45.2343 }, (* C5 *) + { x = 27.5519; y = 6.1461; z = 44.0958 }, (* C6 *) + (G ( + { x = 30.1838; y = 6.3385; z = 41.6890 }, (* N2 *) + { x = 27.9936; y = 5.5926; z = 46.5651 }, (* N7 *) + { x = 30.2046; y = 5.3825; z = 46.3136 }, (* N9 *) + { x = 29.1371; y = 5.3398; z = 47.1506 }, (* C8 *) + { x = 26.3361; y = 6.3024; z = 44.0495 }, (* O6 *) + { x = 27.8122; y = 6.5394; z = 42.0833 }, (* H1 *) + { x = 29.7125; y = 6.5595; z = 40.8235 }, (* H21 *) + { x = 31.1859; y = 6.2231; z = 41.6389 }, (* H22 *) + { x = 28.9406; y = 5.1504; z = 48.2059 }) (* H8 *) + ) + ) + +let rGs = [rG01;rG02;rG03;rG04;rG05;rG06;rG07;rG08;rG09;rG10] + +let rU + = N( + { a= -0.0359; b= -0.8071; c=0.5894; (* dgf_base_tfo *) + d= -0.2669; e=0.5761; f=0.7726; + g= -0.9631; h= -0.1296; i= -0.2361; + tx=0.1584; ty=8.3434; tz=0.5434 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2430; y = -8.2420; z = 2.8260 }, (* C5' *) + { x = 5.1974; y = -8.8497; z = 1.9223 }, (* H5' *) + { x = 5.5548; y = -8.7348; z = 3.7469 }, (* H5'' *) + { x = 6.3140; y = -7.2060; z = 2.5510 }, (* C4' *) + { x = 7.2954; y = -7.6762; z = 2.4898 }, (* H4' *) + { x = 6.0140; y = -6.5420; z = 1.2890 }, (* O4' *) + { x = 6.4190; y = -5.1840; z = 1.3620 }, (* C1' *) + { x = 7.1608; y = -5.0495; z = 0.5747 }, (* H1' *) + { x = 7.0760; y = -4.9560; z = 2.7270 }, (* C2' *) + { x = 6.7770; y = -3.9803; z = 3.1099 }, (* H2'' *) + { x = 8.4500; y = -5.1930; z = 2.5810 }, (* O2' *) + { x = 8.8309; y = -4.8755; z = 1.7590 }, (* H2' *) + { x = 6.4060; y = -6.0590; z = 3.5580 }, (* C3' *) + { x = 5.4021; y = -5.7313; z = 3.8281 }, (* H3' *) + { x = 7.1570; y = -6.4240; z = 4.7070 }, (* O3' *) + { x = 5.2170; y = -4.3260; z = 1.1690 }, (* N1 *) + { x = 4.2960; y = -2.2560; z = 0.6290 }, (* N3 *) + { x = 5.4330; y = -3.0200; z = 0.7990 }, (* C2 *) + { x = 2.9930; y = -2.6780; z = 0.7940 }, (* C4 *) + { x = 2.8670; y = -4.0630; z = 1.1830 }, (* C5 *) + { x = 3.9570; y = -4.8300; z = 1.3550 }, (* C6 *) + (U ( + { x = 6.5470; y = -2.5560; z = 0.6290 }, (* O2 *) + { x = 2.0540; y = -1.9000; z = 0.6130 }, (* O4 *) + { x = 4.4300; y = -1.3020; z = 0.3600 }, (* H3 *) + { x = 1.9590; y = -4.4570; z = 1.3250 }, (* H5 *) + { x = 3.8460; y = -5.7860; z = 1.6240 }) (* H6 *) + ) + ) + +let rU01 + = N( + { a= -0.0137; b= -0.8012; c=0.5983; (* dgf_base_tfo *) + d= -0.2523; e=0.5817; f=0.7733; + g= -0.9675; h= -0.1404; i= -0.2101; + tx=0.2031; ty=8.3874; tz=0.4228 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2416; y = -8.2422; z = 2.8181 }, (* C5' *) + { x = 5.2050; y = -8.8128; z = 1.8901 }, (* H5' *) + { x = 5.5368; y = -8.7738; z = 3.7227 }, (* H5'' *) + { x = 6.3232; y = -7.2037; z = 2.6002 }, (* C4' *) + { x = 7.3048; y = -7.6757; z = 2.5577 }, (* H4' *) + { x = 6.0635; y = -6.5092; z = 1.3456 }, (* O4' *) + { x = 6.4697; y = -5.1547; z = 1.4629 }, (* C1' *) + { x = 7.2354; y = -5.0043; z = 0.7018 }, (* H1' *) + { x = 7.0856; y = -4.9610; z = 2.8521 }, (* C2' *) + { x = 6.7777; y = -3.9935; z = 3.2487 }, (* H2'' *) + { x = 8.4627; y = -5.1992; z = 2.7423 }, (* O2' *) + { x = 8.8693; y = -4.8638; z = 1.9399 }, (* H2' *) + { x = 6.3877; y = -6.0809; z = 3.6362 }, (* C3' *) + { x = 5.3770; y = -5.7562; z = 3.8834 }, (* H3' *) + { x = 7.1024; y = -6.4754; z = 4.7985 }, (* O3' *) + { x = 5.2764; y = -4.2883; z = 1.2538 }, (* N1 *) + { x = 4.3777; y = -2.2062; z = 0.7229 }, (* N3 *) + { x = 5.5069; y = -2.9779; z = 0.9088 }, (* C2 *) + { x = 3.0693; y = -2.6246; z = 0.8500 }, (* C4 *) + { x = 2.9279; y = -4.0146; z = 1.2149 }, (* C5 *) + { x = 4.0101; y = -4.7892; z = 1.4017 }, (* C6 *) + (U ( + { x = 6.6267; y = -2.5166; z = 0.7728 }, (* O2 *) + { x = 2.1383; y = -1.8396; z = 0.6581 }, (* O4 *) + { x = 4.5223; y = -1.2489; z = 0.4716 }, (* H3 *) + { x = 2.0151; y = -4.4065; z = 1.3290 }, (* H5 *) + { x = 3.8886; y = -5.7486; z = 1.6535 }) (* H6 *) + ) + ) + +let rU02 + = N( + { a=0.5141; b=0.0246; c=0.8574; (* dgf_base_tfo *) + d= -0.5547; e= -0.7529; f=0.3542; + g=0.6542; h= -0.6577; i= -0.3734; + tx= -9.1111; ty= -3.4598; tz= -3.2939 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 4.3825; y = -6.6585; z = 4.0489 }, (* C5' *) + { x = 4.6841; y = -7.2019; z = 4.9443 }, (* H5' *) + { x = 3.6189; y = -5.8889; z = 4.1625 }, (* H5'' *) + { x = 5.6255; y = -5.9175; z = 3.5998 }, (* C4' *) + { x = 5.8732; y = -5.1228; z = 4.3034 }, (* H4' *) + { x = 6.7337; y = -6.8605; z = 3.5222 }, (* O4' *) + { x = 7.5932; y = -6.4923; z = 2.4548 }, (* C1' *) + { x = 8.5661; y = -6.2983; z = 2.9064 }, (* H1' *) + { x = 7.0527; y = -5.2012; z = 1.8322 }, (* C2' *) + { x = 7.1627; y = -5.2525; z = 0.7490 }, (* H2'' *) + { x = 7.6666; y = -4.1249; z = 2.4880 }, (* O2' *) + { x = 8.5944; y = -4.2543; z = 2.6981 }, (* H2' *) + { x = 5.5661; y = -5.3029; z = 2.2009 }, (* C3' *) + { x = 5.0841; y = -6.0018; z = 1.5172 }, (* H3' *) + { x = 4.9062; y = -4.0452; z = 2.2042 }, (* O3' *) + { x = 7.6298; y = -7.6136; z = 1.4752 }, (* N1 *) + { x = 8.6945; y = -8.7046; z = -0.2857 }, (* N3 *) + { x = 8.6943; y = -7.6514; z = 0.6066 }, (* C2 *) + { x = 7.7426; y = -9.6987; z = -0.3801 }, (* C4 *) + { x = 6.6642; y = -9.5742; z = 0.5722 }, (* C5 *) + { x = 6.6391; y = -8.5592; z = 1.4526 }, (* C6 *) + (U ( + { x = 9.5840; y = -6.8186; z = 0.6136 }, (* O2 *) + { x = 7.8505; y = -10.5925; z = -1.2223 }, (* O4 *) + { x = 9.4601; y = -8.7514; z = -0.9277 }, (* H3 *) + { x = 5.9281; y = -10.2509; z = 0.5782 }, (* H5 *) + { x = 5.8831; y = -8.4931; z = 2.1028 }) (* H6 *) + ) + ) + +let rU03 + = N( + { a= -0.4993; b=0.0476; c=0.8651; (* dgf_base_tfo *) + d=0.8078; e= -0.3353; f=0.4847; + g=0.3132; h=0.9409; i=0.1290; + tx=6.2989; ty= -5.2303; tz= -3.8577 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 3.9938; y = -6.7042; z = 1.9023 }, (* C5' *) + { x = 3.2332; y = -5.9343; z = 2.0319 }, (* H5' *) + { x = 3.9666; y = -7.2863; z = 0.9812 }, (* H5'' *) + { x = 5.3098; y = -5.9546; z = 1.8564 }, (* C4' *) + { x = 5.3863; y = -5.3702; z = 0.9395 }, (* H4' *) + { x = 5.3851; y = -5.0642; z = 3.0076 }, (* O4' *) + { x = 6.7315; y = -4.9724; z = 3.4462 }, (* C1' *) + { x = 7.0033; y = -3.9202; z = 3.3619 }, (* H1' *) + { x = 7.5997; y = -5.8018; z = 2.4948 }, (* C2' *) + { x = 8.3627; y = -6.3254; z = 3.0707 }, (* H2'' *) + { x = 8.0410; y = -4.9501; z = 1.4724 }, (* O2' *) + { x = 8.2781; y = -4.0644; z = 1.7570 }, (* H2' *) + { x = 6.5701; y = -6.8129; z = 1.9714 }, (* C3' *) + { x = 6.4186; y = -7.5809; z = 2.7299 }, (* H3' *) + { x = 6.9357; y = -7.3841; z = 0.7235 }, (* O3' *) + { x = 6.8024; y = -5.4718; z = 4.8475 }, (* N1 *) + { x = 7.9218; y = -5.5700; z = 6.8877 }, (* N3 *) + { x = 7.8908; y = -5.0886; z = 5.5944 }, (* C2 *) + { x = 6.9789; y = -6.3827; z = 7.4823 }, (* C4 *) + { x = 5.8742; y = -6.7319; z = 6.6202 }, (* C5 *) + { x = 5.8182; y = -6.2769; z = 5.3570 }, (* C6 *) + (U ( + { x = 8.7747; y = -4.3728; z = 5.1568 }, (* O2 *) + { x = 7.1154; y = -6.7509; z = 8.6509 }, (* O4 *) + { x = 8.7055; y = -5.3037; z = 7.4491 }, (* H3 *) + { x = 5.1416; y = -7.3178; z = 6.9665 }, (* H5 *) + { x = 5.0441; y = -6.5310; z = 4.7784 }) (* H6 *) + ) + ) + +let rU04 + = N( + { a= -0.5669; b= -0.8012; c=0.1918; (* dgf_base_tfo *) + d= -0.8129; e=0.5817; f=0.0273; + g= -0.1334; h= -0.1404; i= -0.9811; + tx= -0.3279; ty=8.3874; tz=0.3355 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2416; y = -8.2422; z = 2.8181 }, (* C5' *) + { x = 5.2050; y = -8.8128; z = 1.8901 }, (* H5' *) + { x = 5.5368; y = -8.7738; z = 3.7227 }, (* H5'' *) + { x = 6.3232; y = -7.2037; z = 2.6002 }, (* C4' *) + { x = 7.3048; y = -7.6757; z = 2.5577 }, (* H4' *) + { x = 6.0635; y = -6.5092; z = 1.3456 }, (* O4' *) + { x = 6.4697; y = -5.1547; z = 1.4629 }, (* C1' *) + { x = 7.2354; y = -5.0043; z = 0.7018 }, (* H1' *) + { x = 7.0856; y = -4.9610; z = 2.8521 }, (* C2' *) + { x = 6.7777; y = -3.9935; z = 3.2487 }, (* H2'' *) + { x = 8.4627; y = -5.1992; z = 2.7423 }, (* O2' *) + { x = 8.8693; y = -4.8638; z = 1.9399 }, (* H2' *) + { x = 6.3877; y = -6.0809; z = 3.6362 }, (* C3' *) + { x = 5.3770; y = -5.7562; z = 3.8834 }, (* H3' *) + { x = 7.1024; y = -6.4754; z = 4.7985 }, (* O3' *) + { x = 5.2764; y = -4.2883; z = 1.2538 }, (* N1 *) + { x = 3.8961; y = -3.0896; z = -0.1893 }, (* N3 *) + { x = 5.0095; y = -3.8907; z = -0.0346 }, (* C2 *) + { x = 3.0480; y = -2.6632; z = 0.8116 }, (* C4 *) + { x = 3.4093; y = -3.1310; z = 2.1292 }, (* C5 *) + { x = 4.4878; y = -3.9124; z = 2.3088 }, (* C6 *) + (U ( + { x = 5.7005; y = -4.2164; z = -0.9842 }, (* O2 *) + { x = 2.0800; y = -1.9458; z = 0.5503 }, (* O4 *) + { x = 3.6834; y = -2.7882; z = -1.1190 }, (* H3 *) + { x = 2.8508; y = -2.8721; z = 2.9172 }, (* H5 *) + { x = 4.7188; y = -4.2247; z = 3.2295 }) (* H6 *) + ) + ) + +let rU05 + = N( + { a= -0.6298; b=0.0246; c=0.7763; (* dgf_base_tfo *) + d= -0.5226; e= -0.7529; f= -0.4001; + g=0.5746; h= -0.6577; i=0.4870; + tx= -0.0208; ty= -3.4598; tz= -9.6882 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 4.3825; y = -6.6585; z = 4.0489 }, (* C5' *) + { x = 4.6841; y = -7.2019; z = 4.9443 }, (* H5' *) + { x = 3.6189; y = -5.8889; z = 4.1625 }, (* H5'' *) + { x = 5.6255; y = -5.9175; z = 3.5998 }, (* C4' *) + { x = 5.8732; y = -5.1228; z = 4.3034 }, (* H4' *) + { x = 6.7337; y = -6.8605; z = 3.5222 }, (* O4' *) + { x = 7.5932; y = -6.4923; z = 2.4548 }, (* C1' *) + { x = 8.5661; y = -6.2983; z = 2.9064 }, (* H1' *) + { x = 7.0527; y = -5.2012; z = 1.8322 }, (* C2' *) + { x = 7.1627; y = -5.2525; z = 0.7490 }, (* H2'' *) + { x = 7.6666; y = -4.1249; z = 2.4880 }, (* O2' *) + { x = 8.5944; y = -4.2543; z = 2.6981 }, (* H2' *) + { x = 5.5661; y = -5.3029; z = 2.2009 }, (* C3' *) + { x = 5.0841; y = -6.0018; z = 1.5172 }, (* H3' *) + { x = 4.9062; y = -4.0452; z = 2.2042 }, (* O3' *) + { x = 7.6298; y = -7.6136; z = 1.4752 }, (* N1 *) + { x = 8.5977; y = -9.5977; z = 0.7329 }, (* N3 *) + { x = 8.5951; y = -8.5745; z = 1.6594 }, (* C2 *) + { x = 7.7372; y = -9.7371; z = -0.3364 }, (* C4 *) + { x = 6.7596; y = -8.6801; z = -0.4476 }, (* C5 *) + { x = 6.7338; y = -7.6721; z = 0.4408 }, (* C6 *) + (U ( + { x = 9.3993; y = -8.5377; z = 2.5743 }, (* O2 *) + { x = 7.8374; y = -10.6990; z = -1.1008 }, (* O4 *) + { x = 9.2924; y = -10.3081; z = 0.8477 }, (* H3 *) + { x = 6.0932; y = -8.6982; z = -1.1929 }, (* H5 *) + { x = 6.0481; y = -6.9515; z = 0.3446 }) (* H6 *) + ) + ) + +let rU06 + = N( + { a= -0.9837; b=0.0476; c= -0.1733; (* dgf_base_tfo *) + d= -0.1792; e= -0.3353; f=0.9249; + g= -0.0141; h=0.9409; i=0.3384; + tx=5.7793; ty= -5.2303; tz=4.5997 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 3.9938; y = -6.7042; z = 1.9023 }, (* C5' *) + { x = 3.2332; y = -5.9343; z = 2.0319 }, (* H5' *) + { x = 3.9666; y = -7.2863; z = 0.9812 }, (* H5'' *) + { x = 5.3098; y = -5.9546; z = 1.8564 }, (* C4' *) + { x = 5.3863; y = -5.3702; z = 0.9395 }, (* H4' *) + { x = 5.3851; y = -5.0642; z = 3.0076 }, (* O4' *) + { x = 6.7315; y = -4.9724; z = 3.4462 }, (* C1' *) + { x = 7.0033; y = -3.9202; z = 3.3619 }, (* H1' *) + { x = 7.5997; y = -5.8018; z = 2.4948 }, (* C2' *) + { x = 8.3627; y = -6.3254; z = 3.0707 }, (* H2'' *) + { x = 8.0410; y = -4.9501; z = 1.4724 }, (* O2' *) + { x = 8.2781; y = -4.0644; z = 1.7570 }, (* H2' *) + { x = 6.5701; y = -6.8129; z = 1.9714 }, (* C3' *) + { x = 6.4186; y = -7.5809; z = 2.7299 }, (* H3' *) + { x = 6.9357; y = -7.3841; z = 0.7235 }, (* O3' *) + { x = 6.8024; y = -5.4718; z = 4.8475 }, (* N1 *) + { x = 6.6920; y = -5.0495; z = 7.1354 }, (* N3 *) + { x = 6.6201; y = -4.5500; z = 5.8506 }, (* C2 *) + { x = 6.9254; y = -6.3614; z = 7.4926 }, (* C4 *) + { x = 7.1046; y = -7.2543; z = 6.3718 }, (* C5 *) + { x = 7.0391; y = -6.7951; z = 5.1106 }, (* C6 *) + (U ( + { x = 6.4083; y = -3.3696; z = 5.6340 }, (* O2 *) + { x = 6.9679; y = -6.6901; z = 8.6800 }, (* O4 *) + { x = 6.5626; y = -4.3957; z = 7.8812 }, (* H3 *) + { x = 7.2781; y = -8.2254; z = 6.5350 }, (* H5 *) + { x = 7.1657; y = -7.4312; z = 4.3503 }) (* H6 *) + ) + ) + +let rU07 + = N( + { a= -0.9434; b=0.3172; c=0.0971; (* dgf_base_tfo *) + d=0.2294; e=0.4125; f=0.8816; + g=0.2396; h=0.8539; i= -0.4619; + tx=8.3625; ty= -52.7147; tz=1.3745 }, + { a=0.2765; b= -0.1121; c= -0.9545; (* P_O3'_275_tfo *) + d= -0.8297; e=0.4733; f= -0.2959; + g=0.4850; h=0.8737; i=0.0379; + tx= -14.7774; ty= -45.2464; tz=21.9088 }, + { a=0.1063; b= -0.6334; c= -0.7665; (* P_O3'_180_tfo *) + d= -0.5932; e= -0.6591; f=0.4624; + g= -0.7980; h=0.4055; i= -0.4458; + tx=43.7634; ty=4.3296; tz=28.4890 }, + { a=0.7136; b= -0.5032; c= -0.4873; (* P_O3'_60_tfo *) + d=0.6803; e=0.3317; f=0.6536; + g= -0.1673; h= -0.7979; i=0.5791; + tx= -17.1858; ty=41.4390; tz= -27.0751 }, + { x = 21.3880; y = 15.0780; z = 45.5770 }, (* P *) + { x = 21.9980; y = 14.5500; z = 46.8210 }, (* O1P *) + { x = 21.1450; y = 14.0270; z = 44.5420 }, (* O2P *) + { x = 22.1250; y = 16.3600; z = 44.9460 }, (* O5' *) + { x = 21.5037; y = 16.8594; z = 43.7323 }, (* C5' *) + { x = 20.8147; y = 17.6663; z = 43.9823 }, (* H5' *) + { x = 21.1086; y = 16.0230; z = 43.1557 }, (* H5'' *) + { x = 22.5654; y = 17.4874; z = 42.8616 }, (* C4' *) + { x = 22.1584; y = 17.7243; z = 41.8785 }, (* H4' *) + { x = 23.0557; y = 18.6826; z = 43.4751 }, (* O4' *) + { x = 24.4788; y = 18.6151; z = 43.6455 }, (* C1' *) + { x = 24.9355; y = 19.0840; z = 42.7739 }, (* H1' *) + { x = 24.7958; y = 17.1427; z = 43.6474 }, (* C2' *) + { x = 24.5652; y = 16.7400; z = 44.6336 }, (* H2'' *) + { x = 26.1041; y = 16.8773; z = 43.2455 }, (* O2' *) + { x = 26.7516; y = 17.5328; z = 43.5149 }, (* H2' *) + { x = 23.8109; y = 16.5979; z = 42.6377 }, (* C3' *) + { x = 23.5756; y = 15.5686; z = 42.9084 }, (* H3' *) + { x = 24.2890; y = 16.7447; z = 41.2729 }, (* O3' *) + { x = 24.9420; y = 19.2174; z = 44.8923 }, (* N1 *) + { x = 25.2655; y = 20.5636; z = 44.8883 }, (* N3 *) + { x = 25.1663; y = 21.2219; z = 43.8561 }, (* C2 *) + { x = 25.6911; y = 21.1219; z = 46.0494 }, (* C4 *) + { x = 25.8051; y = 20.4068; z = 47.2048 }, (* C5 *) + { x = 26.2093; y = 20.9962; z = 48.2534 }, (* C6 *) + (U ( + { x = 25.4692; y = 19.0221; z = 47.2053 }, (* O2 *) + { x = 25.0502; y = 18.4827; z = 46.0370 }, (* O4 *) + { x = 25.9599; y = 22.1772; z = 46.0966 }, (* H3 *) + { x = 25.5545; y = 18.4409; z = 48.1234 }, (* H5 *) + { x = 24.7854; y = 17.4265; z = 45.9883 }) (* H6 *) + ) + ) + +let rU08 + = N( + { a= -0.0080; b= -0.7928; c=0.6094; (* dgf_base_tfo *) + d= -0.7512; e=0.4071; f=0.5197; + g= -0.6601; h= -0.4536; i= -0.5988; + tx=44.1482; ty=30.7036; tz=2.1088 }, + { a=0.2765; b= -0.1121; c= -0.9545; (* P_O3'_275_tfo *) + d= -0.8297; e=0.4733; f= -0.2959; + g=0.4850; h=0.8737; i=0.0379; + tx= -14.7774; ty= -45.2464; tz=21.9088 }, + { a=0.1063; b= -0.6334; c= -0.7665; (* P_O3'_180_tfo *) + d= -0.5932; e= -0.6591; f=0.4624; + g= -0.7980; h=0.4055; i= -0.4458; + tx=43.7634; ty=4.3296; tz=28.4890 }, + { a=0.7136; b= -0.5032; c= -0.4873; (* P_O3'_60_tfo *) + d=0.6803; e=0.3317; f=0.6536; + g= -0.1673; h= -0.7979; i=0.5791; + tx= -17.1858; ty=41.4390; tz= -27.0751 }, + { x = 21.3880; y = 15.0780; z = 45.5770 }, (* P *) + { x = 21.9980; y = 14.5500; z = 46.8210 }, (* O1P *) + { x = 21.1450; y = 14.0270; z = 44.5420 }, (* O2P *) + { x = 22.1250; y = 16.3600; z = 44.9460 }, (* O5' *) + { x = 23.5096; y = 16.1227; z = 44.5783 }, (* C5' *) + { x = 23.5649; y = 15.8588; z = 43.5222 }, (* H5' *) + { x = 23.9621; y = 15.4341; z = 45.2919 }, (* H5'' *) + { x = 24.2805; y = 17.4138; z = 44.7151 }, (* C4' *) + { x = 25.3492; y = 17.2309; z = 44.6030 }, (* H4' *) + { x = 23.8497; y = 18.3471; z = 43.7208 }, (* O4' *) + { x = 23.4090; y = 19.5681; z = 44.3321 }, (* C1' *) + { x = 24.2595; y = 20.2496; z = 44.3524 }, (* H1' *) + { x = 23.0418; y = 19.1813; z = 45.7407 }, (* C2' *) + { x = 22.0532; y = 18.7224; z = 45.7273 }, (* H2'' *) + { x = 23.1307; y = 20.2521; z = 46.6291 }, (* O2' *) + { x = 22.8888; y = 21.1051; z = 46.2611 }, (* H2' *) + { x = 24.0799; y = 18.1326; z = 46.0700 }, (* C3' *) + { x = 23.6490; y = 17.4370; z = 46.7900 }, (* H3' *) + { x = 25.3329; y = 18.7227; z = 46.5109 }, (* O3' *) + { x = 22.2515; y = 20.1624; z = 43.6698 }, (* N1 *) + { x = 22.4760; y = 21.0609; z = 42.6406 }, (* N3 *) + { x = 23.6229; y = 21.3462; z = 42.3061 }, (* C2 *) + { x = 21.3986; y = 21.6081; z = 42.0236 }, (* C4 *) + { x = 20.1189; y = 21.3012; z = 42.3804 }, (* C5 *) + { x = 19.1599; y = 21.8516; z = 41.7578 }, (* C6 *) + (U ( + { x = 19.8919; y = 20.3745; z = 43.4387 }, (* O2 *) + { x = 20.9790; y = 19.8423; z = 44.0440 }, (* O4 *) + { x = 21.5235; y = 22.3222; z = 41.2097 }, (* H3 *) + { x = 18.8732; y = 20.1200; z = 43.7312 }, (* H5 *) + { x = 20.8545; y = 19.1313; z = 44.8608 }) (* H6 *) + ) + ) + +let rU09 + = N( + { a= -0.0317; b=0.1374; c=0.9900; (* dgf_base_tfo *) + d= -0.3422; e= -0.9321; f=0.1184; + g=0.9391; h= -0.3351; i=0.0765; + tx= -32.1929; ty=25.8198; tz= -28.5088 }, + { a=0.2765; b= -0.1121; c= -0.9545; (* P_O3'_275_tfo *) + d= -0.8297; e=0.4733; f= -0.2959; + g=0.4850; h=0.8737; i=0.0379; + tx= -14.7774; ty= -45.2464; tz=21.9088 }, + { a=0.1063; b= -0.6334; c= -0.7665; (* P_O3'_180_tfo *) + d= -0.5932; e= -0.6591; f=0.4624; + g= -0.7980; h=0.4055; i= -0.4458; + tx=43.7634; ty=4.3296; tz=28.4890 }, + { a=0.7136; b= -0.5032; c= -0.4873; (* P_O3'_60_tfo *) + d=0.6803; e=0.3317; f=0.6536; + g= -0.1673; h= -0.7979; i=0.5791; + tx= -17.1858; ty=41.4390; tz= -27.0751 }, + { x = 21.3880; y = 15.0780; z = 45.5770 }, (* P *) + { x = 21.9980; y = 14.5500; z = 46.8210 }, (* O1P *) + { x = 21.1450; y = 14.0270; z = 44.5420 }, (* O2P *) + { x = 22.1250; y = 16.3600; z = 44.9460 }, (* O5' *) + { x = 21.5037; y = 16.8594; z = 43.7323 }, (* C5' *) + { x = 20.8147; y = 17.6663; z = 43.9823 }, (* H5' *) + { x = 21.1086; y = 16.0230; z = 43.1557 }, (* H5'' *) + { x = 22.5654; y = 17.4874; z = 42.8616 }, (* C4' *) + { x = 23.0565; y = 18.3036; z = 43.3915 }, (* H4' *) + { x = 23.5375; y = 16.5054; z = 42.4925 }, (* O4' *) + { x = 23.6574; y = 16.4257; z = 41.0649 }, (* C1' *) + { x = 24.4701; y = 17.0882; z = 40.7671 }, (* H1' *) + { x = 22.3525; y = 16.9643; z = 40.5396 }, (* C2' *) + { x = 21.5993; y = 16.1799; z = 40.6133 }, (* H2'' *) + { x = 22.4693; y = 17.4849; z = 39.2515 }, (* O2' *) + { x = 23.0899; y = 17.0235; z = 38.6827 }, (* H2' *) + { x = 22.0341; y = 18.0633; z = 41.5279 }, (* C3' *) + { x = 20.9509; y = 18.1709; z = 41.5846 }, (* H3' *) + { x = 22.7249; y = 19.3020; z = 41.2100 }, (* O3' *) + { x = 23.8580; y = 15.0648; z = 40.5757 }, (* N1 *) + { x = 25.1556; y = 14.5982; z = 40.4523 }, (* N3 *) + { x = 26.1047; y = 15.3210; z = 40.7448 }, (* C2 *) + { x = 25.3391; y = 13.3315; z = 40.0020 }, (* C4 *) + { x = 24.2974; y = 12.5148; z = 39.6749 }, (* C5 *) + { x = 24.5450; y = 11.3410; z = 39.2610 }, (* C6 *) + (U ( + { x = 22.9633; y = 12.9979; z = 39.8053 }, (* O2 *) + { x = 22.8009; y = 14.2648; z = 40.2524 }, (* O4 *) + { x = 26.3414; y = 12.9194; z = 39.8855 }, (* H3 *) + { x = 22.1227; y = 12.3533; z = 39.5486 }, (* H5 *) + { x = 21.7989; y = 14.6788; z = 40.3650 }) (* H6 *) + ) + ) + +let rU10 + = N( + { a= -0.9674; b=0.1021; c= -0.2318; (* dgf_base_tfo *) + d= -0.2514; e= -0.2766; f=0.9275; + g=0.0306; h=0.9555; i=0.2933; + tx=27.8571; ty= -42.1305; tz= -24.4563 }, + { a=0.2765; b= -0.1121; c= -0.9545; (* P_O3'_275_tfo *) + d= -0.8297; e=0.4733; f= -0.2959; + g=0.4850; h=0.8737; i=0.0379; + tx= -14.7774; ty= -45.2464; tz=21.9088 }, + { a=0.1063; b= -0.6334; c= -0.7665; (* P_O3'_180_tfo *) + d= -0.5932; e= -0.6591; f=0.4624; + g= -0.7980; h=0.4055; i= -0.4458; + tx=43.7634; ty=4.3296; tz=28.4890 }, + { a=0.7136; b= -0.5032; c= -0.4873; (* P_O3'_60_tfo *) + d=0.6803; e=0.3317; f=0.6536; + g= -0.1673; h= -0.7979; i=0.5791; + tx= -17.1858; ty=41.4390; tz= -27.0751 }, + { x = 21.3880; y = 15.0780; z = 45.5770 }, (* P *) + { x = 21.9980; y = 14.5500; z = 46.8210 }, (* O1P *) + { x = 21.1450; y = 14.0270; z = 44.5420 }, (* O2P *) + { x = 22.1250; y = 16.3600; z = 44.9460 }, (* O5' *) + { x = 23.5096; y = 16.1227; z = 44.5783 }, (* C5' *) + { x = 23.5649; y = 15.8588; z = 43.5222 }, (* H5' *) + { x = 23.9621; y = 15.4341; z = 45.2919 }, (* H5'' *) + { x = 24.2805; y = 17.4138; z = 44.7151 }, (* C4' *) + { x = 23.8509; y = 18.1819; z = 44.0720 }, (* H4' *) + { x = 24.2506; y = 17.8583; z = 46.0741 }, (* O4' *) + { x = 25.5830; y = 18.0320; z = 46.5775 }, (* C1' *) + { x = 25.8569; y = 19.0761; z = 46.4256 }, (* H1' *) + { x = 26.4410; y = 17.1555; z = 45.7033 }, (* C2' *) + { x = 26.3459; y = 16.1253; z = 46.0462 }, (* H2'' *) + { x = 27.7649; y = 17.5888; z = 45.6478 }, (* O2' *) + { x = 28.1004; y = 17.9719; z = 46.4616 }, (* H2' *) + { x = 25.7796; y = 17.2997; z = 44.3513 }, (* C3' *) + { x = 25.9478; y = 16.3824; z = 43.7871 }, (* H3' *) + { x = 26.2154; y = 18.4984; z = 43.6541 }, (* O3' *) + { x = 25.7321; y = 17.6281; z = 47.9726 }, (* N1 *) + { x = 25.5136; y = 18.5779; z = 48.9560 }, (* N3 *) + { x = 25.2079; y = 19.7276; z = 48.6503 }, (* C2 *) + { x = 25.6482; y = 18.1987; z = 50.2518 }, (* C4 *) + { x = 25.9847; y = 16.9266; z = 50.6092 }, (* C5 *) + { x = 26.0918; y = 16.6439; z = 51.8416 }, (* C6 *) + (U ( + { x = 26.2067; y = 15.9515; z = 49.5943 }, (* O2 *) + { x = 26.0713; y = 16.3497; z = 48.3080 }, (* O4 *) + { x = 25.4890; y = 18.9105; z = 51.0618 }, (* H3 *) + { x = 26.4742; y = 14.9310; z = 49.8682 }, (* H5 *) + { x = 26.2346; y = 15.6394; z = 47.4975 }) (* H6 *) + ) + ) + +let rUs = [rU01;rU02;rU03;rU04;rU05;rU06;rU07;rU08;rU09;rU10] + +let rG' + = N( + { a= -0.2067; b= -0.0264; c=0.9780; (* dgf_base_tfo *) + d=0.9770; e= -0.0586; f=0.2049; + g=0.0519; h=0.9979; i=0.0379; + tx=1.0331; ty= -46.8078; tz= -36.4742 }, + { a= -0.8644; b= -0.4956; c= -0.0851; (* P_O3'_275_tfo *) + d= -0.0427; e=0.2409; f= -0.9696; + g=0.5010; h= -0.8345; i= -0.2294; + tx=4.0167; ty=54.5377; tz=12.4779 }, + { a=0.3706; b= -0.6167; c=0.6945; (* P_O3'_180_tfo *) + d= -0.2867; e= -0.7872; f= -0.5460; + g=0.8834; h=0.0032; i= -0.4686; + tx= -52.9020; ty=18.6313; tz= -0.6709 }, + { a=0.4155; b=0.9025; c= -0.1137; (* P_O3'_60_tfo *) + d=0.9040; e= -0.4236; f= -0.0582; + g= -0.1007; h= -0.0786; i= -0.9918; + tx= -7.6624; ty= -25.2080; tz=49.5181 }, + { x = 31.3810; y = 0.1400; z = 47.5810 }, (* P *) + { x = 29.9860; y = 0.6630; z = 47.6290 }, (* O1P *) + { x = 31.7210; y = -0.6460; z = 48.8090 }, (* O2P *) + { x = 32.4940; y = 1.2540; z = 47.2740 }, (* O5' *) + { x = 32.1610; y = 2.2370; z = 46.2560 }, (* C5' *) + { x = 31.2986; y = 2.8190; z = 46.5812 }, (* H5' *) + { x = 32.0980; y = 1.7468; z = 45.2845 }, (* H5'' *) + { x = 33.3476; y = 3.1959; z = 46.1947 }, (* C4' *) + { x = 33.2668; y = 3.8958; z = 45.3630 }, (* H4' *) + { x = 33.3799; y = 3.9183; z = 47.4216 }, (* O4' *) + { x = 34.6515; y = 3.7222; z = 48.0398 }, (* C1' *) + { x = 35.2947; y = 4.5412; z = 47.7180 }, (* H1' *) + { x = 35.1756; y = 2.4228; z = 47.4827 }, (* C2' *) + { x = 34.6778; y = 1.5937; z = 47.9856 }, (* H2'' *) + { x = 36.5631; y = 2.2672; z = 47.4798 }, (* O2' *) + { x = 37.0163; y = 2.6579; z = 48.2305 }, (* H2' *) + { x = 34.6953; y = 2.5043; z = 46.0448 }, (* C3' *) + { x = 34.5444; y = 1.4917; z = 45.6706 }, (* H3' *) + { x = 35.6679; y = 3.3009; z = 45.3487 }, (* O3' *) + { x = 37.4804; y = 4.0914; z = 52.2559 }, (* N1 *) + { x = 36.9670; y = 4.1312; z = 49.9281 }, (* N3 *) + { x = 37.8045; y = 4.2519; z = 50.9550 }, (* C2 *) + { x = 35.7171; y = 3.8264; z = 50.3222 }, (* C4 *) + { x = 35.2668; y = 3.6420; z = 51.6115 }, (* C5 *) + { x = 36.2037; y = 3.7829; z = 52.6706 }, (* C6 *) + (G ( + { x = 39.0869; y = 4.5552; z = 50.7092 }, (* N2 *) + { x = 33.9075; y = 3.3338; z = 51.6102 }, (* N7 *) + { x = 34.6126; y = 3.6358; z = 49.5108 }, (* N9 *) + { x = 33.5805; y = 3.3442; z = 50.3425 }, (* C8 *) + { x = 35.9958; y = 3.6512; z = 53.8724 }, (* O6 *) + { x = 38.2106; y = 4.2053; z = 52.9295 }, (* H1 *) + { x = 39.8218; y = 4.6863; z = 51.3896 }, (* H21 *) + { x = 39.3420; y = 4.6857; z = 49.7407 }, (* H22 *) + { x = 32.5194; y = 3.1070; z = 50.2664 }) (* H8 *) + ) + ) + +let rU' + = N( + { a= -0.0109; b=0.5907; c=0.8068; (* dgf_base_tfo *) + d=0.2217; e= -0.7853; f=0.5780; + g=0.9751; h=0.1852; i= -0.1224; + tx= -1.4225; ty= -11.0956; tz= -2.5217 }, + { a= -0.8313; b= -0.4738; c= -0.2906; (* P_O3'_275_tfo *) + d=0.0649; e=0.4366; f= -0.8973; + g=0.5521; h= -0.7648; i= -0.3322; + tx=1.6833; ty=6.8060; tz= -7.0011 }, + { a=0.3445; b= -0.7630; c=0.5470; (* P_O3'_180_tfo *) + d= -0.4628; e= -0.6450; f= -0.6082; + g=0.8168; h= -0.0436; i= -0.5753; + tx= -6.8179; ty= -3.9778; tz= -5.9887 }, + { a=0.5855; b=0.7931; c= -0.1682; (* P_O3'_60_tfo *) + d=0.8103; e= -0.5790; f=0.0906; + g= -0.0255; h= -0.1894; i= -0.9816; + tx=6.1203; ty= -7.1051; tz=3.1984 }, + { x = 2.6760; y = -8.4960; z = 3.2880 }, (* P *) + { x = 1.4950; y = -7.6230; z = 3.4770 }, (* O1P *) + { x = 2.9490; y = -9.4640; z = 4.3740 }, (* O2P *) + { x = 3.9730; y = -7.5950; z = 3.0340 }, (* O5' *) + { x = 5.2430; y = -8.2420; z = 2.8260 }, (* C5' *) + { x = 5.1974; y = -8.8497; z = 1.9223 }, (* H5' *) + { x = 5.5548; y = -8.7348; z = 3.7469 }, (* H5'' *) + { x = 6.3140; y = -7.2060; z = 2.5510 }, (* C4' *) + { x = 5.8744; y = -6.2116; z = 2.4731 }, (* H4' *) + { x = 7.2798; y = -7.2260; z = 3.6420 }, (* O4' *) + { x = 8.5733; y = -6.9410; z = 3.1329 }, (* C1' *) + { x = 8.9047; y = -6.0374; z = 3.6446 }, (* H1' *) + { x = 8.4429; y = -6.6596; z = 1.6327 }, (* C2' *) + { x = 9.2880; y = -7.1071; z = 1.1096 }, (* H2'' *) + { x = 8.2502; y = -5.2799; z = 1.4754 }, (* O2' *) + { x = 8.7676; y = -4.7284; z = 2.0667 }, (* H2' *) + { x = 7.1642; y = -7.4416; z = 1.3021 }, (* C3' *) + { x = 7.4125; y = -8.5002; z = 1.2260 }, (* H3' *) + { x = 6.5160; y = -6.9772; z = 0.1267 }, (* O3' *) + { x = 9.4531; y = -8.1107; z = 3.4087 }, (* N1 *) + { x = 11.5931; y = -9.0015; z = 3.6357 }, (* N3 *) + { x = 10.8101; y = -7.8950; z = 3.3748 }, (* C2 *) + { x = 11.1439; y = -10.2744; z = 3.9206 }, (* C4 *) + { x = 9.7056; y = -10.4026; z = 3.9332 }, (* C5 *) + { x = 8.9192; y = -9.3419; z = 3.6833 }, (* C6 *) + (U ( + { x = 11.3013; y = -6.8063; z = 3.1326 }, (* O2 *) + { x = 11.9431; y = -11.1876; z = 4.1375 }, (* O4 *) + { x = 12.5840; y = -8.8673; z = 3.6158 }, (* H3 *) + { x = 9.2891; y = -11.2898; z = 4.1313 }, (* H5 *) + { x = 7.9263; y = -9.4537; z = 3.6977 }) (* H6 *) + ) + ) + +(* -- PARTIAL INSTANTIATIONS ------------------------------------------------*) + +type variable = + { id : int; + t : tfo; + n : nuc } + +let mk_var i t n = { id = i; t = t; n = n } + +let absolute_pos v p = tfo_apply v.t p + +let atom_pos atom v = absolute_pos v (atom v.n) + +let rec get_var id = function + | (v::lst) -> if id = v.id then v else get_var id lst + | _ -> assert false + +(* -- SEARCH ----------------------------------------------------------------*) + +(* Sequential backtracking algorithm *) + +let rec search (partial_inst : variable list) l constr = + match l with + [] -> [partial_inst] + | (h::t) -> + let rec try_assignments = function + [] -> [] + | v::vs -> + if constr v partial_inst then + (search (v::partial_inst) t constr) @ (try_assignments vs) + else + try_assignments vs + in + try_assignments (h partial_inst) + + +(* -- DOMAINS ---------------------------------------------------------------*) + +(* Primary structure: strand A CUGCCACGUCUG, strand B CAGACGUGGCAG + + Secondary structure: strand A CUGCCACGUCUG + |||||||||||| + GACGGUGCAGAC strand B + + Tertiary structure: + + 5' end of strand A C1----G12 3' end of strand B + U2-------A11 + G3-------C10 + C4-----G9 + C5---G8 + A6 + G6-C7 + C5----G8 + A4-------U9 + G3--------C10 + A2-------U11 + 5' end of strand B C1----G12 3' end of strand A + + "helix", "stacked" and "connected" describe the spatial relationship + between two consecutive nucleotides. E.g. the nucleotides C1 and U2 + from the strand A. + + "wc" (stands for Watson-Crick and is a type of base-pairing), + and "wc-dumas" describe the spatial relationship between + nucleotides from two chains that are growing in opposite directions. + E.g. the nucleotides C1 from strand A and G12 from strand B. +*) + +(* Dynamic Domains *) + +(* Given, + "refnuc" a nucleotide which is already positioned, + "nucl" the nucleotide to be placed, + and "tfo" a transformation matrix which expresses the desired + relationship between "refnuc" and "nucl", + the function "dgf-base" computes the transformation matrix that + places the nucleotide "nucl" in the given relationship to "refnuc". +*) + +let +dgf_base tfo v nucl + = let x = if is_A v.n then + tfo_align (atom_pos nuc_C1' v) + (atom_pos rA_N9 v) + (atom_pos nuc_C4 v) + else if is_C v.n then + tfo_align (atom_pos nuc_C1' v) + (atom_pos nuc_N1 v) + (atom_pos nuc_C2 v) + else if is_G v.n then + tfo_align (atom_pos nuc_C1' v) + (atom_pos rG_N9 v) + (atom_pos nuc_C4 v) + else + tfo_align (atom_pos nuc_C1' v) + (atom_pos nuc_N1 v) + (atom_pos nuc_C2 v) + in + tfo_combine (nuc_dgf_base_tfo nucl) + (tfo_combine tfo (tfo_inv_ortho x)) + +(* Placement of first nucleotide. *) + +let +reference n i partial_inst = [ mk_var i tfo_id n ] + +(* The transformation matrix for wc is from: + + Chandrasekaran R. et al (1989) A Re-Examination of the Crystal + Structure of A-DNA Using Fiber Diffraction Data. J. Biomol. + Struct. & Dynamics 6(6):1189-1202. +*) + +let wc_tfo + = ( + { a= -1.0000; b=0.0028; c= -0.0019; + d=0.0028; e=0.3468; f= -0.9379; + g= -0.0019; h= -0.9379; i= -0.3468; + tx= -0.0080; ty=6.0730; tz=8.7208 } + ) + +let +wc nucl i j partial_inst + = [ mk_var i (dgf_base wc_tfo (get_var j partial_inst) nucl) nucl ] + +let wc_dumas_tfo + = ( + { a= -0.9737; b= -0.1834; c=0.1352; + d= -0.1779; e=0.2417; f= -0.9539; + g=0.1422; h= -0.9529; i= -0.2679; + tx=0.4837; ty=6.2649; tz=8.0285 } + ) + +let +wc_dumas nucl i j partial_inst + = [ mk_var i (dgf_base wc_dumas_tfo (get_var j partial_inst) nucl) nucl ] + +let helix5'_tfo + = ( + { a=0.9886; b= -0.0961; c=0.1156; + d=0.1424; e=0.8452; f= -0.5152; + g= -0.0482; h=0.5258; i=0.8492; + tx= -3.8737; ty=0.5480; tz=3.8024 } + ) + +let +helix5' nucl i j partial_inst + = [ mk_var i (dgf_base helix5'_tfo (get_var j partial_inst) nucl) nucl ] + +let helix3'_tfo + = ( + { a=0.9886; b=0.1424; c= -0.0482; + d= -0.0961; e=0.8452; f=0.5258; + g=0.1156; h= -0.5152; i=0.8492; + tx=3.4426; ty=2.0474; tz= -3.7042 } + ) + +let +helix3' nucl i j partial_inst + = [ mk_var i (dgf_base helix3'_tfo (get_var j partial_inst) nucl) nucl ] + +let g37_a38_tfo + = ( + { a=0.9991; b=0.0164; c= -0.0387; + d= -0.0375; e=0.7616; f= -0.6470; + g=0.0189; h=0.6478; i=0.7615; + tx= -3.3018; ty=0.9975; tz=2.5585 } + ) + +let +g37_a38 nucl i j partial_inst + = mk_var i (dgf_base g37_a38_tfo (get_var j partial_inst) nucl) nucl + +let +stacked5' nucl i j partial_inst + = (g37_a38 nucl i j partial_inst) :: (helix5' nucl i j partial_inst) + +let a38_g37_tfo + = ( + { a=0.9991; b= -0.0375; c=0.0189; + d=0.0164; e=0.7616; f=0.6478; + g= -0.0387; h= -0.6470; i=0.7615; + tx=3.3819; ty=0.7718; tz= -2.5321 } + ) + +let +a38_g37 nucl i j partial_inst + = mk_var i (dgf_base a38_g37_tfo (get_var j partial_inst) nucl) nucl + +let +stacked3' nucl i j partial_inst + = (a38_g37 nucl i j partial_inst) :: (helix3' nucl i j partial_inst) + +let +p_o3' nucls i j partial_inst + = let refnuc = get_var j partial_inst in + let align = tfo_inv_ortho + (tfo_align (atom_pos nuc_O3' refnuc) + (atom_pos nuc_C3' refnuc) + (atom_pos nuc_C4' refnuc)) in + let rec generate domains = function + [] -> domains + | n::ns -> + generate + ((mk_var i (tfo_combine (nuc_p_o3'_60_tfo n) align) n):: + (mk_var i (tfo_combine (nuc_p_o3'_180_tfo n) align) n):: + (mk_var i (tfo_combine (nuc_p_o3'_275_tfo n) align) n)::domains) + ns + in + generate [] nucls + +(* -- PROBLEM STATEMENT -----------------------------------------------------*) + +(* Define anticodon problem -- Science 253:1255 Figure 3a, 3b and 3c *) + +let +anticodon_domains + = [ + reference rC 27; + helix5' rC 28 27; + helix5' rA 29 28; + helix5' rG 30 29; + helix5' rA 31 30; + wc rU 39 31; + helix5' rC 40 39; + helix5' rU 41 40; + helix5' rG 42 41; + helix5' rG 43 42; + stacked3' rA 38 39; + stacked3' rG 37 38; + stacked3' rA 36 37; + stacked3' rA 35 36; + stacked3' rG 34 35; (* <-. Distance *) + p_o3' rCs 32 31; (* | Constraint *) + p_o3' rUs 33 32 (* <-' 3.0 Angstroms *) + ] + +(* Anticodon constraint *) + +let +anticodon_constraint v partial_inst = + let rec dist j = let p = atom_pos nuc_P (get_var j partial_inst) in + let o3' = atom_pos nuc_O3' v in + pt_dist p o3' + in + if v.id = 33 then + (dist 34) <= 3.0 + else + true + +let +anticodon () = search [] anticodon_domains anticodon_constraint + +(* Define pseudoknot problem -- Science 253:1255 Figure 4a and 4b *) + +let +pseudoknot_domains + = [ + reference rA 23; + wc_dumas rU 8 23; + helix3' rG 22 23; + wc_dumas rC 9 22; + helix3' rG 21 22; + wc_dumas rC 10 21; + helix3' rC 20 21; + wc_dumas rG 11 20; + helix3' rU' 19 20; (* <-. *) + wc_dumas rA 12 19; (* | Distance *) +(* | Constraint *) +(* Helix 1 | 4.0 Angstroms *) + helix3' rC 3 19; (* | *) + wc_dumas rG 13 3; (* | *) + helix3' rC 2 3; (* | *) + wc_dumas rG 14 2; (* | *) + helix3' rC 1 2; (* | *) + wc_dumas rG' 15 1; (* | *) +(* | *) +(* L2 LOOP | *) + p_o3' rUs 16 15; (* | *) + p_o3' rCs 17 16; (* | *) + p_o3' rAs 18 17; (* <-' *) +(* *) +(* L1 LOOP *) + helix3' rU 7 8; (* <-. *) + p_o3' rCs 4 3; (* | Constraint *) + stacked5' rU 5 4; (* | 4.5 Angstroms *) + stacked5' rC 6 5 (* <-' *) + ] + +(* Pseudoknot constraint *) + +let +pseudoknot_constraint v partial_inst = + let rec dist j = + let p = atom_pos nuc_P (get_var j partial_inst) in + let o3' = atom_pos nuc_O3' v in + pt_dist p o3' + in + if v.id = 18 then + (dist 19) <= 4.0 + else if v.id = 6 then + (dist 7) <= 4.5 + else + true + +let +pseudoknot () = search [] pseudoknot_domains pseudoknot_constraint + +(* -- TESTING ---------------------------------------------------------------*) + +let list_of_atoms = function + (N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6, + A (n6,n7,n9,c8,h2,h61,h62,h8))) + -> [|p;o1p;o2p;o5';c5';h5';h5'';c4';h4';o4';c1';h1';c2';h2'';o2';h2';c3'; + h3';o3';n1;n3;c2;c4;c5;c6;n6;n7;n9;c8;h2;h61;h62;h8|] + +| (N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6, + C (n4,o2,h41,h42,h5,h6))) + -> [|p;o1p;o2p;o5';c5';h5';h5'';c4';h4';o4';c1';h1';c2';h2'';o2';h2';c3'; + h3';o3';n1;n3;c2;c4;c5;c6;n4;o2;h41;h42;h5;h6|] + +| (N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6, + G (n2,n7,n9,c8,o6,h1,h21,h22,h8))) + -> [|p;o1p;o2p;o5';c5';h5';h5'';c4';h4';o4';c1';h1';c2';h2'';o2';h2';c3'; + h3';o3';n1;n3;c2;c4;c5;c6;n2;n7;n9;c8;o6;h1;h21;h22;h8|] + +| (N(dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, + p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', + c3',h3',o3',n1,n3,c2,c4,c5,c6, + U (o2,o4,h3,h5,h6))) + -> [|p;o1p;o2p;o5';c5';h5';h5'';c4';h4';o4';c1';h1';c2';h2'';o2';h2';c3'; + h3';o3';n1;n3;c2;c4;c5;c6;o2;o4;h3;h5;h6|] + +let maximum = function + | x::xs -> + let rec iter m = function + [] -> m + | (a::b) -> iter (if a > m then a else m) b + in + iter x xs + | _ -> assert false + +let +var_most_distant_atom v = + let atoms = list_of_atoms v.n in + let max_dist = ref 0.0 in + for i = 0 to pred (Array.length atoms) do + let p = atoms.(i) in + let distance = + let pos = absolute_pos v p + in sqrt ((pos.x * pos.x) + (pos.y * pos.y) + (pos.z * pos.z)) in + if distance > !max_dist then max_dist := distance + done; + !max_dist + +let +sol_most_distant_atom s = maximum (List.map var_most_distant_atom s) + +let +most_distant_atom sols = maximum (List.map sol_most_distant_atom sols) + +let +check () = List.length (pseudoknot ()) + +let +run () = most_distant_atom (pseudoknot ()) + +let main () = + for i = 1 to 50 do ignore(run()) done; + Printf.printf "%.4f" (run ()); print_newline() + +let _ = main () diff --git a/testsuite/tests/misc/nucleic.reference b/testsuite/tests/misc/nucleic.reference new file mode 100644 index 00000000..14689cdb --- /dev/null +++ b/testsuite/tests/misc/nucleic.reference @@ -0,0 +1 @@ +33.7976 diff --git a/testsuite/tests/misc/sieve.ml b/testsuite/tests/misc/sieve.ml new file mode 100644 index 00000000..450c84f4 --- /dev/null +++ b/testsuite/tests/misc/sieve.ml @@ -0,0 +1,56 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: sieve.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +(* Eratosthene's sieve *) + +(* interval min max = [min; min+1; ...; max-1; max] *) + +let rec interval min max = + if min > max then [] else min :: interval (min + 1) max + + +(* filter p L returns the list of the elements in list L + that satisfy predicate p *) + +let rec filter p = function + [] -> [] + | a::r -> if p a then a :: filter p r else filter p r + + +(* Application: removing all numbers multiple of n from a list of integers *) + +let remove_multiples_of n = + filter (fun m -> m mod n <> 0) + + +(* The sieve itself *) + +let sieve max = + let rec filter_again = function + [] -> [] + | n::r as l -> + if n*n > max then l else n :: filter_again (remove_multiples_of n r) + in + filter_again (interval 2 max) + + +let rec do_list f = function + [] -> () + | a::l -> f a; do_list f l + + +let _ = + do_list (fun n -> print_int n; print_string " ") (sieve 50000); + print_newline(); + exit 0 diff --git a/testsuite/tests/misc/sieve.reference b/testsuite/tests/misc/sieve.reference new file mode 100644 index 00000000..eb96be00 --- /dev/null +++ b/testsuite/tests/misc/sieve.reference @@ -0,0 +1 @@ +2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087 2089 2099 2111 2113 2129 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357 2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 2539 2543 2549 2551 2557 2579 2591 2593 2609 2617 2621 2633 2647 2657 2659 2663 2671 2677 2683 2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 2857 2861 2879 2887 2897 2903 2909 2917 2927 2939 2953 2957 2963 2969 2971 2999 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 3083 3089 3109 3119 3121 3137 3163 3167 3169 3181 3187 3191 3203 3209 3217 3221 3229 3251 3253 3257 3259 3271 3299 3301 3307 3313 3319 3323 3329 3331 3343 3347 3359 3361 3371 3373 3389 3391 3407 3413 3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 3517 3527 3529 3533 3539 3541 3547 3557 3559 3571 3581 3583 3593 3607 3613 3617 3623 3631 3637 3643 3659 3671 3673 3677 3691 3697 3701 3709 3719 3727 3733 3739 3761 3767 3769 3779 3793 3797 3803 3821 3823 3833 3847 3851 3853 3863 3877 3881 3889 3907 3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 4001 4003 4007 4013 4019 4021 4027 4049 4051 4057 4073 4079 4091 4093 4099 4111 4127 4129 4133 4139 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 4241 4243 4253 4259 4261 4271 4273 4283 4289 4297 4327 4337 4339 4349 4357 4363 4373 4391 4397 4409 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 4591 4597 4603 4621 4637 4639 4643 4649 4651 4657 4663 4673 4679 4691 4703 4721 4723 4729 4733 4751 4759 4783 4787 4789 4793 4799 4801 4813 4817 4831 4861 4871 4877 4889 4903 4909 4919 4931 4933 4937 4943 4951 4957 4967 4969 4973 4987 4993 4999 5003 5009 5011 5021 5023 5039 5051 5059 5077 5081 5087 5099 5101 5107 5113 5119 5147 5153 5167 5171 5179 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 5281 5297 5303 5309 5323 5333 5347 5351 5381 5387 5393 5399 5407 5413 5417 5419 5431 5437 5441 5443 5449 5471 5477 5479 5483 5501 5503 5507 5519 5521 5527 5531 5557 5563 5569 5573 5581 5591 5623 5639 5641 5647 5651 5653 5657 5659 5669 5683 5689 5693 5701 5711 5717 5737 5741 5743 5749 5779 5783 5791 5801 5807 5813 5821 5827 5839 5843 5849 5851 5857 5861 5867 5869 5879 5881 5897 5903 5923 5927 5939 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 6067 6073 6079 6089 6091 6101 6113 6121 6131 6133 6143 6151 6163 6173 6197 6199 6203 6211 6217 6221 6229 6247 6257 6263 6269 6271 6277 6287 6299 6301 6311 6317 6323 6329 6337 6343 6353 6359 6361 6367 6373 6379 6389 6397 6421 6427 6449 6451 6469 6473 6481 6491 6521 6529 6547 6551 6553 6563 6569 6571 6577 6581 6599 6607 6619 6637 6653 6659 6661 6673 6679 6689 6691 6701 6703 6709 6719 6733 6737 6761 6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 6841 6857 6863 6869 6871 6883 6899 6907 6911 6917 6947 6949 6959 6961 6967 6971 6977 6983 6991 6997 7001 7013 7019 7027 7039 7043 7057 7069 7079 7103 7109 7121 7127 7129 7151 7159 7177 7187 7193 7207 7211 7213 7219 7229 7237 7243 7247 7253 7283 7297 7307 7309 7321 7331 7333 7349 7351 7369 7393 7411 7417 7433 7451 7457 7459 7477 7481 7487 7489 7499 7507 7517 7523 7529 7537 7541 7547 7549 7559 7561 7573 7577 7583 7589 7591 7603 7607 7621 7639 7643 7649 7669 7673 7681 7687 7691 7699 7703 7717 7723 7727 7741 7753 7757 7759 7789 7793 7817 7823 7829 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919 7927 7933 7937 7949 7951 7963 7993 8009 8011 8017 8039 8053 8059 8069 8081 8087 8089 8093 8101 8111 8117 8123 8147 8161 8167 8171 8179 8191 8209 8219 8221 8231 8233 8237 8243 8263 8269 8273 8287 8291 8293 8297 8311 8317 8329 8353 8363 8369 8377 8387 8389 8419 8423 8429 8431 8443 8447 8461 8467 8501 8513 8521 8527 8537 8539 8543 8563 8573 8581 8597 8599 8609 8623 8627 8629 8641 8647 8663 8669 8677 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 8747 8753 8761 8779 8783 8803 8807 8819 8821 8831 8837 8839 8849 8861 8863 8867 8887 8893 8923 8929 8933 8941 8951 8963 8969 8971 8999 9001 9007 9011 9013 9029 9041 9043 9049 9059 9067 9091 9103 9109 9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 9293 9311 9319 9323 9337 9341 9343 9349 9371 9377 9391 9397 9403 9413 9419 9421 9431 9433 9437 9439 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 9539 9547 9551 9587 9601 9613 9619 9623 9629 9631 9643 9649 9661 9677 9679 9689 9697 9719 9721 9733 9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941 9949 9967 9973 10007 10009 10037 10039 10061 10067 10069 10079 10091 10093 10099 10103 10111 10133 10139 10141 10151 10159 10163 10169 10177 10181 10193 10211 10223 10243 10247 10253 10259 10267 10271 10273 10289 10301 10303 10313 10321 10331 10333 10337 10343 10357 10369 10391 10399 10427 10429 10433 10453 10457 10459 10463 10477 10487 10499 10501 10513 10529 10531 10559 10567 10589 10597 10601 10607 10613 10627 10631 10639 10651 10657 10663 10667 10687 10691 10709 10711 10723 10729 10733 10739 10753 10771 10781 10789 10799 10831 10837 10847 10853 10859 10861 10867 10883 10889 10891 10903 10909 10937 10939 10949 10957 10973 10979 10987 10993 11003 11027 11047 11057 11059 11069 11071 11083 11087 11093 11113 11117 11119 11131 11149 11159 11161 11171 11173 11177 11197 11213 11239 11243 11251 11257 11261 11273 11279 11287 11299 11311 11317 11321 11329 11351 11353 11369 11383 11393 11399 11411 11423 11437 11443 11447 11467 11471 11483 11489 11491 11497 11503 11519 11527 11549 11551 11579 11587 11593 11597 11617 11621 11633 11657 11677 11681 11689 11699 11701 11717 11719 11731 11743 11777 11779 11783 11789 11801 11807 11813 11821 11827 11831 11833 11839 11863 11867 11887 11897 11903 11909 11923 11927 11933 11939 11941 11953 11959 11969 11971 11981 11987 12007 12011 12037 12041 12043 12049 12071 12073 12097 12101 12107 12109 12113 12119 12143 12149 12157 12161 12163 12197 12203 12211 12227 12239 12241 12251 12253 12263 12269 12277 12281 12289 12301 12323 12329 12343 12347 12373 12377 12379 12391 12401 12409 12413 12421 12433 12437 12451 12457 12473 12479 12487 12491 12497 12503 12511 12517 12527 12539 12541 12547 12553 12569 12577 12583 12589 12601 12611 12613 12619 12637 12641 12647 12653 12659 12671 12689 12697 12703 12713 12721 12739 12743 12757 12763 12781 12791 12799 12809 12821 12823 12829 12841 12853 12889 12893 12899 12907 12911 12917 12919 12923 12941 12953 12959 12967 12973 12979 12983 13001 13003 13007 13009 13033 13037 13043 13049 13063 13093 13099 13103 13109 13121 13127 13147 13151 13159 13163 13171 13177 13183 13187 13217 13219 13229 13241 13249 13259 13267 13291 13297 13309 13313 13327 13331 13337 13339 13367 13381 13397 13399 13411 13417 13421 13441 13451 13457 13463 13469 13477 13487 13499 13513 13523 13537 13553 13567 13577 13591 13597 13613 13619 13627 13633 13649 13669 13679 13681 13687 13691 13693 13697 13709 13711 13721 13723 13729 13751 13757 13759 13763 13781 13789 13799 13807 13829 13831 13841 13859 13873 13877 13879 13883 13901 13903 13907 13913 13921 13931 13933 13963 13967 13997 13999 14009 14011 14029 14033 14051 14057 14071 14081 14083 14087 14107 14143 14149 14153 14159 14173 14177 14197 14207 14221 14243 14249 14251 14281 14293 14303 14321 14323 14327 14341 14347 14369 14387 14389 14401 14407 14411 14419 14423 14431 14437 14447 14449 14461 14479 14489 14503 14519 14533 14537 14543 14549 14551 14557 14561 14563 14591 14593 14621 14627 14629 14633 14639 14653 14657 14669 14683 14699 14713 14717 14723 14731 14737 14741 14747 14753 14759 14767 14771 14779 14783 14797 14813 14821 14827 14831 14843 14851 14867 14869 14879 14887 14891 14897 14923 14929 14939 14947 14951 14957 14969 14983 15013 15017 15031 15053 15061 15073 15077 15083 15091 15101 15107 15121 15131 15137 15139 15149 15161 15173 15187 15193 15199 15217 15227 15233 15241 15259 15263 15269 15271 15277 15287 15289 15299 15307 15313 15319 15329 15331 15349 15359 15361 15373 15377 15383 15391 15401 15413 15427 15439 15443 15451 15461 15467 15473 15493 15497 15511 15527 15541 15551 15559 15569 15581 15583 15601 15607 15619 15629 15641 15643 15647 15649 15661 15667 15671 15679 15683 15727 15731 15733 15737 15739 15749 15761 15767 15773 15787 15791 15797 15803 15809 15817 15823 15859 15877 15881 15887 15889 15901 15907 15913 15919 15923 15937 15959 15971 15973 15991 16001 16007 16033 16057 16061 16063 16067 16069 16073 16087 16091 16097 16103 16111 16127 16139 16141 16183 16187 16189 16193 16217 16223 16229 16231 16249 16253 16267 16273 16301 16319 16333 16339 16349 16361 16363 16369 16381 16411 16417 16421 16427 16433 16447 16451 16453 16477 16481 16487 16493 16519 16529 16547 16553 16561 16567 16573 16603 16607 16619 16631 16633 16649 16651 16657 16661 16673 16691 16693 16699 16703 16729 16741 16747 16759 16763 16787 16811 16823 16829 16831 16843 16871 16879 16883 16889 16901 16903 16921 16927 16931 16937 16943 16963 16979 16981 16987 16993 17011 17021 17027 17029 17033 17041 17047 17053 17077 17093 17099 17107 17117 17123 17137 17159 17167 17183 17189 17191 17203 17207 17209 17231 17239 17257 17291 17293 17299 17317 17321 17327 17333 17341 17351 17359 17377 17383 17387 17389 17393 17401 17417 17419 17431 17443 17449 17467 17471 17477 17483 17489 17491 17497 17509 17519 17539 17551 17569 17573 17579 17581 17597 17599 17609 17623 17627 17657 17659 17669 17681 17683 17707 17713 17729 17737 17747 17749 17761 17783 17789 17791 17807 17827 17837 17839 17851 17863 17881 17891 17903 17909 17911 17921 17923 17929 17939 17957 17959 17971 17977 17981 17987 17989 18013 18041 18043 18047 18049 18059 18061 18077 18089 18097 18119 18121 18127 18131 18133 18143 18149 18169 18181 18191 18199 18211 18217 18223 18229 18233 18251 18253 18257 18269 18287 18289 18301 18307 18311 18313 18329 18341 18353 18367 18371 18379 18397 18401 18413 18427 18433 18439 18443 18451 18457 18461 18481 18493 18503 18517 18521 18523 18539 18541 18553 18583 18587 18593 18617 18637 18661 18671 18679 18691 18701 18713 18719 18731 18743 18749 18757 18773 18787 18793 18797 18803 18839 18859 18869 18899 18911 18913 18917 18919 18947 18959 18973 18979 19001 19009 19013 19031 19037 19051 19069 19073 19079 19081 19087 19121 19139 19141 19157 19163 19181 19183 19207 19211 19213 19219 19231 19237 19249 19259 19267 19273 19289 19301 19309 19319 19333 19373 19379 19381 19387 19391 19403 19417 19421 19423 19427 19429 19433 19441 19447 19457 19463 19469 19471 19477 19483 19489 19501 19507 19531 19541 19543 19553 19559 19571 19577 19583 19597 19603 19609 19661 19681 19687 19697 19699 19709 19717 19727 19739 19751 19753 19759 19763 19777 19793 19801 19813 19819 19841 19843 19853 19861 19867 19889 19891 19913 19919 19927 19937 19949 19961 19963 19973 19979 19991 19993 19997 20011 20021 20023 20029 20047 20051 20063 20071 20089 20101 20107 20113 20117 20123 20129 20143 20147 20149 20161 20173 20177 20183 20201 20219 20231 20233 20249 20261 20269 20287 20297 20323 20327 20333 20341 20347 20353 20357 20359 20369 20389 20393 20399 20407 20411 20431 20441 20443 20477 20479 20483 20507 20509 20521 20533 20543 20549 20551 20563 20593 20599 20611 20627 20639 20641 20663 20681 20693 20707 20717 20719 20731 20743 20747 20749 20753 20759 20771 20773 20789 20807 20809 20849 20857 20873 20879 20887 20897 20899 20903 20921 20929 20939 20947 20959 20963 20981 20983 21001 21011 21013 21017 21019 21023 21031 21059 21061 21067 21089 21101 21107 21121 21139 21143 21149 21157 21163 21169 21179 21187 21191 21193 21211 21221 21227 21247 21269 21277 21283 21313 21317 21319 21323 21341 21347 21377 21379 21383 21391 21397 21401 21407 21419 21433 21467 21481 21487 21491 21493 21499 21503 21517 21521 21523 21529 21557 21559 21563 21569 21577 21587 21589 21599 21601 21611 21613 21617 21647 21649 21661 21673 21683 21701 21713 21727 21737 21739 21751 21757 21767 21773 21787 21799 21803 21817 21821 21839 21841 21851 21859 21863 21871 21881 21893 21911 21929 21937 21943 21961 21977 21991 21997 22003 22013 22027 22031 22037 22039 22051 22063 22067 22073 22079 22091 22093 22109 22111 22123 22129 22133 22147 22153 22157 22159 22171 22189 22193 22229 22247 22259 22271 22273 22277 22279 22283 22291 22303 22307 22343 22349 22367 22369 22381 22391 22397 22409 22433 22441 22447 22453 22469 22481 22483 22501 22511 22531 22541 22543 22549 22567 22571 22573 22613 22619 22621 22637 22639 22643 22651 22669 22679 22691 22697 22699 22709 22717 22721 22727 22739 22741 22751 22769 22777 22783 22787 22807 22811 22817 22853 22859 22861 22871 22877 22901 22907 22921 22937 22943 22961 22963 22973 22993 23003 23011 23017 23021 23027 23029 23039 23041 23053 23057 23059 23063 23071 23081 23087 23099 23117 23131 23143 23159 23167 23173 23189 23197 23201 23203 23209 23227 23251 23269 23279 23291 23293 23297 23311 23321 23327 23333 23339 23357 23369 23371 23399 23417 23431 23447 23459 23473 23497 23509 23531 23537 23539 23549 23557 23561 23563 23567 23581 23593 23599 23603 23609 23623 23627 23629 23633 23663 23669 23671 23677 23687 23689 23719 23741 23743 23747 23753 23761 23767 23773 23789 23801 23813 23819 23827 23831 23833 23857 23869 23873 23879 23887 23893 23899 23909 23911 23917 23929 23957 23971 23977 23981 23993 24001 24007 24019 24023 24029 24043 24049 24061 24071 24077 24083 24091 24097 24103 24107 24109 24113 24121 24133 24137 24151 24169 24179 24181 24197 24203 24223 24229 24239 24247 24251 24281 24317 24329 24337 24359 24371 24373 24379 24391 24407 24413 24419 24421 24439 24443 24469 24473 24481 24499 24509 24517 24527 24533 24547 24551 24571 24593 24611 24623 24631 24659 24671 24677 24683 24691 24697 24709 24733 24749 24763 24767 24781 24793 24799 24809 24821 24841 24847 24851 24859 24877 24889 24907 24917 24919 24923 24943 24953 24967 24971 24977 24979 24989 25013 25031 25033 25037 25057 25073 25087 25097 25111 25117 25121 25127 25147 25153 25163 25169 25171 25183 25189 25219 25229 25237 25243 25247 25253 25261 25301 25303 25307 25309 25321 25339 25343 25349 25357 25367 25373 25391 25409 25411 25423 25439 25447 25453 25457 25463 25469 25471 25523 25537 25541 25561 25577 25579 25583 25589 25601 25603 25609 25621 25633 25639 25643 25657 25667 25673 25679 25693 25703 25717 25733 25741 25747 25759 25763 25771 25793 25799 25801 25819 25841 25847 25849 25867 25873 25889 25903 25913 25919 25931 25933 25939 25943 25951 25969 25981 25997 25999 26003 26017 26021 26029 26041 26053 26083 26099 26107 26111 26113 26119 26141 26153 26161 26171 26177 26183 26189 26203 26209 26227 26237 26249 26251 26261 26263 26267 26293 26297 26309 26317 26321 26339 26347 26357 26371 26387 26393 26399 26407 26417 26423 26431 26437 26449 26459 26479 26489 26497 26501 26513 26539 26557 26561 26573 26591 26597 26627 26633 26641 26647 26669 26681 26683 26687 26693 26699 26701 26711 26713 26717 26723 26729 26731 26737 26759 26777 26783 26801 26813 26821 26833 26839 26849 26861 26863 26879 26881 26891 26893 26903 26921 26927 26947 26951 26953 26959 26981 26987 26993 27011 27017 27031 27043 27059 27061 27067 27073 27077 27091 27103 27107 27109 27127 27143 27179 27191 27197 27211 27239 27241 27253 27259 27271 27277 27281 27283 27299 27329 27337 27361 27367 27397 27407 27409 27427 27431 27437 27449 27457 27479 27481 27487 27509 27527 27529 27539 27541 27551 27581 27583 27611 27617 27631 27647 27653 27673 27689 27691 27697 27701 27733 27737 27739 27743 27749 27751 27763 27767 27773 27779 27791 27793 27799 27803 27809 27817 27823 27827 27847 27851 27883 27893 27901 27917 27919 27941 27943 27947 27953 27961 27967 27983 27997 28001 28019 28027 28031 28051 28057 28069 28081 28087 28097 28099 28109 28111 28123 28151 28163 28181 28183 28201 28211 28219 28229 28277 28279 28283 28289 28297 28307 28309 28319 28349 28351 28387 28393 28403 28409 28411 28429 28433 28439 28447 28463 28477 28493 28499 28513 28517 28537 28541 28547 28549 28559 28571 28573 28579 28591 28597 28603 28607 28619 28621 28627 28631 28643 28649 28657 28661 28663 28669 28687 28697 28703 28711 28723 28729 28751 28753 28759 28771 28789 28793 28807 28813 28817 28837 28843 28859 28867 28871 28879 28901 28909 28921 28927 28933 28949 28961 28979 29009 29017 29021 29023 29027 29033 29059 29063 29077 29101 29123 29129 29131 29137 29147 29153 29167 29173 29179 29191 29201 29207 29209 29221 29231 29243 29251 29269 29287 29297 29303 29311 29327 29333 29339 29347 29363 29383 29387 29389 29399 29401 29411 29423 29429 29437 29443 29453 29473 29483 29501 29527 29531 29537 29567 29569 29573 29581 29587 29599 29611 29629 29633 29641 29663 29669 29671 29683 29717 29723 29741 29753 29759 29761 29789 29803 29819 29833 29837 29851 29863 29867 29873 29879 29881 29917 29921 29927 29947 29959 29983 29989 30011 30013 30029 30047 30059 30071 30089 30091 30097 30103 30109 30113 30119 30133 30137 30139 30161 30169 30181 30187 30197 30203 30211 30223 30241 30253 30259 30269 30271 30293 30307 30313 30319 30323 30341 30347 30367 30389 30391 30403 30427 30431 30449 30467 30469 30491 30493 30497 30509 30517 30529 30539 30553 30557 30559 30577 30593 30631 30637 30643 30649 30661 30671 30677 30689 30697 30703 30707 30713 30727 30757 30763 30773 30781 30803 30809 30817 30829 30839 30841 30851 30853 30859 30869 30871 30881 30893 30911 30931 30937 30941 30949 30971 30977 30983 31013 31019 31033 31039 31051 31063 31069 31079 31081 31091 31121 31123 31139 31147 31151 31153 31159 31177 31181 31183 31189 31193 31219 31223 31231 31237 31247 31249 31253 31259 31267 31271 31277 31307 31319 31321 31327 31333 31337 31357 31379 31387 31391 31393 31397 31469 31477 31481 31489 31511 31513 31517 31531 31541 31543 31547 31567 31573 31583 31601 31607 31627 31643 31649 31657 31663 31667 31687 31699 31721 31723 31727 31729 31741 31751 31769 31771 31793 31799 31817 31847 31849 31859 31873 31883 31891 31907 31957 31963 31973 31981 31991 32003 32009 32027 32029 32051 32057 32059 32063 32069 32077 32083 32089 32099 32117 32119 32141 32143 32159 32173 32183 32189 32191 32203 32213 32233 32237 32251 32257 32261 32297 32299 32303 32309 32321 32323 32327 32341 32353 32359 32363 32369 32371 32377 32381 32401 32411 32413 32423 32429 32441 32443 32467 32479 32491 32497 32503 32507 32531 32533 32537 32561 32563 32569 32573 32579 32587 32603 32609 32611 32621 32633 32647 32653 32687 32693 32707 32713 32717 32719 32749 32771 32779 32783 32789 32797 32801 32803 32831 32833 32839 32843 32869 32887 32909 32911 32917 32933 32939 32941 32957 32969 32971 32983 32987 32993 32999 33013 33023 33029 33037 33049 33053 33071 33073 33083 33091 33107 33113 33119 33149 33151 33161 33179 33181 33191 33199 33203 33211 33223 33247 33287 33289 33301 33311 33317 33329 33331 33343 33347 33349 33353 33359 33377 33391 33403 33409 33413 33427 33457 33461 33469 33479 33487 33493 33503 33521 33529 33533 33547 33563 33569 33577 33581 33587 33589 33599 33601 33613 33617 33619 33623 33629 33637 33641 33647 33679 33703 33713 33721 33739 33749 33751 33757 33767 33769 33773 33791 33797 33809 33811 33827 33829 33851 33857 33863 33871 33889 33893 33911 33923 33931 33937 33941 33961 33967 33997 34019 34031 34033 34039 34057 34061 34123 34127 34129 34141 34147 34157 34159 34171 34183 34211 34213 34217 34231 34253 34259 34261 34267 34273 34283 34297 34301 34303 34313 34319 34327 34337 34351 34361 34367 34369 34381 34403 34421 34429 34439 34457 34469 34471 34483 34487 34499 34501 34511 34513 34519 34537 34543 34549 34583 34589 34591 34603 34607 34613 34631 34649 34651 34667 34673 34679 34687 34693 34703 34721 34729 34739 34747 34757 34759 34763 34781 34807 34819 34841 34843 34847 34849 34871 34877 34883 34897 34913 34919 34939 34949 34961 34963 34981 35023 35027 35051 35053 35059 35069 35081 35083 35089 35099 35107 35111 35117 35129 35141 35149 35153 35159 35171 35201 35221 35227 35251 35257 35267 35279 35281 35291 35311 35317 35323 35327 35339 35353 35363 35381 35393 35401 35407 35419 35423 35437 35447 35449 35461 35491 35507 35509 35521 35527 35531 35533 35537 35543 35569 35573 35591 35593 35597 35603 35617 35671 35677 35729 35731 35747 35753 35759 35771 35797 35801 35803 35809 35831 35837 35839 35851 35863 35869 35879 35897 35899 35911 35923 35933 35951 35963 35969 35977 35983 35993 35999 36007 36011 36013 36017 36037 36061 36067 36073 36083 36097 36107 36109 36131 36137 36151 36161 36187 36191 36209 36217 36229 36241 36251 36263 36269 36277 36293 36299 36307 36313 36319 36341 36343 36353 36373 36383 36389 36433 36451 36457 36467 36469 36473 36479 36493 36497 36523 36527 36529 36541 36551 36559 36563 36571 36583 36587 36599 36607 36629 36637 36643 36653 36671 36677 36683 36691 36697 36709 36713 36721 36739 36749 36761 36767 36779 36781 36787 36791 36793 36809 36821 36833 36847 36857 36871 36877 36887 36899 36901 36913 36919 36923 36929 36931 36943 36947 36973 36979 36997 37003 37013 37019 37021 37039 37049 37057 37061 37087 37097 37117 37123 37139 37159 37171 37181 37189 37199 37201 37217 37223 37243 37253 37273 37277 37307 37309 37313 37321 37337 37339 37357 37361 37363 37369 37379 37397 37409 37423 37441 37447 37463 37483 37489 37493 37501 37507 37511 37517 37529 37537 37547 37549 37561 37567 37571 37573 37579 37589 37591 37607 37619 37633 37643 37649 37657 37663 37691 37693 37699 37717 37747 37781 37783 37799 37811 37813 37831 37847 37853 37861 37871 37879 37889 37897 37907 37951 37957 37963 37967 37987 37991 37993 37997 38011 38039 38047 38053 38069 38083 38113 38119 38149 38153 38167 38177 38183 38189 38197 38201 38219 38231 38237 38239 38261 38273 38281 38287 38299 38303 38317 38321 38327 38329 38333 38351 38371 38377 38393 38431 38447 38449 38453 38459 38461 38501 38543 38557 38561 38567 38569 38593 38603 38609 38611 38629 38639 38651 38653 38669 38671 38677 38693 38699 38707 38711 38713 38723 38729 38737 38747 38749 38767 38783 38791 38803 38821 38833 38839 38851 38861 38867 38873 38891 38903 38917 38921 38923 38933 38953 38959 38971 38977 38993 39019 39023 39041 39043 39047 39079 39089 39097 39103 39107 39113 39119 39133 39139 39157 39161 39163 39181 39191 39199 39209 39217 39227 39229 39233 39239 39241 39251 39293 39301 39313 39317 39323 39341 39343 39359 39367 39371 39373 39383 39397 39409 39419 39439 39443 39451 39461 39499 39503 39509 39511 39521 39541 39551 39563 39569 39581 39607 39619 39623 39631 39659 39667 39671 39679 39703 39709 39719 39727 39733 39749 39761 39769 39779 39791 39799 39821 39827 39829 39839 39841 39847 39857 39863 39869 39877 39883 39887 39901 39929 39937 39953 39971 39979 39983 39989 40009 40013 40031 40037 40039 40063 40087 40093 40099 40111 40123 40127 40129 40151 40153 40163 40169 40177 40189 40193 40213 40231 40237 40241 40253 40277 40283 40289 40343 40351 40357 40361 40387 40423 40427 40429 40433 40459 40471 40483 40487 40493 40499 40507 40519 40529 40531 40543 40559 40577 40583 40591 40597 40609 40627 40637 40639 40693 40697 40699 40709 40739 40751 40759 40763 40771 40787 40801 40813 40819 40823 40829 40841 40847 40849 40853 40867 40879 40883 40897 40903 40927 40933 40939 40949 40961 40973 40993 41011 41017 41023 41039 41047 41051 41057 41077 41081 41113 41117 41131 41141 41143 41149 41161 41177 41179 41183 41189 41201 41203 41213 41221 41227 41231 41233 41243 41257 41263 41269 41281 41299 41333 41341 41351 41357 41381 41387 41389 41399 41411 41413 41443 41453 41467 41479 41491 41507 41513 41519 41521 41539 41543 41549 41579 41593 41597 41603 41609 41611 41617 41621 41627 41641 41647 41651 41659 41669 41681 41687 41719 41729 41737 41759 41761 41771 41777 41801 41809 41813 41843 41849 41851 41863 41879 41887 41893 41897 41903 41911 41927 41941 41947 41953 41957 41959 41969 41981 41983 41999 42013 42017 42019 42023 42043 42061 42071 42073 42083 42089 42101 42131 42139 42157 42169 42179 42181 42187 42193 42197 42209 42221 42223 42227 42239 42257 42281 42283 42293 42299 42307 42323 42331 42337 42349 42359 42373 42379 42391 42397 42403 42407 42409 42433 42437 42443 42451 42457 42461 42463 42467 42473 42487 42491 42499 42509 42533 42557 42569 42571 42577 42589 42611 42641 42643 42649 42667 42677 42683 42689 42697 42701 42703 42709 42719 42727 42737 42743 42751 42767 42773 42787 42793 42797 42821 42829 42839 42841 42853 42859 42863 42899 42901 42923 42929 42937 42943 42953 42961 42967 42979 42989 43003 43013 43019 43037 43049 43051 43063 43067 43093 43103 43117 43133 43151 43159 43177 43189 43201 43207 43223 43237 43261 43271 43283 43291 43313 43319 43321 43331 43391 43397 43399 43403 43411 43427 43441 43451 43457 43481 43487 43499 43517 43541 43543 43573 43577 43579 43591 43597 43607 43609 43613 43627 43633 43649 43651 43661 43669 43691 43711 43717 43721 43753 43759 43777 43781 43783 43787 43789 43793 43801 43853 43867 43889 43891 43913 43933 43943 43951 43961 43963 43969 43973 43987 43991 43997 44017 44021 44027 44029 44041 44053 44059 44071 44087 44089 44101 44111 44119 44123 44129 44131 44159 44171 44179 44189 44201 44203 44207 44221 44249 44257 44263 44267 44269 44273 44279 44281 44293 44351 44357 44371 44381 44383 44389 44417 44449 44453 44483 44491 44497 44501 44507 44519 44531 44533 44537 44543 44549 44563 44579 44587 44617 44621 44623 44633 44641 44647 44651 44657 44683 44687 44699 44701 44711 44729 44741 44753 44771 44773 44777 44789 44797 44809 44819 44839 44843 44851 44867 44879 44887 44893 44909 44917 44927 44939 44953 44959 44963 44971 44983 44987 45007 45013 45053 45061 45077 45083 45119 45121 45127 45131 45137 45139 45161 45179 45181 45191 45197 45233 45247 45259 45263 45281 45289 45293 45307 45317 45319 45329 45337 45341 45343 45361 45377 45389 45403 45413 45427 45433 45439 45481 45491 45497 45503 45523 45533 45541 45553 45557 45569 45587 45589 45599 45613 45631 45641 45659 45667 45673 45677 45691 45697 45707 45737 45751 45757 45763 45767 45779 45817 45821 45823 45827 45833 45841 45853 45863 45869 45887 45893 45943 45949 45953 45959 45971 45979 45989 46021 46027 46049 46051 46061 46073 46091 46093 46099 46103 46133 46141 46147 46153 46171 46181 46183 46187 46199 46219 46229 46237 46261 46271 46273 46279 46301 46307 46309 46327 46337 46349 46351 46381 46399 46411 46439 46441 46447 46451 46457 46471 46477 46489 46499 46507 46511 46523 46549 46559 46567 46573 46589 46591 46601 46619 46633 46639 46643 46649 46663 46679 46681 46687 46691 46703 46723 46727 46747 46751 46757 46769 46771 46807 46811 46817 46819 46829 46831 46853 46861 46867 46877 46889 46901 46919 46933 46957 46993 46997 47017 47041 47051 47057 47059 47087 47093 47111 47119 47123 47129 47137 47143 47147 47149 47161 47189 47207 47221 47237 47251 47269 47279 47287 47293 47297 47303 47309 47317 47339 47351 47353 47363 47381 47387 47389 47407 47417 47419 47431 47441 47459 47491 47497 47501 47507 47513 47521 47527 47533 47543 47563 47569 47581 47591 47599 47609 47623 47629 47639 47653 47657 47659 47681 47699 47701 47711 47713 47717 47737 47741 47743 47777 47779 47791 47797 47807 47809 47819 47837 47843 47857 47869 47881 47903 47911 47917 47933 47939 47947 47951 47963 47969 47977 47981 48017 48023 48029 48049 48073 48079 48091 48109 48119 48121 48131 48157 48163 48179 48187 48193 48197 48221 48239 48247 48259 48271 48281 48299 48311 48313 48337 48341 48353 48371 48383 48397 48407 48409 48413 48437 48449 48463 48473 48479 48481 48487 48491 48497 48523 48527 48533 48539 48541 48563 48571 48589 48593 48611 48619 48623 48647 48649 48661 48673 48677 48679 48731 48733 48751 48757 48761 48767 48779 48781 48787 48799 48809 48817 48821 48823 48847 48857 48859 48869 48871 48883 48889 48907 48947 48953 48973 48989 48991 49003 49009 49019 49031 49033 49037 49043 49057 49069 49081 49103 49109 49117 49121 49123 49139 49157 49169 49171 49177 49193 49199 49201 49207 49211 49223 49253 49261 49277 49279 49297 49307 49331 49333 49339 49363 49367 49369 49391 49393 49409 49411 49417 49429 49433 49451 49459 49463 49477 49481 49499 49523 49529 49531 49537 49547 49549 49559 49597 49603 49613 49627 49633 49639 49663 49667 49669 49681 49697 49711 49727 49739 49741 49747 49757 49783 49787 49789 49801 49807 49811 49823 49831 49843 49853 49871 49877 49891 49919 49921 49927 49937 49939 49943 49957 49991 49993 49999 diff --git a/testsuite/tests/misc/sorts.ml b/testsuite/tests/misc/sorts.ml new file mode 100644 index 00000000..9aea6239 --- /dev/null +++ b/testsuite/tests/misc/sorts.ml @@ -0,0 +1,4479 @@ +(* Test bench for sorting algorithms. *) + + +(* + ocamlopt -noassert sorts.ml -cclib -lunix +*) + +open Printf;; + +(* + Criteres: + 0. overhead en pile: doit etre logn au maximum. + 1. stable ou non. + 2. overhead en espace. + 3. vitesse. +*) + +(************************************************************************) +(* auxiliary functions *) + +let rec exp2 n = if n <= 0 then 1 else 2 * exp2 (n-1);; +let id x = x;; +let postl x y = Array.of_list y;; +let posta x y = x;; + +let mkconst n = Array.make n 0;; +let chkconst _ n a = (a = mkconst n);; + +let mksorted n = + let a = Array.make n 0 in + for i = 0 to n - 1 do + a.(i) <- i; + done; + a +;; +let chksorted _ n a = (a = mksorted n);; + +let mkrev n = + let a = Array.make n 0 in + for i = 0 to n - 1 do + a.(i) <- n - 1 - i; + done; + a +;; +let chkrev _ n a = (a = mksorted n);; + +let seed = ref 0;; +let random_reinit () = Random.init !seed;; + +let random_get_state () = + let a = Array.make 55 0 in + for i = 0 to 54 do a.(i) <- Random.bits (); done; + Random.full_init a; + a +;; +let random_set_state a = Random.full_init a;; + +let chkgen mke cmp rstate n a = + let marks = Array.make n (-1) in + let skipmarks l = + if marks.(l) = -1 then l else begin + let m = ref marks.(l) in + while marks.(!m) <> -1 do incr m; done; + marks.(l) <- !m; + !m + end + in + let linear e l = + let l = skipmarks l in + let rec loop l = + if cmp a.(l) e > 0 then raise Exit + else if e = a.(l) then marks.(l) <- l+1 + else loop (l+1) + in loop l + in + let rec dicho e l r = + if l = r then linear e l + else begin + assert (l < r); + let m = (l + r) / 2 in + if cmp a.(m) e >= 0 then dicho e l m else dicho e (m + 1) r + end + in + try + for i = 0 to n-2 do if cmp a.(i) a.(i+1) > 0 then raise Exit; done; + random_set_state rstate; + for i = 0 to n-1 do dicho (mke i) 0 (Array.length a - 1); done; + true + with Exit | Invalid_argument _ -> false; +;; + +let mkrand_dup n = + let a = Array.make n 0 in + for i = 0 to (n-1) do a.(i) <- Random.int n; done; + a +;; + +let chkrand_dup rstate n a = + chkgen (fun i -> Random.int n) compare rstate n a +;; + +let mkrand_nodup n = + let a = Array.make n 0 in + for i = 0 to (n-1) do a.(i) <- Random.bits (); done; + a +;; + +let chkrand_nodup rstate n a = + chkgen (fun i -> Random.bits ()) compare rstate n a +;; + +let mkfloats n = + let a = Array.make n 0.0 in + for i = 0 to (n-1) do a.(i) <- Random.float 1.0; done; + a +;; + +let chkfloats rstate n a = + chkgen (fun i -> Random.float 1.0) compare rstate n a +;; + +type record = { + s1 : string; + s2 : string; + i1 : int; + i2 : int; +};; + +let rand_string () = + let len = Random.int 10 in + let s = String.create len in + for i = 0 to len-1 do + s.[i] <- Char.chr (Random.int 256); + done; + s +;; + +let mkrec1 b i = { + s1 = rand_string (); + s2 = rand_string (); + i1 = Random.int b; + i2 = i; +};; + +let mkrecs b n = Array.init n (mkrec1 b);; + +let mkrec1_rev b i = { + s1 = rand_string (); + s2 = rand_string (); + i1 = - i; + i2 = i; +};; + +let mkrecs_rev n = Array.init n (mkrec1_rev 0);; + +let cmpstr r1 r2 = + let c1 = compare r1.s1 r2.s1 in + if c1 = 0 then compare r1.s2 r2.s2 else c1 +;; +let lestr r1 r2 = + let c1 = compare r1.s1 r2.s1 in + if c1 = 0 then r1.s2 <= r2.s2 else (c1 < 0) +;; +let chkstr b rstate n a = chkgen (mkrec1 b) cmpstr rstate n a;; + +let cmpint r1 r2 = compare r1.i1 r2.i1;; +let leint r1 r2 = r1.i1 <= r2.i1;; +let chkint b rstate n a = chkgen (mkrec1 b) cmpint rstate n a;; + +let cmplex r1 r2 = + let c1 = compare r1.i1 r2.i1 in + if c1 = 0 then compare r1.i2 r2.i2 else c1 +;; +let lelex r1 r2 = + let c1 = compare r1.i1 r2.i1 in + if c1 = 0 then r1.i2 <= r2.i2 else (c1 < 0) +;; +let chklex b rstate n a = chkgen (mkrec1 b) cmplex rstate n a;; + +(************************************************************************) + +let lens = [ + 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 28; + 100; 127; 128; 129; 191; 192; 193; 506; + 1000; 1023; 1024; 1025; 1535; 1536; 1537; 2323; + 4000; 4094; 4096; 4098; 5123; +];; + +type ('a, 'b, 'c, 'd) aux = { + prepf : ('a -> 'a -> int) -> ('a -> 'a -> bool) -> 'b; + prepd : 'a array -> 'c; + postd : 'a array -> 'd -> 'a array; +};; + +let ll = { prepf = (fun x y -> y); prepd = Array.to_list; postd = postl };; +let lc = { prepf = (fun x y -> x); prepd = Array.to_list; postd = postl };; +let al = { prepf = (fun x y -> y); prepd = id; postd = posta };; +let ac = { prepf = (fun x y -> x); prepd = id; postd = posta };; + +type 'a outcome = Value of 'a | Exception of exn;; + +let numfailed = ref 0;; + +let test1 name f prepdata postdata cmp desc mk chk = + random_reinit (); + printf " %s with %s" name desc; + let i = ref 0 in + List.iter (fun n -> + if !i = 0 then printf "\n "; incr i; if !i > 11 then i := 0; + printf "%5d" n; flush stdout; + let rstate = random_get_state () in + let a = mk n in + let input = prepdata a in + let output = try Value (f cmp input) with e -> Exception e in + printf "."; flush stdout; + begin match output with + | Value v -> + if not (chk rstate n (postdata a v)) + then (incr numfailed; printf "\n*** FAIL\n") + | Exception e -> + incr numfailed; printf "\n*** %s\n" (Printexc.to_string e) + end; + flush stdout; + ) lens; + printf "\n"; +;; + +let test name stable f1 f2 aux1 aux2 = + printf "Testing %s...\n" name; + let t a b c d = test1 name f1 aux1.prepd aux1.postd a b c d in + let cmp = aux1.prepf compare (<=) in + t cmp "constant ints" mkconst chkconst; + t cmp "sorted ints" mksorted chksorted; + t cmp "reverse-sorted ints" mkrev chkrev; + t cmp "random ints (many dups)" mkrand_dup chkrand_dup; + t cmp "random ints (few dups)" mkrand_nodup chkrand_nodup; +(* + let t a b c d = test1 name f3 aux3.prepd aux3.postd a b c d in + t cmp "random floats" mkfloats chkfloats; +*) + let t a b c d = test1 name f2 aux2.prepd aux2.postd a b c d in + let cmp = aux2.prepf cmpstr lestr in + t cmp "records (str)" (mkrecs 1) (chkstr 1); + let cmp = aux2.prepf cmpint leint in + List.iter (fun m -> t cmp (sprintf "records (int[%d])" m) (mkrecs m) + (chkint m) + ) [1; 10; 100; 1000]; + if stable then + List.iter (fun m -> t cmp (sprintf "records (int[%d]) [stable]" m) + (mkrecs m) (chklex m) + ) [1; 10; 100; 1000]; +;; + +(************************************************************************) + +(* Warning: rpt_timer cannot be used for the array sorts because + the sorting functions have effects. +*) + +let rpt_timer1 repeat f x = + Gc.compact (); + ignore (f x); + let st = Sys.time () in + for i = 1 to repeat do ignore (f x); done; + let en = Sys.time () in + en -. st +;; + +let rpt_timer f x = + let repeat = ref 1 in + let t = ref (rpt_timer1 !repeat f x) in + while !t < 0.2 do + repeat := 10 * !repeat; + t := rpt_timer1 !repeat f x; + done; + if !t < 2.0 then begin + repeat := (int_of_float (10. *. (float !repeat) /. !t) + 1); + t := rpt_timer1 !repeat f x; + end; + !t /. (float !repeat) +;; + +let timer f x = + let st = Sys.time () in + ignore (f x); + let en = Sys.time () in + (en -. st) +;; + +let table1 limit f mkarg = + printf " %10s %9s %9s %9s %9s %9s\n" "n" "t1" "t2" "t3" "t4" "t5"; + let sz = ref 49151 in + while !sz < int_of_float (2. ** float limit) do + begin try + printf " %10d " !sz; flush stdout; + for i = 0 to 4 do + let arg = mkarg !sz in + let t = timer f arg in + printf " %.2e " t; flush stdout; + done; + printf "\n"; + with e -> printf "*** %s\n" (Printexc.to_string e); + end; + flush stdout; + sz := 2 * !sz + 1; + done; +;; + +let table2 limit f mkarg = + printf " %10s %9s %9s %9s %9s %9s\n" + " n" "t" "t/n" "t/nlogn" "t/nlog^2n" "t/n^2"; + let sz = ref 49151 in + while float !sz < 2. ** float limit do + begin try + printf " %10d " !sz; flush stdout; + Gc.compact (); + let arg = mkarg !sz in + let t = timer f arg in + let n = float !sz in + let logn = log (float !sz) /. log 2. in + printf "%.2e %.2e %.2e %.2e %.2e\n" + t (t/.n) (t/.n/.logn) (t/.n/.logn/.logn) (t/.n/.n); + with e -> printf "*** %s\n" (Printexc.to_string e); + end; + flush stdout; + sz := 2 * !sz + 1; + done; +;; + +let table3 limit f mkarg = + printf " %10s %9s %9s %9s %9s %9s\n" "n" "t1" "t2" "t3" "t4" "t5"; + let sz = ref 2 in + while float !sz < 2. ** float limit do + begin try + printf " %10d " !sz; flush stdout; + for i = 0 to 4 do + let arg = mkarg !sz in + let t = rpt_timer f arg in + printf " %.2e " t; flush stdout; + done; + printf "\n"; + with e -> printf "*** %s\n" (Printexc.to_string e); + end; + flush stdout; + sz := 2 * !sz + 1; + done; +;; + +(************************************************************************) + +(* benchmarks: + 1a. random records, sorted with two keys + 1b. random integers + 1c. random floats + + 2a. integers, constant + 2b. integers, already sorted + 2c. integers, reverse sorted + + only for short lists: + 3a. random records, sorted with two keys + 3b. random integers + 3c. random floats +*) +let bench1a limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + random_reinit (); + + printf "\n%s with random records [10]:\n" name; + let cmp = aux.prepf cmplex lelex in + table1 limit (f cmp) (fun n -> aux.prepd (mkrecs 10 n)); +;; + +let bench1b limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + random_reinit (); + + printf "\n%s with random integers:\n" name; + let cmp = aux.prepf (-) (<=) in + table1 limit (f cmp) (fun n -> aux.prepd (mkrand_nodup n)); +;; + +let bench1c limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + random_reinit (); + + printf "\n%s with random floats:\n" name; + let cmp = aux.prepf compare (<=) in + table1 limit (f cmp) (fun n -> aux.prepd (mkfloats n)); +;; + +let bench2 limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + printf "\n%s with constant integers:\n" name; + let cmp = aux.prepf compare (<=) in + table2 limit (f cmp) (fun n -> aux.prepd (mkconst n)); + + printf "\n%s with sorted integers:\n" name; + let cmp = aux.prepf compare (<=) in + table2 limit (f cmp) (fun n -> aux.prepd (mksorted n)); + + printf "\n%s with reverse-sorted integers:\n" name; + let cmp = aux.prepf compare (<=) in + table2 limit (f cmp) (fun n -> aux.prepd (mkrev n)); +;; + +let bench3a limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + random_reinit (); + + printf "\n%s with random records [10]:\n" name; + let cmp = aux.prepf cmplex lelex in + table3 limit (f cmp) (fun n -> aux.prepd (mkrecs 10 n)); +;; + +let bench3b limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + random_reinit (); + + printf "\n%s with random integers:\n" name; + let cmp = aux.prepf (-) (<=) in + table3 limit (f cmp) (fun n -> aux.prepd (mkrand_nodup n)); +;; + +let bench3c limit name f aux = + + (* Don't do benchmarks with assertions enabled. *) + assert (not true); + + random_reinit (); + + printf "\n%s with random floats:\n" name; + let cmp = aux.prepf compare (<=) in + table3 limit (f cmp) (fun n -> aux.prepd (mkfloats n)); +;; + +(************************************************************************) +(* merge sort on lists *) + +(* FIXME to do: cutoff + to do: cascader les pattern-matchings (enlever les paires) + to do: fermeture intermediaire pour merge +*) +let (@@) = List.rev_append;; + +let lmerge_1a cmp l = + let rec init accu = function + | [] -> accu + | e::rest -> init ([e] :: accu) rest + in + let rec merge rest accu2 accu l1 l2 = (* l1,l2,rest are forward; + accu,accu2 are rev *) + match l1, l2 with + | [] , _ -> mergepairs ((l2 @@ accu)::accu2) rest + | _ , [] -> mergepairs ((l1 @@ accu)::accu2) rest + | h1::t1, h2::t2 -> if cmp h1 h2 <= 0 + then merge rest accu2 (h1::accu) t1 l2 + else merge rest accu2 (h2::accu) l1 t2 + and merge_rev rest accu2 accu l1 l2 = (* accu, accu2 are forward; + l1,l2,rest are rev *) + match l1, l2 with + | [] , _ -> mergepairs_rev ((l2 @@ accu)::accu2) rest + | _ , [] -> mergepairs_rev ((l1 @@ accu)::accu2) rest + | h1::t1, h2::t2 -> if cmp h2 h1 <= 0 + then merge_rev rest accu2 (h1::accu) t1 l2 + else merge_rev rest accu2 (h2::accu) l1 t2 + and mergepairs accu = function (* accu is rev, arg is forward *) + | [] -> mergeall_rev accu + | [l] -> mergeall_rev ((List.rev l)::accu) + | l1::l2::rest -> merge rest accu [] l1 l2 + and mergepairs_rev accu = function (* accu is forward, arg is rev *) + | [] -> mergeall accu + | [l] -> mergeall ((List.rev l)::accu) + | l1::l2::rest -> merge_rev rest accu [] l1 l2 + and mergeall = function (* arg is forward *) + | [] -> [] + | [l] -> l + | llist -> mergepairs [] llist + and mergeall_rev = function (* arg is rev *) + | [] -> [] + | [l] -> List.rev l + | llist -> mergepairs_rev [] llist + in + mergeall_rev (init [] l) +;; + +let lmerge_1b cmp l = + let rec init accu = function + | [] -> accu + | [e] -> [e] :: accu + | e1::e2::rest -> + init ((if cmp e1 e2 <= 0 then [e2;e1] else [e1;e2])::accu) rest + in + let rec merge rest accu2 accu l1 l2 = (* l1,l2,rest are forward; + accu,accu2 are rev *) + match l1, l2 with + | [] , _ -> mergepairs ((l2 @@ accu)::accu2) rest + | _ , [] -> mergepairs ((l1 @@ accu)::accu2) rest + | h1::t1, h2::t2 -> if cmp h1 h2 <= 0 + then merge rest accu2 (h1::accu) t1 l2 + else merge rest accu2 (h2::accu) l1 t2 + and merge_rev rest accu2 accu l1 l2 = (* accu, accu2 are forward; + l1,l2,rest are rev *) + match l1, l2 with + | [] , _ -> mergepairs_rev ((l2 @@ accu)::accu2) rest + | _ , [] -> mergepairs_rev ((l1 @@ accu)::accu2) rest + | h1::t1, h2::t2 -> if cmp h2 h1 <= 0 + then merge_rev rest accu2 (h1::accu) t1 l2 + else merge_rev rest accu2 (h2::accu) l1 t2 + and mergepairs accu = function (* accu is rev, arg is forward *) + | [] -> mergeall_rev accu + | [l] -> mergeall_rev ((List.rev l)::accu) + | l1::l2::rest -> merge rest accu [] l1 l2 + and mergepairs_rev accu = function (* accu is forward, arg is rev *) + | [] -> mergeall accu + | [l] -> mergeall ((List.rev l)::accu) + | l1::l2::rest -> merge_rev rest accu [] l1 l2 + and mergeall = function (* arg is forward *) + | [] -> [] + | [l] -> l + | llist -> mergepairs [] llist + and mergeall_rev = function (* arg is rev *) + | [] -> [] + | [l] -> List.rev l + | llist -> mergepairs_rev [] llist + in + mergeall_rev (init [] l) +;; + +let lmerge_1c cmp l = + let rec init accu = function + | [] -> accu + | [e] -> [e] :: accu + | e1::e2::rest -> + init ((if cmp e1 e2 <= 0 then [e2;e1] else [e1;e2])::accu) rest + in + let rec merge rest accu2 accu l1 l2 = (* l1,l2,rest are forward; + accu,accu2 are rev *) + match l1 with + | [] -> mergepairs ((l2 @@ accu)::accu2) rest + | h1::t1 -> + match l2 with + | [] -> mergepairs ((l1 @@ accu)::accu2) rest + | h2::t2 -> if cmp h1 h2 <= 0 + then merge rest accu2 (h1::accu) t1 l2 + else merge rest accu2 (h2::accu) l1 t2 + and merge_rev rest accu2 accu l1 l2 = (* accu, accu2 are forward; + l1,l2,rest are rev *) + match l1 with + | [] -> mergepairs_rev ((l2 @@ accu)::accu2) rest + | h1::t1 -> + match l2 with + | [] -> mergepairs_rev ((l1 @@ accu)::accu2) rest + | h2::t2 -> if cmp h2 h1 <= 0 + then merge_rev rest accu2 (h1::accu) t1 l2 + else merge_rev rest accu2 (h2::accu) l1 t2 + and mergepairs accu = function (* accu is rev, arg is forward *) + | [] -> mergeall_rev accu + | [l] -> mergeall_rev ((List.rev l)::accu) + | l1::l2::rest -> merge rest accu [] l1 l2 + and mergepairs_rev accu = function (* accu is forward, arg is rev *) + | [] -> mergeall accu + | [l] -> mergeall ((List.rev l)::accu) + | l1::l2::rest -> merge_rev rest accu [] l1 l2 + and mergeall = function (* arg is forward *) + | [] -> [] + | [l] -> l + | llist -> mergepairs [] llist + and mergeall_rev = function (* arg is rev *) + | [] -> [] + | [l] -> List.rev l + | llist -> mergepairs_rev [] llist + in + mergeall_rev (init [] l) +;; + +let lmerge_1d cmp l = + let rec init accu = function + | [] -> accu + | [e] -> [e] :: accu + | e1::e2::rest -> + init ((if cmp e1 e2 <= 0 then [e2;e1] else [e1;e2])::accu) rest + in + let rec merge rest accu2 accu l1 l2 = (* l1,l2,rest are forward; + accu,accu2 are rev *) + let merge_rest_accu2 accu l1 l2 = + match l1 with + | [] -> mergepairs ((l2 @@ accu)::accu2) rest + | h1::t1 -> + match l2 with + | [] -> mergepairs ((l1 @@ accu)::accu2) rest + | h2::t2 -> if cmp h1 h2 <= 0 + then merge rest accu2 (h1::accu) t1 l2 + else merge rest accu2 (h2::accu) l1 t2 + in merge_rest_accu2 accu l1 l2 + and merge_rev rest accu2 accu l1 l2 = (* accu, accu2 are forward; + l1,l2,rest are rev *) + let merge_rev_rest_accu2 accu l1 l2 = + match l1 with + | [] -> mergepairs_rev ((l2 @@ accu)::accu2) rest + | h1::t1 -> + match l2 with + | [] -> mergepairs_rev ((l1 @@ accu)::accu2) rest + | h2::t2 -> if cmp h2 h1 <= 0 + then merge_rev rest accu2 (h1::accu) t1 l2 + else merge_rev rest accu2 (h2::accu) l1 t2 + in merge_rev_rest_accu2 accu l1 l2 + and mergepairs accu = function (* accu is rev, arg is forward *) + | [] -> mergeall_rev accu + | [l] -> mergeall_rev ((List.rev l)::accu) + | l1::l2::rest -> merge rest accu [] l1 l2 + and mergepairs_rev accu = function (* accu is forward, arg is rev *) + | [] -> mergeall accu + | [l] -> mergeall ((List.rev l)::accu) + | l1::l2::rest -> merge_rev rest accu [] l1 l2 + and mergeall = function (* arg is forward *) + | [] -> [] + | [l] -> l + | llist -> mergepairs [] llist + and mergeall_rev = function (* arg is rev *) + | [] -> [] + | [l] -> List.rev l + | llist -> mergepairs_rev [] llist + in + mergeall_rev (init [] l) +;; + +(************************************************************************) +(* merge sort on lists, user-contributed (NOT STABLE) *) + +(* BEGIN code contributed by Yann Coscoy *) + + let rec rev_merge_append order l1 l2 acc = + match l1 with + [] -> List.rev_append l2 acc + | h1 :: t1 -> + match l2 with + [] -> List.rev_append l1 acc + | h2 :: t2 -> + if order h1 h2 + then rev_merge_append order t1 l2 (h1::acc) + else rev_merge_append order l1 t2 (h2::acc) + + let rev_merge order l1 l2 = rev_merge_append order l1 l2 [] + + let rec rev_merge_append' order l1 l2 acc = + match l1 with + | [] -> List.rev_append l2 acc + | h1 :: t1 -> + match l2 with + | [] -> List.rev_append l1 acc + | h2 :: t2 -> + if order h2 h1 + then rev_merge_append' order t1 l2 (h1::acc) + else rev_merge_append' order l1 t2 (h2::acc) + + let rev_merge' order l1 l2 = rev_merge_append' order l1 l2 [] + + let lmerge_3 order l = + let rec initlist l acc = match l with + | e1::e2::rest -> + initlist rest + ((if order e1 e2 then [e1;e2] else [e2;e1])::acc) + | [e] -> [e]::acc + | [] -> acc + in + let rec merge2 ll acc = match ll with + | [] -> acc + | [l] -> [List.rev l]@acc + | l1::l2::rest -> + merge2 rest (rev_merge order l1 l2::acc) + in + let rec merge2' ll acc = match ll with + | [] -> acc + | [l] -> [List.rev l]@acc + | l1::l2::rest -> + merge2' rest (rev_merge' order l1 l2::acc) + in + let rec mergeall rev = function + | [] -> [] + | [l] -> if rev then List.rev l else l + | llist -> + mergeall + (not rev) ((if rev then merge2' else merge2) llist []) + in + mergeall false (initlist l []) + +(* END code contributed by Yann Coscoy *) + +(************************************************************************) +(* merge sort on short lists, Francois Pottier *) + +(* BEGIN code contributed by Francois Pottier *) + + (* [chop k l] returns the list [l] deprived of its [k] first + elements. The length of the list [l] must be [k] at least. *) + + let rec chop k l = + match k, l with + | 0, _ -> l + | _, x :: l -> chop (k-1) l + | _, _ -> assert false + ;; + + let rec merge order l1 l2 = + match l1 with + [] -> l2 + | h1 :: t1 -> + match l2 with + [] -> l1 + | h2 :: t2 -> + if order h1 h2 + then h1 :: merge order t1 l2 + else h2 :: merge order l1 t2 + ;; + + let rec lmerge_4a order l = + match l with + | [] + | [ _ ] -> l + | _ -> + let rec sort k l = (* k > 1 *) + match k, l with + | 2, x1 :: x2 :: _ -> + if order x1 x2 then [ x1; x2 ] else [ x2; x1 ] + | 3, x1 :: x2 :: x3 :: _ -> + if order x1 x2 then + if order x2 x3 then + [ x1 ; x2 ; x3 ] + else + if order x1 x3 then [ x1 ; x3 ; x2 ] else [ x3; x1; x2 ] + else + if order x1 x3 then + [ x2; x1; x3 ] + else + if order x2 x3 then [ x2; x3; x1 ] else [ x3; x2; x1 ] + | _, _ -> + let k1 = k / 2 in + let k2 = k - k1 in + merge order (sort k1 l) (sort k2 (chop k1 l)) + in + sort (List.length l) l + ;; +(* END code contributed by Francois Pottier *) + +(************************************************************************) +(* merge sort on short lists, Francois Pottier, + adapted to new-style interface *) + +(* BEGIN code contributed by Francois Pottier *) + + (* [chop k l] returns the list [l] deprived of its [k] first + elements. The length of the list [l] must be [k] at least. *) + + let rec chop k l = + match k, l with + | 0, _ -> l + | _, x :: l -> chop (k-1) l + | _, _ -> assert false + ;; + + let rec merge order l1 l2 = + match l1 with + [] -> l2 + | h1 :: t1 -> + match l2 with + [] -> l1 + | h2 :: t2 -> + if order h1 h2 <= 0 + then h1 :: merge order t1 l2 + else h2 :: merge order l1 t2 + ;; + + let rec lmerge_4b order l = + match l with + | [] + | [ _ ] -> l + | _ -> + let rec sort k l = (* k > 1 *) + match k, l with + | 2, x1 :: x2 :: _ -> + if order x1 x2 <= 0 then [ x1; x2 ] else [ x2; x1 ] + | 3, x1 :: x2 :: x3 :: _ -> + if order x1 x2 <= 0 then + if order x2 x3 <= 0 then + [ x1 ; x2 ; x3 ] + else + if order x1 x3 <= 0 then [ x1 ; x3 ; x2 ] else [ x3; x1; x2 ] + else + if order x1 x3 <= 0 then + [ x2; x1; x3 ] + else + if order x2 x3 <= 0 then [ x2; x3; x1 ] else [ x3; x2; x1 ] + | _, _ -> + let k1 = k / 2 in + let k2 = k - k1 in + merge order (sort k1 l) (sort k2 (chop k1 l)) + in + sort (List.length l) l + ;; +(* END code contributed by Francois Pottier *) + +(************************************************************************) +(* merge sort on short lists a la Pottier, modified merge *) + +let rec chop k l = + if k = 0 then l else begin + match l with + | x::t -> chop (k-1) t + | _ -> assert false + end +;; + +let lmerge_4c cmp l = + let rec merge1 h1 t1 l2 = + match l2 with + | [] -> h1 :: t1 + | h2 :: t2 -> + if cmp h1 h2 <= 0 + then h1 :: (merge2 t1 h2 t2) + else h2 :: (merge1 h1 t1 t2) + and merge2 l1 h2 t2 = + match l1 with + | [] -> h2 :: t2 + | h1 :: t1 -> + if cmp h1 h2 <= 0 + then h1 :: (merge2 t1 h2 t2) + else h2 :: (merge1 h1 t1 t2) + in + let merge l1 = function + | [] -> l1 + | h2 :: t2 -> merge2 l1 h2 t2 + in + let rec sort n l = + match n, l with + | 2, x1 :: x2 :: _ -> + if cmp x1 x2 <= 0 then [x1; x2] else [x2; x1] + | 3, x1 :: x2 :: x3 :: _ -> + if cmp x1 x2 <= 0 then begin + if cmp x2 x3 <= 0 then [x1; x2; x3] + else if cmp x1 x3 <= 0 then [x1; x3; x2] + else [x3; x1; x2] + end else begin + if cmp x1 x3 <= 0 then [x2; x1; x3] + else if cmp x2 x3 <= 0 then [x2; x3; x1] + else [x3; x2; x1] + end + | n, l -> + let n1 = n asr 1 in + let n2 = n - n1 in + merge (sort n1 l) (sort n2 (chop n1 l)) + in + let len = List.length l in + if len < 2 then l else sort len l +;; + +(************************************************************************) +(* merge sort on short lists a la Pottier, logarithmic stack space *) + +let rec chop k l = + if k = 0 then l else begin + match l with + | x::t -> chop (k-1) t + | _ -> assert false + end +;; + +let lmerge_4d cmp l = + let rec rev_merge l1 l2 accu = + match l1, l2 with + | [], l2 -> l2 @@ accu + | l1, [] -> l1 @@ accu + | h1::t1, h2::t2 -> + if cmp h1 h2 <= 0 + then rev_merge t1 l2 (h1::accu) + else rev_merge l1 t2 (h2::accu) + in + let rec rev_merge_rev l1 l2 accu = + match l1, l2 with + | [], l2 -> l2 @@ accu + | l1, [] -> l1 @@ accu + | h1::t1, h2::t2 -> + if cmp h1 h2 > 0 + then rev_merge_rev t1 l2 (h1::accu) + else rev_merge_rev l1 t2 (h2::accu) + in + let rec sort n l = + match n, l with + | 2, x1 :: x2 :: _ -> + if cmp x1 x2 <= 0 then [x1; x2] else [x2; x1] + | 3, x1 :: x2 :: x3 :: _ -> + if cmp x1 x2 <= 0 then begin + if cmp x2 x3 <= 0 then [x1; x2; x3] + else if cmp x1 x3 <= 0 then [x1; x3; x2] + else [x3; x1; x2] + end else begin + if cmp x1 x3 <= 0 then [x2; x1; x3] + else if cmp x2 x3 <= 0 then [x2; x3; x1] + else [x3; x2; x1] + end + | n, l -> + let n1 = n asr 1 in + let n2 = n - n1 in + rev_merge_rev (rev_sort n1 l) (rev_sort n2 (chop n1 l)) [] + and rev_sort n l = + match n, l with + | 2, x1 :: x2 :: _ -> + if cmp x1 x2 > 0 then [x1; x2] else [x2; x1] + | 3, x1 :: x2 :: x3 :: _ -> + if cmp x1 x2 > 0 then begin + if cmp x2 x3 > 0 then [x1; x2; x3] + else if cmp x1 x3 > 0 then [x1; x3; x2] + else [x3; x1; x2] + end else begin + if cmp x1 x3 > 0 then [x2; x1; x3] + else if cmp x2 x3 > 0 then [x2; x3; x1] + else [x3; x2; x1] + end + | n, l -> + let n1 = n asr 1 in + let n2 = n - n1 in + rev_merge (sort n1 l) (sort n2 (chop n1 l)) [] + in + let len = List.length l in + if len < 2 then l else sort len l +;; + + +(************************************************************************) +(* merge sort on short lists a la Pottier, logarithmic stack space, + in place: input list is freed as the output is being computed. *) + +let rec chop k l = + if k = 0 then l else begin + match l with + | x::t -> chop (k-1) t + | _ -> assert false + end +;; + +let lmerge_4e cmp l = + let rec rev_merge l1 l2 accu = + match l1, l2 with + | [], l2 -> l2 @@ accu + | l1, [] -> l1 @@ accu + | h1::t1, h2::t2 -> + if cmp h1 h2 <= 0 + then rev_merge t1 l2 (h1::accu) + else rev_merge l1 t2 (h2::accu) + in + let rec rev_merge_rev l1 l2 accu = + match l1, l2 with + | [], l2 -> l2 @@ accu + | l1, [] -> l1 @@ accu + | h1::t1, h2::t2 -> + if cmp h1 h2 > 0 + then rev_merge_rev t1 l2 (h1::accu) + else rev_merge_rev l1 t2 (h2::accu) + in + let rec sort n l = + match n, l with + | 2, x1 :: x2 :: _ -> + if cmp x1 x2 <= 0 then [x1; x2] else [x2; x1] + | 3, x1 :: x2 :: x3 :: _ -> + if cmp x1 x2 <= 0 then begin + if cmp x2 x3 <= 0 then [x1; x2; x3] + else if cmp x1 x3 <= 0 then [x1; x3; x2] + else [x3; x1; x2] + end else begin + if cmp x1 x3 <= 0 then [x2; x1; x3] + else if cmp x2 x3 <= 0 then [x2; x3; x1] + else [x3; x2; x1] + end + | n, l -> + let n1 = n asr 1 in + let n2 = n - n1 in + let l2 = chop n1 l in + let s1 = rev_sort n1 l in + let s2 = rev_sort n2 l2 in + rev_merge_rev s1 s2 [] + and rev_sort n l = + match n, l with + | 2, x1 :: x2 :: _ -> + if cmp x1 x2 > 0 then [x1; x2] else [x2; x1] + | 3, x1 :: x2 :: x3 :: _ -> + if cmp x1 x2 > 0 then begin + if cmp x2 x3 > 0 then [x1; x2; x3] + else if cmp x1 x3 > 0 then [x1; x3; x2] + else [x3; x1; x2] + end else begin + if cmp x1 x3 > 0 then [x2; x1; x3] + else if cmp x2 x3 > 0 then [x2; x3; x1] + else [x3; x2; x1] + end + | n, l -> + let n1 = n asr 1 in + let n2 = n - n1 in + let l2 = chop n1 l in + let s1 = sort n1 l in + let s2 = sort n2 l2 in + rev_merge s1 s2 [] + in + let len = List.length l in + if len < 2 then l else sort len l +;; + +(************************************************************************) +(* chop-free version of Pottier's code, binary version *) + +let rec merge cmp l1 l2 = + match l1, l2 with + | [], l2 -> l2 + | l1, [] -> l1 + | h1 :: t1, h2 :: t2 -> + if cmp h1 h2 <= 0 + then h1 :: merge cmp t1 l2 + else h2 :: merge cmp l1 t2 +;; + +let lmerge_5a cmp l = + let rem = ref l in + let rec sort_prefix n = + if n <= 1 then begin + match !rem with + | [] -> [] + | [x] as l -> rem := []; l + | x::y::t -> rem := t; if cmp x y <= 0 then [x;y] else [y;x] + end else if !rem = [] then [] + else begin + let l1 = sort_prefix (n-1) in + let l2 = sort_prefix (n-1) in + merge cmp l1 l2 + end + in + let len = ref (List.length l) in + let i = ref 0 in + while !len > 0 do incr i; len := !len lsr 1; done; + sort_prefix !i +;; + +(************************************************************************) +(* chop-free version of Pottier's code, dichotomic version, + ground cases 1 & 2 *) + +let rec merge cmp l1 l2 = + match l1, l2 with + | [], l2 -> l2 + | l1, [] -> l1 + | h1 :: t1, h2 :: t2 -> + if cmp h1 h2 <= 0 + then h1 :: merge cmp t1 l2 + else h2 :: merge cmp l1 t2 +;; + +let lmerge_5b cmp l = + let rem = ref l in + let rec sort_prefix n = + match n, !rem with + | 1, x::t -> rem := t; [x] + | 2, x::y::t -> rem := t; if cmp x y <= 0 then [x;y] else [y;x] + | n, _ -> + let n1 = n/2 in + let n2 = n - n1 in + let l1 = sort_prefix n1 in + let l2 = sort_prefix n2 in + merge cmp l1 l2 + in + let len = List.length l in + if len <= 1 then l else sort_prefix len +;; + +(************************************************************************) +(* chop-free version of Pottier's code, dichotomic version, + ground cases 2 & 3 *) + +let rec merge cmp l1 l2 = + match l1, l2 with + | [], l2 -> l2 + | l1, [] -> l1 + | h1 :: t1, h2 :: t2 -> + if cmp h1 h2 <= 0 + then h1 :: merge cmp t1 l2 + else h2 :: merge cmp l1 t2 +;; + +let lmerge_5c cmp l = + let rem = ref l in + let rec sort_prefix n = + match n, !rem with + | 2, x::y::t -> rem := t; if cmp x y <= 0 then [x;y] else [y;x] + | 3, x::y::z::t -> + rem := t; + if cmp x y <= 0 then + if cmp y z <= 0 then [x; y; z] + else if cmp x z <= 0 then [x; z; y] + else [z; x; y] + else + if cmp x z <= 0 then [y; x; z] + else if cmp y z <= 0 then [y; z; x] + else [z; y; x] + | n, _ -> + let n1 = n/2 in + let n2 = n - n1 in + let l1 = sort_prefix n1 in + let l2 = sort_prefix n2 in + merge cmp l1 l2 + in + let len = List.length l in + if len <= 1 then l else sort_prefix len +;; + +(************************************************************************) +(* chop-free, ref-free version of Pottier's code, dichotomic version, + ground cases 2 & 3, modified merge *) + +let lmerge_5d cmp l = + let rec merge1 h1 t1 l2 = + match l2 with + | [] -> h1::t1 + | h2 :: t2 -> + if cmp h1 h2 <= 0 + then h1 :: merge2 t1 h2 t2 + else h2 :: merge1 h1 t1 t2 + and merge2 l1 h2 t2 = + match l1 with + | [] -> h2::t2 + | h1 :: t1 -> + if cmp h1 h2 <= 0 + then h1 :: merge2 t1 h2 t2 + else h2 :: merge1 h1 t1 t2 + in + let rec sort_prefix n l = + match n, l with + | 2, x::y::t -> ((if cmp x y <= 0 then [x;y] else [y;x]), t) + | 3, x::y::z::t -> + ((if cmp x y <= 0 then + if cmp y z <= 0 then [x; y; z] + else if cmp x z <= 0 then [x; z; y] + else [z; x; y] + else + if cmp x z <= 0 then [y; x; z] + else if cmp y z <= 0 then [y; z; x] + else [z; y; x]), + t) + | n, _ -> + let n1 = n/2 in + let n2 = n - n1 in + let (l1, rest1) = sort_prefix n1 l in + match sort_prefix n2 rest1 with + | (h2::t2, rest2) -> ((merge2 l1 h2 t2), rest2) + | _ -> assert false + in + let len = List.length l in + if len <= 1 then l else fst (sort_prefix len l) +;; + +(************************************************************************) +(* merge sort on arrays, merge with tail-rec function *) + +let amerge_1a cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let rec sortto srcofs dst dstofs len = + assert (len > 0); + if len = 1 then dst.(dstofs) <- a.(srcofs) + else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= 1 then () + else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let amerge_1b cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let rec sortto srcofs dst dstofs len = + assert (len > 0); + if len = 1 then dst.(dstofs) <- a.(srcofs) + else if len = 2 then begin + if cmp a.(srcofs) a.(srcofs+1) <= 0 then begin + dst.(dstofs) <- a.(srcofs); + dst.(dstofs+1) <- a.(srcofs+1); + end else begin + dst.(dstofs) <- a.(srcofs+1); + dst.(dstofs+1) <- a.(srcofs); + end; + end else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= 1 then () + else if l = 2 then begin + if cmp a.(0) a.(1) > 0 then begin + let e = a.(0) in + a.(0) <- a.(1); + a.(1) <- e; + end; + end else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 3;; +let amerge_1c cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 4;; +let amerge_1d cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 5;; +let amerge_1e cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 6;; +let amerge_1f cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 7;; +let amerge_1g cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 8;; +let amerge_1h cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 9;; +let amerge_1i cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 10;; +let amerge_1j cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let src1r = src1ofs + src1len and src2r = src2ofs + src2len in + let rec loop i1 s1 i2 s2 d = + if cmp s1 s2 <= 0 then begin + dst.(d) <- s1; + let i1 = i1 + 1 in + if i1 < src1r then + loop i1 a.(i1) i2 s2 (d + 1) + else + Array.blit src2 i2 dst (d + 1) (src2r - i2) + end else begin + dst.(d) <- s2; + let i2 = i2 + 1 in + if i2 < src2r then + loop i1 s1 i2 src2.(i2) (d + 1) + else + Array.blit a i1 dst (d + 1) (src1r - i1) + end + in loop src1ofs a.(src1ofs) src2ofs src2.(src2ofs) dstofs; + in + let isortto srcofs dst dstofs len = + for i = 0 to len - 1 do + let e = a.(srcofs + i) in + let j = ref (dstofs + i - 1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs + l1) dst (dstofs + l1) l2; + sortto srcofs a (srcofs + l2) l1; + merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs; + end; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +(* FIXME a essayer: *) +(* list->array->list direct et array->list->array direct *) +(* overhead = 1/3, 1/4, etc. *) +(* overhead = sqrt (n) *) +(* overhead = n/3 jusqu'a 30k, 30k jusqu'a 900M, sqrt (n) au-dela *) + +(************************************************************************) +(* merge sort on arrays, merge with loop *) + +(* cutoff = 1 *) +let amerge_3a cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let rec sortto srcofs dst dstofs len = + assert (len > 0); + if len = 1 then dst.(dstofs) <- a.(srcofs) else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= 1 then () else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let amerge_3b cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let rec sortto srcofs dst dstofs len = + assert (len > 0); + if len = 1 then dst.(dstofs) <- a.(srcofs) + else if len = 2 then begin + if cmp a.(srcofs) a.(srcofs+1) <= 0 then begin + dst.(dstofs) <- a.(srcofs); + dst.(dstofs+1) <- a.(srcofs+1); + end else begin + dst.(dstofs) <- a.(srcofs+1); + dst.(dstofs+1) <- a.(srcofs); + end + end else begin + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + end + in + let l = Array.length a in + if l <= 1 then () + else if l = 2 then begin + if cmp a.(0) a.(1) > 0 then begin + let e = a.(0) in + a.(0) <- a.(1); + a.(1) <- e; + end; + end else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 3;; +let amerge_3c cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 4;; +let amerge_3d cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 5;; +let amerge_3e cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 6;; +let amerge_3f cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 7;; +let amerge_3g cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 8;; +let amerge_3h cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 9;; +let amerge_3i cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +let cutoff = 10;; +let amerge_3j cmp a = + let merge src1ofs src1len src2 src2ofs src2len dst dstofs = + let i1 = ref src1ofs + and i2 = ref src2ofs + and d = ref dstofs + and src1r = src1ofs + src1len + and src2r = src2ofs + src2len + in + while !i1 < src1r && !i2 < src2r do + let s1 = a.(!i1) and s2 = src2.(!i2) in + if cmp s1 s2 <= 0 then begin + dst.(!d) <- s1; + incr i1; + end else begin + dst.(!d) <- s2; + incr i2; + end; + incr d; + done; + if !i1 < src1r then + Array.blit a !i1 dst !d (src1r - !i1) + else + Array.blit src2 !i2 dst !d (src2r - !i2) + in + let isortto srcofs dst dstofs len = + for i = 0 to len-1 do + let e = a.(srcofs+i) in + let j = ref (dstofs+i-1) in + while (!j >= dstofs && cmp dst.(!j) e > 0) do + dst.(!j + 1) <- dst.(!j); + decr j; + done; + dst.(!j + 1) <- e; + done; + in + let rec sortto srcofs dst dstofs len = + if len <= cutoff then isortto srcofs dst dstofs len else + let l1 = len / 2 in + let l2 = len - l1 in + sortto (srcofs+l1) dst (dstofs+l1) l2; + sortto srcofs a (srcofs+l2) l1; + merge (srcofs+l2) l1 dst (dstofs+l1) l2 dst dstofs; + in + let l = Array.length a in + if l <= cutoff then isortto 0 a 0 l else begin + let l1 = l / 2 in + let l2 = l - l1 in + let t = Array.make l2 a.(0) in + sortto l1 t 0 l2; + sortto 0 a l2 l1; + merge l2 l1 t 0 l2 a 0; + end; +;; + +(* FIXME essayer bottom-up merge on arrays ? *) + +(************************************************************************) +(* Shell sort on arrays *) + +let ashell_1 cmp a = + let l = Array.length a in + let step = ref 1 in + while !step < l do step := !step * 3 + 1; done; + step := !step / 3; + while !step > 0 do + for j = !step to l-1 do + let e = a.(j) in + let k = ref (j - !step) in + let k1 = ref j in + while !k >= 0 && cmp a.(!k) e > 0 do + a.(!k1) <- a.(!k); + k1 := !k; + k := !k - !step; + done; + a.(!k1) <- e; + done; + step := !step / 3; + done; +;; + +let ashell_2 cmp a = + let l = Array.length a in + let step = ref 1 in + while !step < l do step := !step * 3 + 1; done; + step := !step / 3; + while !step > 0 do + for j = !step to l-1 do + let e = a.(j) in + let k = ref (j - !step) in + while !k >= 0 && cmp a.(!k) e > 0 do + a.(!k + !step) <- a.(!k); + k := !k - !step; + done; + a.(!k + !step) <- e; + done; + step := !step / 3; + done; +;; + +let ashell_3 cmp a = + let l = Array.length a in + let step = ref 1 in + while !step < l do step := !step * 3 + 1; done; + step := !step / 3; + while !step > 0 do + for i = 0 to !step - 1 do + let j = ref (i + !step) in + while !j < l do + let e = ref a.(!j) in + let k = ref (!j - !step) in + if cmp !e a.(i) < 0 then begin + let x = !e in e := a.(i); a.(i) <- x; + end; + while cmp a.(!k) !e > 0 do + a.(!k + !step) <- a.(!k); + k := !k - !step; + done; + a.(!k + !step) <- !e; + j := !j + !step; + done; + done; + step := !step / 3; + done; +;; + +let force = Lazy.force;; + +type iilist = Cons of int * iilist Lazy.t;; + +let rec mult n (Cons (x,l)) = Cons (n*x, lazy (mult n (force l))) + +let rec merge (Cons (x1, t1) as l1) (Cons (x2, t2) as l2) = + if x1 = x2 then Cons (x1, lazy (merge (force t1) (force t2))) + else if x1 < x2 then Cons (x1, lazy (merge (force t1) l2)) + else Cons (x2, lazy (merge l1 (force t2))) +;; + +let rec scale = Cons (1, lazy (merge (mult 2 scale) (mult 3 scale)));; + +let ashell_4 cmp a = + let l = Array.length a in + let rec loop1 accu (Cons (x, t)) = + if x > l then accu else loop1 (x::accu) (force t) + in + let sc = loop1 [] scale in + let rec loop2 = function + | [] -> () + | step::t -> + for i = 0 to step - 1 do + let j = ref (i + step) in + while !j < l do + let e = a.(!j) in + let k = ref (!j - step) in + while !k >= 0 && cmp a.(!k) e > 0 do + a.(!k + step) <- a.(!k); + k := !k - step; + done; + a.(!k + step) <- e; + j := !j + step; + done; + done; + loop2 t; + in + loop2 sc; +;; + +(************************************************************************) +(* Quicksort on arrays *) +let cutoff = 1;; +let aquick_1a cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 2;; +let aquick_1b cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 3;; +let aquick_1c cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 4;; +let aquick_1d cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 5;; +let aquick_1e cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 6;; +let aquick_1f cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 7;; +let aquick_1g cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref (r - 1) in + while !p2 <= !p3 do + let e = a.(!p3) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + end else if c < 0 then begin + a.(!p3) <- a.(!p2); + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + a.(!p3) <- a.(!p2); + a.(!p2) <- e; + incr p2; + end; + done; + incr p3; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 1 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 1;; +let aquick_2a cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 2;; +let aquick_2b cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 3;; +let aquick_2c cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 4;; +let aquick_2d cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 5;; +let aquick_2e cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 6;; +let aquick_2f cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 7;; +let aquick_2g cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end else begin + incr p2; + end; + done; + let len1 = !p1 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p1; qsort !p3 r) + else (qsort !p3 r; qsort l !p1) + end else qsort l !p1 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 1;; +let aquick_3a cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 2;; +let aquick_3b cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 3;; +let aquick_3c cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 4;; +let aquick_3d cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 5;; +let aquick_3e cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 6;; +let aquick_3f cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 7;; +let aquick_3g cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 8;; +let aquick_3h cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 9;; +let aquick_3i cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +let cutoff = 10;; +let aquick_3j cmp a = + let rec qsort l r = (* ASSUMES r - l >= 2 *) + let m = (l + r) / 2 in + let al = a.(l) and am = a.(m) and ar = a.(r - 1) in + let pivot = if cmp al am <= 0 then + if cmp am ar <= 0 then am + else if cmp al ar <= 0 then ar + else al + else + if cmp al ar <= 0 then al + else if cmp am ar <= 0 then ar + else am + in + let p1 = ref l and p2 = ref l and p3 = ref r in + while !p2 < !p3 do + let e = a.(!p2) in + let c = cmp e pivot in + if c > 0 then begin + decr p3; + a.(!p2) <- a.(!p3); + a.(!p3) <- e; + end else if c < 0 then begin + incr p2; + end else begin + a.(!p2) <- a.(!p1); + a.(!p1) <- e; + incr p1; + incr p2; + end + done; + while !p1 > l do + decr p1; + decr p2; + let e = a.(!p1) in a.(!p1) <- a.(!p2); a.(!p2) <- e; + done; + let len1 = !p2 - l and len2 = r - !p3 in + if len1 > cutoff then + if len2 > cutoff then begin + if len1 < len2 + then (qsort l !p2; qsort !p3 r) + else (qsort !p3 r; qsort l !p2) + end else qsort l !p2 + else if len2 > cutoff then qsort !p3 r; + in + let l = Array.length a in + if l > 1 then begin + qsort 0 l; + let mini = ref 0 in + for i = 0 to (min l cutoff) - 1 do + if cmp a.(i) a.(!mini) < 0 then mini := i; + done; + let e = a.(0) in a.(0) <- a.(!mini); a.(!mini) <- e; + for i = 1 to l - 1 do + let e = a.(i) in + let j = ref (i - 1) in + while cmp a.(!j) e > 0 do + a.(!j + 1) <- a.(!j); + decr j; + done; + a.(!j + 1) <- e; + done; + end; +;; + +(************************************************************************) +(* Heap sort on arrays (top-down, ternary) *) + +let aheap_1 cmp a = + let l = ref (Array.length a) in + let l3 = ref ((!l + 1) / 3) in (* l3 is the first element without sons *) + let maxson i = (* ASSUMES i < !l3 *) + let i31 = i+i+i+1 in + let x = ref i31 in + if i31+2 < !l then begin + if cmp a.(i31) a.(i31+1) < 0 then x := i31+1; + if cmp a.(!x) a.(i31+2) < 0 then x := i31+2; + !x + end else begin + if i31+1 < !l && cmp a.(i31) a.(i31+1) < 0 + then i31+1 + else i31 + end + in + let rec trickledown i e = (* ASSUMES i < !l3 *) + let j = maxson i in + if cmp a.(j) e > 0 then begin + a.(i) <- a.(j); + if j < !l3 then trickledown j e else a.(j) <- e; + end else begin + a.(i) <- e; + end; + in + for i = !l3 - 1 downto 0 do trickledown i a.(i); done; + let m = ref (!l + 1 - 3 * !l3) in + while !l > 2 do + decr l; + if !m = 0 then (m := 2; decr l3) else decr m; + let e = a.(!l) in + a.(!l) <- a.(0); + trickledown 0 e; + done; + if !l > 1 then begin let e = a.(1) in a.(1) <- a.(0); a.(0) <- e; end; +;; + +(************************************************************************) +(* Heap sort on arrays (top-down, binary) *) + +(* FIXME essayer application partielle de trickledown (merge avec down) *) +(* FIXME essayer expanser maxson dans trickledown; supprimer l'exception. *) + +let aheap_2 cmp a = + let maxson l i e = + let i21 = i + i + 1 in + if i21 + 1 < l && cmp a.(i21) a.(i21+1) < 0 + then i21 + 1 + else if i21 < l then i21 else (a.(i) <- e; raise Exit) + in + let rec trickledown l i e = + let j = maxson l i e in + if cmp a.(j) e > 0 then begin + a.(i) <- a.(j); + trickledown l j e; + end else begin + a.(i) <- e; + end; + in + let down l i e = try trickledown l i e with Exit -> () in + let l = Array.length a in + for i = l / 2 -1 downto 0 do down l i a.(i); done; + for i = l - 1 downto 1 do + let e = a.(i) in + a.(i) <- a.(0); + down i 0 e; + done; +;; + +(************************************************************************) +(* Heap sort on arrays (bottom-up, ternary) *) + +exception Bottom of int;; + +let aheap_3 cmp a = + let maxson l i = + let i31 = i+i+i+1 in + let x = ref i31 in + if i31+2 < l then begin + if cmp a.(i31) a.(i31+1) < 0 then x := i31+1; + if cmp a.(!x) a.(i31+2) < 0 then x := i31+2; + !x + end else + if i31+1 < l && cmp a.(i31) a.(i31+1) < 0 + then i31+1 + else if i31 < l then i31 else raise (Bottom i) + in + let rec trickledown l i e = + let j = maxson l i in + if cmp a.(j) e > 0 then begin + a.(i) <- a.(j); + trickledown l j e; + end else begin + a.(i) <- e; + end; + in + let rec trickle l i e = try trickledown l i e with Bottom i -> a.(i) <- e in + let rec bubbledown l i = + let j = maxson l i in + a.(i) <- a.(j); + bubbledown l j; + in + let bubble l i = try bubbledown l i with Bottom i -> i in + let rec trickleup i e = + let father = (i - 1) / 3 in + assert (i <> father); + if cmp a.(father) e < 0 then begin + a.(i) <- a.(father); + if father > 0 then trickleup father e else a.(0) <- e; + end else begin + a.(i) <- e; + end; + in + let l = Array.length a in + for i = (l + 1) / 3 - 1 downto 0 do trickle l i a.(i); done; + for i = l - 1 downto 2 do + let e = a.(i) in + a.(i) <- a.(0); + trickleup (bubble i 0) e; + done; + if l > 1 then (let e = a.(1) in a.(1) <- a.(0); a.(0) <- e); +;; + +(************************************************************************) +(* Heap sort on arrays (bottom-up, binary) *) + +let aheap_4 cmp a = + let maxson l i = + let i21 = i + i + 1 in + if i21 + 1 < l && cmp a.(i21) a.(i21 + 1) < 0 + then i21 + 1 + else if i21 < l then i21 else raise (Bottom i) + in + let rec trickledown l i e = + let j = maxson l i in + if cmp a.(j) e > 0 then begin + a.(i) <- a.(j); + trickledown l j e; + end else begin + a.(i) <- e; + end; + in + let trickle l i e = try trickledown l i e with Bottom i -> a.(i) <- e in + let rec bubbledown l i = + let j = maxson l i in + a.(i) <- a.(j); + bubbledown l j; + in + let bubble l i = try bubbledown l i with Bottom i -> i in + let rec trickleup i e = + let father = (i - 1) / 2 in + assert (i <> father); + if cmp a.(father) e < 0 then begin + a.(i) <- a.(father); + if father > 0 then trickleup father e else a.(0) <- e; + end else begin + a.(i) <- e; + end; + in + let l = Array.length a in + for i = l / 2 - 1 downto 0 do trickle l i a.(i); done; + for i = l - 1 downto 2 do + let e = a.(i) in + a.(i) <- a.(0); + trickleup (bubble i 0) e; + done; + if l > 1 then (let e = a.(1) in a.(1) <- a.(0); a.(0) <- e); +;; + +(************************************************************************) +(* heap sort, top-down, ternary, recursive final loop *) + +let aheap_5 cmp a = + let maxson l i = (* ASSUMES i < (l+1)/3 *) + let i31 = i+i+i+1 in + let x = ref i31 in + if i31+2 < l then begin + if cmp a.(i31) a.(i31+1) < 0 then x := i31+1; + if cmp a.(!x) a.(i31+2) < 0 then x := i31+2; + !x + end else begin + if i31+1 < l && cmp a.(i31) a.(i31+1) < 0 + then i31+1 + else i31 + end + in + let rec trickledown l l3 i e = (* ASSUMES i < l3 *) + let j = maxson l i in + if cmp a.(j) e > 0 then begin + a.(i) <- a.(j); + if j < l3 then trickledown l l3 j e else a.(j) <- e; + end else begin + a.(i) <- e; + end; + in + let l = Array.length a in + let l3 = (l + 1) / 3 in + for i = l3 - 1 downto 0 do trickledown l l3 i a.(i); done; + let rec loop0 l l3 = + let e = a.(l) in + a.(l) <- a.(0); + trickledown l l3 0 e; + loop2 (l-1) (l3-1); + and loop1 l l3 = + let e = a.(l) in + a.(l) <- a.(0); + trickledown l l3 0 e; + loop0 (l-1) l3; + and loop2 l l3 = + if l > 1 then begin + let e = a.(l) in + a.(l) <- a.(0); + trickledown l l3 0 e; + loop1 (l-1) l3; + end else begin + let e = a.(1) in a.(1) <- a.(0); a.(0) <- e; + end; + in + if l > 1 then + match l + 1 - 3 * l3 with + | 0 -> loop2 (l-1) (l3-1); + | 1 -> loop0 (l-1) l3; + | 2 -> loop1 (l-1) l3; + | _ -> assert false; +;; + +(************************************************************************) +(* heap sort, top-down, ternary, with exception *) + +let aheap_6 cmp a = + let maxson e l i = + let i31 = i + i + i + 1 in + let x = ref i31 in + if i31+2 < l then begin + if cmp a.(i31) a.(i31+1) < 0 then x := i31+1; + if cmp a.(!x) a.(i31+2) < 0 then x := i31+2; + !x + end else begin + if i31+1 < l && cmp a.(i31) a.(i31+1) < 0 + then i31+1 + else if i31 < l then i31 else (a.(i) <- e; raise Exit) + end + in + let rec trickledown e l i = + let j = maxson e l i in + if cmp a.(j) e > 0 then begin + a.(i) <- a.(j); + trickledown e l j; + end else begin + a.(i) <- e; + end; + in + let down e l i = try trickledown e l i with Exit -> (); in + let l = Array.length a in + for i = (l + 1) / 3 - 1 downto 0 do down a.(i) l i; done; + for i = l - 1 downto 2 do + let e = a.(i) in + a.(i) <- a.(0); + down e i 0; + done; + if l > 1 then (let e = a.(1) in a.(1) <- a.(0); a.(0) <- e); +;; + +(* FIXME essayer cutoff pour heapsort *) + +(************************************************************************) +(* Insertion sort with dichotomic search *) + +let ainsertion_1 cmp a = + let rec dicho l r e = + if l = r then l else begin + let m = (l + r) / 2 in + if cmp a.(m) e <= 0 + then dicho (m+1) r e + else dicho l m e + end + in + for i = 1 to Array.length a - 1 do + let e = a.(i) in + let j = dicho 0 i e in + Array.blit a j a (j + 1) (i - j); + a.(j) <- e; + done; +;; + +(************************************************************************) +(* merge sort on lists via arrays *) + +let array_to_list_in_place a = + let l = Array.length a in + let rec loop accu n p = + if p <= 0 then accu else begin + if p = n then begin + Obj.truncate (Obj.repr a) p; + loop (a.(p-1) :: accu) (n-1000) (p-1) + end else begin + loop (a.(p-1) :: accu) n (p-1) + end + end + in + loop [] l l +;; + +let array_of_list l len = + match l with + | [] -> [| |] + | h::t -> + let a = Array.make len h in + let rec loop i l = + match l with + | [] -> () + | h::t -> a.(i) <- h; loop (i+1) t + in + loop 1 t; + a +;; + +let lmerge_0a cmp l = + let a = Array.of_list l in + amerge_1e cmp a; + array_to_list_in_place a +;; + +let lmerge_0b cmp l = + let len = List.length l in + if len > 256 then Gc.minor (); + let a = array_of_list l len in + amerge_1e cmp a; + array_to_list_in_place a +;; + +let lshell_0 cmp l = + let a = Array.of_list l in + ashell_2 cmp a; + array_to_list_in_place a +;; + +let lquick_0 cmp l = + let a = Array.of_list l in + aquick_3f cmp a; + array_to_list_in_place a +;; + +(************************************************************************) +(* merge sort on arrays via lists *) + +let amerge_0 cmp a = (* cutoff is not yet used *) + let l = lmerge_4e cmp (Array.to_list a) in + let rec loop i = function + | [] -> () + | h::t -> a.(i) <- h; loop (i + 1) t + in + loop 0 l +;; + +(************************************************************************) + +let lold = [ + "Sort.list", Sort.list, true; + "lmerge_3", lmerge_3, false; + "lmerge_4a", lmerge_4a, true; +];; + +let lnew = [ + "List.stable_sort", List.stable_sort, true; + + "lmerge_0a", lmerge_0a, true; + "lmerge_0b", lmerge_0b, true; + "lshell_0", lshell_0, false; + "lquick_0", lquick_0, false; + + "lmerge_1a", lmerge_1a, true; + "lmerge_1b", lmerge_1b, true; + "lmerge_1c", lmerge_1c, true; + "lmerge_1d", lmerge_1d, true; + + "lmerge_4b", lmerge_4b, true; + "lmerge_4c", lmerge_4c, true; + "lmerge_4d", lmerge_4d, true; + "lmerge_4e", lmerge_4e, true; + + "lmerge_5a", lmerge_5a, true; + "lmerge_5b", lmerge_5b, true; + "lmerge_5c", lmerge_5c, true; + "lmerge_5d", lmerge_5d, true; +];; +let anew = [ + "Array.stable_sort", Array.stable_sort, true; + "Array.sort", Array.sort, false; + + "amerge_0", amerge_0, true; + + "amerge_1a", amerge_1a, true; + "amerge_1b", amerge_1b, true; + "amerge_1c", amerge_1c, true; + "amerge_1d", amerge_1d, true; + "amerge_1e", amerge_1e, true; + "amerge_1f", amerge_1f, true; + "amerge_1g", amerge_1g, true; + "amerge_1h", amerge_1h, true; + "amerge_1i", amerge_1i, true; + "amerge_1j", amerge_1j, true; + + "amerge_3a", amerge_3a, true; + "amerge_3b", amerge_3b, true; + "amerge_3c", amerge_3c, true; + "amerge_3d", amerge_3d, true; + "amerge_3e", amerge_3e, true; + "amerge_3f", amerge_3f, true; + "amerge_3g", amerge_3g, true; + "amerge_3h", amerge_3h, true; + "amerge_3i", amerge_3i, true; + "amerge_3j", amerge_3j, true; + + "ashell_1", ashell_1, false; + "ashell_2", ashell_2, false; + "ashell_3", ashell_3, false; + "ashell_4", ashell_4, false; + + "aquick_1a", aquick_1a, false; + "aquick_1b", aquick_1b, false; + "aquick_1c", aquick_1c, false; + "aquick_1d", aquick_1d, false; + "aquick_1e", aquick_1e, false; + "aquick_1f", aquick_1f, false; + "aquick_1g", aquick_1g, false; + + "aquick_2a", aquick_2a, false; + "aquick_2b", aquick_2b, false; + "aquick_2c", aquick_2c, false; + "aquick_2d", aquick_2d, false; + "aquick_2e", aquick_2e, false; + "aquick_2f", aquick_2f, false; + "aquick_2g", aquick_2g, false; + + "aquick_3a", aquick_3a, false; + "aquick_3b", aquick_3b, false; + "aquick_3c", aquick_3c, false; + "aquick_3d", aquick_3d, false; + "aquick_3e", aquick_3e, false; + "aquick_3f", aquick_3f, false; + "aquick_3g", aquick_3g, false; + "aquick_3h", aquick_3h, false; + "aquick_3i", aquick_3i, false; + "aquick_3j", aquick_3j, false; + + "aheap_1", aheap_1, false; + "aheap_2", aheap_2, false; + "aheap_3", aheap_3, false; + "aheap_4", aheap_4, false; + "aheap_5", aheap_5, false; + "aheap_6", aheap_6, false; + + "ainsertion_1", ainsertion_1, true; +];; + +(************************************************************************) +(* main program *) + +type mode = Test_std | Test | Bench1 | Bench2 | Bench3;; + +let size = ref 22 +and mem = ref 0 +and mode = ref Test_std +and only = ref [] +;; + +let usage = "Usage: sorts [-size ] [-mem ]\n\ + \032 [-seed ] [-test|-bench]" +;; + +let options = [ + "-size", Arg.Int ((:=) size), " Maximum size for benchmarks (default 22)"; + "-meg",Arg.Int ((:=) mem)," How many megabytes to preallocate (default 0)"; + "-seed", Arg.Int ((:=) seed), " PRNG seed (default 0)"; + "-teststd", Arg.Unit (fun () -> mode := Test_std), " Test stdlib (default)"; + "-test", Arg.Unit (fun () -> mode := Test), " Select test mode"; + "-bench1", Arg.Unit (fun () -> mode := Bench1), " Select bench mode 1"; + "-bench2", Arg.Unit (fun () -> mode := Bench2), " Select bench mode 2"; + "-bench3", Arg.Unit (fun () -> mode := Bench3), " Select bench mode 3"; + "-fn", Arg.String (fun x -> only := x :: !only), + " Test/Bench this function (default all)"; +];; +let anonymous x = raise (Arg.Bad ("unrecognised option "^x));; + +let main () = + Arg.parse options anonymous usage; + + Printf.printf "Command line arguments are:"; + for i = 1 to Array.length Sys.argv - 1 do + Printf.printf " %s" Sys.argv.(i); + done; + Printf.printf "\n"; + + ignore (String.create (1048576 * !mem)); + Gc.full_major (); +(* + let a2l = Array.to_list in + let l2ak x y = Array.of_list x in + let id = fun x -> x in + let fst x y = x in + let snd x y = y in +*) + let benchonly f x y z t = + match !only with + | [] -> f x y z t + | l -> if List.mem y l then f x y z t + in + let testonly x1 x2 x3 x4 x5 x6 = + match !only with + | [] -> test x1 x2 x3 x4 x5 x6 + | l -> if List.mem x1 l then test x1 x2 x3 x4 x5 x6 + in + + match !mode with + | Test_std -> begin + testonly "List.sort" false List.sort List.sort lc lc; + testonly "List.stable_sort" true List.stable_sort List.stable_sort lc lc; + testonly "Array.sort" false Array.sort Array.sort ac ac; + testonly "Array.stable_sort" true Array.stable_sort Array.stable_sort + ac ac; + printf "Number of tests failed: %d\n" !numfailed; + end; + | Test -> begin + for i = 0 to List.length lold - 1 do + let (name, f1, stable) = List.nth lold i in + let (_, f2, _) = List.nth lold i in + testonly name stable f1 f2 ll ll; + done; + testonly "Sort.array" false Sort.array Sort.array al al; + for i = 0 to List.length lnew - 1 do + let (name, f1, stable) = List.nth lnew i in + let (_, f2, _) = List.nth lnew i in + testonly name stable f1 f2 lc lc; + done; + for i = 0 to List.length anew - 1 do + let (name, f1, stable) = List.nth anew i in + let (_, f2, _) = List.nth anew i in + testonly name stable f1 f2 ac ac; + done; + printf "Number of tests failed: %d\n" !numfailed; + end; + | Bench1 -> begin + let ba = fun x y z -> benchonly bench1a !size x y z + and bb = fun x y z -> benchonly bench1b !size x y z + and bc = fun x y z -> benchonly bench1c !size x y z + in + for i = 0 to List.length lold - 1 do + let (name, f, stable) = List.nth lold i in ba name f ll; + let (name, f, stable) = List.nth lold i in bb name f ll; + let (name, f, stable) = List.nth lold i in bc name f ll; + done; + ba "Sort.array" Sort.array al; + bb "Sort.array" Sort.array al; + bc "Sort.array" Sort.array al; + for i = 0 to List.length lnew - 1 do + let (name, f, stable) = List.nth lnew i in ba name f lc; + let (name, f, stable) = List.nth lnew i in bb name f lc; + let (name, f, stable) = List.nth lnew i in bc name f lc; + done; + for i = 0 to List.length anew - 1 do + let (name, f, stable) = List.nth anew i in ba name f ac; + let (name, f, stable) = List.nth anew i in bb name f ac; + let (name, f, stable) = List.nth anew i in bc name f ac; + done; + end; + | Bench2 -> begin + let b = fun x y z -> benchonly bench2 !size x y z in + for i = 0 to List.length lold - 1 do + let (name, f, stable) = List.nth lold i in b name f ll; + done; + b "Sort.array" Sort.array al; + for i = 0 to List.length lnew - 1 do + let (name, f, stable) = List.nth lnew i in b name f lc; + done; + for i = 0 to List.length anew - 1 do + let (name, f, stable) = List.nth anew i in b name f ac; + done; + end; + | Bench3 -> begin + let ba = fun x y z -> benchonly bench3a !size x y z + and bb = fun x y z -> benchonly bench3b !size x y z + and bc = fun x y z -> benchonly bench3c !size x y z + in + for i = 0 to List.length lold - 1 do + let (name, f, stable) = List.nth lold i in ba name f ll; + let (name, f, stable) = List.nth lold i in bb name f ll; + let (name, f, stable) = List.nth lold i in bc name f ll; + done; + for i = 0 to List.length lnew - 1 do + let (name, f, stable) = List.nth lnew i in ba name f lc; + let (name, f, stable) = List.nth lnew i in bb name f lc; + let (name, f, stable) = List.nth lnew i in bc name f lc; + done; + end; +;; + +if not !Sys.interactive then Printexc.catch main ();; + +(* $Id: sorts.ml 4955 2002-06-26 14:55:37Z doligez $ *) diff --git a/testsuite/tests/misc/sorts.reference b/testsuite/tests/misc/sorts.reference new file mode 100644 index 00000000..fa0cc048 --- /dev/null +++ b/testsuite/tests/misc/sorts.reference @@ -0,0 +1,198 @@ +Command line arguments are: +Testing List.sort... + List.sort with constant ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with reverse-sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with random ints (many dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with random ints (few dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with records (str) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with records (int[1]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with records (int[10]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with records (int[100]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.sort with records (int[1000]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. +Testing List.stable_sort... + List.stable_sort with constant ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with reverse-sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with random ints (many dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with random ints (few dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (str) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[1]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[10]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[100]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[1000]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[1]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[10]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[100]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + List.stable_sort with records (int[1000]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. +Testing Array.sort... + Array.sort with constant ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with reverse-sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with random ints (many dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with random ints (few dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with records (str) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with records (int[1]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with records (int[10]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with records (int[100]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.sort with records (int[1000]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. +Testing Array.stable_sort... + Array.stable_sort with constant ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with reverse-sorted ints + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with random ints (many dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with random ints (few dups) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (str) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[1]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[10]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[100]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[1000]) + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[1]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[10]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[100]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. + Array.stable_sort with records (int[1000]) [stable] + 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. + 12. 13. 28. 100. 127. 128. 129. 191. 192. 193. 506. 1000. + 1023. 1024. 1025. 1535. 1536. 1537. 2323. 4000. 4094. 4096. 4098. 5123. +Number of tests failed: 0 diff --git a/testsuite/tests/misc/takc.ml b/testsuite/tests/misc/takc.ml new file mode 100644 index 00000000..99aa6cde --- /dev/null +++ b/testsuite/tests/misc/takc.ml @@ -0,0 +1,23 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: takc.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +let rec tak x y z = + if x > y then tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y) + else z + +let rec repeat n = + if n <= 0 then 0 else tak 18 12 6 + repeat(n-1) + +let _ = print_int (repeat 2000); print_newline(); exit 0 + diff --git a/testsuite/tests/misc/takc.reference b/testsuite/tests/misc/takc.reference new file mode 100644 index 00000000..bfed8193 --- /dev/null +++ b/testsuite/tests/misc/takc.reference @@ -0,0 +1 @@ +14000 diff --git a/testsuite/tests/misc/taku.ml b/testsuite/tests/misc/taku.ml new file mode 100644 index 00000000..c3eae9f9 --- /dev/null +++ b/testsuite/tests/misc/taku.ml @@ -0,0 +1,22 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: taku.ml 7017 2005-08-12 09:22:04Z xleroy $ *) + +let rec tak (x, y, z) = + if x > y then tak(tak (x-1, y, z), tak (y-1, z, x), tak (z-1, x, y)) + else z + +let rec repeat n = + if n <= 0 then 0 else tak(18,12,6) + repeat(n-1) + +let _ = print_int (repeat 2000); print_newline(); exit 0 diff --git a/testsuite/tests/misc/taku.reference b/testsuite/tests/misc/taku.reference new file mode 100644 index 00000000..bfed8193 --- /dev/null +++ b/testsuite/tests/misc/taku.reference @@ -0,0 +1 @@ +14000 diff --git a/testsuite/tests/misc/weaktest.ml b/testsuite/tests/misc/weaktest.ml new file mode 100644 index 00000000..5dd4e19d --- /dev/null +++ b/testsuite/tests/misc/weaktest.ml @@ -0,0 +1,73 @@ +(* $Id: weaktest.ml 8766 2008-01-11 11:55:36Z doligez $ *) + +let debug = false;; + +open Printf;; + +module Hashed = struct + type t = string list;; + let equal x y = + eprintf "equal: %s / %s\n" (List.hd x) (List.hd y); + x = y + ;; + let hash x = Hashtbl.hash (List.hd x);; +end;; + +module HT = Weak.Make (Hashed);; + +let tbl = HT.create 7;; + +let r = ref [];; + +let bunch = + if Array.length Sys.argv < 2 + then 10000 + else int_of_string Sys.argv.(1) +;; + +Random.init 314;; + +let random_string n = + let result = String.create n in + for i = 0 to n - 1 do + result.[i] <- Char.chr (32 + Random.int 95); + done; + result +;; + +let added = ref 0;; +let mistakes = ref 0;; + +let print_status () = + let (len, entries, sumbuck, buckmin, buckmed, buckmax) = HT.stats tbl in + if entries > bunch * (!added + 1) then begin + if debug then begin + printf "\n===================\n"; + printf "len = %d\n" len; + printf "entries = %d\n" entries; + printf "sum of bucket sizes = %d\n" sumbuck; + printf "min bucket = %d\n" buckmin; + printf "med bucket = %d\n" buckmed; + printf "max bucket = %d\n" buckmax; + printf "GC count = %d\n" (Gc.quick_stat ()).Gc.major_collections; + flush stdout; + end; + incr mistakes; + end; + added := 0; +;; + +Gc.create_alarm print_status;; + +for j = 0 to 99 do + r := []; + incr added; + + for i = 1 to bunch do + let c = random_string 7 in + r := c :: !r; + HT.add tbl !r; + done; +done;; + +if !mistakes < 5 then printf "pass\n" else printf "fail\n";; diff --git a/testsuite/tests/misc/weaktest.reference b/testsuite/tests/misc/weaktest.reference new file mode 100644 index 00000000..2ae28399 --- /dev/null +++ b/testsuite/tests/misc/weaktest.reference @@ -0,0 +1 @@ +pass diff --git a/testsuite/tests/runtime-errors/Makefile b/testsuite/tests/runtime-errors/Makefile new file mode 100644 index 00000000..62f05380 --- /dev/null +++ b/testsuite/tests/runtime-errors/Makefile @@ -0,0 +1,25 @@ +default: compile run + +compile: + @for f in *.ml; do \ + $(OCAMLC) -w a -o `basename $$f ml`bytecode $$f; \ + $(OCAMLOPT) -w a -o `basename $$f ml`native $$f; \ + done + @if [ ! `grep -c HAS_STACK_OVERFLOW_DETECTION ../../../config/s.h` ]; then \ + rm -f stackoverflow.byte stackoverflow.native; \ + fi + +run: + @for f in *.bytecode; do \ + printf " ... testing '$$f':"; \ + (./$$f > $$f.result 2>&1; true); \ + diff -q $$f.reference $$f.result > /dev/null || (echo " => failed" && exit 1) && echo " => passed"; \ + printf " ... testing '`basename $$f bytecode`native':"; \ + (./`basename $$f bytecode`native > `basename $$f bytecode`native.result 2>&1; true); \ + diff -q `basename $$f bytecode`native.reference `basename $$f bytecode`native.result > /dev/null || (echo " => failed" && exit 1) && echo " => passed"; \ + done + +clean: defaultclean + @rm -f *.byte *.native *.result + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/runtime-errors/stackoverflow.bytecode.reference b/testsuite/tests/runtime-errors/stackoverflow.bytecode.reference new file mode 100644 index 00000000..745f81ae --- /dev/null +++ b/testsuite/tests/runtime-errors/stackoverflow.bytecode.reference @@ -0,0 +1,5 @@ +x = 196608 +x = 131072 +x = 65536 +x = 0 +Stack overflow caught diff --git a/testsuite/tests/runtime-errors/stackoverflow.ml b/testsuite/tests/runtime-errors/stackoverflow.ml new file mode 100644 index 00000000..4d211bc8 --- /dev/null +++ b/testsuite/tests/runtime-errors/stackoverflow.ml @@ -0,0 +1,15 @@ +let rec f x = + if x land 0xFFFF <> 0 + then 1 + f (x + 1) + else + try + 1 + f (x + 1) + with Stack_overflow -> + print_string "x = "; print_int x; print_newline(); + raise Stack_overflow + +let _ = + try + ignore(f 0) + with Stack_overflow -> + print_string "Stack overflow caught"; print_newline() diff --git a/testsuite/tests/runtime-errors/stackoverflow.native.reference b/testsuite/tests/runtime-errors/stackoverflow.native.reference new file mode 100644 index 00000000..835095c5 --- /dev/null +++ b/testsuite/tests/runtime-errors/stackoverflow.native.reference @@ -0,0 +1,65 @@ +x = 4128768 +x = 4063232 +x = 3997696 +x = 3932160 +x = 3866624 +x = 3801088 +x = 3735552 +x = 3670016 +x = 3604480 +x = 3538944 +x = 3473408 +x = 3407872 +x = 3342336 +x = 3276800 +x = 3211264 +x = 3145728 +x = 3080192 +x = 3014656 +x = 2949120 +x = 2883584 +x = 2818048 +x = 2752512 +x = 2686976 +x = 2621440 +x = 2555904 +x = 2490368 +x = 2424832 +x = 2359296 +x = 2293760 +x = 2228224 +x = 2162688 +x = 2097152 +x = 2031616 +x = 1966080 +x = 1900544 +x = 1835008 +x = 1769472 +x = 1703936 +x = 1638400 +x = 1572864 +x = 1507328 +x = 1441792 +x = 1376256 +x = 1310720 +x = 1245184 +x = 1179648 +x = 1114112 +x = 1048576 +x = 983040 +x = 917504 +x = 851968 +x = 786432 +x = 720896 +x = 655360 +x = 589824 +x = 524288 +x = 458752 +x = 393216 +x = 327680 +x = 262144 +x = 196608 +x = 131072 +x = 65536 +x = 0 +Stack overflow caught diff --git a/testsuite/tests/runtime-errors/syserror.bytecode.reference b/testsuite/tests/runtime-errors/syserror.bytecode.reference new file mode 100644 index 00000000..3f6219a2 --- /dev/null +++ b/testsuite/tests/runtime-errors/syserror.bytecode.reference @@ -0,0 +1 @@ +Fatal error: exception Sys_error("titi:/toto: No such file or directory") diff --git a/testsuite/tests/runtime-errors/syserror.ml b/testsuite/tests/runtime-errors/syserror.ml new file mode 100644 index 00000000..46f62ead --- /dev/null +++ b/testsuite/tests/runtime-errors/syserror.ml @@ -0,0 +1 @@ +let channel = open_out "titi:/toto" diff --git a/testsuite/tests/runtime-errors/syserror.native.reference b/testsuite/tests/runtime-errors/syserror.native.reference new file mode 100644 index 00000000..3f6219a2 --- /dev/null +++ b/testsuite/tests/runtime-errors/syserror.native.reference @@ -0,0 +1 @@ +Fatal error: exception Sys_error("titi:/toto: No such file or directory") diff --git a/testsuite/tests/tool-lexyacc/.svnignore b/testsuite/tests/tool-lexyacc/.svnignore new file mode 100644 index 00000000..5c0431d4 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/.svnignore @@ -0,0 +1,6 @@ +scanner.ml +grammar.mli +grammar.ml +*.byte +*.native +*.result diff --git a/testsuite/tests/tool-lexyacc/Makefile b/testsuite/tests/tool-lexyacc/Makefile new file mode 100644 index 00000000..b9260a54 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/Makefile @@ -0,0 +1,9 @@ +MODULES=syntax gram_aux grammar scan_aux scanner lexgen output +MAIN_MODULE=main +LEX_MODULES=scanner +YACC_MODULES=grammar +ADD_COMPFLAGS=-w a +EXEC_ARGS=input + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/tool-lexyacc/gram_aux.ml b/testsuite/tests/tool-lexyacc/gram_aux.ml new file mode 100644 index 00000000..6b23b5ec --- /dev/null +++ b/testsuite/tests/tool-lexyacc/gram_aux.ml @@ -0,0 +1,47 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: gram_aux.ml,v 1.4 1999/11/17 18:58:38 xleroy Exp $ *) + +(* Auxiliaries for the parser. *) + +open Syntax + +let regexp_for_string s = + let l = String.length s in + if l = 0 then + Epsilon + else begin + let re = ref(Characters [String.get s (l - 1)]) in + for i = l - 2 downto 0 do + re := Sequence(Characters [String.get s i], !re) + done; + !re + end + + +let char_class c1 c2 = + let cl = ref [] in + for i = Char.code c2 downto Char.code c1 do + cl := Char.chr i :: !cl + done; + !cl + + +let all_chars = char_class '\001' '\255' + + +let rec subtract l1 l2 = + match l1 with + [] -> [] + | a::l -> if List.mem a l2 then subtract l l2 else a :: subtract l l2 + diff --git a/testsuite/tests/tool-lexyacc/grammar.mly b/testsuite/tests/tool-lexyacc/grammar.mly new file mode 100644 index 00000000..ee5a8d24 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/grammar.mly @@ -0,0 +1,114 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy, 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 Q Public License version 1.0. */ +/* */ +/***********************************************************************/ + +/* $Id: grammar.mly,v 1.4 1999/11/17 18:58:38 xleroy Exp $ */ + +/* The grammar for lexer definitions */ + +%{ +open Syntax +open Gram_aux +%} + +%token Tident +%token Tchar +%token Tstring +%token Taction +%token Trule Tparse Tand Tequal Tend Tor Tunderscore Teof Tlbracket Trbracket +%token Tstar Tmaybe Tplus Tlparen Trparen Tcaret Tdash + +%left Tor +%left CONCAT +%nonassoc Tmaybe +%left Tstar +%left Tplus + +%start lexer_definition +%type lexer_definition + +%% + +lexer_definition: + header Trule definition other_definitions Tend + { Lexdef($1, $3::(List.rev $4)) } +; +header: + Taction + { $1 } + | + { Location(0,0) } +; +other_definitions: + other_definitions Tand definition + { $3::$1 } + | + { [] } +; +definition: + Tident Tequal entry + { ($1,$3) } +; +entry: + Tparse case rest_of_entry + { $2 :: List.rev $3 } +; +rest_of_entry: + rest_of_entry Tor case + { $3::$1 } + | + { [] } +; +case: + regexp Taction + { ($1,$2) } +; +regexp: + Tunderscore + { Characters all_chars } + | Teof + { Characters ['\000'] } + | Tchar + { Characters [$1] } + | Tstring + { regexp_for_string $1 } + | Tlbracket char_class Trbracket + { Characters $2 } + | regexp Tstar + { Repetition $1 } + | regexp Tmaybe + { Alternative($1, Epsilon) } + | regexp Tplus + { Sequence($1, Repetition $1) } + | regexp Tor regexp + { Alternative($1,$3) } + | regexp regexp %prec CONCAT + { Sequence($1,$2) } + | Tlparen regexp Trparen + { $2 } +; +char_class: + Tcaret char_class1 + { subtract all_chars $2 } + | char_class1 + { $1 } +; +char_class1: + Tchar Tdash Tchar + { char_class $1 $3 } + | Tchar + { [$1] } + | char_class char_class %prec CONCAT + { $1 @ $2 } +; + +%% + diff --git a/testsuite/tests/tool-lexyacc/input b/testsuite/tests/tool-lexyacc/input new file mode 100644 index 00000000..86114203 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/input @@ -0,0 +1,133 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: scanner.mll,v 1.5 1999/11/17 18:58:39 xleroy Exp $ *) + +(* The lexical analyzer for lexer definitions. *) + +{ +open Syntax +open Grammar +open Scan_aux +} + +rule main = parse + [' ' '\010' '\013' '\009' ] + + { main lexbuf } + | "(*" + { comment_depth := 1; + comment lexbuf; + main lexbuf } + | (['A'-'Z' 'a'-'z'] | '_' ['A'-'Z' 'a'-'z' '\'' '0'-'9']) + ( '_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9'] ) * + { match Lexing.lexeme lexbuf with + "rule" -> Trule + | "parse" -> Tparse + | "and" -> Tand + | "eof" -> Teof + | s -> Tident s } + | '"' + { reset_string_buffer(); + string lexbuf; + Tstring(get_stored_string()) } + | "'" + { Tchar(char lexbuf) } + | '{' + { let n1 = Lexing.lexeme_end lexbuf in + brace_depth := 1; + let n2 = action lexbuf in + Taction(Location(n1, n2)) } + | '=' { Tequal } + | ";;" { Tend } + | '|' { Tor } + | '_' { Tunderscore } + | "eof" { Teof } + | '[' { Tlbracket } + | ']' { Trbracket } + | '*' { Tstar } + | '?' { Tmaybe } + | '+' { Tplus } + | '(' { Tlparen } + | ')' { Trparen } + | '^' { Tcaret } + | '-' { Tdash } + | eof + { raise(Lexical_error "unterminated lexer definition") } + | _ + { raise(Lexical_error("illegal character " ^ Lexing.lexeme lexbuf)) } + +and action = parse + '{' + { incr brace_depth; + action lexbuf } + | '}' + { decr brace_depth; + if !brace_depth = 0 then Lexing.lexeme_start lexbuf else action lexbuf } + | '"' + { reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + action lexbuf } + | '\'' + { let _ = char lexbuf in action lexbuf } + | "(*" + { comment_depth := 1; + comment lexbuf; + action lexbuf } + | eof + { raise (Lexical_error "unterminated action") } + | _ + { action lexbuf } + +and string = parse + '"' + { () } + | '\\' [' ' '\010' '\013' '\009' '\026' '\012'] + + { string lexbuf } + | '\\' ['\\' '"' 'n' 't' 'b' 'r'] + { store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); + string lexbuf } + | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] + { store_string_char(char_for_decimal_code lexbuf 1); + string lexbuf } + | eof + { raise(Lexical_error "unterminated string") } + | _ + { store_string_char(Lexing.lexeme_char lexbuf 0); + string lexbuf } + +and char = parse + [^ '\\'] "'" + { Lexing.lexeme_char lexbuf 0 } + | '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'" + { char_for_backslash (Lexing.lexeme_char lexbuf 1) } + | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'" + { char_for_decimal_code lexbuf 1 } + | _ + { raise(Lexical_error "bad character constant") } + +and comment = parse + "(*" + { incr comment_depth; comment lexbuf } + | "*)" + { decr comment_depth; + if !comment_depth = 0 then () else comment lexbuf } + | '"' + { reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + comment lexbuf } + | eof + { raise(Lexical_error "unterminated comment") } + | _ + { comment lexbuf } +;; diff --git a/testsuite/tests/tool-lexyacc/input.ml b/testsuite/tests/tool-lexyacc/input.ml new file mode 100644 index 00000000..57d17c08 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/input.ml @@ -0,0 +1,312 @@ + +open Syntax +open Grammar +open Scan_aux + +let rec action_43 lexbuf = ( + comment lexbuf ) +and action_42 lexbuf = ( + raise(Lexical_error "unterminated comment") ) +and action_41 lexbuf = ( + reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + comment lexbuf ) +and action_40 lexbuf = ( + decr comment_depth; + if !comment_depth = 0 then () else comment lexbuf ) +and action_39 lexbuf = ( + incr comment_depth; comment lexbuf ) +and action_38 lexbuf = ( + raise(Lexical_error "bad character constant") ) +and action_37 lexbuf = ( + char_for_decimal_code lexbuf 1 ) +and action_36 lexbuf = ( + char_for_backslash (Lexing.lexeme_char lexbuf 1) ) +and action_35 lexbuf = ( + Lexing.lexeme_char lexbuf 0 ) +and action_34 lexbuf = ( + store_string_char(Lexing.lexeme_char lexbuf 0); + string lexbuf ) +and action_33 lexbuf = ( + raise(Lexical_error "unterminated string") ) +and action_32 lexbuf = ( + store_string_char(char_for_decimal_code lexbuf 1); + string lexbuf ) +and action_31 lexbuf = ( + store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); + string lexbuf ) +and action_30 lexbuf = ( + string lexbuf ) +and action_29 lexbuf = ( + () ) +and action_28 lexbuf = ( + action lexbuf ) +and action_27 lexbuf = ( + raise (Lexical_error "unterminated action") ) +and action_26 lexbuf = ( + comment_depth := 1; + comment lexbuf; + action lexbuf ) +and action_25 lexbuf = ( + let _ = char lexbuf in action lexbuf ) +and action_24 lexbuf = ( + reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + action lexbuf ) +and action_23 lexbuf = ( + decr brace_depth; + if !brace_depth = 0 then Lexing.lexeme_start lexbuf else action lexbuf ) +and action_22 lexbuf = ( + incr brace_depth; + action lexbuf ) +and action_21 lexbuf = ( + raise(Lexical_error("illegal character " ^ Lexing.lexeme lexbuf)) ) +and action_20 lexbuf = ( + raise(Lexical_error "unterminated lexer definition") ) +and action_19 lexbuf = ( + Tdash ) +and action_18 lexbuf = ( + Tcaret ) +and action_17 lexbuf = ( + Trparen ) +and action_16 lexbuf = ( + Tlparen ) +and action_15 lexbuf = ( + Tplus ) +and action_14 lexbuf = ( + Tmaybe ) +and action_13 lexbuf = ( + Tstar ) +and action_12 lexbuf = ( + Trbracket ) +and action_11 lexbuf = ( + Tlbracket ) +and action_10 lexbuf = ( + Teof ) +and action_9 lexbuf = ( + Tunderscore ) +and action_8 lexbuf = ( + Tor ) +and action_7 lexbuf = ( + Tend ) +and action_6 lexbuf = ( + Tequal ) +and action_5 lexbuf = ( + let n1 = Lexing.lexeme_end lexbuf in + brace_depth := 1; + let n2 = action lexbuf in + Taction(Location(n1, n2)) ) +and action_4 lexbuf = ( + Tchar(char lexbuf) ) +and action_3 lexbuf = ( + reset_string_buffer(); + string lexbuf; + Tstring(get_stored_string()) ) +and action_2 lexbuf = ( + match Lexing.lexeme lexbuf with + "rule" -> Trule + | "parse" -> Tparse + | "and" -> Tand + | "eof" -> Teof + | s -> Tident s ) +and action_1 lexbuf = ( + comment_depth := 1; + comment lexbuf; + main lexbuf ) +and action_0 lexbuf = ( + main lexbuf ) +and state_0 lexbuf = + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A' -> state_51 lexbuf + | ' '|'\013'|'\n'|'\t' -> state_40 lexbuf + | '|' -> action_8 lexbuf + | '{' -> action_5 lexbuf + | 'e' -> state_56 lexbuf + | '_' -> state_55 lexbuf + | '^' -> action_18 lexbuf + | ']' -> action_12 lexbuf + | '[' -> action_11 lexbuf + | '?' -> action_14 lexbuf + | '=' -> action_6 lexbuf + | ';' -> state_48 lexbuf + | '-' -> action_19 lexbuf + | '+' -> action_15 lexbuf + | '*' -> action_13 lexbuf + | ')' -> action_17 lexbuf + | '(' -> state_43 lexbuf + | '\'' -> action_4 lexbuf + | '"' -> action_3 lexbuf + | '\000' -> action_20 lexbuf + | _ -> action_21 lexbuf +and state_1 lexbuf = + match lexing.next_char lexbuf with + '}' -> action_23 lexbuf + | '{' -> action_22 lexbuf + | '(' -> state_34 lexbuf + | '\'' -> action_25 lexbuf + | '"' -> action_24 lexbuf + | '\000' -> action_27 lexbuf + | _ -> action_28 lexbuf +and state_2 lexbuf = + match lexing.next_char lexbuf with + '\\' -> state_24 lexbuf + | '"' -> action_29 lexbuf + | '\000' -> action_33 lexbuf + | _ -> action_34 lexbuf +and state_3 lexbuf = + match lexing.next_char lexbuf with + '\\' -> state_13 lexbuf + | '\000' -> lexing.backtrack lexbuf + | _ -> state_12 lexbuf +and state_4 lexbuf = + match lexing.next_char lexbuf with + '*' -> state_9 lexbuf + | '(' -> state_8 lexbuf + | '"' -> action_41 lexbuf + | '\000' -> action_42 lexbuf + | _ -> action_43 lexbuf +and state_8 lexbuf = + Lexing.set_backtrack lexbuf action_43; + match lexing.next_char lexbuf with + '*' -> action_39 lexbuf + | _ -> lexing.backtrack lexbuf +and state_9 lexbuf = + Lexing.set_backtrack lexbuf action_43; + match lexing.next_char lexbuf with + ')' -> action_40 lexbuf + | _ -> lexing.backtrack lexbuf +and state_12 lexbuf = + Lexing.set_backtrack lexbuf action_38; + match lexing.next_char lexbuf with + '\'' -> action_35 lexbuf + | _ -> lexing.backtrack lexbuf +and state_13 lexbuf = + Lexing.set_backtrack lexbuf action_38; + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_15 lexbuf + | 't'|'r'|'n'|'b'|'\\'|'\'' -> state_14 lexbuf + | _ -> lexing.backtrack lexbuf +and state_14 lexbuf = + match lexing.next_char lexbuf with + '\'' -> action_36 lexbuf + | _ -> lexing.backtrack lexbuf +and state_15 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_16 lexbuf + | _ -> lexing.backtrack lexbuf +and state_16 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_17 lexbuf + | _ -> lexing.backtrack lexbuf +and state_17 lexbuf = + match lexing.next_char lexbuf with + '\'' -> action_37 lexbuf + | _ -> lexing.backtrack lexbuf +and state_24 lexbuf = + Lexing.set_backtrack lexbuf action_34; + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_27 lexbuf + | 't'|'r'|'n'|'b'|'\\'|'"' -> action_31 lexbuf + | ' '|'\026'|'\013'|'\012'|'\n'|'\t' -> state_25 lexbuf + | _ -> lexing.backtrack lexbuf +and state_25 lexbuf = + Lexing.set_backtrack lexbuf action_30; + match lexing.next_char lexbuf with + ' '|'\026'|'\013'|'\012'|'\n'|'\t' -> state_25 lexbuf + | _ -> lexing.backtrack lexbuf +and state_27 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_28 lexbuf + | _ -> lexing.backtrack lexbuf +and state_28 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> action_32 lexbuf + | _ -> lexing.backtrack lexbuf +and state_34 lexbuf = + Lexing.set_backtrack lexbuf action_28; + match lexing.next_char lexbuf with + '*' -> action_26 lexbuf + | _ -> lexing.backtrack lexbuf +and state_40 lexbuf = + Lexing.set_backtrack lexbuf action_0; + match lexing.next_char lexbuf with + ' '|'\013'|'\n'|'\t' -> state_65 lexbuf + | _ -> lexing.backtrack lexbuf +and state_43 lexbuf = + Lexing.set_backtrack lexbuf action_16; + match lexing.next_char lexbuf with + '*' -> action_1 lexbuf + | _ -> lexing.backtrack lexbuf +and state_48 lexbuf = + Lexing.set_backtrack lexbuf action_21; + match lexing.next_char lexbuf with + ';' -> action_7 lexbuf + | _ -> lexing.backtrack lexbuf +and state_51 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_55 lexbuf = + Lexing.set_backtrack lexbuf action_9; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | _ -> lexing.backtrack lexbuf +and state_56 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | 'o' -> state_61 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_59 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_60 lexbuf = + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | _ -> lexing.backtrack lexbuf +and state_61 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | 'f' -> state_62 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_62 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_65 lexbuf = + Lexing.set_backtrack lexbuf action_0; + match lexing.next_char lexbuf with + ' '|'\013'|'\n'|'\t' -> state_65 lexbuf + | _ -> lexing.backtrack lexbuf +and main lexbuf = + Lexing.init lexbuf; + state_0 lexbuf + +and action lexbuf = + Lexing.init lexbuf; + state_1 lexbuf + +and string lexbuf = + Lexing.init lexbuf; + state_2 lexbuf + +and char lexbuf = + Lexing.init lexbuf; + state_3 lexbuf + +and comment lexbuf = + Lexing.init lexbuf; + state_4 lexbuf + diff --git a/testsuite/tests/tool-lexyacc/lexgen.ml b/testsuite/tests/tool-lexyacc/lexgen.ml new file mode 100644 index 00000000..05cb3c03 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/lexgen.ml @@ -0,0 +1,266 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: lexgen.ml,v 1.5 2000/12/28 13:06:39 weis Exp $ *) + +(* Compiling a lexer definition *) + +open Syntax + +(* Deep abstract syntax for regular expressions *) + +type regexp = + Empty + | Chars of int + | Action of int + | Seq of regexp * regexp + | Alt of regexp * regexp + | Star of regexp + +(* From shallow to deep syntax *) + +(*** + +let print_char_class c = + let print_interval low high = + prerr_int low; + if high - 1 > low then begin + prerr_char '-'; + prerr_int (high-1) + end; + prerr_char ' ' in + let rec print_class first next = function + [] -> print_interval first next + | c::l -> + if char.code c = next + then print_class first (next+1) l + else begin + print_interval first next; + print_class (char.code c) (char.code c + 1) l + end in + match c with + [] -> prerr_newline() + | c::l -> print_class (char.code c) (char.code c + 1) l; prerr_newline() + + +let rec print_regexp = function + Empty -> prerr_string "Empty" + | Chars n -> prerr_string "Chars "; prerr_int n + | Action n -> prerr_string "Action "; prerr_int n + | Seq(r1,r2) -> print_regexp r1; prerr_string "; "; print_regexp r2 + | Alt(r1,r2) -> prerr_string "("; print_regexp r1; prerr_string " | "; print_regexp r2; prerr_string ")" + | Star r -> prerr_string "("; print_regexp r; prerr_string ")*" + +***) + +let chars = ref ([] : char list list) +let chars_count = ref 0 +let actions = ref ([] : (int * location) list) +let actions_count = ref 0 + +let rec encode_regexp = function + Epsilon -> Empty + | Characters cl -> + let n = !chars_count in +(*** prerr_int n; prerr_char ' '; print_char_class cl; ***) + chars := cl :: !chars; + chars_count := !chars_count + 1; + Chars(n) + | Sequence(r1,r2) -> + Seq(encode_regexp r1, encode_regexp r2) + | Alternative(r1,r2) -> + Alt(encode_regexp r1, encode_regexp r2) + | Repetition r -> + Star (encode_regexp r) + + +let encode_casedef = + List.fold_left + (fun reg (expr,act) -> + let act_num = !actions_count in + actions_count := !actions_count + 1; + actions := (act_num, act) :: !actions; + Alt(reg, Seq(encode_regexp expr, Action act_num))) + Empty + + +let encode_lexdef (Lexdef(_, ld)) = + chars := []; + chars_count := 0; + actions := []; + actions_count := 0; + let name_regexp_list = + List.map (fun (name, casedef) -> (name, encode_casedef casedef)) ld in +(* List.iter print_char_class chars; *) + let chr = Array.of_list (List.rev !chars) + and act = !actions in + chars := []; + actions := []; + (chr, name_regexp_list, act) + + +(* To generate directly a NFA from a regular expression. + Confer Aho-Sethi-Ullman, dragon book, chap. 3 *) + +type transition = + OnChars of int + | ToAction of int + + +let rec merge_trans l1 l2 = + match (l1, l2) with + ([], s2) -> s2 + | (s1, []) -> s1 + | ((OnChars n1 as t1) :: r1 as s1), ((OnChars n2 as t2) :: r2 as s2) -> + if n1 = n2 then t1 :: merge_trans r1 r2 else + if n1 < n2 then t1 :: merge_trans r1 s2 else + t2 :: merge_trans s1 r2 + | ((ToAction n1 as t1) :: r1 as s1), ((ToAction n2 as t2) :: r2 as s2) -> + if n1 = n2 then t1 :: merge_trans r1 r2 else + if n1 < n2 then t1 :: merge_trans r1 s2 else + t2 :: merge_trans s1 r2 + | ((OnChars n1 as t1) :: r1), ((ToAction n2) :: r2 as s2) -> + t1 :: merge_trans r1 s2 + | ((ToAction n1) :: r1 as s1), ((OnChars n2 as t2) :: r2) -> + t2 :: merge_trans s1 r2 + + +let rec nullable = function + Empty -> true + | Chars _ -> false + | Action _ -> false + | Seq(r1,r2) -> nullable r1 && nullable r2 + | Alt(r1,r2) -> nullable r1 || nullable r2 + | Star r -> true + + +let rec firstpos = function + Empty -> [] + | Chars pos -> [OnChars pos] + | Action act -> [ToAction act] + | Seq(r1,r2) -> if nullable r1 + then merge_trans (firstpos r1) (firstpos r2) + else firstpos r1 + | Alt(r1,r2) -> merge_trans (firstpos r1) (firstpos r2) + | Star r -> firstpos r + + +let rec lastpos = function + Empty -> [] + | Chars pos -> [OnChars pos] + | Action act -> [ToAction act] + | Seq(r1,r2) -> if nullable r2 + then merge_trans (lastpos r1) (lastpos r2) + else lastpos r2 + | Alt(r1,r2) -> merge_trans (lastpos r1) (lastpos r2) + | Star r -> lastpos r + + +let followpos size name_regexp_list = + let v = Array.create size [] in + let fill_pos first = function + OnChars pos -> v.(pos) <- merge_trans first v.(pos); () + | ToAction _ -> () in + let rec fill = function + Seq(r1,r2) -> + fill r1; fill r2; + List.iter (fill_pos (firstpos r2)) (lastpos r1) + | Alt(r1,r2) -> + fill r1; fill r2 + | Star r -> + fill r; + List.iter (fill_pos (firstpos r)) (lastpos r) + | _ -> () in + List.iter (fun (name, regexp) -> fill regexp) name_regexp_list; + v + + +let no_action = 0x3FFFFFFF + +let split_trans_set = + List.fold_left + (fun (act, pos_set as act_pos_set) trans -> + match trans with + OnChars pos -> (act, pos :: pos_set) + | ToAction act1 -> if act1 < act then (act1, pos_set) + else act_pos_set) + (no_action, []) + + +let memory = (Hashtbl.create 131 : (transition list, int) Hashtbl.t) +let todo = ref ([] : (transition list * int) list) +let next = ref 0 + +let get_state st = + try + Hashtbl.find memory st + with Not_found -> + let nbr = !next in + next := !next + 1; + Hashtbl.add memory st nbr; + todo := (st, nbr) :: !todo; + nbr + +let rec map_on_states f = + match !todo with + [] -> [] + | (st,i)::r -> todo := r; let res = f st in (res,i) :: map_on_states f + +let number_of_states () = !next + +let goto_state = function + [] -> Backtrack + | ps -> Goto (get_state ps) + + +let transition_from chars follow pos_set = + let tr = Array.create 256 [] + and shift = Array.create 256 Backtrack in + List.iter + (fun pos -> + List.iter + (fun c -> + tr.(Char.code c) <- + merge_trans tr.(Char.code c) follow.(pos)) + chars.(pos)) + pos_set; + for i = 0 to 255 do + shift.(i) <- goto_state tr.(i) + done; + shift + + +let translate_state chars follow state = + match split_trans_set state with + n, [] -> Perform n + | n, ps -> Shift( (if n = no_action then No_remember else Remember n), + transition_from chars follow ps) + + +let make_dfa lexdef = + let (chars, name_regexp_list, actions) = + encode_lexdef lexdef in +(** + List.iter (fun (name, regexp) -> prerr_string name; prerr_string " = "; print_regexp regexp; prerr_newline()) name_regexp_list; +**) + let follow = + followpos (Array.length chars) name_regexp_list in + let initial_states = + List.map (fun (name, regexp) -> (name, get_state(firstpos regexp))) + name_regexp_list in + let states = + map_on_states (translate_state chars follow) in + let v = + Array.create (number_of_states()) (Perform 0) in + List.iter (fun (auto, i) -> v.(i) <- auto) states; + (initial_states, v, actions) + diff --git a/testsuite/tests/tool-lexyacc/main.ml b/testsuite/tests/tool-lexyacc/main.ml new file mode 100644 index 00000000..1dd130b9 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/main.ml @@ -0,0 +1,119 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: main.ml,v 1.4 1999/11/17 18:58:39 xleroy Exp $ *) + +(* The lexer generator. Command-line parsing. *) + +open Syntax +open Scanner +open Grammar +open Lexgen +open Output + +let main () = + if Array.length Sys.argv <> 2 then begin + prerr_string "Usage: camllex \n"; + exit 2 + end; + let source_name = Sys.argv.(1) in + let dest_name = + if Filename.check_suffix source_name ".mll" then + Filename.chop_suffix source_name ".mll" ^ ".ml" + else + source_name ^ ".ml" in + ic := open_in source_name; +(* oc := open_out dest_name; *) ignore dest_name; + oc := stdout; + let lexbuf = Lexing.from_channel !ic in + let (Lexdef(header,_) as def) = + try + Grammar.lexer_definition Scanner.main lexbuf + with + Parsing.Parse_error -> + prerr_string "Syntax error around char "; + prerr_int (Lexing.lexeme_start lexbuf); + prerr_endline "."; + exit 2 + | Scan_aux.Lexical_error s -> + prerr_string "Lexical error around char "; + prerr_int (Lexing.lexeme_start lexbuf); + prerr_string ": "; + prerr_string s; + prerr_endline "."; + exit 2 in + let ((init, states, acts) as dfa) = make_dfa def in + output_lexdef header dfa; + close_in !ic; + close_out !oc + +let _ = main(); exit 0 + + +(***** +let main () = + ic := stdin; + oc := stdout; + let lexbuf = lexing.from_channel ic in + let (Lexdef(header,_) as def) = + try + grammar.lexer_definition scanner.main lexbuf + with + parsing.Parse_error x -> + prerr_string "Syntax error around char "; + prerr_int (lexing.lexeme_start lexbuf); + prerr_endline "."; + sys.exit 2 + | scan_aux.Lexical_error s -> + prerr_string "Lexical error around char "; + prerr_int (lexing.lexeme_start lexbuf); + prerr_string ": "; + prerr_string s; + prerr_endline "."; + sys.exit 2 in + let ((init, states, acts) as dfa) = make_dfa def in + output_lexdef header dfa + +****) + +(**** +let debug_scanner lexbuf = + let tok = scanner.main lexbuf in + begin match tok with + Tident s -> prerr_string "Tident "; prerr_string s + | Tchar c -> prerr_string "Tchar "; prerr_char c + | Tstring s -> prerr_string "Tstring "; prerr_string s + | Taction(Location(i1,i2)) -> + prerr_string "Taction "; prerr_int i1; prerr_string "-"; + prerr_int i2 + | Trule -> prerr_string "Trule" + | Tparse -> prerr_string "Tparse" + | Tand -> prerr_string "Tand" + | Tequal -> prerr_string "Tequal" + | Tend -> prerr_string "Tend" + | Tor -> prerr_string "Tor" + | Tunderscore -> prerr_string "Tunderscore" + | Teof -> prerr_string "Teof" + | Tlbracket -> prerr_string "Tlbracket" + | Trbracket -> prerr_string "Trbracket" + | Tstar -> prerr_string "Tstar" + | Tmaybe -> prerr_string "Tmaybe" + | Tplus -> prerr_string "Tplus" + | Tlparen -> prerr_string "Tlparen" + | Trparen -> prerr_string "Trparen" + | Tcaret -> prerr_string "Tcaret" + | Tdash -> prerr_string "Tdash" + end; + prerr_newline(); + tok + +****) diff --git a/testsuite/tests/tool-lexyacc/main.reference b/testsuite/tests/tool-lexyacc/main.reference new file mode 100644 index 00000000..7711833a --- /dev/null +++ b/testsuite/tests/tool-lexyacc/main.reference @@ -0,0 +1,313 @@ +66 states, 44 actions. + +open Syntax +open Grammar +open Scan_aux + +let rec action_43 lexbuf = ( + comment lexbuf ) +and action_42 lexbuf = ( + raise(Lexical_error "unterminated comment") ) +and action_41 lexbuf = ( + reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + comment lexbuf ) +and action_40 lexbuf = ( + decr comment_depth; + if !comment_depth = 0 then () else comment lexbuf ) +and action_39 lexbuf = ( + incr comment_depth; comment lexbuf ) +and action_38 lexbuf = ( + raise(Lexical_error "bad character constant") ) +and action_37 lexbuf = ( + char_for_decimal_code lexbuf 1 ) +and action_36 lexbuf = ( + char_for_backslash (Lexing.lexeme_char lexbuf 1) ) +and action_35 lexbuf = ( + Lexing.lexeme_char lexbuf 0 ) +and action_34 lexbuf = ( + store_string_char(Lexing.lexeme_char lexbuf 0); + string lexbuf ) +and action_33 lexbuf = ( + raise(Lexical_error "unterminated string") ) +and action_32 lexbuf = ( + store_string_char(char_for_decimal_code lexbuf 1); + string lexbuf ) +and action_31 lexbuf = ( + store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); + string lexbuf ) +and action_30 lexbuf = ( + string lexbuf ) +and action_29 lexbuf = ( + () ) +and action_28 lexbuf = ( + action lexbuf ) +and action_27 lexbuf = ( + raise (Lexical_error "unterminated action") ) +and action_26 lexbuf = ( + comment_depth := 1; + comment lexbuf; + action lexbuf ) +and action_25 lexbuf = ( + let _ = char lexbuf in action lexbuf ) +and action_24 lexbuf = ( + reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + action lexbuf ) +and action_23 lexbuf = ( + decr brace_depth; + if !brace_depth = 0 then Lexing.lexeme_start lexbuf else action lexbuf ) +and action_22 lexbuf = ( + incr brace_depth; + action lexbuf ) +and action_21 lexbuf = ( + raise(Lexical_error("illegal character " ^ Lexing.lexeme lexbuf)) ) +and action_20 lexbuf = ( + raise(Lexical_error "unterminated lexer definition") ) +and action_19 lexbuf = ( + Tdash ) +and action_18 lexbuf = ( + Tcaret ) +and action_17 lexbuf = ( + Trparen ) +and action_16 lexbuf = ( + Tlparen ) +and action_15 lexbuf = ( + Tplus ) +and action_14 lexbuf = ( + Tmaybe ) +and action_13 lexbuf = ( + Tstar ) +and action_12 lexbuf = ( + Trbracket ) +and action_11 lexbuf = ( + Tlbracket ) +and action_10 lexbuf = ( + Teof ) +and action_9 lexbuf = ( + Tunderscore ) +and action_8 lexbuf = ( + Tor ) +and action_7 lexbuf = ( + Tend ) +and action_6 lexbuf = ( + Tequal ) +and action_5 lexbuf = ( + let n1 = Lexing.lexeme_end lexbuf in + brace_depth := 1; + let n2 = action lexbuf in + Taction(Location(n1, n2)) ) +and action_4 lexbuf = ( + Tchar(char lexbuf) ) +and action_3 lexbuf = ( + reset_string_buffer(); + string lexbuf; + Tstring(get_stored_string()) ) +and action_2 lexbuf = ( + match Lexing.lexeme lexbuf with + "rule" -> Trule + | "parse" -> Tparse + | "and" -> Tand + | "eof" -> Teof + | s -> Tident s ) +and action_1 lexbuf = ( + comment_depth := 1; + comment lexbuf; + main lexbuf ) +and action_0 lexbuf = ( + main lexbuf ) +and state_0 lexbuf = + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A' -> state_51 lexbuf + | ' '|'\013'|'\n'|'\t' -> state_40 lexbuf + | '|' -> action_8 lexbuf + | '{' -> action_5 lexbuf + | 'e' -> state_56 lexbuf + | '_' -> state_55 lexbuf + | '^' -> action_18 lexbuf + | ']' -> action_12 lexbuf + | '[' -> action_11 lexbuf + | '?' -> action_14 lexbuf + | '=' -> action_6 lexbuf + | ';' -> state_48 lexbuf + | '-' -> action_19 lexbuf + | '+' -> action_15 lexbuf + | '*' -> action_13 lexbuf + | ')' -> action_17 lexbuf + | '(' -> state_43 lexbuf + | '\'' -> action_4 lexbuf + | '"' -> action_3 lexbuf + | '\000' -> action_20 lexbuf + | _ -> action_21 lexbuf +and state_1 lexbuf = + match lexing.next_char lexbuf with + '}' -> action_23 lexbuf + | '{' -> action_22 lexbuf + | '(' -> state_34 lexbuf + | '\'' -> action_25 lexbuf + | '"' -> action_24 lexbuf + | '\000' -> action_27 lexbuf + | _ -> action_28 lexbuf +and state_2 lexbuf = + match lexing.next_char lexbuf with + '\\' -> state_24 lexbuf + | '"' -> action_29 lexbuf + | '\000' -> action_33 lexbuf + | _ -> action_34 lexbuf +and state_3 lexbuf = + match lexing.next_char lexbuf with + '\\' -> state_13 lexbuf + | '\000' -> lexing.backtrack lexbuf + | _ -> state_12 lexbuf +and state_4 lexbuf = + match lexing.next_char lexbuf with + '*' -> state_9 lexbuf + | '(' -> state_8 lexbuf + | '"' -> action_41 lexbuf + | '\000' -> action_42 lexbuf + | _ -> action_43 lexbuf +and state_8 lexbuf = + Lexing.set_backtrack lexbuf action_43; + match lexing.next_char lexbuf with + '*' -> action_39 lexbuf + | _ -> lexing.backtrack lexbuf +and state_9 lexbuf = + Lexing.set_backtrack lexbuf action_43; + match lexing.next_char lexbuf with + ')' -> action_40 lexbuf + | _ -> lexing.backtrack lexbuf +and state_12 lexbuf = + Lexing.set_backtrack lexbuf action_38; + match lexing.next_char lexbuf with + '\'' -> action_35 lexbuf + | _ -> lexing.backtrack lexbuf +and state_13 lexbuf = + Lexing.set_backtrack lexbuf action_38; + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_15 lexbuf + | 't'|'r'|'n'|'b'|'\\'|'\'' -> state_14 lexbuf + | _ -> lexing.backtrack lexbuf +and state_14 lexbuf = + match lexing.next_char lexbuf with + '\'' -> action_36 lexbuf + | _ -> lexing.backtrack lexbuf +and state_15 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_16 lexbuf + | _ -> lexing.backtrack lexbuf +and state_16 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_17 lexbuf + | _ -> lexing.backtrack lexbuf +and state_17 lexbuf = + match lexing.next_char lexbuf with + '\'' -> action_37 lexbuf + | _ -> lexing.backtrack lexbuf +and state_24 lexbuf = + Lexing.set_backtrack lexbuf action_34; + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_27 lexbuf + | 't'|'r'|'n'|'b'|'\\'|'"' -> action_31 lexbuf + | ' '|'\026'|'\013'|'\012'|'\n'|'\t' -> state_25 lexbuf + | _ -> lexing.backtrack lexbuf +and state_25 lexbuf = + Lexing.set_backtrack lexbuf action_30; + match lexing.next_char lexbuf with + ' '|'\026'|'\013'|'\012'|'\n'|'\t' -> state_25 lexbuf + | _ -> lexing.backtrack lexbuf +and state_27 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> state_28 lexbuf + | _ -> lexing.backtrack lexbuf +and state_28 lexbuf = + match lexing.next_char lexbuf with + '9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0' -> action_32 lexbuf + | _ -> lexing.backtrack lexbuf +and state_34 lexbuf = + Lexing.set_backtrack lexbuf action_28; + match lexing.next_char lexbuf with + '*' -> action_26 lexbuf + | _ -> lexing.backtrack lexbuf +and state_40 lexbuf = + Lexing.set_backtrack lexbuf action_0; + match lexing.next_char lexbuf with + ' '|'\013'|'\n'|'\t' -> state_65 lexbuf + | _ -> lexing.backtrack lexbuf +and state_43 lexbuf = + Lexing.set_backtrack lexbuf action_16; + match lexing.next_char lexbuf with + '*' -> action_1 lexbuf + | _ -> lexing.backtrack lexbuf +and state_48 lexbuf = + Lexing.set_backtrack lexbuf action_21; + match lexing.next_char lexbuf with + ';' -> action_7 lexbuf + | _ -> lexing.backtrack lexbuf +and state_51 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_55 lexbuf = + Lexing.set_backtrack lexbuf action_9; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | _ -> lexing.backtrack lexbuf +and state_56 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | 'o' -> state_61 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_59 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_60 lexbuf = + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | _ -> lexing.backtrack lexbuf +and state_61 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | 'f' -> state_62 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_62 lexbuf = + Lexing.set_backtrack lexbuf action_2; + match lexing.next_char lexbuf with + 'z'|'y'|'x'|'w'|'v'|'u'|'t'|'s'|'r'|'q'|'p'|'o'|'n'|'m'|'l'|'k'|'j'|'i'|'h'|'g'|'f'|'e'|'d'|'c'|'b'|'a'|'Z'|'Y'|'X'|'W'|'V'|'U'|'T'|'S'|'R'|'Q'|'P'|'O'|'N'|'M'|'L'|'K'|'J'|'I'|'H'|'G'|'F'|'E'|'D'|'C'|'B'|'A'|'9'|'8'|'7'|'6'|'5'|'4'|'3'|'2'|'1'|'0'|'\'' -> state_59 lexbuf + | '_' -> state_60 lexbuf + | _ -> lexing.backtrack lexbuf +and state_65 lexbuf = + Lexing.set_backtrack lexbuf action_0; + match lexing.next_char lexbuf with + ' '|'\013'|'\n'|'\t' -> state_65 lexbuf + | _ -> lexing.backtrack lexbuf +and main lexbuf = + Lexing.init lexbuf; + state_0 lexbuf + +and action lexbuf = + Lexing.init lexbuf; + state_1 lexbuf + +and string lexbuf = + Lexing.init lexbuf; + state_2 lexbuf + +and char lexbuf = + Lexing.init lexbuf; + state_3 lexbuf + +and comment lexbuf = + Lexing.init lexbuf; + state_4 lexbuf + diff --git a/testsuite/tests/tool-lexyacc/output.ml b/testsuite/tests/tool-lexyacc/output.ml new file mode 100644 index 00000000..6c561408 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/output.ml @@ -0,0 +1,169 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: output.ml,v 1.5 2000/12/28 13:06:41 weis Exp $ *) + +(* Generating a DFA as a set of mutually recursive functions *) + +open Syntax + +let ic = ref stdin +let oc = ref stdout + +(* 1- Generating the actions *) + +let copy_buffer = String.create 1024 + +let copy_chunk (Location(start,stop)) = + seek_in !ic start; + let tocopy = ref(stop - start) in + while !tocopy > 0 do + let m = + input !ic copy_buffer 0 (min !tocopy (String.length copy_buffer)) in + output !oc copy_buffer 0 m; + tocopy := !tocopy - m + done + + +let output_action (i,act) = + output_string !oc ("action_" ^ string_of_int i ^ " lexbuf = (\n"); + copy_chunk act; + output_string !oc ")\nand " + + +(* 2- Generating the states *) + +let states = ref ([||] : automata array) + +type occurrence = + { mutable pos: int list; + mutable freq: int } + +let enumerate_vect v = + let env = ref [] in + for pos = 0 to Array.length v - 1 do + try + let occ = List.assoc v.(pos) !env in + occ.pos <- pos :: occ.pos; + occ.freq <- occ.freq + 1 + with Not_found -> + env := (v.(pos), {pos = [pos]; freq = 1 }) :: !env + done; + Sort.list (fun (e1, occ1) (e2, occ2) -> occ1.freq >= occ2.freq) !env + + +let output_move = function + Backtrack -> + output_string !oc "lexing.backtrack lexbuf" + | Goto dest -> + match !states.(dest) with + Perform act_num -> + output_string !oc ("action_" ^ string_of_int act_num ^ " lexbuf") + | _ -> + output_string !oc ("state_" ^ string_of_int dest ^ " lexbuf") + + +(* Cannot use standard char_for_read because the characters to escape + are not the same in CL6 and CL1999. *) + +let output_char_lit oc = function + '\'' -> output_string oc "\\'" + | '\\' -> output_string oc "\\\\" + | '\n' -> output_string oc "\\n" + | '\t' -> output_string oc "\\t" + | c -> if Char.code c >= 32 && Char.code c < 128 then + output_char oc c + else begin + let n = Char.code c in + output_char oc '\\'; + output_char oc (Char.chr (48 + n / 100)); + output_char oc (Char.chr (48 + (n / 10) mod 10)); + output_char oc (Char.chr (48 + n mod 10)) + end + +let rec output_chars = function + [] -> + failwith "output_chars" + | [c] -> + output_string !oc "'"; + output_char_lit !oc (Char.chr c); + output_string !oc "'" + | c::cl -> + output_string !oc "'"; + output_char_lit !oc (Char.chr c); + output_string !oc "'|"; + output_chars cl + +let output_one_trans (dest, occ) = + output_chars occ.pos; + output_string !oc " -> "; + output_move dest; + output_string !oc "\n | " + +let output_all_trans trans = + output_string !oc " match lexing.next_char lexbuf with\n "; + match enumerate_vect trans with + [] -> + failwith "output_all_trans" + | (default, _) :: rest -> + List.iter output_one_trans rest; + output_string !oc "_ -> "; + output_move default; + output_string !oc "\nand " + +let output_state state_num = function + Perform i -> + () + | Shift(what_to_do, moves) -> + output_string !oc + ("state_" ^ string_of_int state_num ^ " lexbuf =\n"); + begin match what_to_do with + No_remember -> () + | Remember i -> + output_string !oc + (" Lexing.set_backtrack lexbuf action_" ^ + string_of_int i ^ ";\n") + end; + output_all_trans moves + + +(* 3- Generating the entry points *) + +let rec output_entries = function + [] -> failwith "output_entries" + | (name,state_num) :: rest -> + output_string !oc (name ^ " lexbuf =\n"); + output_string !oc " Lexing.init lexbuf;\n"; + output_string !oc (" state_" ^ string_of_int state_num ^ + " lexbuf\n"); + match rest with + [] -> output_string !oc "\n"; () + | _ -> output_string !oc "\nand "; output_entries rest + + +(* All together *) + +let output_lexdef header (initial_st, st, actions) = + print_int (Array.length st); print_string " states, "; + print_int (List.length actions); print_string " actions."; + print_newline(); + copy_chunk header; + output_string !oc "\nlet rec "; + states := st; + List.iter output_action actions; + for i = 0 to Array.length st - 1 do + output_state i st.(i) + done; + output_entries initial_st + + + diff --git a/testsuite/tests/tool-lexyacc/scan_aux.ml b/testsuite/tests/tool-lexyacc/scan_aux.ml new file mode 100644 index 00000000..172d6f41 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/scan_aux.ml @@ -0,0 +1,60 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: scan_aux.ml,v 1.4 1999/11/17 18:58:39 xleroy Exp $ *) + +(* Auxiliaries for the lexical analyzer *) + +let brace_depth = ref 0 +let comment_depth = ref 0 + +exception Lexical_error of string + +let initial_string_buffer = String.create 256 +let string_buff = ref initial_string_buffer +let string_index = ref 0 + +let reset_string_buffer () = + string_buff := initial_string_buffer; + string_index := 0 + + +let store_string_char c = + begin + if !string_index >= String.length !string_buff then begin + let new_buff = String.create (String.length !string_buff * 2) in + String.blit new_buff 0 !string_buff 0 (String.length !string_buff); + string_buff := new_buff + end + end; + String.unsafe_set !string_buff !string_index c; + incr string_index + +let get_stored_string () = + let s = String.sub !string_buff 0 !string_index in + string_buff := initial_string_buffer; + s + + +let char_for_backslash = function + 'n' -> '\010' (* '\n' when bootstrapped *) + | 't' -> '\009' (* '\t' *) + | 'b' -> '\008' (* '\b' *) + | 'r' -> '\013' (* '\r' *) + | c -> c + + +let char_for_decimal_code lexbuf i = + Char.chr(100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) + + 10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) + + (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48)) + diff --git a/testsuite/tests/tool-lexyacc/scanner.mll b/testsuite/tests/tool-lexyacc/scanner.mll new file mode 100644 index 00000000..c7d74b01 --- /dev/null +++ b/testsuite/tests/tool-lexyacc/scanner.mll @@ -0,0 +1,132 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: scanner.mll,v 1.5 1999/11/17 18:58:39 xleroy Exp $ *) + +(* The lexical analyzer for lexer definitions. *) + +{ +open Syntax +open Grammar +open Scan_aux +} + +rule main = parse + [' ' '\010' '\013' '\009' ] + + { main lexbuf } + | "(*" + { comment_depth := 1; + comment lexbuf; + main lexbuf } + | (['A'-'Z' 'a'-'z'] | '_' ['A'-'Z' 'a'-'z' '\'' '0'-'9']) + ( '_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9'] ) * + { match Lexing.lexeme lexbuf with + "rule" -> Trule + | "parse" -> Tparse + | "and" -> Tand + | "eof" -> Teof + | s -> Tident s } + | '"' + { reset_string_buffer(); + string lexbuf; + Tstring(get_stored_string()) } + | "'" + { Tchar(char lexbuf) } + | '{' + { let n1 = Lexing.lexeme_end lexbuf in + brace_depth := 1; + let n2 = action lexbuf in + Taction(Location(n1, n2)) } + | '=' { Tequal } + | ";;" { Tend } + | '|' { Tor } + | '_' { Tunderscore } + | "eof" { Teof } + | '[' { Tlbracket } + | ']' { Trbracket } + | '*' { Tstar } + | '?' { Tmaybe } + | '+' { Tplus } + | '(' { Tlparen } + | ')' { Trparen } + | '^' { Tcaret } + | '-' { Tdash } + | eof + { raise(Lexical_error "unterminated lexer definition") } + | _ + { raise(Lexical_error("illegal character " ^ Lexing.lexeme lexbuf)) } + +and action = parse + '{' + { incr brace_depth; + action lexbuf } + | '}' + { decr brace_depth; + if !brace_depth = 0 then Lexing.lexeme_start lexbuf else action lexbuf } + | '"' + { reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + action lexbuf } + | '\'' + { let _ = char lexbuf in action lexbuf } + | "(*" + { comment_depth := 1; + comment lexbuf; + action lexbuf } + | eof + { raise (Lexical_error "unterminated action") } + | _ + { action lexbuf } + +and string = parse + '"' + { () } + | '\\' [' ' '\010' '\013' '\009' '\026' '\012'] + + { string lexbuf } + | '\\' ['\\' '"' 'n' 't' 'b' 'r'] + { store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); + string lexbuf } + | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] + { store_string_char(char_for_decimal_code lexbuf 1); + string lexbuf } + | eof + { raise(Lexical_error "unterminated string") } + | _ + { store_string_char(Lexing.lexeme_char lexbuf 0); + string lexbuf } + +and char = parse + [^ '\\'] "'" + { Lexing.lexeme_char lexbuf 0 } + | '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'" + { char_for_backslash (Lexing.lexeme_char lexbuf 1) } + | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'" + { char_for_decimal_code lexbuf 1 } + | _ + { raise(Lexical_error "bad character constant") } + +and comment = parse + "(*" + { incr comment_depth; comment lexbuf } + | "*)" + { decr comment_depth; + if !comment_depth = 0 then () else comment lexbuf } + | '"' + { reset_string_buffer(); + string lexbuf; + reset_string_buffer(); + comment lexbuf } + | eof + { raise(Lexical_error "unterminated comment") } + | _ + { comment lexbuf } diff --git a/testsuite/tests/tool-lexyacc/syntax.ml b/testsuite/tests/tool-lexyacc/syntax.ml new file mode 100644 index 00000000..14d2987a --- /dev/null +++ b/testsuite/tests/tool-lexyacc/syntax.ml @@ -0,0 +1,40 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, 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 Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: syntax.ml,v 1.4 1999/11/17 18:58:39 xleroy Exp $ *) + +(* The shallow abstract syntax *) + +type location = + Location of int * int + +type regular_expression = + Epsilon + | Characters of char list + | Sequence of regular_expression * regular_expression + | Alternative of regular_expression * regular_expression + | Repetition of regular_expression + +type lexer_definition = + Lexdef of location * (string * (regular_expression * location) list) list + +(* Representation of automata *) + +type automata = + Perform of int + | Shift of automata_trans * automata_move array +and automata_trans = + No_remember + | Remember of int +and automata_move = + Backtrack + | Goto of int diff --git a/testsuite/tests/tool-ocaml/Makefile b/testsuite/tests/tool-ocaml/Makefile new file mode 100644 index 00000000..2b2940fb --- /dev/null +++ b/testsuite/tests/tool-ocaml/Makefile @@ -0,0 +1,16 @@ +SHOULD_FAIL=t060-raise.ml + +compile: lib.cmo + @for file in t*.ml; do \ + printf " ... testing '$$file'"; \ + if [ `echo $(SHOULD_FAIL) | grep $$file` ]; then \ + $(OCAML) -w a lib.cmo $$file 2> /dev/null && (echo " => failed" && exit 1) || echo " => passed"; \ + else \ + $(OCAML) -w a lib.cmo $$file 2> /dev/null && echo " => passed" || (echo " => failed" && exit 1); \ + fi; \ + done + +clean: defaultclean + @rm -f ./a.out + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/tool-ocaml/lib.ml b/testsuite/tests/tool-ocaml/lib.ml new file mode 100644 index 00000000..bf08b66c --- /dev/null +++ b/testsuite/tests/tool-ocaml/lib.ml @@ -0,0 +1,46 @@ +(* file $Id: lib.ml 6190 2004-04-06 09:11:45Z starynke $ *) + +external raise : exn -> 'a = "%raise" + +external not : bool -> bool = "%boolnot" + +external (=) : 'a -> 'a -> bool = "%equal" +external (<>) : 'a -> 'a -> bool = "%notequal" +external (<) : 'a -> 'a -> bool = "%lessthan" +external (>) : 'a -> 'a -> bool = "%greaterthan" +external (<=) : 'a -> 'a -> bool = "%lessequal" +external (>=) : 'a -> 'a -> bool = "%greaterequal" + +external (~-) : int -> int = "%negint" +external (+) : int -> int -> int = "%addint" +external (-) : int -> int -> int = "%subint" +external ( * ) : int -> int -> int = "%mulint" +external (/) : int -> int -> int = "%divint" +external (mod) : int -> int -> int = "%modint" + +external (land) : int -> int -> int = "%andint" +external (lor) : int -> int -> int = "%orint" +external (lxor) : int -> int -> int = "%xorint" +external (lsl) : int -> int -> int = "%lslint" +external (lsr) : int -> int -> int = "%lsrint" +external (asr) : int -> int -> int = "%asrint" + +external ignore : 'a -> unit = "%ignore" + +type 'a ref = { mutable contents: 'a } +external ref : 'a -> 'a ref = "%makemutable" +external (!) : 'a ref -> 'a = "%field0" +external (:=) : 'a ref -> 'a -> unit = "%setfield0" +external incr : int ref -> unit = "%incr" +external decr : int ref -> unit = "%decr" + +type 'a option = None | Some of 'a + +type 'a weak_t;; +external weak_create: int -> 'a weak_t = "caml_weak_create";; +external weak_set : 'a weak_t -> int -> 'a option -> unit = "caml_weak_set";; +external weak_get: 'a weak_t -> int -> 'a option = "caml_weak_get";; + +let x = 42;; + +(* eof $Id: lib.ml 6190 2004-04-06 09:11:45Z starynke $ *) diff --git a/testsuite/tests/tool-ocaml/t000.ml b/testsuite/tests/tool-ocaml/t000.ml new file mode 100644 index 00000000..fafa1c89 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t000.ml @@ -0,0 +1,7 @@ +(* empty file *) + +(** + 0 ATOM0 + 1 SETGLOBAL T000 + 3 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t010-const0.ml b/testsuite/tests/tool-ocaml/t010-const0.ml new file mode 100644 index 00000000..73ecbb1f --- /dev/null +++ b/testsuite/tests/tool-ocaml/t010-const0.ml @@ -0,0 +1,8 @@ +0;; + +(** + 0 CONST0 + 1 ATOM0 + 2 SETGLOBAL T010-const0 + 4 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t010-const1.ml b/testsuite/tests/tool-ocaml/t010-const1.ml new file mode 100644 index 00000000..75a00d57 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t010-const1.ml @@ -0,0 +1,8 @@ +1;; + +(** + 0 CONST1 + 1 ATOM0 + 2 SETGLOBAL T010-const1 + 4 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t010-const2.ml b/testsuite/tests/tool-ocaml/t010-const2.ml new file mode 100644 index 00000000..f0ed8e7d --- /dev/null +++ b/testsuite/tests/tool-ocaml/t010-const2.ml @@ -0,0 +1,8 @@ +2;; + +(** + 0 CONST2 + 1 ATOM0 + 2 SETGLOBAL T010-const2 + 4 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t010-const3.ml b/testsuite/tests/tool-ocaml/t010-const3.ml new file mode 100644 index 00000000..4f034c4b --- /dev/null +++ b/testsuite/tests/tool-ocaml/t010-const3.ml @@ -0,0 +1,8 @@ +3;; + +(** + 0 CONST3 + 1 ATOM0 + 2 SETGLOBAL T010-const3 + 4 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t011-constint.ml b/testsuite/tests/tool-ocaml/t011-constint.ml new file mode 100644 index 00000000..9ece6c53 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t011-constint.ml @@ -0,0 +1,8 @@ +4;; + +(** + 0 CONSTINT 4 + 2 ATOM0 + 3 SETGLOBAL T011-constint + 5 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t020.ml b/testsuite/tests/tool-ocaml/t020.ml new file mode 100644 index 00000000..5d6a3cfc --- /dev/null +++ b/testsuite/tests/tool-ocaml/t020.ml @@ -0,0 +1,10 @@ +let _ = () in ();; + +(** + 0 CONST0 + 1 PUSHCONST0 + 2 POP 1 + 4 ATOM0 + 5 SETGLOBAL T020 + 7 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t021-pushconst1.ml b/testsuite/tests/tool-ocaml/t021-pushconst1.ml new file mode 100644 index 00000000..075997a8 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t021-pushconst1.ml @@ -0,0 +1,10 @@ +let _ = () in 1;; + +(** + 0 CONST0 + 1 PUSHCONST1 + 2 POP 1 + 4 ATOM0 + 5 SETGLOBAL T021-pushconst1 + 7 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t021-pushconst2.ml b/testsuite/tests/tool-ocaml/t021-pushconst2.ml new file mode 100644 index 00000000..17adb507 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t021-pushconst2.ml @@ -0,0 +1,10 @@ +let _ = () in 2;; + +(** + 0 CONST0 + 1 PUSHCONST2 + 2 POP 1 + 4 ATOM0 + 5 SETGLOBAL T021-pushconst2 + 7 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t021-pushconst3.ml b/testsuite/tests/tool-ocaml/t021-pushconst3.ml new file mode 100644 index 00000000..563c6093 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t021-pushconst3.ml @@ -0,0 +1,10 @@ +let _ = () in 3;; + +(** + 0 CONST0 + 1 PUSHCONST3 + 2 POP 1 + 4 ATOM0 + 5 SETGLOBAL T021-pushconst3 + 7 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t022-pushconstint.ml b/testsuite/tests/tool-ocaml/t022-pushconstint.ml new file mode 100644 index 00000000..1b766a57 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t022-pushconstint.ml @@ -0,0 +1,10 @@ +let _ = () in -1;; + +(** + 0 CONST0 + 1 PUSHCONSTINT -1 + 3 POP 1 + 5 ATOM0 + 6 SETGLOBAL T022-pushconstint + 8 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t040-makeblock1.ml b/testsuite/tests/tool-ocaml/t040-makeblock1.ml new file mode 100644 index 00000000..71516606 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t040-makeblock1.ml @@ -0,0 +1,13 @@ +type t = { + mutable a : int; +};; + +{ a = 0 };; + +(** + 0 CONST0 + 1 MAKEBLOCK1 0 + 3 ATOM0 + 4 SETGLOBAL T040-makeblock1 + 6 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t040-makeblock2.ml b/testsuite/tests/tool-ocaml/t040-makeblock2.ml new file mode 100644 index 00000000..e7c745b9 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t040-makeblock2.ml @@ -0,0 +1,15 @@ +type t = { + mutable a : int; + mutable b : int; +};; + +{ a = 0; b = 0 };; + +(** + 0 CONST0 + 1 PUSHCONST0 + 2 MAKEBLOCK2 0 + 4 ATOM0 + 5 SETGLOBAL T040-makeblock2 + 7 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t040-makeblock3.ml b/testsuite/tests/tool-ocaml/t040-makeblock3.ml new file mode 100644 index 00000000..8fb56054 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t040-makeblock3.ml @@ -0,0 +1,17 @@ +type t = { + mutable a : int; + mutable b : int; + mutable c : int; +};; + +{ a = 0; b = 0; c = 0 };; + +(** + 0 CONST0 + 1 PUSHCONST0 + 2 PUSHCONST0 + 3 MAKEBLOCK3 0 + 5 ATOM0 + 6 SETGLOBAL T040-makeblock3 + 8 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t041-makeblock.ml b/testsuite/tests/tool-ocaml/t041-makeblock.ml new file mode 100644 index 00000000..5ae255d6 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t041-makeblock.ml @@ -0,0 +1,19 @@ +type t = { + mutable a : int; + mutable b : int; + mutable c : int; + mutable d : int; +};; + +{ a = 0; b = 0; c = 0; d = 0 };; + +(** + 0 CONST0 + 1 PUSHCONST0 + 2 PUSHCONST0 + 3 PUSHCONST0 + 4 MAKEBLOCK 4, 0 + 7 ATOM0 + 8 SETGLOBAL T041-makeblock + 10 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t050-getglobal.ml b/testsuite/tests/tool-ocaml/t050-getglobal.ml new file mode 100644 index 00000000..f10393cf --- /dev/null +++ b/testsuite/tests/tool-ocaml/t050-getglobal.ml @@ -0,0 +1,8 @@ +[1];; + +(** + 0 GETGLOBAL <0>(1, 0) + 2 ATOM0 + 3 SETGLOBAL T050-getglobal + 5 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml b/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml new file mode 100644 index 00000000..e1172cc3 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t050-pushgetglobal.ml @@ -0,0 +1,10 @@ +let _ = () in 0.01;; + +(** + 0 CONST0 + 1 PUSHGETGLOBAL 0.01 + 3 POP 1 + 5 ATOM0 + 6 SETGLOBAL T050-pushgetglobal + 8 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t051-getglobalfield.ml b/testsuite/tests/tool-ocaml/t051-getglobalfield.ml new file mode 100644 index 00000000..45d9ccea --- /dev/null +++ b/testsuite/tests/tool-ocaml/t051-getglobalfield.ml @@ -0,0 +1,13 @@ +Lib.x;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBALFIELD Lib, 0 + 12 ATOM0 + 13 SETGLOBAL T051-getglobalfield + 15 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml b/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml new file mode 100644 index 00000000..2012a257 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t051-pushgetglobalfield.ml @@ -0,0 +1,15 @@ +let _ = () in Lib.x;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHGETGLOBALFIELD Lib, 0 + 13 POP 1 + 15 ATOM0 + 16 SETGLOBAL T051-pushgetglobalfield + 18 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t060-raise.ml b/testsuite/tests/tool-ocaml/t060-raise.ml new file mode 100644 index 00000000..1aa48466 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t060-raise.ml @@ -0,0 +1,15 @@ +open Lib;; +raise End_of_file;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL End_of_file + 11 MAKEBLOCK1 0 + 13 RAISE + 14 SETGLOBAL T060-raise + 16 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t070-branch.ml b/testsuite/tests/tool-ocaml/t070-branch.ml new file mode 100644 index 00000000..4fc52d42 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t070-branch.ml @@ -0,0 +1,20 @@ +open Lib;; +if true then 0 else raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 BRANCHIFNOT 15 + 12 CONST0 + 13 BRANCH 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 ATOM0 + 21 SETGLOBAL T070-branch + 23 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t070-branchif.ml b/testsuite/tests/tool-ocaml/t070-branchif.ml new file mode 100644 index 00000000..c256248c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t070-branchif.ml @@ -0,0 +1,20 @@ +open Lib;; +if not false then 0 else raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 BRANCHIF 15 + 12 CONST0 + 13 BRANCH 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 ATOM0 + 21 SETGLOBAL T070-branchif + 23 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t070-branchifnot.ml b/testsuite/tests/tool-ocaml/t070-branchifnot.ml new file mode 100644 index 00000000..9e6e4e8b --- /dev/null +++ b/testsuite/tests/tool-ocaml/t070-branchifnot.ml @@ -0,0 +1,18 @@ +open Lib;; +if false then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 BRANCHIFNOT 17 + 12 GETGLOBAL Not_found + 14 MAKEBLOCK1 0 + 16 RAISE + 17 ATOM0 + 18 SETGLOBAL T070-branchifnot + 20 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t071-boolnot.ml b/testsuite/tests/tool-ocaml/t071-boolnot.ml new file mode 100644 index 00000000..b4a81943 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t071-boolnot.ml @@ -0,0 +1,19 @@ +open Lib;; +if not true then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 BOOLNOT + 11 BRANCHIFNOT 18 + 13 GETGLOBAL Not_found + 15 MAKEBLOCK1 0 + 17 RAISE + 18 ATOM0 + 19 SETGLOBAL T071-boolnot + 21 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t080-eq.ml b/testsuite/tests/tool-ocaml/t080-eq.ml new file mode 100644 index 00000000..3ee735f0 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t080-eq.ml @@ -0,0 +1,21 @@ +open Lib;; +if not (0 = 0) then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 EQ + 12 BOOLNOT + 13 BRANCHIFNOT 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 ATOM0 + 21 SETGLOBAL T080-eq + 23 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t080-geint.ml b/testsuite/tests/tool-ocaml/t080-geint.ml new file mode 100644 index 00000000..a220b7e9 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t080-geint.ml @@ -0,0 +1,21 @@ +open Lib;; +if not (0 >= 0) then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 GEINT + 12 BOOLNOT + 13 BRANCHIFNOT 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 ATOM0 + 21 SETGLOBAL T080-geint + 23 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t080-gtint.ml b/testsuite/tests/tool-ocaml/t080-gtint.ml new file mode 100644 index 00000000..32d57321 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t080-gtint.ml @@ -0,0 +1,20 @@ +open Lib;; +if 0 > 0 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 GTINT + 12 BRANCHIFNOT 19 + 14 GETGLOBAL Not_found + 16 MAKEBLOCK1 0 + 18 RAISE + 19 ATOM0 + 20 SETGLOBAL T080-gtint + 22 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t080-leint.ml b/testsuite/tests/tool-ocaml/t080-leint.ml new file mode 100644 index 00000000..cc983a08 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t080-leint.ml @@ -0,0 +1,21 @@ +open Lib;; +if not (0 <= 0) then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 LEINT + 12 BOOLNOT + 13 BRANCHIFNOT 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 ATOM0 + 21 SETGLOBAL T080-leint + 23 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t080-ltint.ml b/testsuite/tests/tool-ocaml/t080-ltint.ml new file mode 100644 index 00000000..ae7d240a --- /dev/null +++ b/testsuite/tests/tool-ocaml/t080-ltint.ml @@ -0,0 +1,20 @@ +open Lib;; +if 0 < 0 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 LTINT + 12 BRANCHIFNOT 19 + 14 GETGLOBAL Not_found + 16 MAKEBLOCK1 0 + 18 RAISE + 19 ATOM0 + 20 SETGLOBAL T080-ltint + 22 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t080-neq.ml b/testsuite/tests/tool-ocaml/t080-neq.ml new file mode 100644 index 00000000..5066e9cb --- /dev/null +++ b/testsuite/tests/tool-ocaml/t080-neq.ml @@ -0,0 +1,20 @@ +open Lib;; +if 0 <> 0 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 NEQ + 12 BRANCHIFNOT 19 + 14 GETGLOBAL Not_found + 16 MAKEBLOCK1 0 + 18 RAISE + 19 ATOM0 + 20 SETGLOBAL T080-neq + 22 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc0.ml b/testsuite/tests/tool-ocaml/t090-acc0.ml new file mode 100644 index 00000000..74acceca --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc0.ml @@ -0,0 +1,25 @@ +open Lib;; +let x = true in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 ACC0 + 12 BOOLNOT + 13 BRANCHIFNOT 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 POP 1 + 22 ATOM0 + 23 SETGLOBAL T090-acc0 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc1.ml b/testsuite/tests/tool-ocaml/t090-acc1.ml new file mode 100644 index 00000000..fc9b0254 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc1.ml @@ -0,0 +1,27 @@ +open Lib;; +let x = true in +let y = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 ACC1 + 13 BOOLNOT + 14 BRANCHIFNOT 21 + 16 GETGLOBAL Not_found + 18 MAKEBLOCK1 0 + 20 RAISE + 21 POP 2 + 23 ATOM0 + 24 SETGLOBAL T090-acc1 + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc2.ml b/testsuite/tests/tool-ocaml/t090-acc2.ml new file mode 100644 index 00000000..48659449 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc2.ml @@ -0,0 +1,29 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 ACC2 + 14 BOOLNOT + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 POP 3 + 24 ATOM0 + 25 SETGLOBAL T090-acc2 + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc3.ml b/testsuite/tests/tool-ocaml/t090-acc3.ml new file mode 100644 index 00000000..9622456a --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc3.ml @@ -0,0 +1,31 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +let a = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 ACC3 + 15 BOOLNOT + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 POP 4 + 25 ATOM0 + 26 SETGLOBAL T090-acc3 + 28 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc4.ml b/testsuite/tests/tool-ocaml/t090-acc4.ml new file mode 100644 index 00000000..992559b7 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc4.ml @@ -0,0 +1,33 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +let a = false in +let b = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHCONST0 + 15 ACC4 + 16 BOOLNOT + 17 BRANCHIFNOT 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 POP 5 + 26 ATOM0 + 27 SETGLOBAL T090-acc4 + 29 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc5.ml b/testsuite/tests/tool-ocaml/t090-acc5.ml new file mode 100644 index 00000000..57f7453b --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc5.ml @@ -0,0 +1,35 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +let a = false in +let b = false in +let c = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHCONST0 + 15 PUSHCONST0 + 16 ACC5 + 17 BOOLNOT + 18 BRANCHIFNOT 25 + 20 GETGLOBAL Not_found + 22 MAKEBLOCK1 0 + 24 RAISE + 25 POP 6 + 27 ATOM0 + 28 SETGLOBAL T090-acc5 + 30 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc6.ml b/testsuite/tests/tool-ocaml/t090-acc6.ml new file mode 100644 index 00000000..f9400282 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc6.ml @@ -0,0 +1,37 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +let a = false in +let b = false in +let c = false in +let d = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHCONST0 + 15 PUSHCONST0 + 16 PUSHCONST0 + 17 ACC6 + 18 BOOLNOT + 19 BRANCHIFNOT 26 + 21 GETGLOBAL Not_found + 23 MAKEBLOCK1 0 + 25 RAISE + 26 POP 7 + 28 ATOM0 + 29 SETGLOBAL T090-acc6 + 31 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t090-acc7.ml b/testsuite/tests/tool-ocaml/t090-acc7.ml new file mode 100644 index 00000000..366191bf --- /dev/null +++ b/testsuite/tests/tool-ocaml/t090-acc7.ml @@ -0,0 +1,39 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +let a = false in +let b = false in +let c = false in +let d = false in +let e = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHCONST0 + 15 PUSHCONST0 + 16 PUSHCONST0 + 17 PUSHCONST0 + 18 ACC7 + 19 BOOLNOT + 20 BRANCHIFNOT 27 + 22 GETGLOBAL Not_found + 24 MAKEBLOCK1 0 + 26 RAISE + 27 POP 8 + 29 ATOM0 + 30 SETGLOBAL T090-acc7 + 32 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t091-acc.ml b/testsuite/tests/tool-ocaml/t091-acc.ml new file mode 100644 index 00000000..26b003f6 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t091-acc.ml @@ -0,0 +1,41 @@ +open Lib;; +let x = true in +let y = false in +let z = false in +let a = false in +let b = false in +let c = false in +let d = false in +let e = false in +let f = false in +(); +if not x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHCONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHCONST0 + 15 PUSHCONST0 + 16 PUSHCONST0 + 17 PUSHCONST0 + 18 PUSHCONST0 + 19 ACC 8 + 21 BOOLNOT + 22 BRANCHIFNOT 29 + 24 GETGLOBAL Not_found + 26 MAKEBLOCK1 0 + 28 RAISE + 29 POP 9 + 31 ATOM0 + 32 SETGLOBAL T091-acc + 34 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc.ml b/testsuite/tests/tool-ocaml/t092-pushacc.ml new file mode 100644 index 00000000..c21561ec --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc.ml @@ -0,0 +1,38 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +let b = true in +let c = true in +let d = true in +let e = true in +let f = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHCONST1 + 14 PUSHCONST1 + 15 PUSHCONST1 + 16 PUSHCONST1 + 17 PUSHCONST1 + 18 PUSHACC 8 + 20 BRANCHIFNOT 27 + 22 GETGLOBAL Not_found + 24 MAKEBLOCK1 0 + 26 RAISE + 27 POP 9 + 29 ATOM0 + 30 SETGLOBAL T092-pushacc + 32 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc0.ml b/testsuite/tests/tool-ocaml/t092-pushacc0.ml new file mode 100644 index 00000000..ffdc3b04 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc0.ml @@ -0,0 +1,22 @@ +open Lib;; +let x = false in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHACC0 + 11 BRANCHIFNOT 18 + 13 GETGLOBAL Not_found + 15 MAKEBLOCK1 0 + 17 RAISE + 18 POP 1 + 20 ATOM0 + 21 SETGLOBAL T092-pushacc0 + 23 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc1.ml b/testsuite/tests/tool-ocaml/t092-pushacc1.ml new file mode 100644 index 00000000..b923f4fc --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc1.ml @@ -0,0 +1,24 @@ +open Lib;; +let x = false in +let y = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHACC1 + 12 BRANCHIFNOT 19 + 14 GETGLOBAL Not_found + 16 MAKEBLOCK1 0 + 18 RAISE + 19 POP 2 + 21 ATOM0 + 22 SETGLOBAL T092-pushacc1 + 24 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc2.ml b/testsuite/tests/tool-ocaml/t092-pushacc2.ml new file mode 100644 index 00000000..f6249783 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc2.ml @@ -0,0 +1,26 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHACC2 + 13 BRANCHIFNOT 20 + 15 GETGLOBAL Not_found + 17 MAKEBLOCK1 0 + 19 RAISE + 20 POP 3 + 22 ATOM0 + 23 SETGLOBAL T092-pushacc2 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc3.ml b/testsuite/tests/tool-ocaml/t092-pushacc3.ml new file mode 100644 index 00000000..5984fec7 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc3.ml @@ -0,0 +1,28 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHACC3 + 14 BRANCHIFNOT 21 + 16 GETGLOBAL Not_found + 18 MAKEBLOCK1 0 + 20 RAISE + 21 POP 4 + 23 ATOM0 + 24 SETGLOBAL T092-pushacc3 + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc4.ml b/testsuite/tests/tool-ocaml/t092-pushacc4.ml new file mode 100644 index 00000000..ce20e0b9 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc4.ml @@ -0,0 +1,30 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +let b = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHCONST1 + 14 PUSHACC4 + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 POP 5 + 24 ATOM0 + 25 SETGLOBAL T092-pushacc4 + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc5.ml b/testsuite/tests/tool-ocaml/t092-pushacc5.ml new file mode 100644 index 00000000..030f3f04 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc5.ml @@ -0,0 +1,32 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +let b = true in +let c = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHCONST1 + 14 PUSHCONST1 + 15 PUSHACC5 + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 POP 6 + 25 ATOM0 + 26 SETGLOBAL T092-pushacc5 + 28 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc6.ml b/testsuite/tests/tool-ocaml/t092-pushacc6.ml new file mode 100644 index 00000000..9c67b808 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc6.ml @@ -0,0 +1,34 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +let b = true in +let c = true in +let d = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHCONST1 + 14 PUSHCONST1 + 15 PUSHCONST1 + 16 PUSHACC6 + 17 BRANCHIFNOT 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 POP 7 + 26 ATOM0 + 27 SETGLOBAL T092-pushacc6 + 29 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t092-pushacc7.ml b/testsuite/tests/tool-ocaml/t092-pushacc7.ml new file mode 100644 index 00000000..09fbbcaf --- /dev/null +++ b/testsuite/tests/tool-ocaml/t092-pushacc7.ml @@ -0,0 +1,36 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +let b = true in +let c = true in +let d = true in +let e = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHCONST1 + 14 PUSHCONST1 + 15 PUSHCONST1 + 16 PUSHCONST1 + 17 PUSHACC7 + 18 BRANCHIFNOT 25 + 20 GETGLOBAL Not_found + 22 MAKEBLOCK1 0 + 24 RAISE + 25 POP 8 + 27 ATOM0 + 28 SETGLOBAL T092-pushacc7 + 30 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t093-pushacc.ml b/testsuite/tests/tool-ocaml/t093-pushacc.ml new file mode 100644 index 00000000..00a969ad --- /dev/null +++ b/testsuite/tests/tool-ocaml/t093-pushacc.ml @@ -0,0 +1,38 @@ +open Lib;; +let x = false in +let y = true in +let z = true in +let a = true in +let b = true in +let c = true in +let d = true in +let e = true in +let f = true in +if x then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST1 + 11 PUSHCONST1 + 12 PUSHCONST1 + 13 PUSHCONST1 + 14 PUSHCONST1 + 15 PUSHCONST1 + 16 PUSHCONST1 + 17 PUSHCONST1 + 18 PUSHACC 8 + 20 BRANCHIFNOT 27 + 22 GETGLOBAL Not_found + 24 MAKEBLOCK1 0 + 26 RAISE + 27 POP 9 + 29 ATOM0 + 30 SETGLOBAL T093-pushacc + 32 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t100-pushtrap.ml b/testsuite/tests/tool-ocaml/t100-pushtrap.ml new file mode 100644 index 00000000..7b02a862 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t100-pushtrap.ml @@ -0,0 +1,21 @@ +open Lib;; +try raise Not_found +with _ -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 PUSHTRAP 16 + 11 GETGLOBAL Not_found + 13 MAKEBLOCK1 0 + 15 RAISE + 16 PUSHCONST0 + 17 POP 1 + 19 ATOM0 + 20 SETGLOBAL T100-pushtrap + 22 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t101-poptrap.ml b/testsuite/tests/tool-ocaml/t101-poptrap.ml new file mode 100644 index 00000000..3a754a06 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t101-poptrap.ml @@ -0,0 +1,21 @@ +open Lib;; +try () +with _ -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 PUSHTRAP 15 + 11 CONST0 + 12 POPTRAP + 13 BRANCH 18 + 15 PUSHCONST0 + 16 POP 1 + 18 ATOM0 + 19 SETGLOBAL T101-poptrap + 21 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-addint.ml b/testsuite/tests/tool-ocaml/t110-addint.ml new file mode 100644 index 00000000..5d683c57 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-addint.ml @@ -0,0 +1,26 @@ +open Lib;; +let x = 1 in +if 1 + x <> 2 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST2 + 11 PUSHACC1 + 12 PUSHCONST1 + 13 ADDINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 POP 1 + 24 ATOM0 + 25 SETGLOBAL T110-addint + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-andint.ml b/testsuite/tests/tool-ocaml/t110-andint.ml new file mode 100644 index 00000000..016dc3cd --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-andint.ml @@ -0,0 +1,22 @@ +open Lib;; +if (3 land 6) <> 2 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST2 + 10 PUSHCONSTINT 6 + 12 PUSHCONST3 + 13 ANDINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T110-andint + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-asrint-1.ml b/testsuite/tests/tool-ocaml/t110-asrint-1.ml new file mode 100644 index 00000000..173bdca2 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-asrint-1.ml @@ -0,0 +1,22 @@ +open Lib;; +if (-2 asr 1) <> -1 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT -1 + 11 PUSHCONST1 + 12 PUSHCONSTINT -2 + 14 ASRINT + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T110-asrint-1 + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-asrint-2.ml b/testsuite/tests/tool-ocaml/t110-asrint-2.ml new file mode 100644 index 00000000..386fc64c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-asrint-2.ml @@ -0,0 +1,22 @@ +open Lib;; +if (3 asr 1) <> 1 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST1 + 11 PUSHCONST3 + 12 ASRINT + 13 NEQ + 14 BRANCHIFNOT 21 + 16 GETGLOBAL Not_found + 18 MAKEBLOCK1 0 + 20 RAISE + 21 ATOM0 + 22 SETGLOBAL T110-asrint-2 + 24 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-divint-1.ml b/testsuite/tests/tool-ocaml/t110-divint-1.ml new file mode 100644 index 00000000..5cde135d --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-divint-1.ml @@ -0,0 +1,22 @@ +open Lib;; +if 2 / 2 <> 1 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST2 + 11 PUSHCONST2 + 12 DIVINT + 13 NEQ + 14 BRANCHIFNOT 21 + 16 GETGLOBAL Not_found + 18 MAKEBLOCK1 0 + 20 RAISE + 21 ATOM0 + 22 SETGLOBAL T110-divint-1 + 24 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-divint-2.ml b/testsuite/tests/tool-ocaml/t110-divint-2.ml new file mode 100644 index 00000000..34f5b00c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-divint-2.ml @@ -0,0 +1,22 @@ +open Lib;; +if 3 / 2 <> 1 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST2 + 11 PUSHCONST3 + 12 DIVINT + 13 NEQ + 14 BRANCHIFNOT 21 + 16 GETGLOBAL Not_found + 18 MAKEBLOCK1 0 + 20 RAISE + 21 ATOM0 + 22 SETGLOBAL T110-divint-2 + 24 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-divint-3.ml b/testsuite/tests/tool-ocaml/t110-divint-3.ml new file mode 100644 index 00000000..cbb2bff1 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-divint-3.ml @@ -0,0 +1,33 @@ +open Lib;; +try + ignore (3 / 0); + raise Not_found; +with Division_by_zero -> () + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 PUSHTRAP 19 + 11 CONST0 + 12 PUSHCONST3 + 13 DIVINT + 14 GETGLOBAL Not_found + 16 MAKEBLOCK1 0 + 18 RAISE + 19 PUSHGETGLOBAL Division_by_zero + 21 PUSHACC1 + 22 GETFIELD0 + 23 EQ + 24 BRANCHIFNOT 29 + 26 CONST0 + 27 BRANCH 31 + 29 ACC0 + 30 RAISE + 31 POP 1 + 33 ATOM0 + 34 SETGLOBAL T110-divint-3 + 36 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-lslint.ml b/testsuite/tests/tool-ocaml/t110-lslint.ml new file mode 100644 index 00000000..9dd197b4 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-lslint.ml @@ -0,0 +1,22 @@ +open Lib;; +if (3 lsl 2) <> 12 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 12 + 11 PUSHCONST2 + 12 PUSHCONST3 + 13 LSLINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T110-lslint + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-lsrint.ml b/testsuite/tests/tool-ocaml/t110-lsrint.ml new file mode 100644 index 00000000..9777815c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-lsrint.ml @@ -0,0 +1,22 @@ +open Lib;; +if (14 lsr 2) <> 3 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST3 + 10 PUSHCONST2 + 11 PUSHCONSTINT 14 + 13 LSRINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T110-lsrint + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-modint-1.ml b/testsuite/tests/tool-ocaml/t110-modint-1.ml new file mode 100644 index 00000000..2a690c08 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-modint-1.ml @@ -0,0 +1,22 @@ +open Lib;; +if 20 mod 3 <> 2 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST2 + 10 PUSHCONST3 + 11 PUSHCONSTINT 20 + 13 MODINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T110-modint-1 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-modint-2.ml b/testsuite/tests/tool-ocaml/t110-modint-2.ml new file mode 100644 index 00000000..0bc3be0c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-modint-2.ml @@ -0,0 +1,34 @@ +open Lib;; +try + ignore (2 mod 0); + raise Not_found; +with Division_by_zero -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 PUSHTRAP 19 + 11 CONST0 + 12 PUSHCONST2 + 13 MODINT + 14 GETGLOBAL Not_found + 16 MAKEBLOCK1 0 + 18 RAISE + 19 PUSHGETGLOBAL Division_by_zero + 21 PUSHACC1 + 22 GETFIELD0 + 23 EQ + 24 BRANCHIFNOT 29 + 26 CONST0 + 27 BRANCH 31 + 29 ACC0 + 30 RAISE + 31 POP 1 + 33 ATOM0 + 34 SETGLOBAL T110-modint-2 + 36 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-mulint.ml b/testsuite/tests/tool-ocaml/t110-mulint.ml new file mode 100644 index 00000000..97c1cf14 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-mulint.ml @@ -0,0 +1,22 @@ +open Lib;; +if 2 * 2 <> 4 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 4 + 11 PUSHCONST2 + 12 PUSHCONST2 + 13 MULINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T110-mulint + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-negint.ml b/testsuite/tests/tool-ocaml/t110-negint.ml new file mode 100644 index 00000000..069a34b2 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-negint.ml @@ -0,0 +1,25 @@ +open Lib;; +let x = 1 in +if -x <> -1 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONSTINT -1 + 12 PUSHACC1 + 13 NEGINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 POP 1 + 24 ATOM0 + 25 SETGLOBAL T110-negint + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-offsetint.ml b/testsuite/tests/tool-ocaml/t110-offsetint.ml new file mode 100644 index 00000000..925159e3 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-offsetint.ml @@ -0,0 +1,21 @@ +open Lib;; +if 2 + 2 <> 4 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 4 + 11 PUSHCONST2 + 12 OFFSETINT 2 + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T110-offsetint + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-orint.ml b/testsuite/tests/tool-ocaml/t110-orint.ml new file mode 100644 index 00000000..56b63d80 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-orint.ml @@ -0,0 +1,22 @@ +open Lib;; +if (3 lor 6) <> 7 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 7 + 11 PUSHCONSTINT 6 + 13 PUSHCONST3 + 14 ORINT + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T110-orint + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-subint.ml b/testsuite/tests/tool-ocaml/t110-subint.ml new file mode 100644 index 00000000..f626cd0d --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-subint.ml @@ -0,0 +1,26 @@ +open Lib;; +let x = 1 in +if 1 - x <> 0 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST0 + 11 PUSHACC1 + 12 PUSHCONST1 + 13 SUBINT + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 POP 1 + 24 ATOM0 + 25 SETGLOBAL T110-subint + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t110-xorint.ml b/testsuite/tests/tool-ocaml/t110-xorint.ml new file mode 100644 index 00000000..dfb278b7 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t110-xorint.ml @@ -0,0 +1,22 @@ +open Lib;; +if (3 lxor 6) <> 5 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 5 + 11 PUSHCONSTINT 6 + 13 PUSHCONST3 + 14 XORINT + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T110-xorint + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t120-getstringchar.ml b/testsuite/tests/tool-ocaml/t120-getstringchar.ml new file mode 100644 index 00000000..aaff2022 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t120-getstringchar.ml @@ -0,0 +1,22 @@ +open Lib;; +if "foo".[2] <> 'o' then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 111 + 11 PUSHCONST2 + 12 PUSHGETGLOBAL "foo" + 14 GETSTRINGCHAR + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T120-getstringchar + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t121-setstringchar.ml b/testsuite/tests/tool-ocaml/t121-setstringchar.ml new file mode 100644 index 00000000..882d6e08 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t121-setstringchar.ml @@ -0,0 +1,31 @@ +open Lib;; +let x = "foo" in +x.[2] <- 'x'; +if x.[2] <> 'x' then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL "foo" + 11 PUSHCONSTINT 120 + 13 PUSHCONST2 + 14 PUSHACC2 + 15 SETSTRINGCHAR + 16 CONSTINT 120 + 18 PUSHCONST2 + 19 PUSHACC2 + 20 GETSTRINGCHAR + 21 NEQ + 22 BRANCHIFNOT 29 + 24 GETGLOBAL Not_found + 26 MAKEBLOCK1 0 + 28 RAISE + 29 POP 1 + 31 ATOM0 + 32 SETGLOBAL T121-setstringchar + 34 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t130-getvectitem.ml b/testsuite/tests/tool-ocaml/t130-getvectitem.ml new file mode 100644 index 00000000..d2903795 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t130-getvectitem.ml @@ -0,0 +1,24 @@ +open Lib;; +if [| 1; 2 |].(1) <> 2 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST2 + 10 PUSHCONST1 + 11 PUSHCONST2 + 12 PUSHCONST1 + 13 MAKEBLOCK2 0 + 15 GETVECTITEM + 16 NEQ + 17 BRANCHIFNOT 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 ATOM0 + 25 SETGLOBAL T130-getvectitem + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t130-vectlength.ml b/testsuite/tests/tool-ocaml/t130-vectlength.ml new file mode 100644 index 00000000..ce0da0e4 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t130-vectlength.ml @@ -0,0 +1,23 @@ +open Lib;; +if Array.length [| 1; 2 |] <> 2 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST2 + 10 PUSHCONST2 + 11 PUSHCONST1 + 12 MAKEBLOCK2 0 + 14 VECTLENGTH + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T130-vectlength + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t131-setvectitem.ml b/testsuite/tests/tool-ocaml/t131-setvectitem.ml new file mode 100644 index 00000000..f544a3e0 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t131-setvectitem.ml @@ -0,0 +1,33 @@ +open Lib;; +let x = [| 1; 2 |] in +x.(0) <- 3; +if x.(0) <> 3 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST2 + 10 PUSHCONST1 + 11 MAKEBLOCK2 0 + 13 PUSHCONST3 + 14 PUSHCONST0 + 15 PUSHACC2 + 16 SETVECTITEM + 17 CONST3 + 18 PUSHCONST0 + 19 PUSHACC2 + 20 GETVECTITEM + 21 NEQ + 22 BRANCHIFNOT 29 + 24 GETGLOBAL Not_found + 26 MAKEBLOCK1 0 + 28 RAISE + 29 POP 1 + 31 ATOM0 + 32 SETGLOBAL T131-setvectitem + 34 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t140-switch-1.ml b/testsuite/tests/tool-ocaml/t140-switch-1.ml new file mode 100644 index 00000000..b2d73521 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t140-switch-1.ml @@ -0,0 +1,32 @@ +open Lib;; +match 0 with +| 0 -> () +| 1 -> raise Not_found +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHACC0 + 11 SWITCH + int 0 -> 17 + int 1 -> 20 + 15 BRANCH 25 + 17 CONST0 + 18 BRANCH 30 + 20 GETGLOBAL Not_found + 22 MAKEBLOCK1 0 + 24 RAISE + 25 GETGLOBAL Not_found + 27 MAKEBLOCK1 0 + 29 RAISE + 30 POP 1 + 32 ATOM0 + 33 SETGLOBAL T140-switch-1 + 35 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t140-switch-2.ml b/testsuite/tests/tool-ocaml/t140-switch-2.ml new file mode 100644 index 00000000..9004fa66 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t140-switch-2.ml @@ -0,0 +1,32 @@ +open Lib;; +match 1 with +| 0 -> raise Not_found +| 1 -> () +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHACC0 + 11 SWITCH + int 0 -> 17 + int 1 -> 22 + 15 BRANCH 25 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 CONST0 + 23 BRANCH 30 + 25 GETGLOBAL Not_found + 27 MAKEBLOCK1 0 + 29 RAISE + 30 POP 1 + 32 ATOM0 + 33 SETGLOBAL T140-switch-2 + 35 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t140-switch-3.ml b/testsuite/tests/tool-ocaml/t140-switch-3.ml new file mode 100644 index 00000000..b0c4bc8f --- /dev/null +++ b/testsuite/tests/tool-ocaml/t140-switch-3.ml @@ -0,0 +1,31 @@ +open Lib;; +match 2 with +| 0 -> raise Not_found +| 1 -> raise Not_found +| _ -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST2 + 10 PUSHACC0 + 11 SWITCH + int 0 -> 17 + int 1 -> 22 + 15 BRANCH 27 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 GETGLOBAL Not_found + 24 MAKEBLOCK1 0 + 26 RAISE + 27 CONST0 + 28 POP 1 + 30 ATOM0 + 31 SETGLOBAL T140-switch-3 + 33 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t140-switch-4.ml b/testsuite/tests/tool-ocaml/t140-switch-4.ml new file mode 100644 index 00000000..1826b09e --- /dev/null +++ b/testsuite/tests/tool-ocaml/t140-switch-4.ml @@ -0,0 +1,31 @@ +open Lib;; +match -1 with +| 0 -> raise Not_found +| 1 -> raise Not_found +| _ -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT -1 + 11 PUSHACC0 + 12 SWITCH + int 0 -> 18 + int 1 -> 23 + 16 BRANCH 28 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 GETGLOBAL Not_found + 25 MAKEBLOCK1 0 + 27 RAISE + 28 CONST0 + 29 POP 1 + 31 ATOM0 + 32 SETGLOBAL T140-switch-4 + 34 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t141-switch-5.ml b/testsuite/tests/tool-ocaml/t141-switch-5.ml new file mode 100644 index 00000000..ca44849e --- /dev/null +++ b/testsuite/tests/tool-ocaml/t141-switch-5.ml @@ -0,0 +1,38 @@ +open Lib;; +type t = + | A of int + | B of int + | C of int +;; + +match A 0 with +| A _ -> () +| B _ -> raise Not_found +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL <0>(0) + 11 PUSHACC0 + 12 SWITCH + tag 0 -> 17 + tag 1 -> 20 + tag 2 -> 25 + 17 CONST0 + 18 BRANCH 30 + 20 GETGLOBAL Not_found + 22 MAKEBLOCK1 0 + 24 RAISE + 25 GETGLOBAL Not_found + 27 MAKEBLOCK1 0 + 29 RAISE + 30 POP 1 + 32 ATOM0 + 33 SETGLOBAL T141-switch-5 + 35 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t141-switch-6.ml b/testsuite/tests/tool-ocaml/t141-switch-6.ml new file mode 100644 index 00000000..c48e80b5 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t141-switch-6.ml @@ -0,0 +1,38 @@ +open Lib;; +type t = + | A of int + | B of int + | C of int +;; + +match B 0 with +| A _ -> raise Not_found +| B _ -> () +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL <1>(0) + 11 PUSHACC0 + 12 SWITCH + tag 0 -> 17 + tag 1 -> 22 + tag 2 -> 25 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 CONST0 + 23 BRANCH 30 + 25 GETGLOBAL Not_found + 27 MAKEBLOCK1 0 + 29 RAISE + 30 POP 1 + 32 ATOM0 + 33 SETGLOBAL T141-switch-6 + 35 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t141-switch-7.ml b/testsuite/tests/tool-ocaml/t141-switch-7.ml new file mode 100644 index 00000000..00f4873c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t141-switch-7.ml @@ -0,0 +1,37 @@ +open Lib;; +type t = + | A of int + | B of int + | C of int +;; + +match C 0 with +| A _ -> raise Not_found +| B _ -> raise Not_found +| _ -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL <2>(0) + 11 PUSHACC0 + 12 SWITCH + tag 0 -> 17 + tag 1 -> 22 + tag 2 -> 27 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 GETGLOBAL Not_found + 24 MAKEBLOCK1 0 + 26 RAISE + 27 CONST0 + 28 POP 1 + 30 ATOM0 + 31 SETGLOBAL T141-switch-7 + 33 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t142-switch-8.ml b/testsuite/tests/tool-ocaml/t142-switch-8.ml new file mode 100644 index 00000000..51459130 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t142-switch-8.ml @@ -0,0 +1,34 @@ +open Lib;; +type t = + | A + | B of int + | C of int +;; + +match A with +| A -> () +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHACC0 + 11 SWITCH + int 0 -> 16 + tag 0 -> 19 + tag 1 -> 19 + 16 CONST0 + 17 BRANCH 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 POP 1 + 26 ATOM0 + 27 SETGLOBAL T142-switch-8 + 29 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t142-switch-9.ml b/testsuite/tests/tool-ocaml/t142-switch-9.ml new file mode 100644 index 00000000..a0e43d32 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t142-switch-9.ml @@ -0,0 +1,34 @@ +open Lib;; +type t = + | A + | B of int + | C of int +;; + +match B 0 with +| B _ -> () +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL <0>(0) + 11 PUSHACC0 + 12 SWITCH + int 0 -> 20 + tag 0 -> 17 + tag 1 -> 20 + 17 CONST0 + 18 BRANCH 25 + 20 GETGLOBAL Not_found + 22 MAKEBLOCK1 0 + 24 RAISE + 25 POP 1 + 27 ATOM0 + 28 SETGLOBAL T142-switch-9 + 30 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t142-switch-A.ml b/testsuite/tests/tool-ocaml/t142-switch-A.ml new file mode 100644 index 00000000..4f66aec5 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t142-switch-A.ml @@ -0,0 +1,34 @@ +open Lib;; +type t = + | A + | B of int + | C of int +;; + +match C 0 with +| C _ -> () +| _ -> raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL <1>(0) + 11 PUSHACC0 + 12 SWITCH + int 0 -> 20 + tag 0 -> 20 + tag 1 -> 17 + 17 CONST0 + 18 BRANCH 25 + 20 GETGLOBAL Not_found + 22 MAKEBLOCK1 0 + 24 RAISE + 25 POP 1 + 27 ATOM0 + 28 SETGLOBAL T142-switch-A + 30 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t150-push-1.ml b/testsuite/tests/tool-ocaml/t150-push-1.ml new file mode 100644 index 00000000..92649277 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t150-push-1.ml @@ -0,0 +1,24 @@ +open Lib;; +let _ = 0 in +try 0 with _ -> 0 +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSH + 11 PUSHTRAP 17 + 13 CONST0 + 14 POPTRAP + 15 BRANCH 20 + 17 PUSHCONST0 + 18 POP 1 + 20 POP 1 + 22 ATOM0 + 23 SETGLOBAL T150-push-1 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t150-push-2.ml b/testsuite/tests/tool-ocaml/t150-push-2.ml new file mode 100644 index 00000000..d6f51072 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t150-push-2.ml @@ -0,0 +1,39 @@ +open Lib;; +let x = 1 in +try if x <> 1 then raise Not_found +with End_of_file -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSH + 11 PUSHTRAP 26 + 13 CONST1 + 14 PUSHACC5 + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 POPTRAP + 24 BRANCH 40 + 26 PUSHGETGLOBAL End_of_file + 28 PUSHACC1 + 29 GETFIELD0 + 30 EQ + 31 BRANCHIFNOT 36 + 33 CONST0 + 34 BRANCH 38 + 36 ACC0 + 37 RAISE + 38 POP 1 + 40 POP 1 + 42 ATOM0 + 43 SETGLOBAL T150-push-2 + 45 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t160-closure.ml b/testsuite/tests/tool-ocaml/t160-closure.ml new file mode 100644 index 00000000..5eb61286 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t160-closure.ml @@ -0,0 +1,19 @@ +open Lib;; +let f () = ();; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 14 + 11 CONST0 + 12 RETURN 1 + 14 CLOSURE 0, 11 + 17 PUSHACC0 + 18 MAKEBLOCK1 0 + 20 POP 1 + 22 SETGLOBAL T160-closure + 24 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t161-apply1.ml b/testsuite/tests/tool-ocaml/t161-apply1.ml new file mode 100644 index 00000000..5138c5f5 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t161-apply1.ml @@ -0,0 +1,42 @@ +open Lib;; +let f _ = raise End_of_file in +try + f 0; + raise Not_found; +with End_of_file -> 0 +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 16 + 11 GETGLOBAL End_of_file + 13 MAKEBLOCK1 0 + 15 RAISE + 16 CLOSURE 0, 11 + 19 PUSH + 20 PUSHTRAP 30 + 22 CONST0 + 23 PUSHACC5 + 24 APPLY1 + 25 GETGLOBAL Not_found + 27 MAKEBLOCK1 0 + 29 RAISE + 30 PUSHGETGLOBAL End_of_file + 32 PUSHACC1 + 33 GETFIELD0 + 34 EQ + 35 BRANCHIFNOT 40 + 37 CONST0 + 38 BRANCH 42 + 40 ACC0 + 41 RAISE + 42 POP 1 + 44 POP 1 + 46 ATOM0 + 47 SETGLOBAL T161-apply1 + 49 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t162-return.ml b/testsuite/tests/tool-ocaml/t162-return.ml new file mode 100644 index 00000000..1059c9fe --- /dev/null +++ b/testsuite/tests/tool-ocaml/t162-return.ml @@ -0,0 +1,21 @@ +open Lib;; +let f _ = 0 in f 0;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 14 + 11 CONST0 + 12 RETURN 1 + 14 CLOSURE 0, 11 + 17 PUSHCONST0 + 18 PUSHACC1 + 19 APPLY1 + 20 POP 1 + 22 ATOM0 + 23 SETGLOBAL T162-return + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t163.ml b/testsuite/tests/tool-ocaml/t163.ml new file mode 100644 index 00000000..9ec7790c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t163.ml @@ -0,0 +1,23 @@ +open Lib;; +let f _ _ = 0 in f 0;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 17 + 11 RESTART + 12 GRAB 1 + 14 CONST0 + 15 RETURN 2 + 17 CLOSURE 0, 12 + 20 PUSHCONST0 + 21 PUSHACC1 + 22 APPLY1 + 23 POP 1 + 25 ATOM0 + 26 SETGLOBAL T163 + 28 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t164-apply2.ml b/testsuite/tests/tool-ocaml/t164-apply2.ml new file mode 100644 index 00000000..7fbe7d99 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t164-apply2.ml @@ -0,0 +1,24 @@ +open Lib;; +let f _ _ = 0 in f 0 0;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 17 + 11 RESTART + 12 GRAB 1 + 14 CONST0 + 15 RETURN 2 + 17 CLOSURE 0, 12 + 20 PUSHCONST0 + 21 PUSHCONST0 + 22 PUSHACC2 + 23 APPLY2 + 24 POP 1 + 26 ATOM0 + 27 SETGLOBAL T164-apply2 + 29 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t164-apply3.ml b/testsuite/tests/tool-ocaml/t164-apply3.ml new file mode 100644 index 00000000..e7ebc3a4 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t164-apply3.ml @@ -0,0 +1,25 @@ +open Lib;; +let f _ _ _ = 0 in f 0 0 0;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 17 + 11 RESTART + 12 GRAB 2 + 14 CONST0 + 15 RETURN 3 + 17 CLOSURE 0, 12 + 20 PUSHCONST0 + 21 PUSHCONST0 + 22 PUSHCONST0 + 23 PUSHACC3 + 24 APPLY3 + 25 POP 1 + 27 ATOM0 + 28 SETGLOBAL T164-apply3 + 30 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t165-apply.ml b/testsuite/tests/tool-ocaml/t165-apply.ml new file mode 100644 index 00000000..9d668550 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t165-apply.ml @@ -0,0 +1,28 @@ +open Lib;; +let f _ _ _ _ = 0 in f 0 0 0 0;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 17 + 11 RESTART + 12 GRAB 3 + 14 CONST0 + 15 RETURN 4 + 17 CLOSURE 0, 12 + 20 PUSH + 21 PUSH_RETADDR 30 + 23 CONST0 + 24 PUSHCONST0 + 25 PUSHCONST0 + 26 PUSHCONST0 + 27 PUSHACC7 + 28 APPLY 4 + 30 POP 1 + 32 ATOM0 + 33 SETGLOBAL T165-apply + 35 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t170-envacc2.ml b/testsuite/tests/tool-ocaml/t170-envacc2.ml new file mode 100644 index 00000000..3a373667 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t170-envacc2.ml @@ -0,0 +1,37 @@ +open Lib;; +let x = 5 in +let y = 2 in +let f _ = ignore x; y in +if f 0 <> 2 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 16 + 11 ENVACC1 + 12 CONST0 + 13 ENVACC2 + 14 RETURN 1 + 16 CONSTINT 5 + 18 PUSHCONST2 + 19 PUSHACC0 + 20 PUSHACC2 + 21 CLOSURE 2, 11 + 24 PUSHCONST2 + 25 PUSHCONST0 + 26 PUSHACC2 + 27 APPLY1 + 28 NEQ + 29 BRANCHIFNOT 36 + 31 GETGLOBAL Not_found + 33 MAKEBLOCK1 0 + 35 RAISE + 36 POP 3 + 38 ATOM0 + 39 SETGLOBAL T170-envacc2 + 41 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t170-envacc3.ml b/testsuite/tests/tool-ocaml/t170-envacc3.ml new file mode 100644 index 00000000..9a2b8b5a --- /dev/null +++ b/testsuite/tests/tool-ocaml/t170-envacc3.ml @@ -0,0 +1,42 @@ +open Lib;; +let x = 5 in +let y = 2 in +let z = 1 in +let f _ = ignore x; ignore y; z in +if f 0 <> 1 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 18 + 11 ENVACC1 + 12 CONST0 + 13 ENVACC2 + 14 CONST0 + 15 ENVACC3 + 16 RETURN 1 + 18 CONSTINT 5 + 20 PUSHCONST2 + 21 PUSHCONST1 + 22 PUSHACC0 + 23 PUSHACC2 + 24 PUSHACC4 + 25 CLOSURE 3, 11 + 28 PUSHCONST1 + 29 PUSHCONST0 + 30 PUSHACC2 + 31 APPLY1 + 32 NEQ + 33 BRANCHIFNOT 40 + 35 GETGLOBAL Not_found + 37 MAKEBLOCK1 0 + 39 RAISE + 40 POP 4 + 42 ATOM0 + 43 SETGLOBAL T170-envacc3 + 45 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t170-envacc4.ml b/testsuite/tests/tool-ocaml/t170-envacc4.ml new file mode 100644 index 00000000..215e3220 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t170-envacc4.ml @@ -0,0 +1,47 @@ +open Lib;; +let x = 5 in +let y = 2 in +let z = 1 in +let a = 4 in +let f _ = ignore x; ignore y; ignore z; a in +if f 0 <> 4 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 20 + 11 ENVACC1 + 12 CONST0 + 13 ENVACC2 + 14 CONST0 + 15 ENVACC3 + 16 CONST0 + 17 ENVACC4 + 18 RETURN 1 + 20 CONSTINT 5 + 22 PUSHCONST2 + 23 PUSHCONST1 + 24 PUSHCONSTINT 4 + 26 PUSHACC0 + 27 PUSHACC2 + 28 PUSHACC4 + 29 PUSHACC6 + 30 CLOSURE 4, 11 + 33 PUSHCONSTINT 4 + 35 PUSHCONST0 + 36 PUSHACC2 + 37 APPLY1 + 38 NEQ + 39 BRANCHIFNOT 46 + 41 GETGLOBAL Not_found + 43 MAKEBLOCK1 0 + 45 RAISE + 46 POP 5 + 48 ATOM0 + 49 SETGLOBAL T170-envacc4 + 51 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t171-envacc.ml b/testsuite/tests/tool-ocaml/t171-envacc.ml new file mode 100644 index 00000000..4c4a3dfa --- /dev/null +++ b/testsuite/tests/tool-ocaml/t171-envacc.ml @@ -0,0 +1,52 @@ +open Lib;; +let x = 5 in +let y = 2 in +let z = 1 in +let a = 4 in +let b = 3 in +let f _ = ignore x; ignore y; ignore z; ignore a; b in +if f 0 <> 3 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 23 + 11 ENVACC1 + 12 CONST0 + 13 ENVACC2 + 14 CONST0 + 15 ENVACC3 + 16 CONST0 + 17 ENVACC4 + 18 CONST0 + 19 ENVACC 5 + 21 RETURN 1 + 23 CONSTINT 5 + 25 PUSHCONST2 + 26 PUSHCONST1 + 27 PUSHCONSTINT 4 + 29 PUSHCONST3 + 30 PUSHACC0 + 31 PUSHACC2 + 32 PUSHACC4 + 33 PUSHACC6 + 34 PUSHACC 8 + 36 CLOSURE 5, 11 + 39 PUSHCONST3 + 40 PUSHCONST0 + 41 PUSHACC2 + 42 APPLY1 + 43 NEQ + 44 BRANCHIFNOT 51 + 46 GETGLOBAL Not_found + 48 MAKEBLOCK1 0 + 50 RAISE + 51 POP 6 + 53 ATOM0 + 54 SETGLOBAL T171-envacc + 56 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml new file mode 100644 index 00000000..06c4011a --- /dev/null +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc1.ml @@ -0,0 +1,34 @@ +open Lib;; +let x = 5 in +let f _ = x + x in +if f 0 <> 10 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 16 + 11 ENVACC1 + 12 PUSHENVACC1 + 13 ADDINT + 14 RETURN 1 + 16 CONSTINT 5 + 18 PUSHACC0 + 19 CLOSURE 1, 11 + 22 PUSHCONSTINT 10 + 24 PUSHCONST0 + 25 PUSHACC2 + 26 APPLY1 + 27 NEQ + 28 BRANCHIFNOT 35 + 30 GETGLOBAL Not_found + 32 MAKEBLOCK1 0 + 34 RAISE + 35 POP 2 + 37 ATOM0 + 38 SETGLOBAL T172-pushenvacc1 + 40 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml new file mode 100644 index 00000000..c25e40a7 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc2.ml @@ -0,0 +1,37 @@ +open Lib;; +let x = 5 in +let y = 4 in +let f _ = y + x in +if f 0 <> 9 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 16 + 11 ENVACC1 + 12 PUSHENVACC2 + 13 ADDINT + 14 RETURN 1 + 16 CONSTINT 5 + 18 PUSHCONSTINT 4 + 20 PUSHACC0 + 21 PUSHACC2 + 22 CLOSURE 2, 11 + 25 PUSHCONSTINT 9 + 27 PUSHCONST0 + 28 PUSHACC2 + 29 APPLY1 + 30 NEQ + 31 BRANCHIFNOT 38 + 33 GETGLOBAL Not_found + 35 MAKEBLOCK1 0 + 37 RAISE + 38 POP 3 + 40 ATOM0 + 41 SETGLOBAL T172-pushenvacc2 + 43 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml new file mode 100644 index 00000000..093f7f1e --- /dev/null +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc3.ml @@ -0,0 +1,42 @@ +open Lib;; +let x = 5 in +let y = 4 in +let z = 3 in +let f _ = z + y + x in +if f 0 <> 12 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 18 + 11 ENVACC1 + 12 PUSHENVACC2 + 13 PUSHENVACC3 + 14 ADDINT + 15 ADDINT + 16 RETURN 1 + 18 CONSTINT 5 + 20 PUSHCONSTINT 4 + 22 PUSHCONST3 + 23 PUSHACC0 + 24 PUSHACC2 + 25 PUSHACC4 + 26 CLOSURE 3, 11 + 29 PUSHCONSTINT 12 + 31 PUSHCONST0 + 32 PUSHACC2 + 33 APPLY1 + 34 NEQ + 35 BRANCHIFNOT 42 + 37 GETGLOBAL Not_found + 39 MAKEBLOCK1 0 + 41 RAISE + 42 POP 4 + 44 ATOM0 + 45 SETGLOBAL T172-pushenvacc3 + 47 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml b/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml new file mode 100644 index 00000000..154c4a47 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t172-pushenvacc4.ml @@ -0,0 +1,47 @@ +open Lib;; +let x = 5 in +let y = 4 in +let z = 3 in +let a = 2 in +let f _ = a + z + y + x in +if f 0 <> 14 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 21 + 11 ENVACC1 + 12 PUSHENVACC2 + 13 PUSHENVACC3 + 14 PUSHENVACC 4 + 16 ADDINT + 17 ADDINT + 18 ADDINT + 19 RETURN 1 + 21 CONSTINT 5 + 23 PUSHCONSTINT 4 + 25 PUSHCONST3 + 26 PUSHCONST2 + 27 PUSHACC0 + 28 PUSHACC2 + 29 PUSHACC4 + 30 PUSHACC6 + 31 CLOSURE 4, 11 + 34 PUSHCONSTINT 14 + 36 PUSHCONST0 + 37 PUSHACC2 + 38 APPLY1 + 39 NEQ + 40 BRANCHIFNOT 47 + 42 GETGLOBAL Not_found + 44 MAKEBLOCK1 0 + 46 RAISE + 47 POP 5 + 49 ATOM0 + 50 SETGLOBAL T172-pushenvacc4 + 52 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t173-pushenvacc.ml b/testsuite/tests/tool-ocaml/t173-pushenvacc.ml new file mode 100644 index 00000000..0d858b4a --- /dev/null +++ b/testsuite/tests/tool-ocaml/t173-pushenvacc.ml @@ -0,0 +1,52 @@ +open Lib;; +let x = 5 in +let y = 4 in +let z = 3 in +let a = 2 in +let b = 1 in +let f _ = b + a + z + y + x in +if f 0 <> 15 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 24 + 11 ENVACC1 + 12 PUSHENVACC2 + 13 PUSHENVACC3 + 14 PUSHENVACC 4 + 16 PUSHENVACC 5 + 18 ADDINT + 19 ADDINT + 20 ADDINT + 21 ADDINT + 22 RETURN 1 + 24 CONSTINT 5 + 26 PUSHCONSTINT 4 + 28 PUSHCONST3 + 29 PUSHCONST2 + 30 PUSHCONST1 + 31 PUSHACC0 + 32 PUSHACC2 + 33 PUSHACC4 + 34 PUSHACC6 + 35 PUSHACC 8 + 37 CLOSURE 5, 11 + 40 PUSHCONSTINT 15 + 42 PUSHCONST0 + 43 PUSHACC2 + 44 APPLY1 + 45 NEQ + 46 BRANCHIFNOT 53 + 48 GETGLOBAL Not_found + 50 MAKEBLOCK1 0 + 52 RAISE + 53 POP 6 + 55 ATOM0 + 56 SETGLOBAL T173-pushenvacc + 58 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t180-appterm1.ml b/testsuite/tests/tool-ocaml/t180-appterm1.ml new file mode 100644 index 00000000..6b82f51b --- /dev/null +++ b/testsuite/tests/tool-ocaml/t180-appterm1.ml @@ -0,0 +1,35 @@ +open Lib;; +let f _ = 12 in +let g _ = f 0 in +if g 0 <> 12 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 19 + 11 CONST0 + 12 PUSHENVACC1 + 13 APPTERM1 2 + 15 CONSTINT 12 + 17 RETURN 1 + 19 CLOSURE 0, 15 + 22 PUSHACC0 + 23 CLOSURE 1, 11 + 26 PUSHCONSTINT 12 + 28 PUSHCONST0 + 29 PUSHACC2 + 30 APPLY1 + 31 NEQ + 32 BRANCHIFNOT 39 + 34 GETGLOBAL Not_found + 36 MAKEBLOCK1 0 + 38 RAISE + 39 POP 2 + 41 ATOM0 + 42 SETGLOBAL T180-appterm1 + 44 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t180-appterm2.ml b/testsuite/tests/tool-ocaml/t180-appterm2.ml new file mode 100644 index 00000000..28f32a93 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t180-appterm2.ml @@ -0,0 +1,38 @@ +open Lib;; +let f _ _ = 12 in +let g _ = f 0 0 in +if g 0 <> 12 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 23 + 11 CONST0 + 12 PUSHCONST0 + 13 PUSHENVACC1 + 14 APPTERM2 3 + 16 RESTART + 17 GRAB 1 + 19 CONSTINT 12 + 21 RETURN 2 + 23 CLOSURE 0, 17 + 26 PUSHACC0 + 27 CLOSURE 1, 11 + 30 PUSHCONSTINT 12 + 32 PUSHCONST0 + 33 PUSHACC2 + 34 APPLY1 + 35 NEQ + 36 BRANCHIFNOT 43 + 38 GETGLOBAL Not_found + 40 MAKEBLOCK1 0 + 42 RAISE + 43 POP 2 + 45 ATOM0 + 46 SETGLOBAL T180-appterm2 + 48 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t180-appterm3.ml b/testsuite/tests/tool-ocaml/t180-appterm3.ml new file mode 100644 index 00000000..fe8a0bd5 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t180-appterm3.ml @@ -0,0 +1,39 @@ +open Lib;; +let f _ _ _ = 13 in +let g _ = f 0 0 0 in +if g 0 <> 13 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 24 + 11 CONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHENVACC1 + 15 APPTERM3 4 + 17 RESTART + 18 GRAB 2 + 20 CONSTINT 13 + 22 RETURN 3 + 24 CLOSURE 0, 18 + 27 PUSHACC0 + 28 CLOSURE 1, 11 + 31 PUSHCONSTINT 13 + 33 PUSHCONST0 + 34 PUSHACC2 + 35 APPLY1 + 36 NEQ + 37 BRANCHIFNOT 44 + 39 GETGLOBAL Not_found + 41 MAKEBLOCK1 0 + 43 RAISE + 44 POP 2 + 46 ATOM0 + 47 SETGLOBAL T180-appterm3 + 49 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t181-appterm.ml b/testsuite/tests/tool-ocaml/t181-appterm.ml new file mode 100644 index 00000000..03127bc8 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t181-appterm.ml @@ -0,0 +1,40 @@ +open Lib;; +let f _ _ _ _ = -10 in +let g _ = f 0 0 0 0 in +if g 0 <> -10 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 26 + 11 CONST0 + 12 PUSHCONST0 + 13 PUSHCONST0 + 14 PUSHCONST0 + 15 PUSHENVACC1 + 16 APPTERM 4, 5 + 19 RESTART + 20 GRAB 3 + 22 CONSTINT -10 + 24 RETURN 4 + 26 CLOSURE 0, 20 + 29 PUSHACC0 + 30 CLOSURE 1, 11 + 33 PUSHCONSTINT -10 + 35 PUSHCONST0 + 36 PUSHACC2 + 37 APPLY1 + 38 NEQ + 39 BRANCHIFNOT 46 + 41 GETGLOBAL Not_found + 43 MAKEBLOCK1 0 + 45 RAISE + 46 POP 2 + 48 ATOM0 + 49 SETGLOBAL T181-appterm + 51 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml b/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml new file mode 100644 index 00000000..f63c6cd8 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t190-makefloatblock-1.ml @@ -0,0 +1,17 @@ +open Lib;; +let x = 0.0 in [| x |];; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0 + 11 PUSHACC0 + 12 MAKEFLOATBLOCK 1 + 14 POP 1 + 16 ATOM0 + 17 SETGLOBAL T190-makefloatblock-1 + 19 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml b/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml new file mode 100644 index 00000000..53b97f5d --- /dev/null +++ b/testsuite/tests/tool-ocaml/t190-makefloatblock-2.ml @@ -0,0 +1,18 @@ +open Lib;; +let x = 0.0 in [| x; x |];; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0 + 11 PUSHACC0 + 12 PUSHACC1 + 13 MAKEFLOATBLOCK 2 + 15 POP 1 + 17 ATOM0 + 18 SETGLOBAL T190-makefloatblock-2 + 20 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml b/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml new file mode 100644 index 00000000..cebccaa3 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t190-makefloatblock-3.ml @@ -0,0 +1,19 @@ +open Lib;; +let x = 0.0 in [| x; x; x |];; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0 + 11 PUSHACC0 + 12 PUSHACC1 + 13 PUSHACC2 + 14 MAKEFLOATBLOCK 3 + 16 POP 1 + 18 ATOM0 + 19 SETGLOBAL T190-makefloatblock-3 + 21 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t191-vectlength.ml b/testsuite/tests/tool-ocaml/t191-vectlength.ml new file mode 100644 index 00000000..16f7d783 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t191-vectlength.ml @@ -0,0 +1,26 @@ +open Lib;; +let x = 0.0 in +if Array.length [| x |] <> 1 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0 + 11 PUSHCONST1 + 12 PUSHACC1 + 13 MAKEFLOATBLOCK 1 + 15 VECTLENGTH + 16 NEQ + 17 BRANCHIFNOT 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 POP 1 + 26 ATOM0 + 27 SETGLOBAL T191-vectlength + 29 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml b/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml new file mode 100644 index 00000000..ba002b20 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t192-getfloatfield-1.ml @@ -0,0 +1,23 @@ +open Lib;; +type t = { a : float; b : float };; + +if { a = 0.1; b = 0.2 }.a <> 0.1 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0.1 + 11 PUSHGETGLOBAL [|0.1, 0.2|] + 13 GETFLOATFIELD 0 + 15 C_CALL2 neq_float + 17 BRANCHIFNOT 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 ATOM0 + 25 SETGLOBAL T192-getfloatfield-1 + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml b/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml new file mode 100644 index 00000000..89230da3 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t192-getfloatfield-2.ml @@ -0,0 +1,23 @@ +open Lib;; +type t = { a : float; b : float };; + +if { a = 0.1; b = 0.2 }.b <> 0.2 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0.2 + 11 PUSHGETGLOBAL [|0.1, 0.2|] + 13 GETFLOATFIELD 1 + 15 C_CALL2 neq_float + 17 BRANCHIFNOT 24 + 19 GETGLOBAL Not_found + 21 MAKEBLOCK1 0 + 23 RAISE + 24 ATOM0 + 25 SETGLOBAL T192-getfloatfield-2 + 27 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml b/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml new file mode 100644 index 00000000..b488e7da --- /dev/null +++ b/testsuite/tests/tool-ocaml/t193-setfloatfield-1.ml @@ -0,0 +1,36 @@ +open Lib;; +type t = { + mutable a : float; + mutable b : float; +};; + +let x = { a = 0.1; b = 0.2 } in +x.a <- 0.3; +if x.a <> 0.3 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0.2 + 11 PUSHGETGLOBAL 0.1 + 13 MAKEFLOATBLOCK 2 + 15 PUSHGETGLOBAL 0.3 + 17 PUSHACC1 + 18 SETFLOATFIELD 0 + 20 GETGLOBAL 0.3 + 22 PUSHACC1 + 23 GETFLOATFIELD 0 + 25 C_CALL2 neq_float + 27 BRANCHIFNOT 34 + 29 GETGLOBAL Not_found + 31 MAKEBLOCK1 0 + 33 RAISE + 34 POP 1 + 36 ATOM0 + 37 SETGLOBAL T193-setfloatfield-1 + 39 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml b/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml new file mode 100644 index 00000000..7dde0a2c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t193-setfloatfield-2.ml @@ -0,0 +1,36 @@ +open Lib;; +type t = { + mutable a : float; + mutable b : float; +};; + +let x = { a = 0.1; b = 0.2 } in +x.b <- 0.3; +if x.b <> 0.3 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL 0.2 + 11 PUSHGETGLOBAL 0.1 + 13 MAKEFLOATBLOCK 2 + 15 PUSHGETGLOBAL 0.3 + 17 PUSHACC1 + 18 SETFLOATFIELD 1 + 20 GETGLOBAL 0.3 + 22 PUSHACC1 + 23 GETFLOATFIELD 1 + 25 C_CALL2 neq_float + 27 BRANCHIFNOT 34 + 29 GETGLOBAL Not_found + 31 MAKEBLOCK1 0 + 33 RAISE + 34 POP 1 + 36 ATOM0 + 37 SETGLOBAL T193-setfloatfield-2 + 39 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t200-getfield0.ml b/testsuite/tests/tool-ocaml/t200-getfield0.ml new file mode 100644 index 00000000..14ce1d54 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t200-getfield0.ml @@ -0,0 +1,25 @@ +open Lib;; +type t = { + a : int; +};; + +if { a = 7 }.a <> 7 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 7 + 11 PUSHGETGLOBAL <0>(7) + 13 GETFIELD0 + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T200-getfield0 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t200-getfield1.ml b/testsuite/tests/tool-ocaml/t200-getfield1.ml new file mode 100644 index 00000000..f4e2e019 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t200-getfield1.ml @@ -0,0 +1,26 @@ +open Lib;; +type t = { + a : int; + b : int; +};; + +if { a = 7; b = 6 }.b <> 6 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 6 + 11 PUSHGETGLOBAL <0>(7, 6) + 13 GETFIELD1 + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T200-getfield1 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t200-getfield2.ml b/testsuite/tests/tool-ocaml/t200-getfield2.ml new file mode 100644 index 00000000..df5c7172 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t200-getfield2.ml @@ -0,0 +1,27 @@ +open Lib;; +type t = { + a : int; + b : int; + c : int; +};; + +if { a = 7; b = 6; c = 5 }.c <> 5 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 5 + 11 PUSHGETGLOBAL <0>(7, 6, 5) + 13 GETFIELD2 + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T200-getfield2 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t200-getfield3.ml b/testsuite/tests/tool-ocaml/t200-getfield3.ml new file mode 100644 index 00000000..a0376a1f --- /dev/null +++ b/testsuite/tests/tool-ocaml/t200-getfield3.ml @@ -0,0 +1,28 @@ +open Lib;; +type t = { + a : int; + b : int; + c : int; + d : int; +};; + +if { a = 7; b = 6; c = 5; d = 4 }.d <> 4 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 4 + 11 PUSHGETGLOBAL <0>(7, 6, 5, 4) + 13 GETFIELD3 + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T200-getfield3 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t201-getfield.ml b/testsuite/tests/tool-ocaml/t201-getfield.ml new file mode 100644 index 00000000..0fbbc63f --- /dev/null +++ b/testsuite/tests/tool-ocaml/t201-getfield.ml @@ -0,0 +1,29 @@ +open Lib;; +type t = { + a : int; + b : int; + c : int; + d : int; + e : int; +};; + +if { a = 7; b = 6; c = 5; d = 4; e = 3 }.e <> 3 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST3 + 10 PUSHGETGLOBAL <0>(7, 6, 5, 4, 3) + 12 GETFIELD 4 + 14 NEQ + 15 BRANCHIFNOT 22 + 17 GETGLOBAL Not_found + 19 MAKEBLOCK1 0 + 21 RAISE + 22 ATOM0 + 23 SETGLOBAL T201-getfield + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t210-setfield0.ml b/testsuite/tests/tool-ocaml/t210-setfield0.ml new file mode 100644 index 00000000..aa31d41f --- /dev/null +++ b/testsuite/tests/tool-ocaml/t210-setfield0.ml @@ -0,0 +1,36 @@ +open Lib;; +type t = { + mutable a : int; +};; + +let x = {a = 7} in +x.a <- 11; +if x.a <> 11 then raise Not_found; +x +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 7 + 11 MAKEBLOCK1 0 + 13 PUSHCONSTINT 11 + 15 PUSHACC1 + 16 SETFIELD0 + 17 CONSTINT 11 + 19 PUSHACC1 + 20 GETFIELD0 + 21 NEQ + 22 BRANCHIFNOT 29 + 24 GETGLOBAL Not_found + 26 MAKEBLOCK1 0 + 28 RAISE + 29 ACC0 + 30 POP 1 + 32 ATOM0 + 33 SETGLOBAL T210-setfield0 + 35 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t210-setfield1.ml b/testsuite/tests/tool-ocaml/t210-setfield1.ml new file mode 100644 index 00000000..0d8e1676 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t210-setfield1.ml @@ -0,0 +1,38 @@ +open Lib;; +type t = { + mutable a : int; + mutable b : int; +};; + +let x = {a = 7; b = 6} in +x.b <- 11; +if x.b <> 11 then raise Not_found; +x +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 6 + 11 PUSHCONSTINT 7 + 13 MAKEBLOCK2 0 + 15 PUSHCONSTINT 11 + 17 PUSHACC1 + 18 SETFIELD1 + 19 CONSTINT 11 + 21 PUSHACC1 + 22 GETFIELD1 + 23 NEQ + 24 BRANCHIFNOT 31 + 26 GETGLOBAL Not_found + 28 MAKEBLOCK1 0 + 30 RAISE + 31 ACC0 + 32 POP 1 + 34 ATOM0 + 35 SETGLOBAL T210-setfield1 + 37 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t210-setfield2.ml b/testsuite/tests/tool-ocaml/t210-setfield2.ml new file mode 100644 index 00000000..727691d1 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t210-setfield2.ml @@ -0,0 +1,40 @@ +open Lib;; +type t = { + mutable a : int; + mutable b : int; + mutable c : int; +};; + +let x = {a = 7; b = 6; c = 5} in +x.c <- 11; +if x.c <> 11 then raise Not_found; +x +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 5 + 11 PUSHCONSTINT 6 + 13 PUSHCONSTINT 7 + 15 MAKEBLOCK3 0 + 17 PUSHCONSTINT 11 + 19 PUSHACC1 + 20 SETFIELD2 + 21 CONSTINT 11 + 23 PUSHACC1 + 24 GETFIELD2 + 25 NEQ + 26 BRANCHIFNOT 33 + 28 GETGLOBAL Not_found + 30 MAKEBLOCK1 0 + 32 RAISE + 33 ACC0 + 34 POP 1 + 36 ATOM0 + 37 SETGLOBAL T210-setfield2 + 39 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t210-setfield3.ml b/testsuite/tests/tool-ocaml/t210-setfield3.ml new file mode 100644 index 00000000..d50d2c2a --- /dev/null +++ b/testsuite/tests/tool-ocaml/t210-setfield3.ml @@ -0,0 +1,42 @@ +open Lib;; +type t = { + mutable a : int; + mutable b : int; + mutable c : int; + mutable d : int; +};; + +let x = {a = 7; b = 6; c = 5; d = 4} in +x.d <- 11; +if x.d <> 11 then raise Not_found; +x +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 4 + 11 PUSHCONSTINT 5 + 13 PUSHCONSTINT 6 + 15 PUSHCONSTINT 7 + 17 MAKEBLOCK 4, 0 + 20 PUSHCONSTINT 11 + 22 PUSHACC1 + 23 SETFIELD3 + 24 CONSTINT 11 + 26 PUSHACC1 + 27 GETFIELD3 + 28 NEQ + 29 BRANCHIFNOT 36 + 31 GETGLOBAL Not_found + 33 MAKEBLOCK1 0 + 35 RAISE + 36 ACC0 + 37 POP 1 + 39 ATOM0 + 40 SETGLOBAL T210-setfield3 + 42 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t211-setfield.ml b/testsuite/tests/tool-ocaml/t211-setfield.ml new file mode 100644 index 00000000..69c445e1 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t211-setfield.ml @@ -0,0 +1,44 @@ +open Lib;; +type t = { + mutable a : int; + mutable b : int; + mutable c : int; + mutable d : int; + mutable e : int; +};; + +let x = {a = 7; b = 6; c = 5; d = 4; e = 5} in +x.e <- 11; +if x.e <> 11 then raise Not_found; +x +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 5 + 11 PUSHCONSTINT 4 + 13 PUSHCONSTINT 5 + 15 PUSHCONSTINT 6 + 17 PUSHCONSTINT 7 + 19 MAKEBLOCK 5, 0 + 22 PUSHCONSTINT 11 + 24 PUSHACC1 + 25 SETFIELD 4 + 27 CONSTINT 11 + 29 PUSHACC1 + 30 GETFIELD 4 + 32 NEQ + 33 BRANCHIFNOT 40 + 35 GETGLOBAL Not_found + 37 MAKEBLOCK1 0 + 39 RAISE + 40 ACC0 + 41 POP 1 + 43 ATOM0 + 44 SETGLOBAL T211-setfield + 46 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t220-assign.ml b/testsuite/tests/tool-ocaml/t220-assign.ml new file mode 100644 index 00000000..769f8fb2 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t220-assign.ml @@ -0,0 +1,27 @@ +open Lib;; +let x = ref 1 in +x := 3; +if !x <> 3 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST1 + 10 PUSHCONST3 + 11 ASSIGN 0 + 13 CONST3 + 14 PUSHACC1 + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 POP 1 + 25 ATOM0 + 26 SETGLOBAL T220-assign + 28 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t230-check_signals.ml b/testsuite/tests/tool-ocaml/t230-check_signals.ml new file mode 100644 index 00000000..2c2b5d77 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t230-check_signals.ml @@ -0,0 +1,28 @@ +open Lib;; +for i = 0 to 0 do () done;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 PUSHCONST0 + 11 PUSH + 12 BRANCH 21 + 14 CHECK_SIGNALS + 15 CONST0 + 16 ACC1 + 17 OFFSETINT 1 + 19 ASSIGN 1 + 21 ACC0 + 22 PUSHACC2 + 23 LEINT + 24 BRANCHIF 14 + 26 CONST0 + 27 POP 2 + 29 ATOM0 + 30 SETGLOBAL T230-check_signals + 32 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t240-c_call1.ml b/testsuite/tests/tool-ocaml/t240-c_call1.ml new file mode 100644 index 00000000..3c7508cb --- /dev/null +++ b/testsuite/tests/tool-ocaml/t240-c_call1.ml @@ -0,0 +1,21 @@ +open Lib;; +if Pervasives.int_of_string "123" <> 123 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 123 + 11 PUSHGETGLOBAL "123" + 13 C_CALL1 int_of_string + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T240-c_call1 + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t240-c_call2.ml b/testsuite/tests/tool-ocaml/t240-c_call2.ml new file mode 100644 index 00000000..23c98436 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t240-c_call2.ml @@ -0,0 +1,22 @@ +open Lib;; +if Pervasives.compare 1 2 <> -1 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT -1 + 11 PUSHCONST2 + 12 PUSHCONST1 + 13 C_CALL2 compare + 15 NEQ + 16 BRANCHIFNOT 23 + 18 GETGLOBAL Not_found + 20 MAKEBLOCK1 0 + 22 RAISE + 23 ATOM0 + 24 SETGLOBAL T240-c_call2 + 26 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t240-c_call3.ml b/testsuite/tests/tool-ocaml/t240-c_call3.ml new file mode 100644 index 00000000..707bc7ee --- /dev/null +++ b/testsuite/tests/tool-ocaml/t240-c_call3.ml @@ -0,0 +1,23 @@ +open Lib;; +if Hashtbl.hash_param 5 6 [1;2;3] <> 196799 then raise Not_found;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 196799 + 11 PUSHGETGLOBAL <0>(1, <0>(2, <0>(3, 0))) + 13 PUSHCONSTINT 6 + 15 PUSHCONSTINT 5 + 17 C_CALL3 hash_univ_param + 19 NEQ + 20 BRANCHIFNOT 27 + 22 GETGLOBAL Not_found + 24 MAKEBLOCK1 0 + 26 RAISE + 27 ATOM0 + 28 SETGLOBAL T240-c_call3 + 30 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t240-c_call4.ml b/testsuite/tests/tool-ocaml/t240-c_call4.ml new file mode 100644 index 00000000..2ab62d86 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t240-c_call4.ml @@ -0,0 +1,32 @@ +open Lib;; +let s = "abcdefgh" in +String.unsafe_fill s 0 6 'x'; +if s.[5] <> 'x' then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL "abcdefgh" + 11 PUSHCONSTINT 120 + 13 PUSHCONSTINT 6 + 15 PUSHCONST0 + 16 PUSHACC3 + 17 C_CALL4 fill_string + 19 CONSTINT 120 + 21 PUSHCONSTINT 5 + 23 PUSHACC2 + 24 GETSTRINGCHAR + 25 NEQ + 26 BRANCHIFNOT 33 + 28 GETGLOBAL Not_found + 30 MAKEBLOCK1 0 + 32 RAISE + 33 POP 1 + 35 ATOM0 + 36 SETGLOBAL T240-c_call4 + 38 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t240-c_call5.ml b/testsuite/tests/tool-ocaml/t240-c_call5.ml new file mode 100644 index 00000000..e817d550 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t240-c_call5.ml @@ -0,0 +1,33 @@ +open Lib;; +let s = "abcdefgh" in +String.unsafe_blit s 3 s 0 3; +if s.[0] <> 'd' then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 GETGLOBAL "abcdefgh" + 11 PUSHCONST3 + 12 PUSHCONST0 + 13 PUSHACC2 + 14 PUSHCONST3 + 15 PUSHACC4 + 16 C_CALL5 blit_string + 18 CONSTINT 100 + 20 PUSHCONST0 + 21 PUSHACC2 + 22 GETSTRINGCHAR + 23 NEQ + 24 BRANCHIFNOT 31 + 26 GETGLOBAL Not_found + 28 MAKEBLOCK1 0 + 30 RAISE + 31 POP 1 + 33 ATOM0 + 34 SETGLOBAL T240-c_call5 + 36 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t250-closurerec-1.ml b/testsuite/tests/tool-ocaml/t250-closurerec-1.ml new file mode 100644 index 00000000..ded5036e --- /dev/null +++ b/testsuite/tests/tool-ocaml/t250-closurerec-1.ml @@ -0,0 +1,19 @@ +open Lib;; +let rec f _ = 0;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 14 + 11 CONST0 + 12 RETURN 1 + 14 CLOSUREREC 0, 11 + 18 ACC0 + 19 MAKEBLOCK1 0 + 21 POP 1 + 23 SETGLOBAL T250-closurerec-1 + 25 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t250-closurerec-2.ml b/testsuite/tests/tool-ocaml/t250-closurerec-2.ml new file mode 100644 index 00000000..97eac0c7 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t250-closurerec-2.ml @@ -0,0 +1,29 @@ +open Lib;; +let rec f _ = 23 in +if f 0 <> 23 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 15 + 11 CONSTINT 23 + 13 RETURN 1 + 15 CLOSUREREC 0, 11 + 19 CONSTINT 23 + 21 PUSHCONST0 + 22 PUSHACC2 + 23 APPLY1 + 24 NEQ + 25 BRANCHIFNOT 32 + 27 GETGLOBAL Not_found + 29 MAKEBLOCK1 0 + 31 RAISE + 32 POP 1 + 34 ATOM0 + 35 SETGLOBAL T250-closurerec-2 + 37 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml new file mode 100644 index 00000000..b1c25555 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure0.ml @@ -0,0 +1,39 @@ +open Lib;; +let rec f = function + | 0 -> 13 + | n -> f 0 +in +if f 5 <> 13 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 24 + 11 CONST0 + 12 PUSHACC1 + 13 EQ + 14 BRANCHIFNOT 20 + 16 CONSTINT 13 + 18 RETURN 1 + 20 CONST0 + 21 PUSHOFFSETCLOSURE0 + 22 APPTERM1 2 + 24 CLOSUREREC 0, 11 + 28 CONSTINT 13 + 30 PUSHCONSTINT 5 + 32 PUSHACC2 + 33 APPLY1 + 34 NEQ + 35 BRANCHIFNOT 42 + 37 GETGLOBAL Not_found + 39 MAKEBLOCK1 0 + 41 RAISE + 42 POP 1 + 44 ATOM0 + 45 SETGLOBAL T251-pushoffsetclosure0 + 47 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml new file mode 100644 index 00000000..0fbdd6ea --- /dev/null +++ b/testsuite/tests/tool-ocaml/t251-pushoffsetclosure2.ml @@ -0,0 +1,34 @@ +open Lib;; +let rec f _ = g 0 + and g _ = 4 +in +if f 5 <> 4 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 19 + 11 CONST0 + 12 PUSHOFFSETCLOSURE2 + 13 APPTERM1 2 + 15 CONSTINT 4 + 17 RETURN 1 + 19 CLOSUREREC 0, 11, 15 + 24 CONSTINT 4 + 26 PUSHCONSTINT 5 + 28 PUSHACC3 + 29 APPLY1 + 30 NEQ + 31 BRANCHIFNOT 38 + 33 GETGLOBAL Not_found + 35 MAKEBLOCK1 0 + 37 RAISE + 38 POP 2 + 40 ATOM0 + 41 SETGLOBAL T251-pushoffsetclosure2 + 43 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml b/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml new file mode 100644 index 00000000..41ec196c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t251-pushoffsetclosurem2.ml @@ -0,0 +1,34 @@ +open Lib;; +let rec f _ = 4 + and g _ = f 2 +in +if g 5 <> 4 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 19 + 11 CONSTINT 4 + 13 RETURN 1 + 15 CONST2 + 16 PUSHOFFSETCLOSUREM2 + 17 APPTERM1 2 + 19 CLOSUREREC 0, 11, 15 + 24 CONSTINT 4 + 26 PUSHCONSTINT 5 + 28 PUSHACC2 + 29 APPLY1 + 30 NEQ + 31 BRANCHIFNOT 38 + 33 GETGLOBAL Not_found + 35 MAKEBLOCK1 0 + 37 RAISE + 38 POP 2 + 40 ATOM0 + 41 SETGLOBAL T251-pushoffsetclosurem2 + 43 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml b/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml new file mode 100644 index 00000000..18871334 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t252-pushoffsetclosure.ml @@ -0,0 +1,38 @@ +open Lib;; +let rec f x = x + and g _ = f 4 + and h _ = f 6 +in +if h 1 <> 6 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 25 + 11 ACC0 + 12 RETURN 1 + 14 CONSTINT 4 + 16 PUSHOFFSETCLOSUREM2 + 17 APPTERM1 2 + 19 CONSTINT 6 + 21 PUSHOFFSETCLOSURE -4 + 23 APPTERM1 2 + 25 CLOSUREREC 0, 11, 14, 19 + 31 CONSTINT 6 + 33 PUSHCONST1 + 34 PUSHACC2 + 35 APPLY1 + 36 NEQ + 37 BRANCHIFNOT 44 + 39 GETGLOBAL Not_found + 41 MAKEBLOCK1 0 + 43 RAISE + 44 POP 3 + 46 ATOM0 + 47 SETGLOBAL T252-pushoffsetclosure + 49 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml b/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml new file mode 100644 index 00000000..f6d12c6d --- /dev/null +++ b/testsuite/tests/tool-ocaml/t253-offsetclosure0.ml @@ -0,0 +1,34 @@ +open Lib;; +let rec f _ = g f + and g _ = 10 +in +if f 3 <> 10 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 19 + 11 OFFSETCLOSURE0 + 12 PUSHOFFSETCLOSURE2 + 13 APPTERM1 2 + 15 CONSTINT 10 + 17 RETURN 1 + 19 CLOSUREREC 0, 11, 15 + 24 CONSTINT 10 + 26 PUSHCONST3 + 27 PUSHACC3 + 28 APPLY1 + 29 NEQ + 30 BRANCHIFNOT 37 + 32 GETGLOBAL Not_found + 34 MAKEBLOCK1 0 + 36 RAISE + 37 POP 2 + 39 ATOM0 + 40 SETGLOBAL T253-offsetclosure0 + 42 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml b/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml new file mode 100644 index 00000000..be940611 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t253-offsetclosure2.ml @@ -0,0 +1,34 @@ +open Lib;; +let rec f _ = g + and g _ = 10 +in +if f 3 4 <> 10 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 18 + 11 OFFSETCLOSURE2 + 12 RETURN 1 + 14 CONSTINT 10 + 16 RETURN 1 + 18 CLOSUREREC 0, 11, 14 + 23 CONSTINT 10 + 25 PUSHCONSTINT 4 + 27 PUSHCONST3 + 28 PUSHACC4 + 29 APPLY2 + 30 NEQ + 31 BRANCHIFNOT 38 + 33 GETGLOBAL Not_found + 35 MAKEBLOCK1 0 + 37 RAISE + 38 POP 2 + 40 ATOM0 + 41 SETGLOBAL T253-offsetclosure2 + 43 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml b/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml new file mode 100644 index 00000000..cec37931 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t253-offsetclosurem2.ml @@ -0,0 +1,34 @@ +open Lib;; +let rec f _ = 11 + and g _ = f +in +if g 3 4 <> 11 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 18 + 11 CONSTINT 11 + 13 RETURN 1 + 15 OFFSETCLOSUREM2 + 16 RETURN 1 + 18 CLOSUREREC 0, 11, 15 + 23 CONSTINT 11 + 25 PUSHCONSTINT 4 + 27 PUSHCONST3 + 28 PUSHACC3 + 29 APPLY2 + 30 NEQ + 31 BRANCHIFNOT 38 + 33 GETGLOBAL Not_found + 35 MAKEBLOCK1 0 + 37 RAISE + 38 POP 2 + 40 ATOM0 + 41 SETGLOBAL T253-offsetclosurem2 + 43 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t254-offsetclosure.ml b/testsuite/tests/tool-ocaml/t254-offsetclosure.ml new file mode 100644 index 00000000..6da8c28c --- /dev/null +++ b/testsuite/tests/tool-ocaml/t254-offsetclosure.ml @@ -0,0 +1,37 @@ +open Lib;; +let rec f _ = 11 + and g _ = 0 + and h _ = f +in +if h 3 4 <> 11 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 22 + 11 CONSTINT 11 + 13 RETURN 1 + 15 CONST0 + 16 RETURN 1 + 18 OFFSETCLOSURE -4 + 20 RETURN 1 + 22 CLOSUREREC 0, 11, 15, 18 + 28 CONSTINT 11 + 30 PUSHCONSTINT 4 + 32 PUSHCONST3 + 33 PUSHACC3 + 34 APPLY2 + 35 NEQ + 36 BRANCHIFNOT 43 + 38 GETGLOBAL Not_found + 40 MAKEBLOCK1 0 + 42 RAISE + 43 POP 3 + 45 ATOM0 + 46 SETGLOBAL T254-offsetclosure + 48 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t260-offsetref.ml b/testsuite/tests/tool-ocaml/t260-offsetref.ml new file mode 100644 index 00000000..968892ef --- /dev/null +++ b/testsuite/tests/tool-ocaml/t260-offsetref.ml @@ -0,0 +1,31 @@ +open Lib;; +let x = ref 32 in +incr x; +if !x <> 33 then raise Not_found; +x +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONSTINT 32 + 11 MAKEBLOCK1 0 + 13 PUSHACC0 + 14 OFFSETREF 1 + 16 CONSTINT 33 + 18 PUSHACC1 + 19 GETFIELD0 + 20 NEQ + 21 BRANCHIFNOT 28 + 23 GETGLOBAL Not_found + 25 MAKEBLOCK1 0 + 27 RAISE + 28 ACC0 + 29 POP 1 + 31 ATOM0 + 32 SETGLOBAL T260-offsetref + 34 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t270-push_retaddr.ml b/testsuite/tests/tool-ocaml/t270-push_retaddr.ml new file mode 100644 index 00000000..0c7fb369 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t270-push_retaddr.ml @@ -0,0 +1,36 @@ +open Lib;; +let f a b c d = 123 in +if f 0 1 2 3 <> 123 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 18 + 11 RESTART + 12 GRAB 3 + 14 CONSTINT 123 + 16 RETURN 4 + 18 CLOSURE 0, 12 + 21 PUSHCONSTINT 123 + 23 PUSH + 24 PUSH_RETADDR 34 + 26 CONST3 + 27 PUSHCONST2 + 28 PUSHCONST1 + 29 PUSHCONST0 + 30 PUSHACC 8 + 32 APPLY 4 + 34 NEQ + 35 BRANCHIFNOT 42 + 37 GETGLOBAL Not_found + 39 MAKEBLOCK1 0 + 41 RAISE + 42 POP 1 + 44 ATOM0 + 45 SETGLOBAL T270-push_retaddr + 47 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t300-getmethod.ml b/testsuite/tests/tool-ocaml/t300-getmethod.ml new file mode 100644 index 00000000..e7894735 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t300-getmethod.ml @@ -0,0 +1,5885 @@ +open Lib;; + +class c = object + method m = 23 +end;; + +let o = new c in +if o#m <> 23 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 3341 + 2406 RESTART + 2407 GRAB 2 + 2409 ACC2 + 2410 PUSHACC2 + 2411 VECTLENGTH + 2412 OFFSETINT -1 + 2414 PUSHCONST0 + 2415 PUSH + 2416 BRANCH 2433 + 2418 CHECK_SIGNALS + 2419 ACC2 + 2420 PUSHACC2 + 2421 PUSHACC6 + 2422 C_CALL2 array_unsafe_get + 2424 PUSHACC5 + 2425 APPLY2 + 2426 ASSIGN 2 + 2428 ACC1 + 2429 OFFSETINT -1 + 2431 ASSIGN 1 + 2433 ACC0 + 2434 PUSHACC2 + 2435 GEINT + 2436 BRANCHIF 2418 + 2438 CONST0 + 2439 POP 2 + 2441 ACC0 + 2442 RETURN 4 + 2444 RESTART + 2445 GRAB 2 + 2447 ACC1 + 2448 PUSHCONST0 + 2449 PUSHACC4 + 2450 VECTLENGTH + 2451 OFFSETINT -1 + 2453 PUSH + 2454 BRANCH 2471 + 2456 CHECK_SIGNALS + 2457 ACC1 + 2458 PUSHACC6 + 2459 C_CALL2 array_unsafe_get + 2461 PUSHACC3 + 2462 PUSHACC5 + 2463 APPLY2 + 2464 ASSIGN 2 + 2466 ACC1 + 2467 OFFSETINT 1 + 2469 ASSIGN 1 + 2471 ACC0 + 2472 PUSHACC2 + 2473 LEINT + 2474 BRANCHIF 2456 + 2476 CONST0 + 2477 POP 2 + 2479 ACC0 + 2480 RETURN 4 + 2482 RESTART + 2483 GRAB 1 + 2485 ACC1 + 2486 BRANCHIFNOT 2502 + 2488 ACC1 + 2489 GETFIELD0 + 2490 PUSHACC1 + 2491 PUSHENVACC1 + 2492 C_CALL3 array_unsafe_set + 2494 ACC1 + 2495 GETFIELD1 + 2496 PUSHACC1 + 2497 OFFSETINT 1 + 2499 PUSHOFFSETCLOSURE0 + 2500 APPTERM2 4 + 2502 ENVACC1 + 2503 RETURN 2 + 2505 ACC0 + 2506 BRANCHIFNOT 2531 + 2508 ACC0 + 2509 GETFIELD1 + 2510 PUSHACC1 + 2511 GETFIELD0 + 2512 PUSHACC1 + 2513 PUSHGETGLOBALFIELD List, 0 + 2516 APPLY1 + 2517 OFFSETINT 1 + 2519 C_CALL2 make_vect + 2521 PUSHACC0 + 2522 CLOSUREREC 1, 2483 + 2526 ACC2 + 2527 PUSHCONST1 + 2528 PUSHACC2 + 2529 APPTERM2 6 + 2531 ATOM0 + 2532 RETURN 1 + 2534 RESTART + 2535 GRAB 1 + 2537 CONST0 + 2538 PUSHACC1 + 2539 LTINT + 2540 BRANCHIFNOT 2545 + 2542 ACC1 + 2543 RETURN 2 + 2545 ACC1 + 2546 PUSHACC1 + 2547 PUSHENVACC1 + 2548 C_CALL2 array_unsafe_get + 2550 MAKEBLOCK2 0 + 2552 PUSHACC1 + 2553 OFFSETINT -1 + 2555 PUSHOFFSETCLOSURE0 + 2556 APPTERM2 4 + 2558 ACC0 + 2559 CLOSUREREC 1, 2535 + 2563 CONST0 + 2564 PUSHACC2 + 2565 VECTLENGTH + 2566 OFFSETINT -1 + 2568 PUSHACC2 + 2569 APPTERM2 4 + 2571 RESTART + 2572 GRAB 1 + 2574 ACC1 + 2575 VECTLENGTH + 2576 PUSHCONST0 + 2577 PUSHACC1 + 2578 EQ + 2579 BRANCHIFNOT 2584 + 2581 ATOM0 + 2582 RETURN 3 + 2584 CONST0 + 2585 PUSHACC3 + 2586 C_CALL2 array_unsafe_get + 2588 PUSHCONST0 + 2589 PUSHACC3 + 2590 APPLY2 + 2591 PUSHACC1 + 2592 C_CALL2 make_vect + 2594 PUSHCONST1 + 2595 PUSHACC2 + 2596 OFFSETINT -1 + 2598 PUSH + 2599 BRANCH 2618 + 2601 CHECK_SIGNALS + 2602 ACC1 + 2603 PUSHACC6 + 2604 C_CALL2 array_unsafe_get + 2606 PUSHACC2 + 2607 PUSHACC6 + 2608 APPLY2 + 2609 PUSHACC2 + 2610 PUSHACC4 + 2611 C_CALL3 array_unsafe_set + 2613 ACC1 + 2614 OFFSETINT 1 + 2616 ASSIGN 1 + 2618 ACC0 + 2619 PUSHACC2 + 2620 LEINT + 2621 BRANCHIF 2601 + 2623 CONST0 + 2624 POP 2 + 2626 ACC0 + 2627 RETURN 4 + 2629 RESTART + 2630 GRAB 1 + 2632 CONST0 + 2633 PUSHACC2 + 2634 VECTLENGTH + 2635 OFFSETINT -1 + 2637 PUSH + 2638 BRANCH 2653 + 2640 CHECK_SIGNALS + 2641 ACC1 + 2642 PUSHACC4 + 2643 C_CALL2 array_unsafe_get + 2645 PUSHACC2 + 2646 PUSHACC4 + 2647 APPLY2 + 2648 ACC1 + 2649 OFFSETINT 1 + 2651 ASSIGN 1 + 2653 ACC0 + 2654 PUSHACC2 + 2655 LEINT + 2656 BRANCHIF 2640 + 2658 CONST0 + 2659 RETURN 4 + 2661 RESTART + 2662 GRAB 1 + 2664 ACC1 + 2665 VECTLENGTH + 2666 PUSHCONST0 + 2667 PUSHACC1 + 2668 EQ + 2669 BRANCHIFNOT 2674 + 2671 ATOM0 + 2672 RETURN 3 + 2674 CONST0 + 2675 PUSHACC3 + 2676 C_CALL2 array_unsafe_get + 2678 PUSHACC2 + 2679 APPLY1 + 2680 PUSHACC1 + 2681 C_CALL2 make_vect + 2683 PUSHCONST1 + 2684 PUSHACC2 + 2685 OFFSETINT -1 + 2687 PUSH + 2688 BRANCH 2706 + 2690 CHECK_SIGNALS + 2691 ACC1 + 2692 PUSHACC6 + 2693 C_CALL2 array_unsafe_get + 2695 PUSHACC5 + 2696 APPLY1 + 2697 PUSHACC2 + 2698 PUSHACC4 + 2699 C_CALL3 array_unsafe_set + 2701 ACC1 + 2702 OFFSETINT 1 + 2704 ASSIGN 1 + 2706 ACC0 + 2707 PUSHACC2 + 2708 LEINT + 2709 BRANCHIF 2690 + 2711 CONST0 + 2712 POP 2 + 2714 ACC0 + 2715 RETURN 4 + 2717 RESTART + 2718 GRAB 1 + 2720 CONST0 + 2721 PUSHACC2 + 2722 VECTLENGTH + 2723 OFFSETINT -1 + 2725 PUSH + 2726 BRANCH 2740 + 2728 CHECK_SIGNALS + 2729 ACC1 + 2730 PUSHACC4 + 2731 C_CALL2 array_unsafe_get + 2733 PUSHACC3 + 2734 APPLY1 + 2735 ACC1 + 2736 OFFSETINT 1 + 2738 ASSIGN 1 + 2740 ACC0 + 2741 PUSHACC2 + 2742 LEINT + 2743 BRANCHIF 2728 + 2745 CONST0 + 2746 RETURN 4 + 2748 RESTART + 2749 GRAB 4 + 2751 CONST0 + 2752 PUSHACC5 + 2753 LTINT + 2754 BRANCHIF 2782 + 2756 CONST0 + 2757 PUSHACC2 + 2758 LTINT + 2759 BRANCHIF 2782 + 2761 ACC0 + 2762 VECTLENGTH + 2763 PUSHACC5 + 2764 PUSHACC3 + 2765 ADDINT + 2766 GTINT + 2767 BRANCHIF 2782 + 2769 CONST0 + 2770 PUSHACC4 + 2771 LTINT + 2772 BRANCHIF 2782 + 2774 ACC2 + 2775 VECTLENGTH + 2776 PUSHACC5 + 2777 PUSHACC5 + 2778 ADDINT + 2779 GTINT + 2780 BRANCHIFNOT 2789 + 2782 GETGLOBAL "Array.blit" + 2784 PUSHGETGLOBALFIELD Pervasives, 2 + 2787 APPTERM1 6 + 2789 ACC3 + 2790 PUSHACC2 + 2791 LTINT + 2792 BRANCHIFNOT 2827 + 2794 ACC4 + 2795 OFFSETINT -1 + 2797 PUSHCONST0 + 2798 PUSH + 2799 BRANCH 2819 + 2801 CHECK_SIGNALS + 2802 ACC1 + 2803 PUSHACC4 + 2804 ADDINT + 2805 PUSHACC3 + 2806 C_CALL2 array_unsafe_get + 2808 PUSHACC2 + 2809 PUSHACC7 + 2810 ADDINT + 2811 PUSHACC6 + 2812 C_CALL3 array_unsafe_set + 2814 ACC1 + 2815 OFFSETINT -1 + 2817 ASSIGN 1 + 2819 ACC0 + 2820 PUSHACC2 + 2821 GEINT + 2822 BRANCHIF 2801 + 2824 CONST0 + 2825 RETURN 7 + 2827 CONST0 + 2828 PUSHACC5 + 2829 OFFSETINT -1 + 2831 PUSH + 2832 BRANCH 2852 + 2834 CHECK_SIGNALS + 2835 ACC1 + 2836 PUSHACC4 + 2837 ADDINT + 2838 PUSHACC3 + 2839 C_CALL2 array_unsafe_get + 2841 PUSHACC2 + 2842 PUSHACC7 + 2843 ADDINT + 2844 PUSHACC6 + 2845 C_CALL3 array_unsafe_set + 2847 ACC1 + 2848 OFFSETINT 1 + 2850 ASSIGN 1 + 2852 ACC0 + 2853 PUSHACC2 + 2854 LEINT + 2855 BRANCHIF 2834 + 2857 CONST0 + 2858 RETURN 7 + 2860 RESTART + 2861 GRAB 3 + 2863 CONST0 + 2864 PUSHACC2 + 2865 LTINT + 2866 BRANCHIF 2881 + 2868 CONST0 + 2869 PUSHACC3 + 2870 LTINT + 2871 BRANCHIF 2881 + 2873 ACC0 + 2874 VECTLENGTH + 2875 PUSHACC3 + 2876 PUSHACC3 + 2877 ADDINT + 2878 GTINT + 2879 BRANCHIFNOT 2888 + 2881 GETGLOBAL "Array.fill" + 2883 PUSHGETGLOBALFIELD Pervasives, 2 + 2886 APPTERM1 5 + 2888 ACC1 + 2889 PUSHACC3 + 2890 PUSHACC3 + 2891 ADDINT + 2892 OFFSETINT -1 + 2894 PUSH + 2895 BRANCH 2908 + 2897 CHECK_SIGNALS + 2898 ACC5 + 2899 PUSHACC2 + 2900 PUSHACC4 + 2901 C_CALL3 array_unsafe_set + 2903 ACC1 + 2904 OFFSETINT 1 + 2906 ASSIGN 1 + 2908 ACC0 + 2909 PUSHACC2 + 2910 LEINT + 2911 BRANCHIF 2897 + 2913 CONST0 + 2914 RETURN 6 + 2916 RESTART + 2917 GRAB 2 + 2919 CONST0 + 2920 PUSHACC2 + 2921 LTINT + 2922 BRANCHIF 2937 + 2924 CONST0 + 2925 PUSHACC3 + 2926 LTINT + 2927 BRANCHIF 2937 + 2929 ACC0 + 2930 VECTLENGTH + 2931 PUSHACC3 + 2932 PUSHACC3 + 2933 ADDINT + 2934 GTINT + 2935 BRANCHIFNOT 2944 + 2937 GETGLOBAL "Array.sub" + 2939 PUSHGETGLOBALFIELD Pervasives, 2 + 2942 APPTERM1 4 + 2944 CONST0 + 2945 PUSHACC3 + 2946 EQ + 2947 BRANCHIFNOT 2952 + 2949 ATOM0 + 2950 RETURN 3 + 2952 ACC1 + 2953 PUSHACC1 + 2954 C_CALL2 array_unsafe_get + 2956 PUSHACC3 + 2957 C_CALL2 make_vect + 2959 PUSHCONST1 + 2960 PUSHACC4 + 2961 OFFSETINT -1 + 2963 PUSH + 2964 BRANCH 2982 + 2966 CHECK_SIGNALS + 2967 ACC1 + 2968 PUSHACC5 + 2969 ADDINT + 2970 PUSHACC4 + 2971 C_CALL2 array_unsafe_get + 2973 PUSHACC2 + 2974 PUSHACC4 + 2975 C_CALL3 array_unsafe_set + 2977 ACC1 + 2978 OFFSETINT 1 + 2980 ASSIGN 1 + 2982 ACC0 + 2983 PUSHACC2 + 2984 LEINT + 2985 BRANCHIF 2966 + 2987 CONST0 + 2988 POP 2 + 2990 ACC0 + 2991 RETURN 4 + 2993 ACC0 + 2994 BRANCHIFNOT 3017 + 2996 ACC0 + 2997 GETFIELD0 + 2998 PUSHCONST0 + 2999 PUSHACC1 + 3000 VECTLENGTH + 3001 GTINT + 3002 BRANCHIFNOT 3012 + 3004 ENVACC2 + 3005 PUSHCONST0 + 3006 PUSHACC2 + 3007 C_CALL2 array_unsafe_get + 3009 PUSHENVACC1 + 3010 APPTERM2 4 + 3012 ACC1 + 3013 GETFIELD1 + 3014 PUSHOFFSETCLOSURE0 + 3015 APPTERM1 3 + 3017 ATOM0 + 3018 RETURN 1 + 3020 ACC0 + 3021 PUSHENVACC1 + 3022 CLOSUREREC 2, 2993 + 3026 ACC1 + 3027 PUSHACC1 + 3028 APPTERM1 3 + 3030 CONST0 + 3031 PUSHACC1 + 3032 VECTLENGTH + 3033 OFFSETINT -1 + 3035 PUSH + 3036 BRANCH 3056 + 3038 CHECK_SIGNALS + 3039 ACC1 + 3040 PUSHACC3 + 3041 C_CALL2 array_unsafe_get + 3043 PUSHENVACC2 + 3044 GETFIELD0 + 3045 PUSHENVACC1 + 3046 C_CALL3 array_unsafe_set + 3048 ENVACC2 + 3049 OFFSETREF 1 + 3051 ACC1 + 3052 OFFSETINT 1 + 3054 ASSIGN 1 + 3056 ACC0 + 3057 PUSHACC2 + 3058 LEINT + 3059 BRANCHIF 3038 + 3061 CONST0 + 3062 RETURN 3 + 3064 RESTART + 3065 GRAB 1 + 3067 ACC1 + 3068 VECTLENGTH + 3069 PUSHACC1 + 3070 ADDINT + 3071 RETURN 2 + 3073 RESTART + 3074 GRAB 1 + 3076 ACC1 + 3077 PUSHCONST0 + 3078 PUSH + 3079 CLOSURE 0, 3065 + 3082 PUSHGETGLOBALFIELD List, 12 + 3085 APPLY3 + 3086 PUSHACC1 + 3087 PUSHACC1 + 3088 C_CALL2 make_vect + 3090 PUSHCONST0 + 3091 MAKEBLOCK1 0 + 3093 PUSHACC4 + 3094 PUSHACC1 + 3095 PUSHACC3 + 3096 CLOSURE 2, 3030 + 3099 PUSHGETGLOBALFIELD List, 9 + 3102 APPLY2 + 3103 ACC1 + 3104 RETURN 5 + 3106 RESTART + 3107 GRAB 1 + 3109 ACC0 + 3110 VECTLENGTH + 3111 PUSHACC2 + 3112 VECTLENGTH + 3113 PUSHCONST0 + 3114 PUSHACC2 + 3115 EQ + 3116 BRANCHIFNOT 3126 + 3118 CONST0 + 3119 PUSHACC1 + 3120 EQ + 3121 BRANCHIFNOT 3126 + 3123 ATOM0 + 3124 RETURN 4 + 3126 CONST0 + 3127 PUSHCONST0 + 3128 PUSHACC3 + 3129 GTINT + 3130 BRANCHIFNOT 3135 + 3132 ACC3 + 3133 BRANCH 3136 + 3135 ACC4 + 3136 C_CALL2 array_unsafe_get + 3138 PUSHACC1 + 3139 PUSHACC3 + 3140 ADDINT + 3141 C_CALL2 make_vect + 3143 PUSHCONST0 + 3144 PUSHACC3 + 3145 OFFSETINT -1 + 3147 PUSH + 3148 BRANCH 3164 + 3150 CHECK_SIGNALS + 3151 ACC1 + 3152 PUSHACC6 + 3153 C_CALL2 array_unsafe_get + 3155 PUSHACC2 + 3156 PUSHACC4 + 3157 C_CALL3 array_unsafe_set + 3159 ACC1 + 3160 OFFSETINT 1 + 3162 ASSIGN 1 + 3164 ACC0 + 3165 PUSHACC2 + 3166 LEINT + 3167 BRANCHIF 3150 + 3169 CONST0 + 3170 POP 2 + 3172 CONST0 + 3173 PUSHACC2 + 3174 OFFSETINT -1 + 3176 PUSH + 3177 BRANCH 3195 + 3179 CHECK_SIGNALS + 3180 ACC1 + 3181 PUSHACC7 + 3182 C_CALL2 array_unsafe_get + 3184 PUSHACC5 + 3185 PUSHACC3 + 3186 ADDINT + 3187 PUSHACC4 + 3188 C_CALL3 array_unsafe_set + 3190 ACC1 + 3191 OFFSETINT 1 + 3193 ASSIGN 1 + 3195 ACC0 + 3196 PUSHACC2 + 3197 LEINT + 3198 BRANCHIF 3179 + 3200 CONST0 + 3201 POP 2 + 3203 ACC0 + 3204 RETURN 5 + 3206 ACC0 + 3207 VECTLENGTH + 3208 PUSHCONST0 + 3209 PUSHACC1 + 3210 EQ + 3211 BRANCHIFNOT 3216 + 3213 ATOM0 + 3214 RETURN 2 + 3216 CONST0 + 3217 PUSHACC2 + 3218 C_CALL2 array_unsafe_get + 3220 PUSHACC1 + 3221 C_CALL2 make_vect + 3223 PUSHCONST1 + 3224 PUSHACC2 + 3225 OFFSETINT -1 + 3227 PUSH + 3228 BRANCH 3244 + 3230 CHECK_SIGNALS + 3231 ACC1 + 3232 PUSHACC5 + 3233 C_CALL2 array_unsafe_get + 3235 PUSHACC2 + 3236 PUSHACC4 + 3237 C_CALL3 array_unsafe_set + 3239 ACC1 + 3240 OFFSETINT 1 + 3242 ASSIGN 1 + 3244 ACC0 + 3245 PUSHACC2 + 3246 LEINT + 3247 BRANCHIF 3230 + 3249 CONST0 + 3250 POP 2 + 3252 ACC0 + 3253 RETURN 3 + 3255 RESTART + 3256 GRAB 2 + 3258 ATOM0 + 3259 PUSHACC1 + 3260 C_CALL2 make_vect + 3262 PUSHCONST0 + 3263 PUSHACC2 + 3264 OFFSETINT -1 + 3266 PUSH + 3267 BRANCH 3282 + 3269 CHECK_SIGNALS + 3270 ACC5 + 3271 PUSHACC5 + 3272 C_CALL2 make_vect + 3274 PUSHACC2 + 3275 PUSHACC4 + 3276 SETVECTITEM + 3277 ACC1 + 3278 OFFSETINT 1 + 3280 ASSIGN 1 + 3282 ACC0 + 3283 PUSHACC2 + 3284 LEINT + 3285 BRANCHIF 3269 + 3287 CONST0 + 3288 POP 2 + 3290 ACC0 + 3291 RETURN 4 + 3293 RESTART + 3294 GRAB 1 + 3296 CONST0 + 3297 PUSHACC1 + 3298 EQ + 3299 BRANCHIFNOT 3304 + 3301 ATOM0 + 3302 RETURN 2 + 3304 CONST0 + 3305 PUSHACC2 + 3306 APPLY1 + 3307 PUSHACC1 + 3308 C_CALL2 make_vect + 3310 PUSHCONST1 + 3311 PUSHACC2 + 3312 OFFSETINT -1 + 3314 PUSH + 3315 BRANCH 3330 + 3317 CHECK_SIGNALS + 3318 ACC1 + 3319 PUSHACC5 + 3320 APPLY1 + 3321 PUSHACC2 + 3322 PUSHACC4 + 3323 C_CALL3 array_unsafe_set + 3325 ACC1 + 3326 OFFSETINT 1 + 3328 ASSIGN 1 + 3330 ACC0 + 3331 PUSHACC2 + 3332 LEINT + 3333 BRANCHIF 3317 + 3335 CONST0 + 3336 POP 2 + 3338 ACC0 + 3339 RETURN 3 + 3341 CLOSURE 0, 3294 + 3344 PUSH + 3345 CLOSURE 0, 3256 + 3348 PUSH + 3349 CLOSURE 0, 3206 + 3352 PUSH + 3353 CLOSURE 0, 3107 + 3356 PUSH + 3357 CLOSURE 0, 3074 + 3360 PUSHACC0 + 3361 CLOSURE 1, 3020 + 3364 PUSH + 3365 CLOSURE 0, 2917 + 3368 PUSH + 3369 CLOSURE 0, 2861 + 3372 PUSH + 3373 CLOSURE 0, 2749 + 3376 PUSH + 3377 CLOSURE 0, 2718 + 3380 PUSH + 3381 CLOSURE 0, 2662 + 3384 PUSH + 3385 CLOSURE 0, 2630 + 3388 PUSH + 3389 CLOSURE 0, 2572 + 3392 PUSH + 3393 CLOSURE 0, 2558 + 3396 PUSH + 3397 CLOSURE 0, 2505 + 3400 PUSH + 3401 CLOSURE 0, 2445 + 3404 PUSH + 3405 CLOSURE 0, 2407 + 3408 PUSHACC0 + 3409 PUSHACC2 + 3410 PUSHACC6 + 3411 PUSHACC 8 + 3413 PUSHACC 10 + 3415 PUSHACC 12 + 3417 PUSHACC 8 + 3419 PUSHACC 10 + 3421 PUSHACC 16 + 3423 PUSHACC 18 + 3425 PUSHACC 24 + 3427 PUSHACC 21 + 3429 PUSHACC 23 + 3431 PUSHACC 26 + 3433 PUSHACC 29 + 3435 PUSHACC 30 + 3437 PUSHACC 32 + 3439 MAKEBLOCK 17, 0 + 3442 POP 17 + 3444 SETGLOBAL Array + 3446 BRANCH 3480 + 3448 ENVACC1 + 3449 MAKEBLOCK1 0 + 3451 RAISE + 3452 ACC0 + 3453 BRANCHIFNOT 3465 + 3455 ENVACC3 + 3456 CLOSURE 1, 3448 + 3459 MAKEBLOCK1 0 + 3461 PUSHENVACC2 + 3462 PUSHENVACC1 + 3463 APPTERM2 3 + 3465 CONST0 + 3466 PUSHENVACC2 + 3467 PUSHENVACC1 + 3468 APPTERM2 3 + 3470 RESTART + 3471 GRAB 1 + 3473 ACC1 + 3474 PUSHACC1 + 3475 C_CALL2 install_signal_handler + 3477 CONST0 + 3478 RETURN 2 + 3480 CONST0 + 3481 C_CALL1 sys_get_argv + 3483 PUSHCONST0 + 3484 C_CALL1 sys_get_config + 3486 PUSHACC0 + 3487 GETFIELD1 + 3488 PUSHACC0 + 3489 OFFSETINT -10 + 3491 PUSHCONST1 + 3492 LSLINT + 3493 OFFSETINT -1 + 3495 PUSHACC0 + 3496 PUSHCONSTINT 8 + 3498 PUSHACC3 + 3499 DIVINT + 3500 MULINT + 3501 OFFSETINT -1 + 3503 PUSHCONST0 + 3504 MAKEBLOCK1 0 + 3506 PUSH + 3507 CLOSURE 0, 3471 + 3510 PUSHCONSTINT -1 + 3512 PUSHCONSTINT -2 + 3514 PUSHCONSTINT -3 + 3516 PUSHCONSTINT -4 + 3518 PUSHCONSTINT -5 + 3520 PUSHCONSTINT -6 + 3522 PUSHCONSTINT -7 + 3524 PUSHCONSTINT -8 + 3526 PUSHCONSTINT -9 + 3528 PUSHCONSTINT -10 + 3530 PUSHCONSTINT -11 + 3532 PUSHCONSTINT -12 + 3534 PUSHCONSTINT -13 + 3536 PUSHCONSTINT -14 + 3538 PUSHCONSTINT -15 + 3540 PUSHCONSTINT -16 + 3542 PUSHCONSTINT -17 + 3544 PUSHCONSTINT -18 + 3546 PUSHCONSTINT -19 + 3548 PUSHCONSTINT -20 + 3550 PUSHCONSTINT -21 + 3552 PUSHGETGLOBAL "Sys.Break" + 3554 MAKEBLOCK1 0 + 3556 PUSHACC0 + 3557 PUSHACC 17 + 3559 PUSHACC 24 + 3561 CLOSURE 3, 3452 + 3564 PUSHACC0 + 3565 PUSHACC2 + 3566 PUSHACC4 + 3567 PUSHACC6 + 3568 PUSHACC 8 + 3570 PUSHACC 10 + 3572 PUSHACC 12 + 3574 PUSHACC 14 + 3576 PUSHACC 16 + 3578 PUSHACC 18 + 3580 PUSHACC 20 + 3582 PUSHACC 22 + 3584 PUSHACC 24 + 3586 PUSHACC 26 + 3588 PUSHACC 28 + 3590 PUSHACC 30 + 3592 PUSHACC 32 + 3594 PUSHACC 34 + 3596 PUSHACC 36 + 3598 PUSHACC 38 + 3600 PUSHACC 40 + 3602 PUSHACC 42 + 3604 PUSHACC 44 + 3606 PUSHACC 46 + 3608 PUSHACC 50 + 3610 PUSHACC 50 + 3612 PUSHACC 53 + 3614 PUSHACC 55 + 3616 GETFIELD0 + 3617 PUSHACC 52 + 3619 PUSHACC 58 + 3621 MAKEBLOCK 30, 0 + 3624 POP 30 + 3626 SETGLOBAL Sys + 3628 BRANCH 4510 + 3630 RESTART + 3631 GRAB 1 + 3633 CONST0 + 3634 PUSHACC1 + 3635 LTINT + 3636 BRANCHIFNOT 3641 + 3638 CONST1 + 3639 RETURN 2 + 3641 ACC1 + 3642 BRANCHIFNOT 3652 + 3644 ACC1 + 3645 GETFIELD2 + 3646 PUSHACC1 + 3647 OFFSETINT -1 + 3649 PUSHOFFSETCLOSURE0 + 3650 APPTERM2 4 + 3652 RETURN 2 + 3654 ACC0 + 3655 BRANCHIFNOT 3670 + 3657 ENVACC2 + 3658 PUSHACC1 + 3659 GETFIELD0 + 3660 PUSHENVACC1 + 3661 GETFIELD0 + 3662 APPLY2 + 3663 BRANCHIF 3670 + 3665 ACC0 + 3666 GETFIELD2 + 3667 PUSHOFFSETCLOSURE0 + 3668 APPTERM1 2 + 3670 RETURN 1 + 3672 RESTART + 3673 GRAB 1 + 3675 ACC1 + 3676 PUSHENVACC1 + 3677 CLOSUREREC 2, 3654 + 3681 ACC1 + 3682 GETFIELD1 + 3683 VECTLENGTH + 3684 PUSHACC3 + 3685 PUSHENVACC1 + 3686 GETFIELD1 + 3687 APPLY1 + 3688 MODINT + 3689 PUSHACC2 + 3690 GETFIELD1 + 3691 C_CALL2 array_get_addr + 3693 PUSHACC1 + 3694 APPTERM1 4 + 3696 ACC0 + 3697 BRANCHIFNOT 3722 + 3699 ACC0 + 3700 GETFIELD2 + 3701 PUSHENVACC2 + 3702 PUSHACC2 + 3703 GETFIELD0 + 3704 PUSHENVACC1 + 3705 GETFIELD0 + 3706 APPLY2 + 3707 BRANCHIFNOT 3718 + 3709 ACC0 + 3710 PUSHOFFSETCLOSURE0 + 3711 APPLY1 + 3712 PUSHACC2 + 3713 GETFIELD1 + 3714 MAKEBLOCK2 0 + 3716 RETURN 2 + 3718 ACC0 + 3719 PUSHOFFSETCLOSURE0 + 3720 APPTERM1 3 + 3722 RETURN 1 + 3724 RESTART + 3725 GRAB 1 + 3727 ACC1 + 3728 PUSHENVACC1 + 3729 CLOSUREREC 2, 3696 + 3733 ACC1 + 3734 GETFIELD1 + 3735 VECTLENGTH + 3736 PUSHACC3 + 3737 PUSHENVACC1 + 3738 GETFIELD1 + 3739 APPLY1 + 3740 MODINT + 3741 PUSHACC2 + 3742 GETFIELD1 + 3743 C_CALL2 array_get_addr + 3745 PUSHACC1 + 3746 APPTERM1 4 + 3748 ACC0 + 3749 BRANCHIFNOT 3768 + 3751 ACC0 + 3752 GETFIELD0 + 3753 PUSHENVACC2 + 3754 PUSHENVACC1 + 3755 GETFIELD0 + 3756 APPLY2 + 3757 BRANCHIFNOT 3763 + 3759 ACC0 + 3760 GETFIELD1 + 3761 RETURN 1 + 3763 ACC0 + 3764 GETFIELD2 + 3765 PUSHOFFSETCLOSURE0 + 3766 APPTERM1 2 + 3768 GETGLOBAL Not_found + 3770 MAKEBLOCK1 0 + 3772 RAISE + 3773 RESTART + 3774 GRAB 1 + 3776 ACC0 + 3777 GETFIELD1 + 3778 VECTLENGTH + 3779 PUSHACC2 + 3780 PUSHENVACC1 + 3781 GETFIELD1 + 3782 APPLY1 + 3783 MODINT + 3784 PUSHACC1 + 3785 GETFIELD1 + 3786 C_CALL2 array_get_addr + 3788 PUSHACC0 + 3789 BRANCHIFNOT 3858 + 3791 ACC0 + 3792 GETFIELD2 + 3793 PUSHACC1 + 3794 GETFIELD0 + 3795 PUSHACC4 + 3796 PUSHENVACC1 + 3797 GETFIELD0 + 3798 APPLY2 + 3799 BRANCHIFNOT 3805 + 3801 ACC1 + 3802 GETFIELD1 + 3803 RETURN 4 + 3805 ACC0 + 3806 BRANCHIFNOT 3853 + 3808 ACC0 + 3809 GETFIELD2 + 3810 PUSHACC1 + 3811 GETFIELD0 + 3812 PUSHACC5 + 3813 PUSHENVACC1 + 3814 GETFIELD0 + 3815 APPLY2 + 3816 BRANCHIFNOT 3822 + 3818 ACC1 + 3819 GETFIELD1 + 3820 RETURN 5 + 3822 ACC0 + 3823 BRANCHIFNOT 3848 + 3825 ACC0 + 3826 GETFIELD0 + 3827 PUSHACC5 + 3828 PUSHENVACC1 + 3829 GETFIELD0 + 3830 APPLY2 + 3831 BRANCHIFNOT 3837 + 3833 ACC0 + 3834 GETFIELD1 + 3835 RETURN 5 + 3837 ACC4 + 3838 PUSHENVACC1 + 3839 CLOSUREREC 2, 3748 + 3843 ACC1 + 3844 GETFIELD2 + 3845 PUSHACC1 + 3846 APPTERM1 7 + 3848 GETGLOBAL Not_found + 3850 MAKEBLOCK1 0 + 3852 RAISE + 3853 GETGLOBAL Not_found + 3855 MAKEBLOCK1 0 + 3857 RAISE + 3858 GETGLOBAL Not_found + 3860 MAKEBLOCK1 0 + 3862 RAISE + 3863 ACC0 + 3864 BRANCHIFNOT 3890 + 3866 ACC0 + 3867 GETFIELD0 + 3868 PUSHACC1 + 3869 GETFIELD2 + 3870 PUSHENVACC2 + 3871 PUSHACC2 + 3872 PUSHENVACC1 + 3873 GETFIELD0 + 3874 APPLY2 + 3875 BRANCHIFNOT 3880 + 3877 ACC0 + 3878 RETURN 3 + 3880 ACC0 + 3881 PUSHOFFSETCLOSURE0 + 3882 APPLY1 + 3883 PUSHACC3 + 3884 GETFIELD1 + 3885 PUSHACC3 + 3886 MAKEBLOCK3 0 + 3888 POP 2 + 3890 RETURN 1 + 3892 RESTART + 3893 GRAB 1 + 3895 ACC1 + 3896 PUSHENVACC1 + 3897 CLOSUREREC 2, 3863 + 3901 ACC1 + 3902 GETFIELD1 + 3903 VECTLENGTH + 3904 PUSHACC3 + 3905 PUSHENVACC1 + 3906 GETFIELD1 + 3907 APPLY1 + 3908 MODINT + 3909 PUSHACC0 + 3910 PUSHACC3 + 3911 GETFIELD1 + 3912 C_CALL2 array_get_addr + 3914 PUSHACC2 + 3915 APPLY1 + 3916 PUSHACC1 + 3917 PUSHACC4 + 3918 GETFIELD1 + 3919 C_CALL3 array_set_addr + 3921 RETURN 4 + 3923 RESTART + 3924 GRAB 2 + 3926 ACC0 + 3927 GETFIELD1 + 3928 VECTLENGTH + 3929 PUSHACC2 + 3930 PUSHENVACC3 + 3931 GETFIELD1 + 3932 APPLY1 + 3933 MODINT + 3934 PUSHACC0 + 3935 PUSHACC2 + 3936 GETFIELD1 + 3937 C_CALL2 array_get_addr + 3939 PUSHACC4 + 3940 PUSHACC4 + 3941 MAKEBLOCK3 0 + 3943 PUSHACC0 + 3944 PUSHACC2 + 3945 PUSHACC4 + 3946 GETFIELD1 + 3947 C_CALL3 array_set_addr + 3949 ACC0 + 3950 PUSHACC3 + 3951 GETFIELD0 + 3952 PUSHENVACC2 + 3953 APPLY2 + 3954 BRANCHIFNOT 3962 + 3956 ACC2 + 3957 PUSHENVACC3 + 3958 GETFIELD1 + 3959 PUSHENVACC1 + 3960 APPTERM2 7 + 3962 RETURN 5 + 3964 ACC0 + 3965 PUSHENVACC 4 + 3967 PUSHENVACC3 + 3968 CLOSURE 3, 3924 + 3971 PUSHACC1 + 3972 CLOSURE 1, 3893 + 3975 PUSHACC2 + 3976 CLOSURE 1, 3774 + 3979 PUSHACC3 + 3980 CLOSURE 1, 3725 + 3983 PUSHACC4 + 3984 CLOSURE 1, 3673 + 3987 PUSHENVACC 5 + 3989 PUSHACC1 + 3990 PUSHACC3 + 3991 PUSHACC5 + 3992 PUSHACC7 + 3993 PUSHACC 9 + 3995 PUSHENVACC2 + 3996 PUSHENVACC1 + 3997 MAKEBLOCK 8, 0 + 4000 RETURN 6 + 4002 ACC0 + 4003 BRANCHIFNOT 4016 + 4005 ACC0 + 4006 GETFIELD1 + 4007 PUSHACC1 + 4008 GETFIELD0 + 4009 PUSHENVACC1 + 4010 APPLY2 + 4011 ACC0 + 4012 GETFIELD2 + 4013 PUSHOFFSETCLOSURE0 + 4014 APPTERM1 2 + 4016 RETURN 1 + 4018 RESTART + 4019 GRAB 1 + 4021 ACC0 + 4022 CLOSUREREC 1, 4002 + 4026 ACC2 + 4027 GETFIELD1 + 4028 PUSHCONST0 + 4029 PUSHACC1 + 4030 VECTLENGTH + 4031 OFFSETINT -1 + 4033 PUSH + 4034 BRANCH 4048 + 4036 CHECK_SIGNALS + 4037 ACC1 + 4038 PUSHACC3 + 4039 C_CALL2 array_get_addr + 4041 PUSHACC4 + 4042 APPLY1 + 4043 ACC1 + 4044 OFFSETINT 1 + 4046 ASSIGN 1 + 4048 ACC0 + 4049 PUSHACC2 + 4050 LEINT + 4051 BRANCHIF 4036 + 4053 CONST0 + 4054 RETURN 6 + 4056 ACC0 + 4057 BRANCHIFNOT 4071 + 4059 ENVACC1 + 4060 PUSHACC1 + 4061 GETFIELD0 + 4062 C_CALL2 equal + 4064 BRANCHIF 4071 + 4066 ACC0 + 4067 GETFIELD2 + 4068 PUSHOFFSETCLOSURE0 + 4069 APPTERM1 2 + 4071 RETURN 1 + 4073 RESTART + 4074 GRAB 1 + 4076 ACC1 + 4077 CLOSUREREC 1, 4056 + 4081 ACC1 + 4082 GETFIELD1 + 4083 VECTLENGTH + 4084 PUSHACC3 + 4085 PUSHENVACC1 + 4086 APPLY1 + 4087 MODINT + 4088 PUSHACC2 + 4089 GETFIELD1 + 4090 C_CALL2 array_get_addr + 4092 PUSHACC1 + 4093 APPTERM1 4 + 4095 ACC0 + 4096 BRANCHIFNOT 4120 + 4098 ACC0 + 4099 GETFIELD2 + 4100 PUSHENVACC1 + 4101 PUSHACC2 + 4102 GETFIELD0 + 4103 C_CALL2 equal + 4105 BRANCHIFNOT 4116 + 4107 ACC0 + 4108 PUSHOFFSETCLOSURE0 + 4109 APPLY1 + 4110 PUSHACC2 + 4111 GETFIELD1 + 4112 MAKEBLOCK2 0 + 4114 RETURN 2 + 4116 ACC0 + 4117 PUSHOFFSETCLOSURE0 + 4118 APPTERM1 3 + 4120 RETURN 1 + 4122 RESTART + 4123 GRAB 1 + 4125 ACC1 + 4126 CLOSUREREC 1, 4095 + 4130 ACC1 + 4131 GETFIELD1 + 4132 VECTLENGTH + 4133 PUSHACC3 + 4134 PUSHENVACC1 + 4135 APPLY1 + 4136 MODINT + 4137 PUSHACC2 + 4138 GETFIELD1 + 4139 C_CALL2 array_get_addr + 4141 PUSHACC1 + 4142 APPTERM1 4 + 4144 ACC0 + 4145 BRANCHIFNOT 4163 + 4147 ACC0 + 4148 GETFIELD0 + 4149 PUSHENVACC1 + 4150 C_CALL2 equal + 4152 BRANCHIFNOT 4158 + 4154 ACC0 + 4155 GETFIELD1 + 4156 RETURN 1 + 4158 ACC0 + 4159 GETFIELD2 + 4160 PUSHOFFSETCLOSURE0 + 4161 APPTERM1 2 + 4163 GETGLOBAL Not_found + 4165 MAKEBLOCK1 0 + 4167 RAISE + 4168 RESTART + 4169 GRAB 1 + 4171 ACC0 + 4172 GETFIELD1 + 4173 VECTLENGTH + 4174 PUSHACC2 + 4175 PUSHENVACC1 + 4176 APPLY1 + 4177 MODINT + 4178 PUSHACC1 + 4179 GETFIELD1 + 4180 C_CALL2 array_get_addr + 4182 PUSHACC0 + 4183 BRANCHIFNOT 4248 + 4185 ACC0 + 4186 GETFIELD2 + 4187 PUSHACC1 + 4188 GETFIELD0 + 4189 PUSHACC4 + 4190 C_CALL2 equal + 4192 BRANCHIFNOT 4198 + 4194 ACC1 + 4195 GETFIELD1 + 4196 RETURN 4 + 4198 ACC0 + 4199 BRANCHIFNOT 4243 + 4201 ACC0 + 4202 GETFIELD2 + 4203 PUSHACC1 + 4204 GETFIELD0 + 4205 PUSHACC5 + 4206 C_CALL2 equal + 4208 BRANCHIFNOT 4214 + 4210 ACC1 + 4211 GETFIELD1 + 4212 RETURN 5 + 4214 ACC0 + 4215 BRANCHIFNOT 4238 + 4217 ACC0 + 4218 GETFIELD0 + 4219 PUSHACC5 + 4220 C_CALL2 equal + 4222 BRANCHIFNOT 4228 + 4224 ACC0 + 4225 GETFIELD1 + 4226 RETURN 5 + 4228 ACC4 + 4229 CLOSUREREC 1, 4144 + 4233 ACC1 + 4234 GETFIELD2 + 4235 PUSHACC1 + 4236 APPTERM1 7 + 4238 GETGLOBAL Not_found + 4240 MAKEBLOCK1 0 + 4242 RAISE + 4243 GETGLOBAL Not_found + 4245 MAKEBLOCK1 0 + 4247 RAISE + 4248 GETGLOBAL Not_found + 4250 MAKEBLOCK1 0 + 4252 RAISE + 4253 ACC0 + 4254 BRANCHIFNOT 4279 + 4256 ACC0 + 4257 GETFIELD0 + 4258 PUSHACC1 + 4259 GETFIELD2 + 4260 PUSHENVACC1 + 4261 PUSHACC2 + 4262 C_CALL2 equal + 4264 BRANCHIFNOT 4269 + 4266 ACC0 + 4267 RETURN 3 + 4269 ACC0 + 4270 PUSHOFFSETCLOSURE0 + 4271 APPLY1 + 4272 PUSHACC3 + 4273 GETFIELD1 + 4274 PUSHACC3 + 4275 MAKEBLOCK3 0 + 4277 POP 2 + 4279 RETURN 1 + 4281 RESTART + 4282 GRAB 1 + 4284 ACC1 + 4285 CLOSUREREC 1, 4253 + 4289 ACC1 + 4290 GETFIELD1 + 4291 VECTLENGTH + 4292 PUSHACC3 + 4293 PUSHENVACC1 + 4294 APPLY1 + 4295 MODINT + 4296 PUSHACC0 + 4297 PUSHACC3 + 4298 GETFIELD1 + 4299 C_CALL2 array_get_addr + 4301 PUSHACC2 + 4302 APPLY1 + 4303 PUSHACC1 + 4304 PUSHACC4 + 4305 GETFIELD1 + 4306 C_CALL3 array_set_addr + 4308 RETURN 4 + 4310 RESTART + 4311 GRAB 2 + 4313 ACC0 + 4314 GETFIELD1 + 4315 VECTLENGTH + 4316 PUSHACC2 + 4317 PUSHENVACC1 + 4318 APPLY1 + 4319 MODINT + 4320 PUSHACC0 + 4321 PUSHACC2 + 4322 GETFIELD1 + 4323 C_CALL2 array_get_addr + 4325 PUSHACC4 + 4326 PUSHACC4 + 4327 MAKEBLOCK3 0 + 4329 PUSHACC0 + 4330 PUSHACC2 + 4331 PUSHACC4 + 4332 GETFIELD1 + 4333 C_CALL3 array_set_addr + 4335 ACC0 + 4336 PUSHACC3 + 4337 GETFIELD0 + 4338 PUSHENVACC3 + 4339 APPLY2 + 4340 BRANCHIFNOT 4347 + 4342 ACC2 + 4343 PUSHENVACC1 + 4344 PUSHENVACC2 + 4345 APPTERM2 7 + 4347 RETURN 5 + 4349 ACC0 + 4350 BRANCHIFNOT 4378 + 4352 ACC0 + 4353 GETFIELD0 + 4354 PUSHACC1 + 4355 GETFIELD2 + 4356 PUSHOFFSETCLOSURE0 + 4357 APPLY1 + 4358 ENVACC2 + 4359 PUSHACC1 + 4360 PUSHENVACC1 + 4361 APPLY1 + 4362 MODINT + 4363 PUSHACC0 + 4364 PUSHENVACC3 + 4365 C_CALL2 array_get_addr + 4367 PUSHACC3 + 4368 GETFIELD1 + 4369 PUSHACC3 + 4370 MAKEBLOCK3 0 + 4372 PUSHACC1 + 4373 PUSHENVACC3 + 4374 C_CALL3 array_set_addr + 4376 POP 2 + 4378 RETURN 1 + 4380 RESTART + 4381 GRAB 1 + 4383 ACC1 + 4384 GETFIELD1 + 4385 PUSHACC0 + 4386 VECTLENGTH + 4387 PUSHACC0 + 4388 PUSHCONST2 + 4389 MULINT + 4390 OFFSETINT 1 + 4392 PUSHCONST0 + 4393 PUSHACC1 + 4394 C_CALL2 make_vect + 4396 PUSHACC0 + 4397 PUSHACC2 + 4398 PUSHACC6 + 4399 CLOSUREREC 3, 4349 + 4403 CONST0 + 4404 PUSHACC4 + 4405 OFFSETINT -1 + 4407 PUSH + 4408 BRANCH 4422 + 4410 CHECK_SIGNALS + 4411 ACC1 + 4412 PUSHACC7 + 4413 C_CALL2 array_get_addr + 4415 PUSHACC3 + 4416 APPLY1 + 4417 ACC1 + 4418 OFFSETINT 1 + 4420 ASSIGN 1 + 4422 ACC0 + 4423 PUSHACC2 + 4424 LEINT + 4425 BRANCHIF 4410 + 4427 CONST0 + 4428 POP 2 + 4430 ACC1 + 4431 PUSHACC7 + 4432 SETFIELD1 + 4433 ACC6 + 4434 GETFIELD0 + 4435 PUSHCONST2 + 4436 MULINT + 4437 PUSHACC7 + 4438 SETFIELD0 + 4439 RETURN 7 + 4441 CONST0 + 4442 PUSHACC1 + 4443 GETFIELD1 + 4444 VECTLENGTH + 4445 OFFSETINT -1 + 4447 PUSH + 4448 BRANCH 4462 + 4450 CHECK_SIGNALS + 4451 CONST0 + 4452 PUSHACC2 + 4453 PUSHACC4 + 4454 GETFIELD1 + 4455 C_CALL3 array_set_addr + 4457 ACC1 + 4458 OFFSETINT 1 + 4460 ASSIGN 1 + 4462 ACC0 + 4463 PUSHACC2 + 4464 LEINT + 4465 BRANCHIF 4450 + 4467 CONST0 + 4468 RETURN 3 + 4470 CONST1 + 4471 PUSHACC1 + 4472 LTINT + 4473 BRANCHIFNOT 4478 + 4475 CONST1 + 4476 BRANCH 4479 + 4478 ACC0 + 4479 PUSHGETGLOBALFIELD Sys, 5 + 4482 PUSHACC1 + 4483 GTINT + 4484 BRANCHIFNOT 4491 + 4486 GETGLOBALFIELD Sys, 5 + 4489 BRANCH 4492 + 4491 ACC0 + 4492 PUSHCONST0 + 4493 PUSHACC1 + 4494 C_CALL2 make_vect + 4496 PUSHCONST3 + 4497 MAKEBLOCK2 0 + 4499 RETURN 3 + 4501 ACC0 + 4502 PUSHCONSTINT 100 + 4504 PUSHCONSTINT 10 + 4506 C_CALL3 hash_univ_param + 4508 RETURN 1 + 4510 CLOSURE 0, 4501 + 4513 PUSH + 4514 CLOSURE 0, 4470 + 4517 PUSH + 4518 CLOSURE 0, 4441 + 4521 PUSH + 4522 CLOSURE 0, 4381 + 4525 PUSH + 4526 CLOSUREREC 0, 3631 + 4530 ACC0 + 4531 PUSHACC2 + 4532 PUSHACC6 + 4533 CLOSURE 3, 4311 + 4536 PUSHACC5 + 4537 CLOSURE 1, 4282 + 4540 PUSHACC6 + 4541 CLOSURE 1, 4169 + 4544 PUSHACC7 + 4545 CLOSURE 1, 4123 + 4548 PUSHACC 8 + 4550 CLOSURE 1, 4074 + 4553 PUSH + 4554 CLOSURE 0, 4019 + 4557 PUSHACC0 + 4558 PUSHACC7 + 4559 PUSHACC 9 + 4561 PUSHACC 11 + 4563 PUSHACC 13 + 4565 CLOSURE 5, 3964 + 4568 PUSHACC 11 + 4570 PUSHACC1 + 4571 PUSHACC3 + 4572 PUSHACC 8 + 4574 PUSHACC6 + 4575 PUSHACC 8 + 4577 PUSHACC 10 + 4579 PUSHACC 13 + 4581 PUSHACC 17 + 4583 PUSHACC 19 + 4585 MAKEBLOCK 10, 0 + 4588 POP 12 + 4590 SETGLOBAL Hashtbl + 4592 BRANCH 5073 + 4594 RESTART + 4595 GRAB 2 + 4597 ACC1 + 4598 BRANCHIFNOT 4638 + 4600 ACC1 + 4601 GETFIELD0 + 4602 PUSHACC3 + 4603 BRANCHIFNOT 4635 + 4605 ACC3 + 4606 GETFIELD0 + 4607 PUSHACC0 + 4608 PUSHACC2 + 4609 PUSHACC4 + 4610 APPLY2 + 4611 BRANCHIFNOT 4624 + 4613 ACC4 + 4614 PUSHACC4 + 4615 GETFIELD1 + 4616 PUSHACC4 + 4617 PUSHOFFSETCLOSURE0 + 4618 APPLY3 + 4619 PUSHACC2 + 4620 MAKEBLOCK2 0 + 4622 RETURN 5 + 4624 ACC4 + 4625 GETFIELD1 + 4626 PUSHACC4 + 4627 PUSHACC4 + 4628 PUSHOFFSETCLOSURE0 + 4629 APPLY3 + 4630 PUSHACC1 + 4631 MAKEBLOCK2 0 + 4633 RETURN 5 + 4635 ACC2 + 4636 RETURN 4 + 4638 ACC2 + 4639 RETURN 3 + 4641 RESTART + 4642 GRAB 1 + 4644 CONSTINT 6 + 4646 PUSHACC1 + 4647 PUSHACC3 + 4648 SUBINT + 4649 GEINT + 4650 BRANCHIFNOT 4809 + 4652 CONST1 + 4653 PUSHACC2 + 4654 PUSHACC2 + 4655 ADDINT + 4656 LSRINT + 4657 PUSHACC1 + 4658 PUSHENVACC3 + 4659 C_CALL2 array_unsafe_get + 4661 PUSHACC1 + 4662 PUSHENVACC3 + 4663 C_CALL2 array_unsafe_get + 4665 PUSHENVACC2 + 4666 APPLY2 + 4667 BRANCHIFNOT 4674 + 4669 ACC1 + 4670 PUSHACC1 + 4671 PUSHENVACC3 + 4672 PUSHENVACC1 + 4673 APPLY3 + 4674 ACC0 + 4675 PUSHENVACC3 + 4676 C_CALL2 array_unsafe_get + 4678 PUSHACC3 + 4679 PUSHENVACC3 + 4680 C_CALL2 array_unsafe_get + 4682 PUSHENVACC2 + 4683 APPLY2 + 4684 BRANCHIFNOT 4708 + 4686 ACC2 + 4687 PUSHACC1 + 4688 PUSHENVACC3 + 4689 PUSHENVACC1 + 4690 APPLY3 + 4691 ACC1 + 4692 PUSHENVACC3 + 4693 C_CALL2 array_unsafe_get + 4695 PUSHACC1 + 4696 PUSHENVACC3 + 4697 C_CALL2 array_unsafe_get + 4699 PUSHENVACC2 + 4700 APPLY2 + 4701 BRANCHIFNOT 4708 + 4703 ACC1 + 4704 PUSHACC1 + 4705 PUSHENVACC3 + 4706 PUSHENVACC1 + 4707 APPLY3 + 4708 ACC0 + 4709 PUSHENVACC3 + 4710 C_CALL2 array_unsafe_get + 4712 PUSHACC2 + 4713 OFFSETINT 1 + 4715 PUSHACC4 + 4716 OFFSETINT -1 + 4718 PUSH + 4719 BRANCH 4777 + 4721 CHECK_SIGNALS + 4722 BRANCH 4730 + 4724 CHECK_SIGNALS + 4725 ACC1 + 4726 OFFSETINT 1 + 4728 ASSIGN 1 + 4730 ACC1 + 4731 PUSHENVACC3 + 4732 C_CALL2 array_unsafe_get + 4734 PUSHACC3 + 4735 PUSHENVACC2 + 4736 APPLY2 + 4737 BRANCHIFNOT 4724 + 4739 CONST0 + 4740 BRANCH 4748 + 4742 CHECK_SIGNALS + 4743 ACC0 + 4744 OFFSETINT -1 + 4746 ASSIGN 0 + 4748 ACC2 + 4749 PUSHACC1 + 4750 PUSHENVACC3 + 4751 C_CALL2 array_unsafe_get + 4753 PUSHENVACC2 + 4754 APPLY2 + 4755 BRANCHIFNOT 4742 + 4757 ACC0 + 4758 PUSHACC2 + 4759 LTINT + 4760 BRANCHIFNOT 4767 + 4762 ACC0 + 4763 PUSHACC2 + 4764 PUSHENVACC3 + 4765 PUSHENVACC1 + 4766 APPLY3 + 4767 ACC1 + 4768 OFFSETINT 1 + 4770 ASSIGN 1 + 4772 ACC0 + 4773 OFFSETINT -1 + 4775 ASSIGN 0 + 4777 ACC0 + 4778 PUSHACC2 + 4779 LTINT + 4780 BRANCHIF 4721 + 4782 ACC1 + 4783 PUSHACC6 + 4784 SUBINT + 4785 PUSHACC5 + 4786 PUSHACC2 + 4787 SUBINT + 4788 LEINT + 4789 BRANCHIFNOT 4800 + 4791 ACC0 + 4792 PUSHACC5 + 4793 PUSHOFFSETCLOSURE0 + 4794 APPLY2 + 4795 ACC5 + 4796 PUSHACC2 + 4797 PUSHOFFSETCLOSURE0 + 4798 APPTERM2 8 + 4800 ACC5 + 4801 PUSHACC2 + 4802 PUSHOFFSETCLOSURE0 + 4803 APPLY2 + 4804 ACC0 + 4805 PUSHACC5 + 4806 PUSHOFFSETCLOSURE0 + 4807 APPTERM2 8 + 4809 RETURN 2 + 4811 RESTART + 4812 GRAB 1 + 4814 ACC1 + 4815 PUSHACC1 + 4816 PUSHENVACC1 + 4817 CLOSUREREC 3, 4642 + 4821 ACC2 + 4822 VECTLENGTH + 4823 OFFSETINT -1 + 4825 PUSHCONST0 + 4826 PUSHACC2 + 4827 APPLY2 + 4828 CONST1 + 4829 PUSHACC3 + 4830 VECTLENGTH + 4831 OFFSETINT -1 + 4833 PUSH + 4834 BRANCH 4918 + 4836 CHECK_SIGNALS + 4837 ACC1 + 4838 PUSHACC5 + 4839 C_CALL2 array_unsafe_get + 4841 PUSHACC0 + 4842 PUSHACC3 + 4843 OFFSETINT -1 + 4845 PUSHACC7 + 4846 C_CALL2 array_unsafe_get + 4848 PUSHACC6 + 4849 APPLY2 + 4850 BOOLNOT + 4851 BRANCHIFNOT 4911 + 4853 ACC2 + 4854 OFFSETINT -1 + 4856 PUSHACC6 + 4857 C_CALL2 array_unsafe_get + 4859 PUSHACC3 + 4860 PUSHACC7 + 4861 C_CALL3 array_unsafe_set + 4863 ACC2 + 4864 OFFSETINT -1 + 4866 PUSH + 4867 BRANCH 4886 + 4869 CHECK_SIGNALS + 4870 ACC0 + 4871 OFFSETINT -1 + 4873 PUSHACC7 + 4874 C_CALL2 array_unsafe_get + 4876 PUSHACC1 + 4877 PUSHACC 8 + 4879 C_CALL3 array_unsafe_set + 4881 ACC0 + 4882 OFFSETINT -1 + 4884 ASSIGN 0 + 4886 CONST1 + 4887 PUSHACC1 + 4888 GEINT + 4889 BRANCHIFNOT 4903 + 4891 ACC1 + 4892 PUSHACC1 + 4893 OFFSETINT -1 + 4895 PUSHACC 8 + 4897 C_CALL2 array_unsafe_get + 4899 PUSHACC7 + 4900 APPLY2 + 4901 BRANCHIFNOT 4869 + 4903 ACC1 + 4904 PUSHACC1 + 4905 PUSHACC 8 + 4907 C_CALL3 array_unsafe_set + 4909 POP 1 + 4911 POP 1 + 4913 ACC1 + 4914 OFFSETINT 1 + 4916 ASSIGN 1 + 4918 ACC0 + 4919 PUSHACC2 + 4920 LEINT + 4921 BRANCHIF 4836 + 4923 CONST0 + 4924 RETURN 5 + 4926 RESTART + 4927 GRAB 2 + 4929 ACC1 + 4930 PUSHACC1 + 4931 C_CALL2 array_unsafe_get + 4933 PUSHACC3 + 4934 PUSHACC2 + 4935 C_CALL2 array_unsafe_get + 4937 PUSHACC3 + 4938 PUSHACC3 + 4939 C_CALL3 array_unsafe_set + 4941 ACC0 + 4942 PUSHACC4 + 4943 PUSHACC3 + 4944 C_CALL3 array_unsafe_set + 4946 RETURN 4 + 4948 ACC0 + 4949 BRANCHIFNOT 4999 + 4951 ACC0 + 4952 GETFIELD0 + 4953 PUSHACC1 + 4954 GETFIELD1 + 4955 PUSHACC0 + 4956 BRANCHIFNOT 4990 + 4958 ACC0 + 4959 GETFIELD0 + 4960 PUSHACC1 + 4961 GETFIELD1 + 4962 PUSHOFFSETCLOSURE0 + 4963 APPLY1 + 4964 PUSHACC1 + 4965 PUSHACC4 + 4966 PUSHENVACC1 + 4967 APPLY2 + 4968 BRANCHIFNOT 4979 + 4970 CONST0 + 4971 PUSHACC2 + 4972 MAKEBLOCK2 0 + 4974 PUSHACC4 + 4975 MAKEBLOCK2 0 + 4977 BRANCH 4986 + 4979 CONST0 + 4980 PUSHACC4 + 4981 MAKEBLOCK2 0 + 4983 PUSHACC2 + 4984 MAKEBLOCK2 0 + 4986 MAKEBLOCK2 0 + 4988 RETURN 4 + 4990 CONST0 + 4991 PUSHCONST0 + 4992 PUSHACC3 + 4993 MAKEBLOCK2 0 + 4995 MAKEBLOCK2 0 + 4997 POP 2 + 4999 RETURN 1 + 5001 ACC0 + 5002 BRANCHIFNOT 5028 + 5004 ACC0 + 5005 GETFIELD1 + 5006 PUSHACC0 + 5007 BRANCHIFNOT 5024 + 5009 ACC0 + 5010 GETFIELD1 + 5011 PUSHOFFSETCLOSURE0 + 5012 APPLY1 + 5013 PUSHACC1 + 5014 GETFIELD0 + 5015 PUSHACC3 + 5016 GETFIELD0 + 5017 PUSHENVACC2 + 5018 PUSHENVACC1 + 5019 APPLY3 + 5020 MAKEBLOCK2 0 + 5022 RETURN 2 + 5024 POP 1 + 5026 BRANCH 5028 + 5028 ACC0 + 5029 RETURN 1 + 5031 ACC0 + 5032 BRANCHIFNOT 5040 + 5034 ACC0 + 5035 GETFIELD1 + 5036 BRANCHIF 5042 + 5038 ACC0 + 5039 GETFIELD0 + 5040 RETURN 1 + 5042 ACC0 + 5043 PUSHENVACC1 + 5044 APPLY1 + 5045 PUSHOFFSETCLOSURE0 + 5046 APPTERM1 2 + 5048 RESTART + 5049 GRAB 1 + 5051 ACC0 + 5052 CLOSUREREC 1, 4948 + 5056 ACC1 + 5057 PUSHENVACC1 + 5058 CLOSUREREC 2, 5001 + 5062 ACC0 + 5063 CLOSUREREC 1, 5031 + 5067 ACC4 + 5068 PUSHACC3 + 5069 APPLY1 + 5070 PUSHACC1 + 5071 APPTERM1 6 + 5073 CLOSUREREC 0, 4595 + 5077 ACC0 + 5078 CLOSURE 1, 5049 + 5081 PUSH + 5082 CLOSURE 0, 4927 + 5085 PUSHACC0 + 5086 CLOSURE 1, 4812 + 5089 PUSHACC3 + 5090 PUSHACC1 + 5091 PUSHACC4 + 5092 MAKEBLOCK3 0 + 5094 POP 4 + 5096 SETGLOBAL Sort + 5098 BRANCH 5847 + 5100 ACC0 + 5101 PUSHENVACC1 + 5102 APPLY1 + 5103 PUSHACC0 + 5104 GETFIELD 11 + 5106 PUSHACC1 + 5107 GETFIELD 10 + 5109 PUSHACC2 + 5110 GETFIELD 9 + 5112 PUSHACC3 + 5113 GETFIELD 6 + 5115 PUSHACC4 + 5116 GETFIELD 8 + 5118 PUSHACC5 + 5119 GETFIELD 5 + 5121 PUSHACC6 + 5122 GETFIELD 4 + 5124 PUSHACC7 + 5125 GETFIELD0 + 5126 MAKEBLOCK 8, 0 + 5129 RETURN 2 + 5131 RESTART + 5132 GRAB 2 + 5134 ACC2 + 5135 BRANCHIFNOT 5201 + 5137 ACC2 + 5138 GETFIELD0 + 5139 PUSHACC3 + 5140 GETFIELD1 + 5141 PUSHACC4 + 5142 GETFIELD2 + 5143 PUSHACC5 + 5144 GETFIELD3 + 5145 PUSHACC2 + 5146 PUSHACC5 + 5147 PUSHENVACC1 + 5148 GETFIELD0 + 5149 APPLY2 + 5150 PUSHCONST0 + 5151 PUSHACC1 + 5152 EQ + 5153 BRANCHIFNOT 5170 + 5155 ACC7 + 5156 GETFIELD 4 + 5158 PUSHACC2 + 5159 PUSHACC 8 + 5161 PUSHACC 8 + 5163 PUSHACC 8 + 5165 MAKEBLOCK 5, 0 + 5168 RETURN 8 + 5170 CONST0 + 5171 PUSHACC1 + 5172 LTINT + 5173 BRANCHIFNOT 5189 + 5175 ACC1 + 5176 PUSHACC3 + 5177 PUSHACC5 + 5178 PUSHACC7 + 5179 PUSHACC 10 + 5181 PUSHACC 10 + 5183 PUSHOFFSETCLOSURE0 + 5184 APPLY3 + 5185 PUSHENVACC2 + 5186 APPTERM 4, 12 + 5189 ACC1 + 5190 PUSHACC7 + 5191 PUSHACC7 + 5192 PUSHOFFSETCLOSURE0 + 5193 APPLY3 + 5194 PUSHACC3 + 5195 PUSHACC5 + 5196 PUSHACC7 + 5197 PUSHENVACC2 + 5198 APPTERM 4, 12 + 5201 CONST1 + 5202 PUSHCONST0 + 5203 PUSHACC3 + 5204 PUSHACC3 + 5205 PUSHCONST0 + 5206 MAKEBLOCK 5, 0 + 5209 RETURN 3 + 5211 RESTART + 5212 GRAB 1 + 5214 ACC1 + 5215 BRANCHIFNOT 5247 + 5217 ACC1 + 5218 GETFIELD1 + 5219 PUSHACC1 + 5220 PUSHENVACC1 + 5221 GETFIELD0 + 5222 APPLY2 + 5223 PUSHCONST0 + 5224 PUSHACC1 + 5225 EQ + 5226 BRANCHIFNOT 5232 + 5228 ACC2 + 5229 GETFIELD2 + 5230 RETURN 3 + 5232 CONST0 + 5233 PUSHACC1 + 5234 LTINT + 5235 BRANCHIFNOT 5241 + 5237 ACC2 + 5238 GETFIELD0 + 5239 BRANCH 5243 + 5241 ACC2 + 5242 GETFIELD3 + 5243 PUSHACC2 + 5244 PUSHOFFSETCLOSURE0 + 5245 APPTERM2 5 + 5247 GETGLOBAL Not_found + 5249 MAKEBLOCK1 0 + 5251 RAISE + 5252 RESTART + 5253 GRAB 1 + 5255 ACC1 + 5256 BRANCHIFNOT 5286 + 5258 ACC1 + 5259 GETFIELD1 + 5260 PUSHACC1 + 5261 PUSHENVACC1 + 5262 GETFIELD0 + 5263 APPLY2 + 5264 PUSHCONST0 + 5265 PUSHACC1 + 5266 EQ + 5267 BRANCHIF 5284 + 5269 CONST0 + 5270 PUSHACC1 + 5271 LTINT + 5272 BRANCHIFNOT 5278 + 5274 ACC2 + 5275 GETFIELD0 + 5276 BRANCH 5280 + 5278 ACC2 + 5279 GETFIELD3 + 5280 PUSHACC2 + 5281 PUSHOFFSETCLOSURE0 + 5282 APPTERM2 5 + 5284 POP 1 + 5286 RETURN 2 + 5288 RESTART + 5289 GRAB 1 + 5291 ACC0 + 5292 BRANCHIF 5297 + 5294 ACC1 + 5295 RETURN 2 + 5297 ACC1 + 5298 BRANCHIF 5303 + 5300 ACC0 + 5301 RETURN 2 + 5303 ACC0 + 5304 BRANCHIFNOT 5336 + 5306 ACC1 + 5307 BRANCHIFNOT 5336 + 5309 PUSH_RETADDR 5326 + 5311 ACC4 + 5312 GETFIELD3 + 5313 PUSHACC5 + 5314 GETFIELD2 + 5315 PUSHACC6 + 5316 GETFIELD1 + 5317 PUSHACC7 + 5318 GETFIELD0 + 5319 PUSHACC7 + 5320 GETFIELD3 + 5321 PUSHOFFSETCLOSURE0 + 5322 APPLY2 + 5323 PUSHENVACC1 + 5324 APPLY 4 + 5326 PUSHACC1 + 5327 GETFIELD2 + 5328 PUSHACC2 + 5329 GETFIELD1 + 5330 PUSHACC3 + 5331 GETFIELD0 + 5332 PUSHENVACC1 + 5333 APPTERM 4, 6 + 5336 GETGLOBAL <0>("map.ml", 3614, 3797) + 5338 PUSHGETGLOBAL Match_failure + 5340 MAKEBLOCK2 0 + 5342 RAISE + 5343 RESTART + 5344 GRAB 1 + 5346 ACC1 + 5347 BRANCHIFNOT 5400 + 5349 ACC1 + 5350 GETFIELD0 + 5351 PUSHACC2 + 5352 GETFIELD1 + 5353 PUSHACC3 + 5354 GETFIELD2 + 5355 PUSHACC4 + 5356 GETFIELD3 + 5357 PUSHACC2 + 5358 PUSHACC5 + 5359 PUSHENVACC1 + 5360 GETFIELD0 + 5361 APPLY2 + 5362 PUSHCONST0 + 5363 PUSHACC1 + 5364 EQ + 5365 BRANCHIFNOT 5372 + 5367 ACC1 + 5368 PUSHACC5 + 5369 PUSHENVACC3 + 5370 APPTERM2 9 + 5372 CONST0 + 5373 PUSHACC1 + 5374 LTINT + 5375 BRANCHIFNOT 5389 + 5377 ACC1 + 5378 PUSHACC3 + 5379 PUSHACC5 + 5380 PUSHACC7 + 5381 PUSHACC 9 + 5383 PUSHOFFSETCLOSURE0 + 5384 APPLY2 + 5385 PUSHENVACC2 + 5386 APPTERM 4, 11 + 5389 ACC1 + 5390 PUSHACC6 + 5391 PUSHOFFSETCLOSURE0 + 5392 APPLY2 + 5393 PUSHACC3 + 5394 PUSHACC5 + 5395 PUSHACC7 + 5396 PUSHENVACC2 + 5397 APPTERM 4, 11 + 5400 RETURN 2 + 5402 RESTART + 5403 GRAB 1 + 5405 ACC1 + 5406 BRANCHIFNOT 5425 + 5408 ACC1 + 5409 GETFIELD0 + 5410 PUSHACC1 + 5411 PUSHOFFSETCLOSURE0 + 5412 APPLY2 + 5413 ACC1 + 5414 GETFIELD2 + 5415 PUSHACC2 + 5416 GETFIELD1 + 5417 PUSHACC2 + 5418 APPLY2 + 5419 ACC1 + 5420 GETFIELD3 + 5421 PUSHACC1 + 5422 PUSHOFFSETCLOSURE0 + 5423 APPTERM2 4 + 5425 RETURN 2 + 5427 RESTART + 5428 GRAB 1 + 5430 ACC1 + 5431 BRANCHIFNOT 5455 + 5433 ACC1 + 5434 GETFIELD 4 + 5436 PUSHACC2 + 5437 GETFIELD3 + 5438 PUSHACC2 + 5439 PUSHOFFSETCLOSURE0 + 5440 APPLY2 + 5441 PUSHACC3 + 5442 GETFIELD2 + 5443 PUSHACC3 + 5444 APPLY1 + 5445 PUSHACC4 + 5446 GETFIELD1 + 5447 PUSHACC5 + 5448 GETFIELD0 + 5449 PUSHACC5 + 5450 PUSHOFFSETCLOSURE0 + 5451 APPLY2 + 5452 MAKEBLOCK 5, 0 + 5455 RETURN 2 + 5457 RESTART + 5458 GRAB 2 + 5460 ACC1 + 5461 BRANCHIFNOT 5481 + 5463 ACC2 + 5464 PUSHACC2 + 5465 GETFIELD3 + 5466 PUSHACC2 + 5467 PUSHOFFSETCLOSURE0 + 5468 APPLY3 + 5469 PUSHACC2 + 5470 GETFIELD2 + 5471 PUSHACC3 + 5472 GETFIELD1 + 5473 PUSHACC3 + 5474 APPLY3 + 5475 PUSHACC2 + 5476 GETFIELD0 + 5477 PUSHACC2 + 5478 PUSHOFFSETCLOSURE0 + 5479 APPTERM3 6 + 5481 ACC2 + 5482 RETURN 3 + 5484 RESTART + 5485 GRAB 3 + 5487 ACC0 + 5488 BRANCHIFNOT 5495 + 5490 ACC0 + 5491 GETFIELD 4 + 5493 BRANCH 5496 + 5495 CONST0 + 5496 PUSHACC4 + 5497 BRANCHIFNOT 5504 + 5499 ACC4 + 5500 GETFIELD 4 + 5502 BRANCH 5505 + 5504 CONST0 + 5505 PUSHACC0 + 5506 OFFSETINT 2 + 5508 PUSHACC2 + 5509 GTINT + 5510 BRANCHIFNOT 5603 + 5512 ACC2 + 5513 BRANCHIFNOT 5596 + 5515 ACC2 + 5516 GETFIELD0 + 5517 PUSHACC3 + 5518 GETFIELD1 + 5519 PUSHACC4 + 5520 GETFIELD2 + 5521 PUSHACC5 + 5522 GETFIELD3 + 5523 PUSHACC0 + 5524 PUSHENVACC1 + 5525 APPLY1 + 5526 PUSHACC4 + 5527 PUSHENVACC1 + 5528 APPLY1 + 5529 GEINT + 5530 BRANCHIFNOT 5551 + 5532 PUSH_RETADDR 5544 + 5534 ACC 12 + 5536 PUSHACC 12 + 5538 PUSHACC 12 + 5540 PUSHACC6 + 5541 PUSHENVACC2 + 5542 APPLY 4 + 5544 PUSHACC2 + 5545 PUSHACC4 + 5546 PUSHACC6 + 5547 PUSHENVACC2 + 5548 APPTERM 4, 14 + 5551 ACC0 + 5552 BRANCHIFNOT 5589 + 5554 PUSH_RETADDR 5567 + 5556 ACC 12 + 5558 PUSHACC 12 + 5560 PUSHACC 12 + 5562 PUSHACC6 + 5563 GETFIELD3 + 5564 PUSHENVACC2 + 5565 APPLY 4 + 5567 PUSHACC1 + 5568 GETFIELD2 + 5569 PUSHACC2 + 5570 GETFIELD1 + 5571 PUSH + 5572 PUSH_RETADDR 5585 + 5574 ACC6 + 5575 GETFIELD0 + 5576 PUSHACC 8 + 5578 PUSHACC 10 + 5580 PUSHACC 12 + 5582 PUSHENVACC2 + 5583 APPLY 4 + 5585 PUSHENVACC2 + 5586 APPTERM 4, 14 + 5589 GETGLOBAL "Map.bal" + 5591 PUSHGETGLOBALFIELD Pervasives, 2 + 5594 APPTERM1 11 + 5596 GETGLOBAL "Map.bal" + 5598 PUSHGETGLOBALFIELD Pervasives, 2 + 5601 APPTERM1 7 + 5603 ACC1 + 5604 OFFSETINT 2 + 5606 PUSHACC1 + 5607 GTINT + 5608 BRANCHIFNOT 5703 + 5610 ACC5 + 5611 BRANCHIFNOT 5696 + 5613 ACC5 + 5614 GETFIELD0 + 5615 PUSHACC6 + 5616 GETFIELD1 + 5617 PUSHACC7 + 5618 GETFIELD2 + 5619 PUSHACC 8 + 5621 GETFIELD3 + 5622 PUSHACC3 + 5623 PUSHENVACC1 + 5624 APPLY1 + 5625 PUSHACC1 + 5626 PUSHENVACC1 + 5627 APPLY1 + 5628 GEINT + 5629 BRANCHIFNOT 5652 + 5631 ACC0 + 5632 PUSHACC2 + 5633 PUSHACC4 + 5634 PUSH + 5635 PUSH_RETADDR 5648 + 5637 ACC 9 + 5639 PUSHACC 15 + 5641 PUSHACC 15 + 5643 PUSHACC 15 + 5645 PUSHENVACC2 + 5646 APPLY 4 + 5648 PUSHENVACC2 + 5649 APPTERM 4, 14 + 5652 ACC3 + 5653 BRANCHIFNOT 5689 + 5655 PUSH_RETADDR 5666 + 5657 ACC3 + 5658 PUSHACC5 + 5659 PUSHACC7 + 5660 PUSHACC 9 + 5662 GETFIELD3 + 5663 PUSHENVACC2 + 5664 APPLY 4 + 5666 PUSHACC4 + 5667 GETFIELD2 + 5668 PUSHACC5 + 5669 GETFIELD1 + 5670 PUSH + 5671 PUSH_RETADDR 5685 + 5673 ACC 9 + 5675 GETFIELD0 + 5676 PUSHACC 15 + 5678 PUSHACC 15 + 5680 PUSHACC 15 + 5682 PUSHENVACC2 + 5683 APPLY 4 + 5685 PUSHENVACC2 + 5686 APPTERM 4, 14 + 5689 GETGLOBAL "Map.bal" + 5691 PUSHGETGLOBALFIELD Pervasives, 2 + 5694 APPTERM1 11 + 5696 GETGLOBAL "Map.bal" + 5698 PUSHGETGLOBALFIELD Pervasives, 2 + 5701 APPTERM1 7 + 5703 ACC0 + 5704 PUSHACC2 + 5705 GEINT + 5706 BRANCHIFNOT 5713 + 5708 ACC1 + 5709 OFFSETINT 1 + 5711 BRANCH 5716 + 5713 ACC0 + 5714 OFFSETINT 1 + 5716 PUSHACC6 + 5717 PUSHACC6 + 5718 PUSHACC6 + 5719 PUSHACC6 + 5720 MAKEBLOCK 5, 0 + 5723 RETURN 6 + 5725 RESTART + 5726 GRAB 3 + 5728 ACC0 + 5729 PUSHENVACC1 + 5730 APPLY1 + 5731 PUSHACC4 + 5732 PUSHENVACC1 + 5733 APPLY1 + 5734 PUSHACC0 + 5735 PUSHACC2 + 5736 GEINT + 5737 BRANCHIFNOT 5744 + 5739 ACC1 + 5740 OFFSETINT 1 + 5742 BRANCH 5747 + 5744 ACC0 + 5745 OFFSETINT 1 + 5747 PUSHACC6 + 5748 PUSHACC6 + 5749 PUSHACC6 + 5750 PUSHACC6 + 5751 MAKEBLOCK 5, 0 + 5754 RETURN 6 + 5756 ACC0 + 5757 BRANCHIFNOT 5764 + 5759 ACC0 + 5760 GETFIELD 4 + 5762 RETURN 1 + 5764 CONST0 + 5765 RETURN 1 + 5767 CONST0 + 5768 PUSH + 5769 CLOSURE 0, 5756 + 5772 PUSHACC0 + 5773 CLOSURE 1, 5726 + 5776 PUSHACC0 + 5777 PUSHACC2 + 5778 CLOSURE 2, 5485 + 5781 PUSHACC0 + 5782 PUSHACC5 + 5783 CLOSUREREC 2, 5132 + 5787 ACC5 + 5788 CLOSUREREC 1, 5212 + 5792 ACC6 + 5793 CLOSUREREC 1, 5253 + 5797 ACC3 + 5798 CLOSUREREC 1, 5289 + 5802 ACC0 + 5803 PUSHACC5 + 5804 PUSHACC 10 + 5806 CLOSUREREC 3, 5344 + 5810 CLOSUREREC 0, 5403 + 5814 CLOSUREREC 0, 5428 + 5818 CLOSUREREC 0, 5458 + 5822 ACC0 + 5823 PUSHACC2 + 5824 PUSHACC4 + 5825 PUSHACC6 + 5826 PUSHACC 8 + 5828 PUSHACC 10 + 5830 PUSHACC 12 + 5832 PUSHACC 14 + 5834 PUSHACC 16 + 5836 PUSHACC 18 + 5838 PUSHACC 20 + 5840 PUSHACC 22 + 5842 MAKEBLOCK 12, 0 + 5845 RETURN 13 + 5847 CLOSURE 0, 5767 + 5850 PUSHACC0 + 5851 CLOSURE 1, 5100 + 5854 MAKEBLOCK1 0 + 5856 POP 1 + 5858 SETGLOBAL Map + 5860 BRANCH 5957 + 5862 CONSTINT 16 + 5864 C_CALL1 create_string + 5866 PUSH + 5867 PUSH_RETADDR 5879 + 5869 CONSTINT 16 + 5871 PUSHCONST0 + 5872 PUSHACC5 + 5873 PUSHACC7 + 5874 PUSHGETGLOBALFIELD Pervasives, 56 + 5877 APPLY 4 + 5879 ACC0 + 5880 RETURN 2 + 5882 RESTART + 5883 GRAB 1 + 5885 CONSTINT 16 + 5887 PUSHCONST0 + 5888 PUSHACC3 + 5889 PUSHACC3 + 5890 PUSHGETGLOBALFIELD Pervasives, 41 + 5893 APPTERM 4, 6 + 5896 ACC0 + 5897 PUSHGETGLOBALFIELD Pervasives, 51 + 5900 APPLY1 + 5901 PUSHACC0 + 5902 PUSHGETGLOBALFIELD Pervasives, 62 + 5905 APPLY1 + 5906 PUSHACC1 + 5907 C_CALL2 md5_chan + 5909 PUSHACC1 + 5910 PUSHGETGLOBALFIELD Pervasives, 63 + 5913 APPLY1 + 5914 ACC0 + 5915 RETURN 3 + 5917 RESTART + 5918 GRAB 2 + 5920 CONST0 + 5921 PUSHACC2 + 5922 LTINT + 5923 BRANCHIF 5934 + 5925 ACC0 + 5926 C_CALL1 ml_string_length + 5928 PUSHACC3 + 5929 PUSHACC3 + 5930 ADDINT + 5931 GTINT + 5932 BRANCHIFNOT 5941 + 5934 GETGLOBAL "Digest.substring" + 5936 PUSHGETGLOBALFIELD Pervasives, 2 + 5939 APPTERM1 4 + 5941 ACC2 + 5942 PUSHACC2 + 5943 PUSHACC2 + 5944 C_CALL3 md5_string + 5946 RETURN 3 + 5948 ACC0 + 5949 C_CALL1 ml_string_length + 5951 PUSHCONST0 + 5952 PUSHACC2 + 5953 C_CALL3 md5_string + 5955 RETURN 1 + 5957 CLOSURE 0, 5948 + 5960 PUSH + 5961 CLOSURE 0, 5918 + 5964 PUSH + 5965 CLOSURE 0, 5896 + 5968 PUSH + 5969 CLOSURE 0, 5883 + 5972 PUSH + 5973 CLOSURE 0, 5862 + 5976 PUSHACC0 + 5977 PUSHACC2 + 5978 PUSHACC4 + 5979 PUSHACC6 + 5980 PUSHACC 8 + 5982 MAKEBLOCK 5, 0 + 5985 POP 5 + 5987 SETGLOBAL Digest + 5989 BRANCH 6245 + 5991 CONST0 + 5992 PUSHENVACC1 + 5993 APPLY1 + 5994 PUSHACC1 + 5995 PUSHACC1 + 5996 GEINT + 5997 BRANCHIFNOT 6003 + 5999 ACC1 + 6000 PUSHOFFSETCLOSURE0 + 6001 APPTERM1 3 + 6003 ACC0 + 6004 RETURN 2 + 6006 CONST0 + 6007 C_CALL1 sys_random_seed + 6009 PUSHENVACC1 + 6010 APPTERM1 2 + 6012 CONSTINT 27182818 + 6014 PUSHENVACC2 + 6015 APPLY1 + 6016 CONST0 + 6017 PUSHACC1 + 6018 VECTLENGTH + 6019 OFFSETINT -1 + 6021 PUSH + 6022 BRANCH 6046 + 6024 CHECK_SIGNALS + 6025 CONSTINT 55 + 6027 PUSHACC2 + 6028 MODINT + 6029 PUSHACC2 + 6030 PUSHACC4 + 6031 GETVECTITEM + 6032 PUSHACC1 + 6033 PUSHENVACC1 + 6034 GETVECTITEM + 6035 ADDINT + 6036 PUSHACC1 + 6037 PUSHENVACC1 + 6038 SETVECTITEM + 6039 POP 1 + 6041 ACC1 + 6042 OFFSETINT 1 + 6044 ASSIGN 1 + 6046 ACC0 + 6047 PUSHACC2 + 6048 LEINT + 6049 BRANCHIF 6024 + 6051 CONST0 + 6052 RETURN 3 + 6054 ENVACC1 + 6055 GETFIELD0 + 6056 OFFSETINT 1 + 6058 PUSHENVACC1 + 6059 SETFIELD0 + 6060 ENVACC1 + 6061 GETFIELD0 + 6062 PUSHGETGLOBALFIELD Pervasives, 14 + 6065 APPLY1 + 6066 PUSHGETGLOBALFIELD Digest, 0 + 6069 APPLY1 + 6070 PUSHCONSTINT 22 + 6072 PUSHCONST3 + 6073 PUSHACC2 + 6074 C_CALL2 string_get + 6076 LSLINT + 6077 PUSHCONSTINT 16 + 6079 PUSHCONST2 + 6080 PUSHACC3 + 6081 C_CALL2 string_get + 6083 LSLINT + 6084 PUSHCONSTINT 8 + 6086 PUSHCONST1 + 6087 PUSHACC4 + 6088 C_CALL2 string_get + 6090 LSLINT + 6091 PUSHCONST0 + 6092 PUSHACC4 + 6093 C_CALL2 string_get + 6095 ADDINT + 6096 ADDINT + 6097 XORINT + 6098 RETURN 2 + 6100 ACC0 + 6101 MAKEBLOCK1 0 + 6103 PUSHACC0 + 6104 CLOSURE 1, 6054 + 6107 PUSHCONST0 + 6108 PUSHCONSTINT 54 + 6110 PUSH + 6111 BRANCH 6125 + 6113 CHECK_SIGNALS + 6114 CONST0 + 6115 PUSHACC3 + 6116 APPLY1 + 6117 PUSHACC2 + 6118 PUSHENVACC1 + 6119 SETVECTITEM + 6120 ACC1 + 6121 OFFSETINT 1 + 6123 ASSIGN 1 + 6125 ACC0 + 6126 PUSHACC2 + 6127 LEINT + 6128 BRANCHIF 6113 + 6130 CONST0 + 6131 POP 2 + 6133 CONST0 + 6134 PUSHENVACC2 + 6135 SETFIELD0 + 6136 RETURN 3 + 6138 ACC0 + 6139 PUSHCONST0 + 6140 PUSHENVACC1 + 6141 APPLY1 + 6142 C_CALL2 mul_float + 6144 RETURN 1 + 6146 CONSTINT 1073741823 + 6148 PUSHACC1 + 6149 GTINT + 6150 BRANCHIF 6157 + 6152 CONST0 + 6153 PUSHACC1 + 6154 LEINT + 6155 BRANCHIFNOT 6164 + 6157 GETGLOBAL "Random.int" + 6159 PUSHGETGLOBALFIELD Pervasives, 2 + 6162 APPTERM1 2 + 6164 ACC0 + 6165 PUSHACC1 + 6166 PUSHACC2 + 6167 PUSHCONSTINT 1073741823 + 6169 DIVINT + 6170 MULINT + 6171 PUSHENVACC1 + 6172 APPLY1 + 6173 MODINT + 6174 RETURN 1 + 6176 GETGLOBAL 1073741824 + 6178 PUSHCONST0 + 6179 PUSHENVACC1 + 6180 APPLY1 + 6181 C_CALL1 float_of_int + 6183 PUSHCONST0 + 6184 PUSHENVACC1 + 6185 APPLY1 + 6186 C_CALL1 float_of_int + 6188 PUSHCONST0 + 6189 PUSHENVACC1 + 6190 APPLY1 + 6191 C_CALL1 float_of_int + 6193 PUSHACC3 + 6194 PUSHACC1 + 6195 PUSHACC5 + 6196 PUSHACC4 + 6197 PUSHACC7 + 6198 PUSHACC7 + 6199 C_CALL2 div_float + 6201 C_CALL2 add_float + 6203 C_CALL2 div_float + 6205 C_CALL2 add_float + 6207 C_CALL2 div_float + 6209 RETURN 5 + 6211 CONSTINT 55 + 6213 PUSHENVACC2 + 6214 GETFIELD0 + 6215 OFFSETINT 1 + 6217 MODINT + 6218 PUSHENVACC2 + 6219 SETFIELD0 + 6220 ENVACC2 + 6221 GETFIELD0 + 6222 PUSHENVACC1 + 6223 GETVECTITEM + 6224 PUSHCONSTINT 55 + 6226 PUSHENVACC2 + 6227 GETFIELD0 + 6228 OFFSETINT 24 + 6230 MODINT + 6231 PUSHENVACC1 + 6232 GETVECTITEM + 6233 ADDINT + 6234 PUSHACC0 + 6235 PUSHENVACC2 + 6236 GETFIELD0 + 6237 PUSHENVACC1 + 6238 SETVECTITEM + 6239 CONSTINT 1073741823 + 6241 PUSHACC1 + 6242 ANDINT + 6243 RETURN 2 + 6245 CONSTINT 440266690 + 6247 PUSHCONSTINT 124177607 + 6249 PUSHCONSTINT 414576093 + 6251 PUSHCONSTINT 180326017 + 6253 PUSHCONSTINT 33747835 + 6255 PUSHCONSTINT 896816596 + 6257 PUSHCONSTINT 21528564 + 6259 PUSHCONSTINT 414383108 + 6261 PUSHCONSTINT 514922558 + 6263 PUSHCONSTINT 979459837 + 6265 PUSHCONSTINT 146577263 + 6267 PUSHCONSTINT 714526560 + 6269 PUSHCONSTINT 187230644 + 6271 PUSHCONSTINT 22990936 + 6273 PUSHCONSTINT 310632349 + 6275 PUSHCONSTINT 781847598 + 6277 PUSHCONSTINT 854580894 + 6279 PUSHCONSTINT 804670393 + 6281 PUSHCONSTINT 268309077 + 6283 PUSHCONSTINT 4136554 + 6285 PUSHCONSTINT 567327260 + 6287 PUSHCONSTINT 768795410 + 6289 PUSHCONSTINT 868098973 + 6291 PUSHCONSTINT 462134267 + 6293 PUSHCONSTINT 32881167 + 6295 PUSHCONSTINT 708896334 + 6297 PUSHCONSTINT 572927557 + 6299 PUSHCONSTINT 933858406 + 6301 PUSHCONSTINT 965168955 + 6303 PUSHCONSTINT 233350272 + 6305 PUSHCONSTINT 878960411 + 6307 PUSHCONSTINT 971004788 + 6309 PUSHCONSTINT 762624501 + 6311 PUSHCONSTINT 796925167 + 6313 PUSHCONSTINT 206134737 + 6315 PUSHCONSTINT 281896889 + 6317 PUSHCONSTINT 814302728 + 6319 PUSHCONSTINT 477485839 + 6321 PUSHCONSTINT 998499212 + 6323 PUSHCONSTINT 473370118 + 6325 PUSHCONSTINT 66770770 + 6327 PUSHCONSTINT 337696531 + 6329 PUSHCONSTINT 848741663 + 6331 PUSHCONSTINT 71648846 + 6333 PUSHCONSTINT 869261341 + 6335 PUSHCONSTINT 951240904 + 6337 PUSHCONSTINT 147054819 + 6339 PUSHCONSTINT 486882977 + 6341 PUSHCONSTINT 552627506 + 6343 PUSHCONSTINT 615350359 + 6345 PUSHCONSTINT 1023641486 + 6347 PUSHCONSTINT 9858203 + 6349 PUSHCONSTINT 764306064 + 6351 PUSHCONSTINT 1051173471 + 6353 PUSHCONSTINT 561073064 + 6355 MAKEBLOCK 55, 0 + 6358 PUSHCONST0 + 6359 MAKEBLOCK1 0 + 6361 PUSHACC0 + 6362 PUSHACC2 + 6363 CLOSURE 2, 6211 + 6366 PUSHACC0 + 6367 CLOSURE 1, 6176 + 6370 PUSHACC1 + 6371 CLOSUREREC 1, 5991 + 6375 ACC0 + 6376 CLOSURE 1, 6146 + 6379 PUSHACC2 + 6380 CLOSURE 1, 6138 + 6383 PUSHACC5 + 6384 PUSHACC7 + 6385 CLOSURE 2, 6100 + 6388 PUSHACC0 + 6389 PUSHACC 8 + 6391 CLOSURE 2, 6012 + 6394 PUSHACC1 + 6395 CLOSURE 1, 6006 + 6398 PUSHACC3 + 6399 PUSHACC5 + 6400 PUSHACC 9 + 6402 PUSHACC3 + 6403 PUSHACC5 + 6404 PUSHACC7 + 6405 MAKEBLOCK 6, 0 + 6408 POP 10 + 6410 SETGLOBAL Random + 6412 BRANCH 8038 + 6414 RESTART + 6415 GRAB 1 + 6417 ACC1 + 6418 BRANCHIFNOT 6441 + 6420 ACC1 + 6421 GETFIELD0 + 6422 PUSHACC2 + 6423 GETFIELD1 + 6424 PUSHACC1 + 6425 PUSHACC3 + 6426 EQ + 6427 BRANCHIFNOT 6432 + 6429 ACC0 + 6430 RETURN 4 + 6432 ACC0 + 6433 PUSHACC3 + 6434 PUSHOFFSETCLOSURE0 + 6435 APPLY2 + 6436 PUSHACC2 + 6437 MAKEBLOCK2 0 + 6439 POP 2 + 6441 RETURN 2 + 6443 RESTART + 6444 GRAB 1 + 6446 CONST0 + 6447 PUSHACC2 + 6448 GTINT + 6449 BRANCHIFNOT 6512 + 6451 CONST0 + 6452 PUSHENVACC2 + 6453 GETFIELD0 + 6454 GTINT + 6455 BRANCHIFNOT 6512 + 6457 ENVACC2 + 6458 GETFIELD0 + 6459 PUSHGETGLOBALFIELD Random, 4 + 6462 APPLY1 + 6463 PUSHACC0 + 6464 PUSHENVACC1 + 6465 GETFIELD0 + 6466 C_CALL2 array_get_addr + 6468 PUSHENVACC 5 + 6470 APPLY1 + 6471 BRANCHIF 6482 + 6473 ACC0 + 6474 PUSHENVACC 4 + 6476 APPLY1 + 6477 ACC2 + 6478 PUSHACC2 + 6479 PUSHOFFSETCLOSURE0 + 6480 APPTERM2 5 + 6482 PUSHTRAP 6496 + 6484 ACC5 + 6485 PUSHACC5 + 6486 PUSHENVACC1 + 6487 GETFIELD0 + 6488 C_CALL2 array_get_addr + 6490 PUSHENVACC 7 + 6492 APPLY2 + 6493 POPTRAP + 6494 RETURN 3 + 6496 PUSHENVACC 6 + 6498 PUSHACC1 + 6499 GETFIELD0 + 6500 EQ + 6501 BRANCHIFNOT 6510 + 6503 ACC3 + 6504 OFFSETINT -1 + 6506 PUSHACC3 + 6507 PUSHOFFSETCLOSURE0 + 6508 APPTERM2 6 + 6510 ACC0 + 6511 RAISE + 6512 ACC0 + 6513 PUSHENVACC3 + 6514 APPLY1 + 6515 ACC0 + 6516 RETURN 2 + 6518 RESTART + 6519 GRAB 1 + 6521 ACC1 + 6522 BRANCHIFNOT 6534 + 6524 ACC0 + 6525 PUSHACC2 + 6526 GETFIELD0 + 6527 APPLY1 + 6528 ACC1 + 6529 GETFIELD1 + 6530 PUSHACC1 + 6531 PUSHOFFSETCLOSURE0 + 6532 APPTERM2 4 + 6534 RETURN 2 + 6536 CONST0 + 6537 PUSHENVACC1 + 6538 OFFSETINT -1 + 6540 PUSH + 6541 BRANCH 6567 + 6543 CHECK_SIGNALS + 6544 ENVACC2 + 6545 PUSHACC2 + 6546 PUSHACC4 + 6547 C_CALL2 array_get + 6549 EQ + 6550 BRANCHIFNOT 6556 + 6552 CONSTINT 46 + 6554 BRANCH 6558 + 6556 CONSTINT 42 + 6558 PUSHGETGLOBALFIELD Pervasives, 20 + 6561 APPLY1 + 6562 ACC1 + 6563 OFFSETINT 1 + 6565 ASSIGN 1 + 6567 ACC0 + 6568 PUSHACC2 + 6569 LEINT + 6570 BRANCHIF 6543 + 6572 CONST0 + 6573 POP 2 + 6575 CONST0 + 6576 PUSHGETGLOBALFIELD Pervasives, 25 + 6579 APPTERM1 2 + 6581 ENVACC3 + 6582 GETFIELD0 + 6583 PUSHENVACC 4 + 6585 APPLY1 + 6586 PUSHENVACC2 + 6587 PUSHENVACC1 + 6588 CLOSURE 2, 6536 + 6591 PUSHGETGLOBALFIELD List, 9 + 6594 APPTERM2 3 + 6596 ACC0 + 6597 GETFIELD1 + 6598 RETURN 1 + 6600 RESTART + 6601 GRAB 1 + 6603 ACC1 + 6604 GETFIELD0 + 6605 PUSHACC1 + 6606 GETFIELD0 + 6607 LEINT + 6608 RETURN 2 + 6610 ACC0 + 6611 PUSHACC1 + 6612 PUSHENVACC1 + 6613 APPLY1 + 6614 MAKEBLOCK2 0 + 6616 RETURN 1 + 6618 ACC0 + 6619 PUSHENVACC1 + 6620 CLOSURE 1, 6610 + 6623 PUSHGETGLOBALFIELD List, 10 + 6626 APPLY2 + 6627 PUSH + 6628 CLOSURE 0, 6601 + 6631 PUSHGETGLOBALFIELD Sort, 0 + 6634 APPLY2 + 6635 PUSH + 6636 CLOSURE 0, 6596 + 6639 PUSHGETGLOBALFIELD List, 10 + 6642 APPTERM2 3 + 6644 ENVACC3 + 6645 GETFIELD0 + 6646 VECTLENGTH + 6647 PUSHENVACC 4 + 6649 GETFIELD0 + 6650 PUSHCONST0 + 6651 PUSHENVACC 8 + 6653 APPLY1 + 6654 PUSHENVACC2 + 6655 GETFIELD0 + 6656 PUSHGETGLOBALFIELD List, 0 + 6659 APPLY1 + 6660 PUSHENVACC 7 + 6662 GETFIELD0 + 6663 PUSHENVACC 6 + 6665 GETFIELD0 + 6666 PUSHENVACC1 + 6667 GETFIELD0 + 6668 PUSHENVACC 5 + 6670 GETFIELD0 + 6671 MAKEBLOCK 8, 0 + 6674 RETURN 1 + 6676 ACC0 + 6677 PUSHENVACC1 + 6678 APPLY1 + 6679 PUSHACC0 + 6680 OFFSETINT -1 + 6682 PUSHENVACC2 + 6683 C_CALL2 array_get_addr + 6685 OFFSETINT 1 + 6687 PUSHACC1 + 6688 OFFSETINT -1 + 6690 PUSHENVACC2 + 6691 C_CALL3 array_set_addr + 6693 RETURN 2 + 6695 CONST0 + 6696 PUSHCONSTINT 32 + 6698 C_CALL2 make_vect + 6700 PUSHENVACC1 + 6701 GETFIELD0 + 6702 PUSHACC1 + 6703 PUSHENVACC2 + 6704 CLOSURE 2, 6676 + 6707 PUSHGETGLOBALFIELD List, 9 + 6710 APPLY2 + 6711 ACC0 + 6712 RETURN 2 + 6714 RESTART + 6715 GRAB 1 + 6717 ACC1 + 6718 PUSHENVACC1 + 6719 APPLY1 + 6720 PUSHACC1 + 6721 PUSHACC1 + 6722 GETFIELD1 + 6723 PUSHACC2 + 6724 GETFIELD0 + 6725 PUSHCONST0 + 6726 PUSHACC5 + 6727 C_CALL2 array_get_addr + 6729 C_CALL2 array_get_addr + 6731 C_CALL2 array_get_addr + 6733 APPTERM1 4 + 6735 ACC0 + 6736 GETFIELD0 + 6737 C_CALL1 obj_dup + 6739 PUSHENVACC1 + 6740 PUSHACC1 + 6741 PUSHENVACC2 + 6742 APPLY2 + 6743 ACC1 + 6744 GETFIELD2 + 6745 PUSHACC1 + 6746 PUSHENVACC3 + 6747 APPLY2 + 6748 ACC0 + 6749 RETURN 2 + 6751 RESTART + 6752 GRAB 1 + 6754 ACC1 + 6755 GETFIELD 7 + 6757 PUSHCONST0 + 6758 PUSHACC1 + 6759 NEQ + 6760 BRANCHIFNOT 6767 + 6762 ACC0 + 6763 PUSHACC2 + 6764 PUSHENVACC1 + 6765 APPTERM2 5 + 6767 RETURN 3 + 6769 ACC0 + 6770 GETFIELD0 + 6771 PUSHENVACC1 + 6772 C_CALL2 obj_block + 6774 PUSHACC1 + 6775 GETFIELD1 + 6776 PUSHCONST0 + 6777 PUSHACC2 + 6778 C_CALL3 array_unsafe_set + 6780 ENVACC2 + 6781 PUSHACC1 + 6782 PUSHENVACC3 + 6783 APPLY2 + 6784 ACC0 + 6785 RETURN 2 + 6787 ACC0 + 6788 GETFIELD0 + 6789 PUSHENVACC3 + 6790 GETFIELD0 + 6791 ADDINT + 6792 OFFSETINT -1 + 6794 PUSHENVACC3 + 6795 SETFIELD0 + 6796 ENVACC1 + 6797 GETFIELD0 + 6798 BRANCHIFNOT 6804 + 6800 ACC0 + 6801 GETFIELD1 + 6802 PUSHENVACC2 + 6803 APPLY1 + 6804 ACC0 + 6805 GETFIELD 7 + 6807 PUSHGETGLOBALFIELD List, 4 + 6810 APPLY1 + 6811 PUSHACC1 + 6812 SETFIELD 7 + 6814 RETURN 1 + 6816 ACC0 + 6817 PUSHENVACC1 + 6818 APPLY1 + 6819 PUSHENVACC 4 + 6821 GETFIELD2 + 6822 PUSHACC1 + 6823 PUSHACC3 + 6824 PUSHENVACC2 + 6825 GETFIELD1 + 6826 APPLY3 + 6827 PUSHENVACC 4 + 6829 SETFIELD2 + 6830 ENVACC4 + 6831 GETFIELD3 + 6832 PUSHCONST1 + 6833 PUSHACC2 + 6834 PUSHENVACC3 + 6835 GETFIELD1 + 6836 APPLY3 + 6837 PUSHENVACC 4 + 6839 SETFIELD3 + 6840 RETURN 2 + 6842 CONST0 + 6843 PUSHENVACC 4 + 6845 APPLY1 + 6846 PUSHACC1 + 6847 PUSHACC1 + 6848 PUSHENVACC3 + 6849 PUSHENVACC2 + 6850 PUSHENVACC1 + 6851 CLOSURE 4, 6816 + 6854 PUSHGETGLOBALFIELD List, 9 + 6857 APPLY2 + 6858 ACC0 + 6859 RETURN 2 + 6861 RESTART + 6862 GRAB 1 + 6864 ACC0 + 6865 GETFIELD 7 + 6867 PUSHACC2 + 6868 MAKEBLOCK2 0 + 6870 PUSHACC1 + 6871 SETFIELD 7 + 6873 RETURN 2 + 6875 ENVACC1 + 6876 PUSHENVACC3 + 6877 PUSH + 6878 BRANCH 6895 + 6880 CHECK_SIGNALS + 6881 ACC1 + 6882 PUSHENVACC2 + 6883 GETVECTITEM + 6884 PUSHENVACC 4 + 6886 PUSHACC3 + 6887 ADDINT + 6888 PUSHACC4 + 6889 SETVECTITEM + 6890 ACC1 + 6891 OFFSETINT 1 + 6893 ASSIGN 1 + 6895 ACC0 + 6896 PUSHACC2 + 6897 LEINT + 6898 BRANCHIF 6880 + 6900 CONST0 + 6901 RETURN 3 + 6903 ENVACC2 + 6904 GETFIELD0 + 6905 PUSHENVACC2 + 6906 GETFIELD2 + 6907 GETFIELD0 + 6908 OFFSETINT -1 + 6910 PUSHENVACC3 + 6911 GETFIELD0 + 6912 OFFSETINT -1 + 6914 PUSHACC1 + 6915 PUSHACC1 + 6916 SUBINT + 6917 PUSHACC0 + 6918 PUSHACC3 + 6919 PUSHACC5 + 6920 PUSHENVACC1 + 6921 CLOSURE 4, 6875 + 6924 RETURN 5 + 6926 RESTART + 6927 GRAB 1 + 6929 CONST0 + 6930 ACC1 + 6931 PUSHACC1 + 6932 PUSHENVACC1 + 6933 CLOSURE 3, 6903 + 6936 RETURN 2 + 6938 RESTART + 6939 GRAB 1 + 6941 ACC0 + 6942 GETFIELD 6 + 6944 PUSHACC2 + 6945 PUSHENVACC1 + 6946 GETFIELD2 + 6947 APPTERM2 4 + 6949 RESTART + 6950 GRAB 1 + 6952 ACC0 + 6953 PUSHENVACC2 + 6954 APPLY1 + 6955 PUSHACC1 + 6956 GETFIELD 6 + 6958 PUSHACC1 + 6959 PUSHACC4 + 6960 PUSHENVACC1 + 6961 GETFIELD1 + 6962 APPLY3 + 6963 PUSHACC2 + 6964 SETFIELD 6 + 6966 ACC0 + 6967 RETURN 3 + 6969 ACC0 + 6970 GETFIELD0 + 6971 PUSHACC0 + 6972 OFFSETINT 1 + 6974 PUSHACC2 + 6975 SETFIELD0 + 6976 ACC0 + 6977 RETURN 2 + 6979 RESTART + 6980 GRAB 1 + 6982 CONST0 + 6983 PUSHACC1 + 6984 PUSHACC3 + 6985 GETFIELD1 + 6986 APPTERM2 4 + 6988 RESTART + 6989 GRAB 1 + 6991 ENVACC1 + 6992 GETFIELD 4 + 6994 PUSHACC1 + 6995 GETFIELD0 + 6996 PUSHGETGLOBALFIELD List, 23 + 6999 APPLY2 + 7000 BRANCHIFNOT 7005 + 7002 ACC1 + 7003 RETURN 2 + 7005 ACC1 + 7006 PUSHACC1 + 7007 MAKEBLOCK2 0 + 7009 RETURN 2 + 7011 RESTART + 7012 GRAB 1 + 7014 ACC0 + 7015 PUSHENVACC2 + 7016 GETFIELD 6 + 7018 PUSHACC3 + 7019 PUSHENVACC1 + 7020 GETFIELD2 + 7021 APPLY2 + 7022 PUSHACC3 + 7023 PUSHENVACC1 + 7024 GETFIELD1 + 7025 APPTERM3 5 + 7027 ACC0 + 7028 GETFIELD 4 + 7030 PUSHGETGLOBALFIELD List, 1 + 7033 APPLY1 + 7034 PUSHACC1 + 7035 GETFIELD 4 + 7037 PUSHGETGLOBALFIELD List, 2 + 7040 APPLY1 + 7041 PUSHACC2 + 7042 SETFIELD 4 + 7044 ACC0 + 7045 GETFIELD 5 + 7047 PUSHACC1 + 7048 GETFIELD3 + 7049 PUSHACC3 + 7050 PUSHENVACC1 + 7051 CLOSURE 2, 7012 + 7054 PUSHGETGLOBALFIELD List, 12 + 7057 APPLY3 + 7058 PUSHACC2 + 7059 SETFIELD 6 + 7061 ACC0 + 7062 GETFIELD0 + 7063 PUSHACC2 + 7064 SETFIELD2 + 7065 ACC0 + 7066 GETFIELD1 + 7067 PUSHACC2 + 7068 SETFIELD3 + 7069 ACC0 + 7070 GETFIELD2 + 7071 PUSHACC2 + 7072 GETFIELD 5 + 7074 PUSHACC2 + 7075 CLOSURE 1, 6989 + 7078 PUSHGETGLOBALFIELD List, 13 + 7081 APPLY3 + 7082 PUSHACC2 + 7083 SETFIELD 5 + 7085 RETURN 2 + 7087 RESTART + 7088 GRAB 1 + 7090 ENVACC1 + 7091 PUSHACC1 + 7092 GETFIELD0 + 7093 PUSHGETGLOBALFIELD List, 23 + 7096 APPLY2 + 7097 BRANCHIFNOT 7102 + 7099 ACC1 + 7100 RETURN 2 + 7102 ACC1 + 7103 PUSHACC1 + 7104 MAKEBLOCK2 0 + 7106 RETURN 2 + 7108 RESTART + 7109 GRAB 1 + 7111 ENVACC3 + 7112 GETFIELD0 + 7113 PUSHACC2 + 7114 PUSHACC2 + 7115 PUSHENVACC1 + 7116 GETFIELD1 + 7117 APPLY3 + 7118 PUSHENVACC3 + 7119 SETFIELD0 + 7120 ENVACC4 + 7121 GETFIELD0 + 7122 PUSHCONST0 + 7123 PUSHACC3 + 7124 PUSHENVACC2 + 7125 GETFIELD1 + 7126 APPLY3 + 7127 PUSHENVACC 4 + 7129 SETFIELD0 + 7130 RETURN 2 + 7132 ACC0 + 7133 PUSHENVACC 4 + 7135 PUSHENVACC3 + 7136 APPLY2 + 7137 PUSHENVACC 5 + 7139 GETFIELD0 + 7140 PUSHACC1 + 7141 PUSHACC3 + 7142 PUSHENVACC1 + 7143 GETFIELD1 + 7144 APPLY3 + 7145 PUSHENVACC 5 + 7147 SETFIELD0 + 7148 ENVACC 6 + 7150 GETFIELD0 + 7151 PUSH + 7152 PUSHTRAP 7163 + 7154 ENVACC4 + 7155 GETFIELD3 + 7156 PUSHACC6 + 7157 PUSHENVACC2 + 7158 GETFIELD2 + 7159 APPLY2 + 7160 POPTRAP + 7161 BRANCH 7177 + 7163 PUSHGETGLOBAL Not_found + 7165 PUSHACC1 + 7166 GETFIELD0 + 7167 EQ + 7168 BRANCHIFNOT 7173 + 7170 CONST1 + 7171 BRANCH 7175 + 7173 ACC0 + 7174 RAISE + 7175 POP 1 + 7177 PUSHACC2 + 7178 PUSHENVACC2 + 7179 GETFIELD1 + 7180 APPLY3 + 7181 PUSHENVACC 6 + 7183 SETFIELD0 + 7184 RETURN 2 + 7186 RESTART + 7187 GRAB 3 + 7189 ACC2 + 7190 PUSHACC1 + 7191 PUSHENVACC 4 + 7193 APPLY1 + 7194 PUSHGETGLOBALFIELD List, 10 + 7197 APPLY2 + 7198 PUSHACC1 + 7199 GETFIELD 4 + 7201 PUSHACC3 + 7202 PUSHACC2 + 7203 PUSHACC4 + 7204 GETFIELD 6 + 7206 PUSHACC5 + 7207 GETFIELD 5 + 7209 PUSHACC6 + 7210 GETFIELD3 + 7211 PUSHACC7 + 7212 GETFIELD2 + 7213 MAKEBLOCK 6, 0 + 7216 MAKEBLOCK2 0 + 7218 PUSHACC2 + 7219 SETFIELD 4 + 7221 ENVACC1 + 7222 GETFIELD0 + 7223 PUSHACC2 + 7224 SETFIELD 6 + 7226 ENVACC2 + 7227 GETFIELD0 + 7228 MAKEBLOCK1 0 + 7230 PUSHENVACC3 + 7231 GETFIELD0 + 7232 MAKEBLOCK1 0 + 7234 PUSHACC6 + 7235 PUSHACC1 + 7236 PUSHACC3 + 7237 PUSHACC6 + 7238 PUSHENVACC 4 + 7240 PUSHENVACC3 + 7241 PUSHENVACC2 + 7242 CLOSURE 6, 7132 + 7245 PUSHGETGLOBALFIELD List, 9 + 7248 APPLY2 + 7249 ACC2 + 7250 PUSHACC6 + 7251 PUSHACC2 + 7252 PUSHACC4 + 7253 PUSHENVACC3 + 7254 PUSHENVACC2 + 7255 CLOSURE 4, 7109 + 7258 PUSHGETGLOBALFIELD List, 14 + 7261 APPLY3 + 7262 ACC1 + 7263 GETFIELD0 + 7264 PUSHACC4 + 7265 SETFIELD2 + 7266 ACC0 + 7267 GETFIELD0 + 7268 PUSHACC4 + 7269 SETFIELD3 + 7270 CONST0 + 7271 PUSHACC4 + 7272 GETFIELD 5 + 7274 PUSHACC4 + 7275 CLOSURE 1, 7088 + 7278 PUSHGETGLOBALFIELD List, 13 + 7281 APPLY3 + 7282 PUSHACC4 + 7283 SETFIELD 5 + 7285 RETURN 7 + 7287 RESTART + 7288 GRAB 1 + 7290 PUSHTRAP 7303 + 7292 ACC4 + 7293 GETFIELD 5 + 7295 PUSHACC6 + 7296 PUSHGETGLOBALFIELD List, 29 + 7299 APPLY2 + 7300 POPTRAP + 7301 RETURN 2 + 7303 PUSHGETGLOBAL Not_found + 7305 PUSHACC1 + 7306 GETFIELD0 + 7307 EQ + 7308 BRANCHIFNOT 7325 + 7310 ACC2 + 7311 PUSHENVACC1 + 7312 APPLY1 + 7313 PUSHACC0 + 7314 GETFIELD1 + 7315 PUSHACC1 + 7316 GETFIELD0 + 7317 PUSHACC4 + 7318 GETFIELD1 + 7319 C_CALL2 array_get_addr + 7321 C_CALL2 array_get + 7323 RETURN 4 + 7325 ACC0 + 7326 RAISE + 7327 RESTART + 7328 GRAB 2 + 7330 ENVACC3 + 7331 OFFSETREF 1 + 7333 ACC0 + 7334 GETFIELD3 + 7335 PUSHACC2 + 7336 PUSHENVACC1 + 7337 GETFIELD2 + 7338 APPLY2 + 7339 BRANCHIFNOT 7347 + 7341 ACC2 + 7342 PUSHACC2 + 7343 PUSHACC2 + 7344 PUSHENVACC2 + 7345 APPTERM3 6 + 7347 ACC0 + 7348 GETFIELD 5 + 7350 PUSHACC3 + 7351 PUSHACC3 + 7352 MAKEBLOCK2 0 + 7354 MAKEBLOCK2 0 + 7356 PUSHACC1 + 7357 SETFIELD 5 + 7359 RETURN 3 + 7361 RESTART + 7362 GRAB 1 + 7364 PUSHTRAP 7375 + 7366 ACC4 + 7367 GETFIELD2 + 7368 PUSHACC6 + 7369 PUSHENVACC2 + 7370 GETFIELD2 + 7371 APPLY2 + 7372 POPTRAP + 7373 RETURN 2 + 7375 PUSHGETGLOBAL Not_found + 7377 PUSHACC1 + 7378 GETFIELD0 + 7379 EQ + 7380 BRANCHIFNOT 7406 + 7382 CONST0 + 7383 PUSHENVACC1 + 7384 APPLY1 + 7385 PUSHACC2 + 7386 GETFIELD2 + 7387 PUSHACC1 + 7388 PUSHACC5 + 7389 PUSHENVACC2 + 7390 GETFIELD1 + 7391 APPLY3 + 7392 PUSHACC3 + 7393 SETFIELD2 + 7394 ACC2 + 7395 GETFIELD3 + 7396 PUSHCONST1 + 7397 PUSHACC2 + 7398 PUSHENVACC3 + 7399 GETFIELD1 + 7400 APPLY3 + 7401 PUSHACC3 + 7402 SETFIELD3 + 7403 ACC0 + 7404 RETURN 4 + 7406 ACC0 + 7407 RAISE + 7408 RESTART + 7409 GRAB 2 + 7411 ACC1 + 7412 PUSHENVACC1 + 7413 APPLY1 + 7414 PUSHACC0 + 7415 GETFIELD0 + 7416 PUSHACC0 + 7417 OFFSETINT 1 + 7419 PUSHACC3 + 7420 PUSHENVACC 4 + 7422 APPLY2 + 7423 ACC0 + 7424 PUSHACC3 + 7425 GETFIELD1 + 7426 C_CALL2 array_get_addr + 7428 PUSHENVACC2 + 7429 PUSHACC1 + 7430 EQ + 7431 BRANCHIFNOT 7444 + 7433 CONST0 + 7434 PUSHENVACC3 + 7435 APPLY1 + 7436 ASSIGN 0 + 7438 ACC0 + 7439 PUSHACC2 + 7440 PUSHACC5 + 7441 GETFIELD1 + 7442 C_CALL3 array_set_addr + 7444 ACC5 + 7445 PUSHACC3 + 7446 GETFIELD1 + 7447 PUSHACC2 + 7448 C_CALL3 array_set + 7450 RETURN 6 + 7452 RESTART + 7453 GRAB 1 + 7455 ACC0 + 7456 GETFIELD1 + 7457 VECTLENGTH + 7458 PUSHACC0 + 7459 PUSHACC3 + 7460 GTINT + 7461 BRANCHIFNOT 7487 + 7463 ENVACC1 + 7464 PUSHACC3 + 7465 C_CALL2 make_vect + 7467 PUSH + 7468 PUSH_RETADDR 7482 + 7470 ACC4 + 7471 PUSHCONST0 + 7472 PUSHACC5 + 7473 PUSHCONST0 + 7474 PUSHACC 9 + 7476 GETFIELD1 + 7477 PUSHGETGLOBALFIELD Array, 8 + 7480 APPLY 5 + 7482 ACC0 + 7483 PUSHACC3 + 7484 SETFIELD1 + 7485 POP 1 + 7487 RETURN 3 + 7489 ENVACC 5 + 7491 OFFSETREF 1 + 7493 CONST0 + 7494 PUSHENVACC2 + 7495 GETFIELD0 + 7496 PUSHCONST0 + 7497 PUSHCONST0 + 7498 PUSHENVACC 4 + 7500 GETFIELD0 + 7501 PUSHENVACC3 + 7502 GETFIELD0 + 7503 PUSH + 7504 ATOM0 + 7505 PUSHENVACC1 + 7506 MAKEBLOCK 8, 0 + 7509 RETURN 1 + 7511 RESTART + 7512 GRAB 1 + 7514 ACC1 + 7515 PUSHACC1 + 7516 C_CALL2 compare + 7518 RETURN 2 + 7520 RESTART + 7521 GRAB 1 + 7523 ACC1 + 7524 PUSHACC1 + 7525 C_CALL2 compare + 7527 RETURN 2 + 7529 RESTART + 7530 GRAB 1 + 7532 ACC1 + 7533 PUSHACC1 + 7534 C_CALL2 compare + 7536 RETURN 2 + 7538 PUSHTRAP 7549 + 7540 ACC4 + 7541 PUSHENVACC1 + 7542 PUSHGETGLOBALFIELD Hashtbl, 3 + 7545 APPLY2 + 7546 POPTRAP + 7547 RETURN 1 + 7549 PUSHGETGLOBAL Not_found + 7551 PUSHACC1 + 7552 GETFIELD0 + 7553 EQ + 7554 BRANCHIFNOT 7569 + 7556 CONST0 + 7557 PUSHENVACC2 + 7558 APPLY1 + 7559 PUSHACC0 + 7560 PUSHACC3 + 7561 PUSHENVACC1 + 7562 PUSHGETGLOBALFIELD Hashtbl, 2 + 7565 APPLY3 + 7566 ACC0 + 7567 RETURN 3 + 7569 ACC0 + 7570 RAISE + 7571 ENVACC2 + 7572 GETFIELD0 + 7573 PUSHENVACC2 + 7574 GETFIELD0 + 7575 PUSHENVACC1 + 7576 APPLY1 + 7577 PUSHENVACC2 + 7578 SETFIELD0 + 7579 ACC0 + 7580 RETURN 2 + 7582 ENVACC1 + 7583 PUSHACC1 + 7584 VECTLENGTH + 7585 OFFSETINT -1 + 7587 PUSH + 7588 BRANCH 7606 + 7590 CHECK_SIGNALS + 7591 ACC1 + 7592 PUSHACC3 + 7593 C_CALL2 array_get_addr + 7595 PUSHENVACC2 + 7596 APPLY1 + 7597 PUSHACC2 + 7598 PUSHACC4 + 7599 C_CALL3 array_set_addr + 7601 ACC1 + 7602 OFFSETINT 1 + 7604 ASSIGN 1 + 7606 ACC0 + 7607 PUSHACC2 + 7608 LEINT + 7609 BRANCHIF 7590 + 7611 CONST0 + 7612 RETURN 3 + 7614 ENVACC4 + 7615 PUSHACC1 + 7616 NEQ + 7617 BRANCHIFNOT 7640 + 7619 ENVACC2 + 7620 GETFIELD0 + 7621 PUSHACC1 + 7622 PUSHENVACC3 + 7623 APPLY1 + 7624 EQ + 7625 BRANCHIFNOT 7640 + 7627 ACC0 + 7628 PUSHENVACC 5 + 7630 APPLY1 + 7631 BRANCHIFNOT 7640 + 7633 ENVACC1 + 7634 GETFIELD3 + 7635 PUSHACC1 + 7636 PUSHENVACC 6 + 7638 APPTERM2 3 + 7640 ACC0 + 7641 RETURN 1 + 7643 RESTART + 7644 GRAB 1 + 7646 CONST0 + 7647 PUSHENVACC1 + 7648 OFFSETINT -1 + 7650 PUSH + 7651 BRANCH 7690 + 7653 CHECK_SIGNALS + 7654 ENVACC2 + 7655 PUSHACC2 + 7656 PUSHACC5 + 7657 C_CALL2 array_get + 7659 NEQ + 7660 BRANCHIFNOT 7679 + 7662 ENVACC2 + 7663 PUSHACC2 + 7664 PUSHACC4 + 7665 C_CALL2 array_get + 7667 NEQ + 7668 BRANCHIFNOT 7679 + 7670 ACC1 + 7671 PUSHACC3 + 7672 C_CALL2 array_get + 7674 PUSHACC2 + 7675 PUSHACC5 + 7676 C_CALL2 array_get + 7678 NEQ + 7679 BRANCHIFNOT 7685 + 7681 ENVACC4 + 7682 MAKEBLOCK1 0 + 7684 RAISE + 7685 ACC1 + 7686 OFFSETINT 1 + 7688 ASSIGN 1 + 7690 ACC0 + 7691 PUSHACC2 + 7692 LEINT + 7693 BRANCHIF 7653 + 7695 CONST0 + 7696 POP 2 + 7698 CONST0 + 7699 PUSHENVACC1 + 7700 OFFSETINT -1 + 7702 PUSH + 7703 BRANCH 7727 + 7705 CHECK_SIGNALS + 7706 ENVACC2 + 7707 PUSHACC2 + 7708 PUSHACC5 + 7709 C_CALL2 array_get + 7711 NEQ + 7712 BRANCHIFNOT 7722 + 7714 ACC1 + 7715 PUSHACC4 + 7716 C_CALL2 array_get + 7718 PUSHACC2 + 7719 PUSHACC4 + 7720 C_CALL3 array_set + 7722 ACC1 + 7723 OFFSETINT 1 + 7725 ASSIGN 1 + 7727 ACC0 + 7728 PUSHACC2 + 7729 LEINT + 7730 BRANCHIF 7705 + 7732 CONST0 + 7733 POP 2 + 7735 ENVACC3 + 7736 GETFIELD0 + 7737 PUSHACC2 + 7738 PUSHENVACC 5 + 7740 APPLY2 + 7741 PUSHENVACC3 + 7742 SETFIELD0 + 7743 ACC0 + 7744 RETURN 2 + 7746 ENVACC1 + 7747 GETFIELD 4 + 7749 PUSHACC1 + 7750 PUSHENVACC2 + 7751 APPLY1 + 7752 LEINT + 7753 RETURN 1 + 7755 CONST0 + 7756 PUSHCONST0 + 7757 PUSHENVACC1 + 7758 OFFSETINT -1 + 7760 PUSH + 7761 BRANCH 7782 + 7763 CHECK_SIGNALS + 7764 ENVACC2 + 7765 PUSHACC2 + 7766 PUSHACC5 + 7767 C_CALL2 array_get + 7769 NEQ + 7770 BRANCHIFNOT 7777 + 7772 ACC2 + 7773 OFFSETINT 1 + 7775 ASSIGN 2 + 7777 ACC1 + 7778 OFFSETINT 1 + 7780 ASSIGN 1 + 7782 ACC0 + 7783 PUSHACC2 + 7784 LEINT + 7785 BRANCHIF 7763 + 7787 CONST0 + 7788 POP 2 + 7790 ACC0 + 7791 RETURN 2 + 7793 ENVACC2 + 7794 GETFIELD0 + 7795 OFFSETINT -1 + 7797 PUSHENVACC1 + 7798 GETFIELD0 + 7799 C_CALL2 array_get_addr + 7801 PUSHACC1 + 7802 PUSHENVACC1 + 7803 GETFIELD0 + 7804 C_CALL3 array_set_addr + 7806 ENVACC2 + 7807 OFFSETREF -1 + 7809 RETURN 1 + 7811 ENVACC1 + 7812 GETFIELD0 + 7813 VECTLENGTH + 7814 PUSHACC0 + 7815 PUSHENVACC2 + 7816 GETFIELD0 + 7817 GEINT + 7818 BRANCHIFNOT 7845 + 7820 ATOM0 + 7821 PUSHACC1 + 7822 PUSHCONST2 + 7823 MULINT + 7824 C_CALL2 make_vect + 7826 PUSH + 7827 PUSH_RETADDR 7840 + 7829 ACC4 + 7830 PUSHCONST0 + 7831 PUSHACC5 + 7832 PUSHCONST0 + 7833 PUSHENVACC1 + 7834 GETFIELD0 + 7835 PUSHGETGLOBALFIELD Array, 8 + 7838 APPLY 5 + 7840 ACC0 + 7841 PUSHENVACC1 + 7842 SETFIELD0 + 7843 POP 1 + 7845 ACC1 + 7846 PUSHENVACC2 + 7847 GETFIELD0 + 7848 PUSHENVACC1 + 7849 GETFIELD0 + 7850 C_CALL3 array_set_addr + 7852 ENVACC2 + 7853 OFFSETREF 1 + 7855 RETURN 2 + 7857 ACC0 + 7858 GETFIELD0 + 7859 PUSHENVACC1 + 7860 APPLY1 + 7861 PUSHENVACC2 + 7862 PUSHACC1 + 7863 GETFIELD0 + 7864 EQ + 7865 BRANCHIFNOT 7874 + 7867 ACC1 + 7868 GETFIELD1 + 7869 PUSHACC1 + 7870 GETFIELD1 + 7871 PUSHENVACC3 + 7872 C_CALL3 array_set + 7874 RETURN 2 + 7876 RESTART + 7877 GRAB 1 + 7879 CONST0 + 7880 PUSHENVACC2 + 7881 APPLY1 + 7882 PUSHACC2 + 7883 PUSHGETGLOBALFIELD List, 4 + 7886 APPLY1 + 7887 PUSHACC1 + 7888 PUSHACC3 + 7889 PUSHENVACC1 + 7890 CLOSURE 3, 7857 + 7893 PUSHGETGLOBALFIELD List, 9 + 7896 APPLY2 + 7897 ACC0 + 7898 RETURN 3 + 7900 ACC0 + 7901 PUSHGETGLOBALFIELD Array, 6 + 7904 APPLY1 + 7905 PUSHACC0 + 7906 PUSHENVACC3 + 7907 APPLY1 + 7908 ENVACC2 + 7909 GETFIELD0 + 7910 PUSHENVACC1 + 7911 PUSHACC2 + 7912 C_CALL3 array_set + 7914 ENVACC4 + 7915 GETFIELD0 + 7916 PUSHACC1 + 7917 MAKEBLOCK2 0 + 7919 PUSHENVACC 4 + 7921 SETFIELD0 + 7922 ACC0 + 7923 RETURN 2 + 7925 ENVACC2 + 7926 PUSHENVACC1 + 7927 OFFSETINT 1 + 7929 C_CALL2 make_vect + 7931 PUSHACC0 + 7932 PUSHENVACC3 + 7933 APPLY1 + 7934 ENVACC4 + 7935 GETFIELD0 + 7936 PUSHACC1 + 7937 MAKEBLOCK2 0 + 7939 PUSHENVACC 4 + 7941 SETFIELD0 + 7942 ACC0 + 7943 RETURN 2 + 7945 ENVACC1 + 7946 PUSHACC1 + 7947 C_CALL2 array_get + 7949 RETURN 1 + 7951 ENVACC2 + 7952 GETFIELD0 + 7953 PUSHENVACC1 + 7954 PUSHACC2 + 7955 C_CALL3 array_set + 7957 RETURN 1 + 7959 ENVACC1 + 7960 PUSHENVACC2 + 7961 PUSHENVACC1 + 7962 MULINT + 7963 PUSHACC2 + 7964 MODINT + 7965 DIVINT + 7966 PUSHENVACC1 + 7967 PUSHCONSTINT 65536 + 7969 PUSHACC3 + 7970 DIVINT + 7971 DIVINT + 7972 MAKEBLOCK2 0 + 7974 RETURN 1 + 7976 ENVACC3 + 7977 OFFSETREF 1 + 7979 ENVACC1 + 7980 PUSHACC1 + 7981 ADDINT + 7982 PUSHCONST0 + 7983 PUSHENVACC2 + 7984 PUSHENVACC1 + 7985 MULINT + 7986 PUSHACC2 + 7987 MODINT + 7988 EQ + 7989 BRANCHIFNOT 8001 + 7991 ENVACC2 + 7992 PUSHCONSTINT 65536 + 7994 SUBINT + 7995 PUSHENVACC1 + 7996 MULINT + 7997 PUSHACC1 + 7998 ADDINT + 7999 RETURN 2 + 8001 ACC0 + 8002 RETURN 2 + 8004 ACC0 + 8005 C_CALL1 obj_dup + 8007 PUSHENVACC1 + 8008 PUSHACC1 + 8009 PUSHENVACC2 + 8010 APPLY2 + 8011 ACC0 + 8012 RETURN 2 + 8014 RESTART + 8015 GRAB 1 + 8017 ACC1 + 8018 GETFIELD0 + 8019 PUSHACC0 + 8020 PUSHCONST1 + 8021 PUSHACC3 + 8022 SETVECTITEM + 8023 ACC0 + 8024 OFFSETINT 1 + 8026 PUSHACC3 + 8027 SETFIELD0 + 8028 RETURN 3 + 8030 ENVACC1 + 8031 GETFIELD0 + 8032 PUSHENVACC1 + 8033 OFFSETREF 1 + 8035 ACC0 + 8036 RETURN 2 + 8038 CONSTINT 248 + 8040 PUSHCONST0 + 8041 MAKEBLOCK1 0 + 8043 PUSHACC0 + 8044 CLOSURE 1, 8030 + 8047 PUSH + 8048 CLOSURE 0, 8015 + 8051 PUSHACC0 + 8052 PUSHACC3 + 8053 CLOSURE 2, 8004 + 8056 PUSHCONSTINT 16 + 8058 PUSHCONST3 + 8059 PUSHCONST1 + 8060 PUSHCONST1 + 8061 PUSHCONST1 + 8062 MAKEBLOCK 5, 0 + 8065 PUSHCONSTINT 16 + 8067 PUSHGETGLOBALFIELD Sys, 3 + 8070 DIVINT + 8071 PUSHCONST0 + 8072 PUSHCONSTINT 32 + 8074 PUSHCONST2 + 8075 PUSHCONST0 + 8076 MAKEBLOCK1 0 + 8078 PUSHACC0 + 8079 PUSHACC3 + 8080 PUSHACC6 + 8081 CLOSURE 3, 7976 + 8084 PUSHACC3 + 8085 PUSHACC6 + 8086 CLOSURE 2, 7959 + 8089 PUSHCONST0 + 8090 PUSHCONST0 + 8091 MAKEBLOCK1 0 + 8093 PUSHACC0 + 8094 PUSHACC7 + 8095 CLOSURE 2, 7951 + 8098 PUSHACC7 + 8099 CLOSURE 1, 7945 + 8102 PUSHCONST0 + 8103 MAKEBLOCK1 0 + 8105 PUSH + 8106 ATOM0 + 8107 PUSHACC1 + 8108 PUSHACC4 + 8109 PUSHACC7 + 8110 PUSHACC 13 + 8112 CLOSURE 4, 7925 + 8115 PUSHACC2 + 8116 PUSHACC5 + 8117 PUSHACC7 + 8118 PUSHACC 14 + 8120 CLOSURE 4, 7900 + 8123 PUSHACC1 + 8124 PUSHACC 9 + 8126 CLOSURE 2, 7877 + 8129 PUSH + 8130 ATOM0 + 8131 PUSHCONSTINT 10 + 8133 C_CALL2 make_vect + 8135 MAKEBLOCK1 0 + 8137 PUSHCONST0 + 8138 MAKEBLOCK1 0 + 8140 PUSHACC0 + 8141 PUSHACC2 + 8142 CLOSURE 2, 7811 + 8145 PUSHACC1 + 8146 PUSHACC3 + 8147 CLOSURE 2, 7793 + 8150 PUSHACC 12 + 8152 PUSHACC 18 + 8154 CLOSURE 2, 7755 + 8157 PUSHACC0 + 8158 PUSHACC 22 + 8160 CLOSURE 2, 7746 + 8163 PUSHGETGLOBAL "Oo.Failed" + 8165 MAKEBLOCK1 0 + 8167 PUSH + 8168 CLOSUREREC 0, 6415 + 8172 ACC0 + 8173 PUSHACC2 + 8174 PUSHACC 14 + 8176 PUSHACC 19 + 8178 PUSHACC 25 + 8180 CLOSURE 5, 7644 + 8183 PUSHACC0 + 8184 PUSHACC3 + 8185 PUSHACC5 + 8186 PUSHACC 8 + 8188 PUSHACC 10 + 8190 PUSHACC 12 + 8192 PUSHACC 14 + 8194 CLOSUREREC 7, 6444 + 8198 ACC0 + 8199 PUSHACC5 + 8200 PUSHACC 15 + 8202 PUSHACC 18 + 8204 PUSHACC 21 + 8206 PUSHACC 31 + 8208 CLOSURE 6, 7614 + 8211 PUSHACC0 + 8212 PUSHACC 26 + 8214 CLOSURE 2, 7582 + 8217 PUSHACC 27 + 8219 PUSHCONSTINT 65536 + 8221 PUSHACC 28 + 8223 MULINT + 8224 MULINT + 8225 PUSHACC0 + 8226 MAKEBLOCK1 0 + 8228 PUSHCONSTINT 101 + 8230 PUSHGETGLOBALFIELD Hashtbl, 0 + 8233 APPLY1 + 8234 PUSHACC1 + 8235 PUSHACC 26 + 8237 CLOSURE 2, 7571 + 8240 PUSHACC0 + 8241 PUSHACC2 + 8242 CLOSURE 2, 7538 + 8245 PUSH + 8246 CLOSURE 0, 7530 + 8249 PUSHACC0 + 8250 MAKEBLOCK1 0 + 8252 POP 1 + 8254 PUSHGETGLOBALFIELD Map, 0 + 8257 APPLY1 + 8258 PUSH + 8259 CLOSURE 0, 7521 + 8262 PUSHACC0 + 8263 MAKEBLOCK1 0 + 8265 POP 1 + 8267 PUSHGETGLOBALFIELD Map, 0 + 8270 APPLY1 + 8271 PUSH + 8272 CLOSURE 0, 7512 + 8275 PUSHACC0 + 8276 MAKEBLOCK1 0 + 8278 POP 1 + 8280 PUSHGETGLOBALFIELD Map, 0 + 8283 APPLY1 + 8284 PUSHCONST0 + 8285 MAKEBLOCK1 0 + 8287 PUSHACC0 + 8288 PUSHACC2 + 8289 PUSHACC4 + 8290 PUSHACC6 + 8291 PUSHACC 37 + 8293 CLOSURE 5, 7489 + 8296 PUSHACC 25 + 8298 CLOSURE 1, 7453 + 8301 PUSHACC0 + 8302 PUSHACC 26 + 8304 PUSHACC 28 + 8306 PUSHACC 35 + 8308 CLOSURE 4, 7409 + 8311 PUSHCONST0 + 8312 MAKEBLOCK1 0 + 8314 PUSHCONST0 + 8315 MAKEBLOCK1 0 + 8317 PUSHACC6 + 8318 PUSHACC 8 + 8320 PUSHACC 12 + 8322 CLOSURE 3, 7362 + 8325 PUSHACC2 + 8326 PUSHACC4 + 8327 PUSHACC 9 + 8329 CLOSURE 3, 7328 + 8332 PUSHACC 37 + 8334 CLOSURE 1, 7288 + 8337 PUSHACC2 + 8338 PUSHACC 10 + 8340 PUSHACC 12 + 8342 PUSHACC 14 + 8344 CLOSURE 4, 7187 + 8347 PUSHACC 12 + 8349 CLOSURE 1, 7027 + 8352 PUSH + 8353 CLOSURE 0, 6980 + 8356 PUSH + 8357 CLOSURE 0, 6969 + 8360 PUSHACC0 + 8361 PUSHACC 16 + 8363 CLOSURE 2, 6950 + 8366 PUSHACC 16 + 8368 CLOSURE 1, 6939 + 8371 PUSHACC 47 + 8373 CLOSURE 1, 6927 + 8376 PUSH + 8377 CLOSURE 0, 6862 + 8380 PUSHACC 15 + 8382 PUSHACC 18 + 8384 PUSHACC 20 + 8386 PUSHACC 23 + 8388 CLOSURE 4, 6842 + 8391 PUSHACC 12 + 8393 PUSHACC 27 + 8395 PUSHACC 56 + 8397 CLOSURE 3, 6787 + 8400 PUSHACC 57 + 8402 PUSHACC 60 + 8404 PUSHACC 62 + 8406 CLOSURE 3, 6769 + 8409 PUSH + 8410 CLOSUREREC 0, 6519 + 8414 ACC0 + 8415 CLOSURE 1, 6752 + 8418 PUSHACC0 + 8419 PUSHACC 61 + 8421 PUSHACC 64 + 8423 CLOSURE 3, 6735 + 8426 PUSHACC 52 + 8428 CLOSURE 1, 6715 + 8431 PUSHACC 39 + 8433 PUSHACC 49 + 8435 CLOSURE 2, 6695 + 8438 PUSHACC0 + 8439 PUSHACC 20 + 8441 PUSHACC 22 + 8443 PUSHACC 27 + 8445 PUSHACC 47 + 8447 PUSHACC 49 + 8449 PUSHACC 55 + 8451 PUSHACC 63 + 8453 CLOSURE 8, 6644 + 8456 PUSHACC 41 + 8458 CLOSURE 1, 6618 + 8461 PUSHACC0 + 8462 PUSHACC 52 + 8464 PUSHACC 57 + 8466 PUSHACC 63 + 8468 CLOSURE 4, 6581 + 8471 PUSHACC0 + 8472 PUSHACC3 + 8473 PUSHACC 66 + 8475 PUSHACC7 + 8476 PUSHACC 9 + 8478 PUSHACC 11 + 8480 PUSHACC 14 + 8482 PUSHACC 16 + 8484 PUSHACC 18 + 8486 PUSHACC 20 + 8488 PUSHACC 27 + 8490 PUSHACC 29 + 8492 PUSHACC 32 + 8494 PUSHACC 32 + 8496 PUSHACC 35 + 8498 PUSHACC 27 + 8500 PUSHACC 29 + 8502 PUSHACC 31 + 8504 PUSHACC 34 + 8506 PUSHACC 50 + 8508 PUSHACC 85 + 8510 MAKEBLOCK 21, 0 + 8513 POP 70 + 8515 SETGLOBAL Oo + 8517 BRANCH 8568 + 8519 ACC0 + 8520 BRANCHIFNOT 8525 + 8522 ACC0 + 8523 BRANCH 8530 + 8525 ENVACC1 + 8526 PUSHGETGLOBALFIELD Oo, 14 + 8529 APPLY1 + 8530 PUSHCONST0 + 8531 ACC1 + 8532 BRANCHIFNOT 8537 + 8534 CONST0 + 8535 BRANCH 8543 + 8537 ENVACC1 + 8538 PUSHACC1 + 8539 PUSHGETGLOBALFIELD Oo, 15 + 8542 APPLY2 + 8543 ACC0 + 8544 RETURN 2 + 8546 CONSTINT 23 + 8548 RETURN 1 + 8550 CLOSURE 0, 8546 + 8553 PUSHACC0 + 8554 POP 1 + 8556 PUSHENVACC1 + 8557 PUSHACC2 + 8558 PUSHGETGLOBALFIELD Oo, 8 + 8561 APPLY3 + 8562 ACC0 + 8563 CLOSURE 1, 8519 + 8566 RETURN 1 + 8568 GETGLOBALFIELD Oo, 1 + 8571 PUSHGETGLOBAL "m" + 8573 PUSHACC1 + 8574 APPLY1 + 8575 PUSHCONST3 + 8576 C_CALL1 alloc_dummy + 8578 PUSHGETGLOBAL <0>("m", 0) + 8580 PUSHGETGLOBALFIELD Oo, 12 + 8583 APPLY1 + 8584 PUSHACC2 + 8585 CLOSURE 1, 8550 + 8588 PUSHACC1 + 8589 PUSHACC1 + 8590 APPLY1 + 8591 PUSHACC2 + 8592 PUSHGETGLOBALFIELD Oo, 13 + 8595 APPLY1 + 8596 ACC2 + 8597 PUSHACC2 + 8598 PUSHACC2 + 8599 MAKEBLOCK3 0 + 8601 POP 3 + 8603 PUSHACC1 + 8604 C_CALL2 update_dummy + 8606 CONST0 + 8607 PUSHACC1 + 8608 GETFIELD0 + 8609 APPLY1 + 8610 PUSHCONSTINT 23 + 8612 PUSHACC1 + 8613 PUSHACC4 + 8614 GETMETHOD + 8615 APPLY1 + 8616 NEQ + 8617 BRANCHIFNOT 8624 + 8619 GETGLOBAL Not_found + 8621 MAKEBLOCK1 0 + 8623 RAISE + 8624 POP 1 + 8626 ACC0 + 8627 MAKEBLOCK1 0 + 8629 POP 3 + 8631 SETGLOBAL T300-getmethod + 8633 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t301-object.ml b/testsuite/tests/tool-ocaml/t301-object.ml new file mode 100644 index 00000000..6cef9bed --- /dev/null +++ b/testsuite/tests/tool-ocaml/t301-object.ml @@ -0,0 +1,29 @@ +(**** file testinterp/t301-object.ml + suggested by Jacques Garrigue to Basile Starynkevitch + + compilable with +ocamlc -nostdlib -I ../../stdlib \ + ../../stdlib/pervasives.cmo ../../stdlib/camlinternalOO.cmo \ + t301-object.ml -o t301-object.byte + +***) +(* $Id: t301-object.ml 6363 2004-06-02 09:42:01Z basile $ *) + + +class c = object (self) + method pubmet = 1 + method privmet = self#pubmet + 1 + val o = object method a = 3 method m = 4 end + method dynmet = o#m +end;; + +let f () = + let c = new c in + (c#pubmet, c#privmet, c#dynmet);; + +let (x,y,z) = f () in + if x <> 1 then raise Not_found; + if y <> 2 then raise Not_found; + if z <> 4 then raise Not_found;; + +(**** eof $Id: t301-object.ml 6363 2004-06-02 09:42:01Z basile $ *) diff --git a/testsuite/tests/tool-ocaml/t310-alloc-1.ml b/testsuite/tests/tool-ocaml/t310-alloc-1.ml new file mode 100644 index 00000000..c438cc97 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t310-alloc-1.ml @@ -0,0 +1,1587 @@ +open Lib;; +let rec f a n = + if n <= 0 then a + else f (1::a) (n-1) +in +let l = f [] 30000 in +if List.fold_left (+) 0 l <> 30000 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2435 + 2406 RESTART + 2407 GRAB 1 + 2409 CONST0 + 2410 PUSHACC2 + 2411 LEINT + 2412 BRANCHIFNOT 2417 + 2414 ACC0 + 2415 RETURN 2 + 2417 ACC1 + 2418 OFFSETINT -1 + 2420 PUSHACC1 + 2421 PUSHCONST1 + 2422 MAKEBLOCK2 0 + 2424 PUSHOFFSETCLOSURE0 + 2425 APPTERM2 4 + 2427 RESTART + 2428 GRAB 1 + 2430 ACC1 + 2431 PUSHACC1 + 2432 ADDINT + 2433 RETURN 2 + 2435 CLOSUREREC 0, 2407 + 2439 CONSTINT 30000 + 2441 PUSHCONST0 + 2442 PUSHACC2 + 2443 APPLY2 + 2444 PUSHCONSTINT 30000 + 2446 PUSHACC1 + 2447 PUSHCONST0 + 2448 PUSH + 2449 CLOSURE 0, 2428 + 2452 PUSHGETGLOBALFIELD List, 12 + 2455 APPLY3 + 2456 NEQ + 2457 BRANCHIFNOT 2464 + 2459 GETGLOBAL Not_found + 2461 MAKEBLOCK1 0 + 2463 RAISE + 2464 POP 2 + 2466 ATOM0 + 2467 SETGLOBAL T310-alloc-1 + 2469 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t310-alloc-2.ml b/testsuite/tests/tool-ocaml/t310-alloc-2.ml new file mode 100644 index 00000000..81034e78 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t310-alloc-2.ml @@ -0,0 +1,2313 @@ +open Lib;; +let v = Array.make 200000 2 in +let t = ref 0 in +Array.iter (fun x -> t := !t + x) v; +if !t <> 400000 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 3341 + 2406 RESTART + 2407 GRAB 2 + 2409 ACC2 + 2410 PUSHACC2 + 2411 VECTLENGTH + 2412 OFFSETINT -1 + 2414 PUSHCONST0 + 2415 PUSH + 2416 BRANCH 2433 + 2418 CHECK_SIGNALS + 2419 ACC2 + 2420 PUSHACC2 + 2421 PUSHACC6 + 2422 C_CALL2 array_unsafe_get + 2424 PUSHACC5 + 2425 APPLY2 + 2426 ASSIGN 2 + 2428 ACC1 + 2429 OFFSETINT -1 + 2431 ASSIGN 1 + 2433 ACC0 + 2434 PUSHACC2 + 2435 GEINT + 2436 BRANCHIF 2418 + 2438 CONST0 + 2439 POP 2 + 2441 ACC0 + 2442 RETURN 4 + 2444 RESTART + 2445 GRAB 2 + 2447 ACC1 + 2448 PUSHCONST0 + 2449 PUSHACC4 + 2450 VECTLENGTH + 2451 OFFSETINT -1 + 2453 PUSH + 2454 BRANCH 2471 + 2456 CHECK_SIGNALS + 2457 ACC1 + 2458 PUSHACC6 + 2459 C_CALL2 array_unsafe_get + 2461 PUSHACC3 + 2462 PUSHACC5 + 2463 APPLY2 + 2464 ASSIGN 2 + 2466 ACC1 + 2467 OFFSETINT 1 + 2469 ASSIGN 1 + 2471 ACC0 + 2472 PUSHACC2 + 2473 LEINT + 2474 BRANCHIF 2456 + 2476 CONST0 + 2477 POP 2 + 2479 ACC0 + 2480 RETURN 4 + 2482 RESTART + 2483 GRAB 1 + 2485 ACC1 + 2486 BRANCHIFNOT 2502 + 2488 ACC1 + 2489 GETFIELD0 + 2490 PUSHACC1 + 2491 PUSHENVACC1 + 2492 C_CALL3 array_unsafe_set + 2494 ACC1 + 2495 GETFIELD1 + 2496 PUSHACC1 + 2497 OFFSETINT 1 + 2499 PUSHOFFSETCLOSURE0 + 2500 APPTERM2 4 + 2502 ENVACC1 + 2503 RETURN 2 + 2505 ACC0 + 2506 BRANCHIFNOT 2531 + 2508 ACC0 + 2509 GETFIELD1 + 2510 PUSHACC1 + 2511 GETFIELD0 + 2512 PUSHACC1 + 2513 PUSHGETGLOBALFIELD List, 0 + 2516 APPLY1 + 2517 OFFSETINT 1 + 2519 C_CALL2 make_vect + 2521 PUSHACC0 + 2522 CLOSUREREC 1, 2483 + 2526 ACC2 + 2527 PUSHCONST1 + 2528 PUSHACC2 + 2529 APPTERM2 6 + 2531 ATOM0 + 2532 RETURN 1 + 2534 RESTART + 2535 GRAB 1 + 2537 CONST0 + 2538 PUSHACC1 + 2539 LTINT + 2540 BRANCHIFNOT 2545 + 2542 ACC1 + 2543 RETURN 2 + 2545 ACC1 + 2546 PUSHACC1 + 2547 PUSHENVACC1 + 2548 C_CALL2 array_unsafe_get + 2550 MAKEBLOCK2 0 + 2552 PUSHACC1 + 2553 OFFSETINT -1 + 2555 PUSHOFFSETCLOSURE0 + 2556 APPTERM2 4 + 2558 ACC0 + 2559 CLOSUREREC 1, 2535 + 2563 CONST0 + 2564 PUSHACC2 + 2565 VECTLENGTH + 2566 OFFSETINT -1 + 2568 PUSHACC2 + 2569 APPTERM2 4 + 2571 RESTART + 2572 GRAB 1 + 2574 ACC1 + 2575 VECTLENGTH + 2576 PUSHCONST0 + 2577 PUSHACC1 + 2578 EQ + 2579 BRANCHIFNOT 2584 + 2581 ATOM0 + 2582 RETURN 3 + 2584 CONST0 + 2585 PUSHACC3 + 2586 C_CALL2 array_unsafe_get + 2588 PUSHCONST0 + 2589 PUSHACC3 + 2590 APPLY2 + 2591 PUSHACC1 + 2592 C_CALL2 make_vect + 2594 PUSHCONST1 + 2595 PUSHACC2 + 2596 OFFSETINT -1 + 2598 PUSH + 2599 BRANCH 2618 + 2601 CHECK_SIGNALS + 2602 ACC1 + 2603 PUSHACC6 + 2604 C_CALL2 array_unsafe_get + 2606 PUSHACC2 + 2607 PUSHACC6 + 2608 APPLY2 + 2609 PUSHACC2 + 2610 PUSHACC4 + 2611 C_CALL3 array_unsafe_set + 2613 ACC1 + 2614 OFFSETINT 1 + 2616 ASSIGN 1 + 2618 ACC0 + 2619 PUSHACC2 + 2620 LEINT + 2621 BRANCHIF 2601 + 2623 CONST0 + 2624 POP 2 + 2626 ACC0 + 2627 RETURN 4 + 2629 RESTART + 2630 GRAB 1 + 2632 CONST0 + 2633 PUSHACC2 + 2634 VECTLENGTH + 2635 OFFSETINT -1 + 2637 PUSH + 2638 BRANCH 2653 + 2640 CHECK_SIGNALS + 2641 ACC1 + 2642 PUSHACC4 + 2643 C_CALL2 array_unsafe_get + 2645 PUSHACC2 + 2646 PUSHACC4 + 2647 APPLY2 + 2648 ACC1 + 2649 OFFSETINT 1 + 2651 ASSIGN 1 + 2653 ACC0 + 2654 PUSHACC2 + 2655 LEINT + 2656 BRANCHIF 2640 + 2658 CONST0 + 2659 RETURN 4 + 2661 RESTART + 2662 GRAB 1 + 2664 ACC1 + 2665 VECTLENGTH + 2666 PUSHCONST0 + 2667 PUSHACC1 + 2668 EQ + 2669 BRANCHIFNOT 2674 + 2671 ATOM0 + 2672 RETURN 3 + 2674 CONST0 + 2675 PUSHACC3 + 2676 C_CALL2 array_unsafe_get + 2678 PUSHACC2 + 2679 APPLY1 + 2680 PUSHACC1 + 2681 C_CALL2 make_vect + 2683 PUSHCONST1 + 2684 PUSHACC2 + 2685 OFFSETINT -1 + 2687 PUSH + 2688 BRANCH 2706 + 2690 CHECK_SIGNALS + 2691 ACC1 + 2692 PUSHACC6 + 2693 C_CALL2 array_unsafe_get + 2695 PUSHACC5 + 2696 APPLY1 + 2697 PUSHACC2 + 2698 PUSHACC4 + 2699 C_CALL3 array_unsafe_set + 2701 ACC1 + 2702 OFFSETINT 1 + 2704 ASSIGN 1 + 2706 ACC0 + 2707 PUSHACC2 + 2708 LEINT + 2709 BRANCHIF 2690 + 2711 CONST0 + 2712 POP 2 + 2714 ACC0 + 2715 RETURN 4 + 2717 RESTART + 2718 GRAB 1 + 2720 CONST0 + 2721 PUSHACC2 + 2722 VECTLENGTH + 2723 OFFSETINT -1 + 2725 PUSH + 2726 BRANCH 2740 + 2728 CHECK_SIGNALS + 2729 ACC1 + 2730 PUSHACC4 + 2731 C_CALL2 array_unsafe_get + 2733 PUSHACC3 + 2734 APPLY1 + 2735 ACC1 + 2736 OFFSETINT 1 + 2738 ASSIGN 1 + 2740 ACC0 + 2741 PUSHACC2 + 2742 LEINT + 2743 BRANCHIF 2728 + 2745 CONST0 + 2746 RETURN 4 + 2748 RESTART + 2749 GRAB 4 + 2751 CONST0 + 2752 PUSHACC5 + 2753 LTINT + 2754 BRANCHIF 2782 + 2756 CONST0 + 2757 PUSHACC2 + 2758 LTINT + 2759 BRANCHIF 2782 + 2761 ACC0 + 2762 VECTLENGTH + 2763 PUSHACC5 + 2764 PUSHACC3 + 2765 ADDINT + 2766 GTINT + 2767 BRANCHIF 2782 + 2769 CONST0 + 2770 PUSHACC4 + 2771 LTINT + 2772 BRANCHIF 2782 + 2774 ACC2 + 2775 VECTLENGTH + 2776 PUSHACC5 + 2777 PUSHACC5 + 2778 ADDINT + 2779 GTINT + 2780 BRANCHIFNOT 2789 + 2782 GETGLOBAL "Array.blit" + 2784 PUSHGETGLOBALFIELD Pervasives, 2 + 2787 APPTERM1 6 + 2789 ACC3 + 2790 PUSHACC2 + 2791 LTINT + 2792 BRANCHIFNOT 2827 + 2794 ACC4 + 2795 OFFSETINT -1 + 2797 PUSHCONST0 + 2798 PUSH + 2799 BRANCH 2819 + 2801 CHECK_SIGNALS + 2802 ACC1 + 2803 PUSHACC4 + 2804 ADDINT + 2805 PUSHACC3 + 2806 C_CALL2 array_unsafe_get + 2808 PUSHACC2 + 2809 PUSHACC7 + 2810 ADDINT + 2811 PUSHACC6 + 2812 C_CALL3 array_unsafe_set + 2814 ACC1 + 2815 OFFSETINT -1 + 2817 ASSIGN 1 + 2819 ACC0 + 2820 PUSHACC2 + 2821 GEINT + 2822 BRANCHIF 2801 + 2824 CONST0 + 2825 RETURN 7 + 2827 CONST0 + 2828 PUSHACC5 + 2829 OFFSETINT -1 + 2831 PUSH + 2832 BRANCH 2852 + 2834 CHECK_SIGNALS + 2835 ACC1 + 2836 PUSHACC4 + 2837 ADDINT + 2838 PUSHACC3 + 2839 C_CALL2 array_unsafe_get + 2841 PUSHACC2 + 2842 PUSHACC7 + 2843 ADDINT + 2844 PUSHACC6 + 2845 C_CALL3 array_unsafe_set + 2847 ACC1 + 2848 OFFSETINT 1 + 2850 ASSIGN 1 + 2852 ACC0 + 2853 PUSHACC2 + 2854 LEINT + 2855 BRANCHIF 2834 + 2857 CONST0 + 2858 RETURN 7 + 2860 RESTART + 2861 GRAB 3 + 2863 CONST0 + 2864 PUSHACC2 + 2865 LTINT + 2866 BRANCHIF 2881 + 2868 CONST0 + 2869 PUSHACC3 + 2870 LTINT + 2871 BRANCHIF 2881 + 2873 ACC0 + 2874 VECTLENGTH + 2875 PUSHACC3 + 2876 PUSHACC3 + 2877 ADDINT + 2878 GTINT + 2879 BRANCHIFNOT 2888 + 2881 GETGLOBAL "Array.fill" + 2883 PUSHGETGLOBALFIELD Pervasives, 2 + 2886 APPTERM1 5 + 2888 ACC1 + 2889 PUSHACC3 + 2890 PUSHACC3 + 2891 ADDINT + 2892 OFFSETINT -1 + 2894 PUSH + 2895 BRANCH 2908 + 2897 CHECK_SIGNALS + 2898 ACC5 + 2899 PUSHACC2 + 2900 PUSHACC4 + 2901 C_CALL3 array_unsafe_set + 2903 ACC1 + 2904 OFFSETINT 1 + 2906 ASSIGN 1 + 2908 ACC0 + 2909 PUSHACC2 + 2910 LEINT + 2911 BRANCHIF 2897 + 2913 CONST0 + 2914 RETURN 6 + 2916 RESTART + 2917 GRAB 2 + 2919 CONST0 + 2920 PUSHACC2 + 2921 LTINT + 2922 BRANCHIF 2937 + 2924 CONST0 + 2925 PUSHACC3 + 2926 LTINT + 2927 BRANCHIF 2937 + 2929 ACC0 + 2930 VECTLENGTH + 2931 PUSHACC3 + 2932 PUSHACC3 + 2933 ADDINT + 2934 GTINT + 2935 BRANCHIFNOT 2944 + 2937 GETGLOBAL "Array.sub" + 2939 PUSHGETGLOBALFIELD Pervasives, 2 + 2942 APPTERM1 4 + 2944 CONST0 + 2945 PUSHACC3 + 2946 EQ + 2947 BRANCHIFNOT 2952 + 2949 ATOM0 + 2950 RETURN 3 + 2952 ACC1 + 2953 PUSHACC1 + 2954 C_CALL2 array_unsafe_get + 2956 PUSHACC3 + 2957 C_CALL2 make_vect + 2959 PUSHCONST1 + 2960 PUSHACC4 + 2961 OFFSETINT -1 + 2963 PUSH + 2964 BRANCH 2982 + 2966 CHECK_SIGNALS + 2967 ACC1 + 2968 PUSHACC5 + 2969 ADDINT + 2970 PUSHACC4 + 2971 C_CALL2 array_unsafe_get + 2973 PUSHACC2 + 2974 PUSHACC4 + 2975 C_CALL3 array_unsafe_set + 2977 ACC1 + 2978 OFFSETINT 1 + 2980 ASSIGN 1 + 2982 ACC0 + 2983 PUSHACC2 + 2984 LEINT + 2985 BRANCHIF 2966 + 2987 CONST0 + 2988 POP 2 + 2990 ACC0 + 2991 RETURN 4 + 2993 ACC0 + 2994 BRANCHIFNOT 3017 + 2996 ACC0 + 2997 GETFIELD0 + 2998 PUSHCONST0 + 2999 PUSHACC1 + 3000 VECTLENGTH + 3001 GTINT + 3002 BRANCHIFNOT 3012 + 3004 ENVACC2 + 3005 PUSHCONST0 + 3006 PUSHACC2 + 3007 C_CALL2 array_unsafe_get + 3009 PUSHENVACC1 + 3010 APPTERM2 4 + 3012 ACC1 + 3013 GETFIELD1 + 3014 PUSHOFFSETCLOSURE0 + 3015 APPTERM1 3 + 3017 ATOM0 + 3018 RETURN 1 + 3020 ACC0 + 3021 PUSHENVACC1 + 3022 CLOSUREREC 2, 2993 + 3026 ACC1 + 3027 PUSHACC1 + 3028 APPTERM1 3 + 3030 CONST0 + 3031 PUSHACC1 + 3032 VECTLENGTH + 3033 OFFSETINT -1 + 3035 PUSH + 3036 BRANCH 3056 + 3038 CHECK_SIGNALS + 3039 ACC1 + 3040 PUSHACC3 + 3041 C_CALL2 array_unsafe_get + 3043 PUSHENVACC2 + 3044 GETFIELD0 + 3045 PUSHENVACC1 + 3046 C_CALL3 array_unsafe_set + 3048 ENVACC2 + 3049 OFFSETREF 1 + 3051 ACC1 + 3052 OFFSETINT 1 + 3054 ASSIGN 1 + 3056 ACC0 + 3057 PUSHACC2 + 3058 LEINT + 3059 BRANCHIF 3038 + 3061 CONST0 + 3062 RETURN 3 + 3064 RESTART + 3065 GRAB 1 + 3067 ACC1 + 3068 VECTLENGTH + 3069 PUSHACC1 + 3070 ADDINT + 3071 RETURN 2 + 3073 RESTART + 3074 GRAB 1 + 3076 ACC1 + 3077 PUSHCONST0 + 3078 PUSH + 3079 CLOSURE 0, 3065 + 3082 PUSHGETGLOBALFIELD List, 12 + 3085 APPLY3 + 3086 PUSHACC1 + 3087 PUSHACC1 + 3088 C_CALL2 make_vect + 3090 PUSHCONST0 + 3091 MAKEBLOCK1 0 + 3093 PUSHACC4 + 3094 PUSHACC1 + 3095 PUSHACC3 + 3096 CLOSURE 2, 3030 + 3099 PUSHGETGLOBALFIELD List, 9 + 3102 APPLY2 + 3103 ACC1 + 3104 RETURN 5 + 3106 RESTART + 3107 GRAB 1 + 3109 ACC0 + 3110 VECTLENGTH + 3111 PUSHACC2 + 3112 VECTLENGTH + 3113 PUSHCONST0 + 3114 PUSHACC2 + 3115 EQ + 3116 BRANCHIFNOT 3126 + 3118 CONST0 + 3119 PUSHACC1 + 3120 EQ + 3121 BRANCHIFNOT 3126 + 3123 ATOM0 + 3124 RETURN 4 + 3126 CONST0 + 3127 PUSHCONST0 + 3128 PUSHACC3 + 3129 GTINT + 3130 BRANCHIFNOT 3135 + 3132 ACC3 + 3133 BRANCH 3136 + 3135 ACC4 + 3136 C_CALL2 array_unsafe_get + 3138 PUSHACC1 + 3139 PUSHACC3 + 3140 ADDINT + 3141 C_CALL2 make_vect + 3143 PUSHCONST0 + 3144 PUSHACC3 + 3145 OFFSETINT -1 + 3147 PUSH + 3148 BRANCH 3164 + 3150 CHECK_SIGNALS + 3151 ACC1 + 3152 PUSHACC6 + 3153 C_CALL2 array_unsafe_get + 3155 PUSHACC2 + 3156 PUSHACC4 + 3157 C_CALL3 array_unsafe_set + 3159 ACC1 + 3160 OFFSETINT 1 + 3162 ASSIGN 1 + 3164 ACC0 + 3165 PUSHACC2 + 3166 LEINT + 3167 BRANCHIF 3150 + 3169 CONST0 + 3170 POP 2 + 3172 CONST0 + 3173 PUSHACC2 + 3174 OFFSETINT -1 + 3176 PUSH + 3177 BRANCH 3195 + 3179 CHECK_SIGNALS + 3180 ACC1 + 3181 PUSHACC7 + 3182 C_CALL2 array_unsafe_get + 3184 PUSHACC5 + 3185 PUSHACC3 + 3186 ADDINT + 3187 PUSHACC4 + 3188 C_CALL3 array_unsafe_set + 3190 ACC1 + 3191 OFFSETINT 1 + 3193 ASSIGN 1 + 3195 ACC0 + 3196 PUSHACC2 + 3197 LEINT + 3198 BRANCHIF 3179 + 3200 CONST0 + 3201 POP 2 + 3203 ACC0 + 3204 RETURN 5 + 3206 ACC0 + 3207 VECTLENGTH + 3208 PUSHCONST0 + 3209 PUSHACC1 + 3210 EQ + 3211 BRANCHIFNOT 3216 + 3213 ATOM0 + 3214 RETURN 2 + 3216 CONST0 + 3217 PUSHACC2 + 3218 C_CALL2 array_unsafe_get + 3220 PUSHACC1 + 3221 C_CALL2 make_vect + 3223 PUSHCONST1 + 3224 PUSHACC2 + 3225 OFFSETINT -1 + 3227 PUSH + 3228 BRANCH 3244 + 3230 CHECK_SIGNALS + 3231 ACC1 + 3232 PUSHACC5 + 3233 C_CALL2 array_unsafe_get + 3235 PUSHACC2 + 3236 PUSHACC4 + 3237 C_CALL3 array_unsafe_set + 3239 ACC1 + 3240 OFFSETINT 1 + 3242 ASSIGN 1 + 3244 ACC0 + 3245 PUSHACC2 + 3246 LEINT + 3247 BRANCHIF 3230 + 3249 CONST0 + 3250 POP 2 + 3252 ACC0 + 3253 RETURN 3 + 3255 RESTART + 3256 GRAB 2 + 3258 ATOM0 + 3259 PUSHACC1 + 3260 C_CALL2 make_vect + 3262 PUSHCONST0 + 3263 PUSHACC2 + 3264 OFFSETINT -1 + 3266 PUSH + 3267 BRANCH 3282 + 3269 CHECK_SIGNALS + 3270 ACC5 + 3271 PUSHACC5 + 3272 C_CALL2 make_vect + 3274 PUSHACC2 + 3275 PUSHACC4 + 3276 SETVECTITEM + 3277 ACC1 + 3278 OFFSETINT 1 + 3280 ASSIGN 1 + 3282 ACC0 + 3283 PUSHACC2 + 3284 LEINT + 3285 BRANCHIF 3269 + 3287 CONST0 + 3288 POP 2 + 3290 ACC0 + 3291 RETURN 4 + 3293 RESTART + 3294 GRAB 1 + 3296 CONST0 + 3297 PUSHACC1 + 3298 EQ + 3299 BRANCHIFNOT 3304 + 3301 ATOM0 + 3302 RETURN 2 + 3304 CONST0 + 3305 PUSHACC2 + 3306 APPLY1 + 3307 PUSHACC1 + 3308 C_CALL2 make_vect + 3310 PUSHCONST1 + 3311 PUSHACC2 + 3312 OFFSETINT -1 + 3314 PUSH + 3315 BRANCH 3330 + 3317 CHECK_SIGNALS + 3318 ACC1 + 3319 PUSHACC5 + 3320 APPLY1 + 3321 PUSHACC2 + 3322 PUSHACC4 + 3323 C_CALL3 array_unsafe_set + 3325 ACC1 + 3326 OFFSETINT 1 + 3328 ASSIGN 1 + 3330 ACC0 + 3331 PUSHACC2 + 3332 LEINT + 3333 BRANCHIF 3317 + 3335 CONST0 + 3336 POP 2 + 3338 ACC0 + 3339 RETURN 3 + 3341 CLOSURE 0, 3294 + 3344 PUSH + 3345 CLOSURE 0, 3256 + 3348 PUSH + 3349 CLOSURE 0, 3206 + 3352 PUSH + 3353 CLOSURE 0, 3107 + 3356 PUSH + 3357 CLOSURE 0, 3074 + 3360 PUSHACC0 + 3361 CLOSURE 1, 3020 + 3364 PUSH + 3365 CLOSURE 0, 2917 + 3368 PUSH + 3369 CLOSURE 0, 2861 + 3372 PUSH + 3373 CLOSURE 0, 2749 + 3376 PUSH + 3377 CLOSURE 0, 2718 + 3380 PUSH + 3381 CLOSURE 0, 2662 + 3384 PUSH + 3385 CLOSURE 0, 2630 + 3388 PUSH + 3389 CLOSURE 0, 2572 + 3392 PUSH + 3393 CLOSURE 0, 2558 + 3396 PUSH + 3397 CLOSURE 0, 2505 + 3400 PUSH + 3401 CLOSURE 0, 2445 + 3404 PUSH + 3405 CLOSURE 0, 2407 + 3408 PUSHACC0 + 3409 PUSHACC2 + 3410 PUSHACC6 + 3411 PUSHACC 8 + 3413 PUSHACC 10 + 3415 PUSHACC 12 + 3417 PUSHACC 8 + 3419 PUSHACC 10 + 3421 PUSHACC 16 + 3423 PUSHACC 18 + 3425 PUSHACC 24 + 3427 PUSHACC 21 + 3429 PUSHACC 23 + 3431 PUSHACC 26 + 3433 PUSHACC 29 + 3435 PUSHACC 30 + 3437 PUSHACC 32 + 3439 MAKEBLOCK 17, 0 + 3442 POP 17 + 3444 SETGLOBAL Array + 3446 BRANCH 3456 + 3448 ACC0 + 3449 PUSHENVACC1 + 3450 GETFIELD0 + 3451 ADDINT + 3452 PUSHENVACC1 + 3453 SETFIELD0 + 3454 RETURN 1 + 3456 CONST2 + 3457 PUSHCONSTINT 200000 + 3459 C_CALL2 make_vect + 3461 PUSHCONST0 + 3462 MAKEBLOCK1 0 + 3464 PUSHACC1 + 3465 PUSHACC1 + 3466 CLOSURE 1, 3448 + 3469 PUSHGETGLOBALFIELD Array, 11 + 3472 APPLY2 + 3473 CONSTINT 400000 + 3475 PUSHACC1 + 3476 GETFIELD0 + 3477 NEQ + 3478 BRANCHIFNOT 3485 + 3480 GETGLOBAL Not_found + 3482 MAKEBLOCK1 0 + 3484 RAISE + 3485 POP 2 + 3487 ATOM0 + 3488 SETGLOBAL T310-alloc-2 + 3490 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t320-gc-1.ml b/testsuite/tests/tool-ocaml/t320-gc-1.ml new file mode 100644 index 00000000..4d5d6d96 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t320-gc-1.ml @@ -0,0 +1,1589 @@ +open Lib;; +let rec f n = + if n <= 0 then [] + else n :: f (n-1) +in +let l = f 300 in +Gc.minor (); +if List.fold_left (+) 0 l <> 301 * 150 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2432 + 2406 CONST0 + 2407 PUSHACC1 + 2408 LEINT + 2409 BRANCHIFNOT 2414 + 2411 CONST0 + 2412 RETURN 1 + 2414 ACC0 + 2415 OFFSETINT -1 + 2417 PUSHOFFSETCLOSURE0 + 2418 APPLY1 + 2419 PUSHACC1 + 2420 MAKEBLOCK2 0 + 2422 RETURN 1 + 2424 RESTART + 2425 GRAB 1 + 2427 ACC1 + 2428 PUSHACC1 + 2429 ADDINT + 2430 RETURN 2 + 2432 CLOSUREREC 0, 2406 + 2436 CONSTINT 300 + 2438 PUSHACC1 + 2439 APPLY1 + 2440 PUSHCONST0 + 2441 C_CALL1 gc_minor + 2443 CONSTINT 150 + 2445 PUSHCONSTINT 301 + 2447 MULINT + 2448 PUSHACC1 + 2449 PUSHCONST0 + 2450 PUSH + 2451 CLOSURE 0, 2425 + 2454 PUSHGETGLOBALFIELD List, 12 + 2457 APPLY3 + 2458 NEQ + 2459 BRANCHIFNOT 2466 + 2461 GETGLOBAL Not_found + 2463 MAKEBLOCK1 0 + 2465 RAISE + 2466 POP 2 + 2468 ATOM0 + 2469 SETGLOBAL T320-gc-1 + 2471 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t320-gc-2.ml b/testsuite/tests/tool-ocaml/t320-gc-2.ml new file mode 100644 index 00000000..f607f651 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t320-gc-2.ml @@ -0,0 +1,1589 @@ +open Lib;; +let rec f n = + if n <= 0 then [] + else n :: f (n-1) +in +let l = f 300 in +Gc.major (); +if List.fold_left (+) 0 l <> 301 * 150 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2432 + 2406 CONST0 + 2407 PUSHACC1 + 2408 LEINT + 2409 BRANCHIFNOT 2414 + 2411 CONST0 + 2412 RETURN 1 + 2414 ACC0 + 2415 OFFSETINT -1 + 2417 PUSHOFFSETCLOSURE0 + 2418 APPLY1 + 2419 PUSHACC1 + 2420 MAKEBLOCK2 0 + 2422 RETURN 1 + 2424 RESTART + 2425 GRAB 1 + 2427 ACC1 + 2428 PUSHACC1 + 2429 ADDINT + 2430 RETURN 2 + 2432 CLOSUREREC 0, 2406 + 2436 CONSTINT 300 + 2438 PUSHACC1 + 2439 APPLY1 + 2440 PUSHCONST0 + 2441 C_CALL1 gc_major + 2443 CONSTINT 150 + 2445 PUSHCONSTINT 301 + 2447 MULINT + 2448 PUSHACC1 + 2449 PUSHCONST0 + 2450 PUSH + 2451 CLOSURE 0, 2425 + 2454 PUSHGETGLOBALFIELD List, 12 + 2457 APPLY3 + 2458 NEQ + 2459 BRANCHIFNOT 2466 + 2461 GETGLOBAL Not_found + 2463 MAKEBLOCK1 0 + 2465 RAISE + 2466 POP 2 + 2468 ATOM0 + 2469 SETGLOBAL T320-gc-2 + 2471 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t320-gc-3.ml b/testsuite/tests/tool-ocaml/t320-gc-3.ml new file mode 100644 index 00000000..7c33d2fd --- /dev/null +++ b/testsuite/tests/tool-ocaml/t320-gc-3.ml @@ -0,0 +1,1589 @@ +open Lib;; +let rec f n = + if n <= 0 then [] + else n :: f (n-1) +in +let l = f 300 in +Gc.full_major (); +if List.fold_left (+) 0 l <> 301 * 150 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2432 + 2406 CONST0 + 2407 PUSHACC1 + 2408 LEINT + 2409 BRANCHIFNOT 2414 + 2411 CONST0 + 2412 RETURN 1 + 2414 ACC0 + 2415 OFFSETINT -1 + 2417 PUSHOFFSETCLOSURE0 + 2418 APPLY1 + 2419 PUSHACC1 + 2420 MAKEBLOCK2 0 + 2422 RETURN 1 + 2424 RESTART + 2425 GRAB 1 + 2427 ACC1 + 2428 PUSHACC1 + 2429 ADDINT + 2430 RETURN 2 + 2432 CLOSUREREC 0, 2406 + 2436 CONSTINT 300 + 2438 PUSHACC1 + 2439 APPLY1 + 2440 PUSHCONST0 + 2441 C_CALL1 gc_full_major + 2443 CONSTINT 150 + 2445 PUSHCONSTINT 301 + 2447 MULINT + 2448 PUSHACC1 + 2449 PUSHCONST0 + 2450 PUSH + 2451 CLOSURE 0, 2425 + 2454 PUSHGETGLOBALFIELD List, 12 + 2457 APPLY3 + 2458 NEQ + 2459 BRANCHIFNOT 2466 + 2461 GETGLOBAL Not_found + 2463 MAKEBLOCK1 0 + 2465 RAISE + 2466 POP 2 + 2468 ATOM0 + 2469 SETGLOBAL T320-gc-3 + 2471 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t330-compact-1.ml b/testsuite/tests/tool-ocaml/t330-compact-1.ml new file mode 100644 index 00000000..efa958fd --- /dev/null +++ b/testsuite/tests/tool-ocaml/t330-compact-1.ml @@ -0,0 +1,15 @@ +open Lib;; +Gc.compact ();; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 CONST0 + 10 C_CALL1 gc_compaction + 12 ATOM0 + 13 SETGLOBAL T330-compact-1 + 15 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t330-compact-2.ml b/testsuite/tests/tool-ocaml/t330-compact-2.ml new file mode 100644 index 00000000..62ab0141 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t330-compact-2.ml @@ -0,0 +1,755 @@ +open Lib;; +Gc.compact ();; +let _ = Pervasives.do_at_exit();; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 CONST0 + 1198 C_CALL1 gc_compaction + 1200 CONST0 + 1201 PUSHGETGLOBALFIELD Pervasives, 68 + 1204 APPLY1 + 1205 ATOM0 + 1206 SETGLOBAL T330-compact-2 + 1208 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t330-compact-3.ml b/testsuite/tests/tool-ocaml/t330-compact-3.ml new file mode 100644 index 00000000..f25c64ef --- /dev/null +++ b/testsuite/tests/tool-ocaml/t330-compact-3.ml @@ -0,0 +1,1589 @@ +open Lib;; +let rec f n = + if n <= 0 then [] + else n :: f (n-1) +in +let l = f 300 in +Gc.compact (); +if List.fold_left (+) 0 l <> 301 * 150 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2432 + 2406 CONST0 + 2407 PUSHACC1 + 2408 LEINT + 2409 BRANCHIFNOT 2414 + 2411 CONST0 + 2412 RETURN 1 + 2414 ACC0 + 2415 OFFSETINT -1 + 2417 PUSHOFFSETCLOSURE0 + 2418 APPLY1 + 2419 PUSHACC1 + 2420 MAKEBLOCK2 0 + 2422 RETURN 1 + 2424 RESTART + 2425 GRAB 1 + 2427 ACC1 + 2428 PUSHACC1 + 2429 ADDINT + 2430 RETURN 2 + 2432 CLOSUREREC 0, 2406 + 2436 CONSTINT 300 + 2438 PUSHACC1 + 2439 APPLY1 + 2440 PUSHCONST0 + 2441 C_CALL1 gc_compaction + 2443 CONSTINT 150 + 2445 PUSHCONSTINT 301 + 2447 MULINT + 2448 PUSHACC1 + 2449 PUSHCONST0 + 2450 PUSH + 2451 CLOSURE 0, 2425 + 2454 PUSHGETGLOBALFIELD List, 12 + 2457 APPLY3 + 2458 NEQ + 2459 BRANCHIFNOT 2466 + 2461 GETGLOBAL Not_found + 2463 MAKEBLOCK1 0 + 2465 RAISE + 2466 POP 2 + 2468 ATOM0 + 2469 SETGLOBAL T330-compact-3 + 2471 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t330-compact-4.ml b/testsuite/tests/tool-ocaml/t330-compact-4.ml new file mode 100644 index 00000000..1c190f75 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t330-compact-4.ml @@ -0,0 +1,1589 @@ +open Lib;; +let rec f n = + if n <= 0 then [] + else n :: f (n-1) +in +Gc.compact (); +let l = f 300 in +if List.fold_left (+) 0 l <> 301 * 150 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2432 + 2406 CONST0 + 2407 PUSHACC1 + 2408 LEINT + 2409 BRANCHIFNOT 2414 + 2411 CONST0 + 2412 RETURN 1 + 2414 ACC0 + 2415 OFFSETINT -1 + 2417 PUSHOFFSETCLOSURE0 + 2418 APPLY1 + 2419 PUSHACC1 + 2420 MAKEBLOCK2 0 + 2422 RETURN 1 + 2424 RESTART + 2425 GRAB 1 + 2427 ACC1 + 2428 PUSHACC1 + 2429 ADDINT + 2430 RETURN 2 + 2432 CLOSUREREC 0, 2406 + 2436 CONST0 + 2437 C_CALL1 gc_compaction + 2439 CONSTINT 300 + 2441 PUSHACC1 + 2442 APPLY1 + 2443 PUSHCONSTINT 150 + 2445 PUSHCONSTINT 301 + 2447 MULINT + 2448 PUSHACC1 + 2449 PUSHCONST0 + 2450 PUSH + 2451 CLOSURE 0, 2425 + 2454 PUSHGETGLOBALFIELD List, 12 + 2457 APPLY3 + 2458 NEQ + 2459 BRANCHIFNOT 2466 + 2461 GETGLOBAL Not_found + 2463 MAKEBLOCK1 0 + 2465 RAISE + 2466 POP 2 + 2468 ATOM0 + 2469 SETGLOBAL T330-compact-4 + 2471 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t340-weak.ml b/testsuite/tests/tool-ocaml/t340-weak.ml new file mode 100644 index 00000000..e36dbab5 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t340-weak.ml @@ -0,0 +1,2551 @@ +open Lib;; +let x = Array.make 20 "" in +let w = weak_create 20 in +for i = 0 to 19 do + x.(i) <- String.make 20 's'; + weak_set w i (Some x.(i)); +done; +Gc.full_major (); +for i = 0 to 19 do + match weak_get w i with + | None -> raise Not_found + | _ -> () +done; +for i = 0 to 19 do + if i mod 2 = 0 then x.(i) <- "" +done; +Gc.full_major (); +for i = 0 to 19 do + match weak_get w i with + | None when i mod 2 = 0 -> () + | Some s when i mod 2 = 1 -> if s.[5] <> 's' then raise Not_found + | _ -> raise Not_found +done +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2622 + 2406 CONSTINT 97 + 2408 PUSHACC1 + 2409 GEINT + 2410 BRANCHIFNOT 2418 + 2412 CONSTINT 122 + 2414 PUSHACC1 + 2415 LEINT + 2416 BRANCHIF 2442 + 2418 CONSTINT 224 + 2420 PUSHACC1 + 2421 GEINT + 2422 BRANCHIFNOT 2430 + 2424 CONSTINT 246 + 2426 PUSHACC1 + 2427 LEINT + 2428 BRANCHIF 2442 + 2430 CONSTINT 248 + 2432 PUSHACC1 + 2433 GEINT + 2434 BRANCHIFNOT 2447 + 2436 CONSTINT 254 + 2438 PUSHACC1 + 2439 LEINT + 2440 BRANCHIFNOT 2447 + 2442 ACC0 + 2443 OFFSETINT -32 + 2445 RETURN 1 + 2447 ACC0 + 2448 RETURN 1 + 2450 CONSTINT 65 + 2452 PUSHACC1 + 2453 GEINT + 2454 BRANCHIFNOT 2462 + 2456 CONSTINT 90 + 2458 PUSHACC1 + 2459 LEINT + 2460 BRANCHIF 2486 + 2462 CONSTINT 192 + 2464 PUSHACC1 + 2465 GEINT + 2466 BRANCHIFNOT 2474 + 2468 CONSTINT 214 + 2470 PUSHACC1 + 2471 LEINT + 2472 BRANCHIF 2486 + 2474 CONSTINT 216 + 2476 PUSHACC1 + 2477 GEINT + 2478 BRANCHIFNOT 2491 + 2480 CONSTINT 222 + 2482 PUSHACC1 + 2483 LEINT + 2484 BRANCHIFNOT 2491 + 2486 ACC0 + 2487 OFFSETINT 32 + 2489 RETURN 1 + 2491 ACC0 + 2492 RETURN 1 + 2494 CONSTINT 39 + 2496 PUSHACC1 + 2497 LTINT + 2498 BRANCHIFNOT 2520 + 2500 CONSTINT 9 + 2502 PUSHACC1 + 2503 EQ + 2504 BRANCHIFNOT 2510 + 2506 GETGLOBAL "\\t" + 2508 RETURN 1 + 2510 CONSTINT 13 + 2512 PUSHACC1 + 2513 EQ + 2514 BRANCHIFNOT 2540 + 2516 GETGLOBAL "\\n" + 2518 RETURN 1 + 2520 CONSTINT 39 + 2522 PUSHACC1 + 2523 EQ + 2524 BRANCHIFNOT 2530 + 2526 GETGLOBAL "\\'" + 2528 RETURN 1 + 2530 CONSTINT 92 + 2532 PUSHACC1 + 2533 EQ + 2534 BRANCHIFNOT 2540 + 2536 GETGLOBAL "\\\\" + 2538 RETURN 1 + 2540 ACC0 + 2541 C_CALL1 is_printable + 2543 BRANCHIFNOT 2555 + 2545 CONST1 + 2546 C_CALL1 create_string + 2548 PUSHACC1 + 2549 PUSHCONST0 + 2550 PUSHACC2 + 2551 SETSTRINGCHAR + 2552 ACC0 + 2553 RETURN 2 + 2555 ACC0 + 2556 PUSHCONSTINT 4 + 2558 C_CALL1 create_string + 2560 PUSHCONSTINT 92 + 2562 PUSHCONST0 + 2563 PUSHACC2 + 2564 SETSTRINGCHAR + 2565 CONSTINT 100 + 2567 PUSHACC2 + 2568 DIVINT + 2569 PUSHCONSTINT 48 + 2571 ADDINT + 2572 PUSHCONST1 + 2573 PUSHACC2 + 2574 SETSTRINGCHAR + 2575 CONSTINT 10 + 2577 PUSHCONSTINT 10 + 2579 PUSHACC3 + 2580 DIVINT + 2581 MODINT + 2582 PUSHCONSTINT 48 + 2584 ADDINT + 2585 PUSHCONST2 + 2586 PUSHACC2 + 2587 SETSTRINGCHAR + 2588 CONSTINT 10 + 2590 PUSHACC2 + 2591 MODINT + 2592 PUSHCONSTINT 48 + 2594 ADDINT + 2595 PUSHCONST3 + 2596 PUSHACC2 + 2597 SETSTRINGCHAR + 2598 ACC0 + 2599 RETURN 3 + 2601 CONST0 + 2602 PUSHACC1 + 2603 LTINT + 2604 BRANCHIF 2612 + 2606 CONSTINT 255 + 2608 PUSHACC1 + 2609 GTINT + 2610 BRANCHIFNOT 2619 + 2612 GETGLOBAL "Char.chr" + 2614 PUSHGETGLOBALFIELD Pervasives, 2 + 2617 APPTERM1 2 + 2619 ACC0 + 2620 RETURN 1 + 2622 CLOSURE 0, 2601 + 2625 PUSH + 2626 CLOSURE 0, 2494 + 2629 PUSH + 2630 CLOSURE 0, 2450 + 2633 PUSH + 2634 CLOSURE 0, 2406 + 2637 PUSHACC0 + 2638 PUSHACC2 + 2639 PUSHACC4 + 2640 PUSHACC6 + 2641 MAKEBLOCK 4, 0 + 2644 POP 4 + 2646 SETGLOBAL Char + 2648 BRANCH 3540 + 2650 RESTART + 2651 GRAB 3 + 2653 ACC1 + 2654 PUSHACC3 + 2655 GEINT + 2656 BRANCHIFNOT 2663 + 2658 GETGLOBAL Not_found + 2660 MAKEBLOCK1 0 + 2662 RAISE + 2663 ACC3 + 2664 PUSHACC3 + 2665 PUSHACC2 + 2666 GETSTRINGCHAR + 2667 EQ + 2668 BRANCHIFNOT 2673 + 2670 ACC2 + 2671 RETURN 4 + 2673 ACC3 + 2674 PUSHACC3 + 2675 OFFSETINT 1 + 2677 PUSHACC3 + 2678 PUSHACC3 + 2679 PUSHOFFSETCLOSURE0 + 2680 APPTERM 4, 8 + 2683 RESTART + 2684 GRAB 2 + 2686 CONST0 + 2687 PUSHACC2 + 2688 LTINT + 2689 BRANCHIFNOT 2696 + 2691 GETGLOBAL Not_found + 2693 MAKEBLOCK1 0 + 2695 RAISE + 2696 ACC2 + 2697 PUSHACC2 + 2698 PUSHACC2 + 2699 GETSTRINGCHAR + 2700 EQ + 2701 BRANCHIFNOT 2706 + 2703 ACC1 + 2704 RETURN 3 + 2706 ACC2 + 2707 PUSHACC2 + 2708 OFFSETINT -1 + 2710 PUSHACC2 + 2711 PUSHOFFSETCLOSURE0 + 2712 APPTERM3 6 + 2714 RESTART + 2715 GRAB 1 + 2717 ACC1 + 2718 PUSHCONST0 + 2719 PUSHACC2 + 2720 PUSHENVACC1 + 2721 APPTERM3 5 + 2723 RESTART + 2724 GRAB 2 + 2726 CONST0 + 2727 PUSHACC2 + 2728 LTINT + 2729 BRANCHIF 2738 + 2731 ACC0 + 2732 C_CALL1 ml_string_length + 2734 PUSHACC2 + 2735 GEINT + 2736 BRANCHIFNOT 2745 + 2738 GETGLOBAL "String.rcontains_from" + 2740 PUSHGETGLOBALFIELD Pervasives, 2 + 2743 APPTERM1 4 + 2745 PUSHTRAP 2756 + 2747 ACC6 + 2748 PUSHACC6 + 2749 PUSHACC6 + 2750 PUSHENVACC1 + 2751 APPLY3 + 2752 CONST1 + 2753 POPTRAP + 2754 RETURN 3 + 2756 PUSHGETGLOBAL Not_found + 2758 PUSHACC1 + 2759 GETFIELD0 + 2760 EQ + 2761 BRANCHIFNOT 2766 + 2763 CONST0 + 2764 RETURN 4 + 2766 ACC0 + 2767 RAISE + 2768 RESTART + 2769 GRAB 2 + 2771 CONST0 + 2772 PUSHACC2 + 2773 LTINT + 2774 BRANCHIF 2783 + 2776 ACC0 + 2777 C_CALL1 ml_string_length + 2779 PUSHACC2 + 2780 GTINT + 2781 BRANCHIFNOT 2790 + 2783 GETGLOBAL "String.contains_from" + 2785 PUSHGETGLOBALFIELD Pervasives, 2 + 2788 APPTERM1 4 + 2790 PUSHTRAP 2811 + 2792 PUSH_RETADDR 2807 + 2794 ACC 9 + 2796 PUSHACC 9 + 2798 PUSHACC 9 + 2800 C_CALL1 ml_string_length + 2802 PUSHACC 10 + 2804 PUSHENVACC1 + 2805 APPLY 4 + 2807 CONST1 + 2808 POPTRAP + 2809 RETURN 3 + 2811 PUSHGETGLOBAL Not_found + 2813 PUSHACC1 + 2814 GETFIELD0 + 2815 EQ + 2816 BRANCHIFNOT 2821 + 2818 CONST0 + 2819 RETURN 4 + 2821 ACC0 + 2822 RAISE + 2823 RESTART + 2824 GRAB 2 + 2826 CONST0 + 2827 PUSHACC2 + 2828 LTINT + 2829 BRANCHIF 2838 + 2831 ACC0 + 2832 C_CALL1 ml_string_length + 2834 PUSHACC2 + 2835 GEINT + 2836 BRANCHIFNOT 2845 + 2838 GETGLOBAL "String.rindex_from" + 2840 PUSHGETGLOBALFIELD Pervasives, 2 + 2843 APPTERM1 4 + 2845 ACC2 + 2846 PUSHACC2 + 2847 PUSHACC2 + 2848 PUSHENVACC1 + 2849 APPTERM3 6 + 2851 RESTART + 2852 GRAB 1 + 2854 ACC1 + 2855 PUSHACC1 + 2856 C_CALL1 ml_string_length + 2858 OFFSETINT -1 + 2860 PUSHACC2 + 2861 PUSHENVACC1 + 2862 APPTERM3 5 + 2864 RESTART + 2865 GRAB 2 + 2867 CONST0 + 2868 PUSHACC2 + 2869 LTINT + 2870 BRANCHIF 2879 + 2872 ACC0 + 2873 C_CALL1 ml_string_length + 2875 PUSHACC2 + 2876 GTINT + 2877 BRANCHIFNOT 2886 + 2879 GETGLOBAL "String.index_from" + 2881 PUSHGETGLOBALFIELD Pervasives, 2 + 2884 APPTERM1 4 + 2886 ACC2 + 2887 PUSHACC2 + 2888 PUSHACC2 + 2889 C_CALL1 ml_string_length + 2891 PUSHACC3 + 2892 PUSHENVACC1 + 2893 APPTERM 4, 7 + 2896 RESTART + 2897 GRAB 1 + 2899 ACC1 + 2900 PUSHCONST0 + 2901 PUSHACC2 + 2902 C_CALL1 ml_string_length + 2904 PUSHACC3 + 2905 PUSHENVACC1 + 2906 APPTERM 4, 6 + 2909 ACC0 + 2910 PUSHGETGLOBALFIELD Char, 2 + 2913 PUSHENVACC1 + 2914 APPTERM2 3 + 2916 ACC0 + 2917 PUSHGETGLOBALFIELD Char, 3 + 2920 PUSHENVACC1 + 2921 APPTERM2 3 + 2923 RESTART + 2924 GRAB 1 + 2926 CONST0 + 2927 PUSHACC2 + 2928 C_CALL1 ml_string_length + 2930 EQ + 2931 BRANCHIFNOT 2936 + 2933 ACC1 + 2934 RETURN 2 + 2936 ACC1 + 2937 PUSHENVACC1 + 2938 APPLY1 + 2939 PUSHCONST0 + 2940 PUSHACC3 + 2941 GETSTRINGCHAR + 2942 PUSHACC2 + 2943 APPLY1 + 2944 PUSHCONST0 + 2945 PUSHACC2 + 2946 SETSTRINGCHAR + 2947 ACC0 + 2948 RETURN 3 + 2950 ACC0 + 2951 PUSHGETGLOBALFIELD Char, 2 + 2954 PUSHENVACC1 + 2955 APPTERM2 3 + 2957 ACC0 + 2958 PUSHGETGLOBALFIELD Char, 3 + 2961 PUSHENVACC1 + 2962 APPTERM2 3 + 2964 RESTART + 2965 GRAB 1 + 2967 ACC1 + 2968 C_CALL1 ml_string_length + 2970 PUSHCONST0 + 2971 PUSHACC1 + 2972 EQ + 2973 BRANCHIFNOT 2978 + 2975 ACC2 + 2976 RETURN 3 + 2978 ACC0 + 2979 C_CALL1 create_string + 2981 PUSHCONST0 + 2982 PUSHACC2 + 2983 OFFSETINT -1 + 2985 PUSH + 2986 BRANCH 3002 + 2988 CHECK_SIGNALS + 2989 ACC1 + 2990 PUSHACC6 + 2991 GETSTRINGCHAR + 2992 PUSHACC5 + 2993 APPLY1 + 2994 PUSHACC2 + 2995 PUSHACC4 + 2996 SETSTRINGCHAR + 2997 ACC1 + 2998 OFFSETINT 1 + 3000 ASSIGN 1 + 3002 ACC0 + 3003 PUSHACC2 + 3004 LEINT + 3005 BRANCHIF 2988 + 3007 CONST0 + 3008 POP 2 + 3010 ACC0 + 3011 RETURN 4 + 3013 CONST0 + 3014 PUSHCONST0 + 3015 PUSHACC2 + 3016 C_CALL1 ml_string_length + 3018 OFFSETINT -1 + 3020 PUSH + 3021 BRANCH 3059 + 3023 CHECK_SIGNALS + 3024 ACC1 + 3025 PUSHACC4 + 3026 GETSTRINGCHAR + 3027 PUSHACC0 + 3028 PUSHGETGLOBAL "\000\"\000\000\004\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + 3030 C_CALL2 bitvect_test + 3032 BRANCHIFNOT 3038 + 3034 CONST0 + 3035 CONST2 + 3036 BRANCH 3048 + 3038 ACC0 + 3039 C_CALL1 is_printable + 3041 BRANCHIFNOT 3046 + 3043 CONST1 + 3044 BRANCH 3048 + 3046 CONSTINT 4 + 3048 POP 1 + 3050 PUSHACC3 + 3051 ADDINT + 3052 ASSIGN 2 + 3054 ACC1 + 3055 OFFSETINT 1 + 3057 ASSIGN 1 + 3059 ACC0 + 3060 PUSHACC2 + 3061 LEINT + 3062 BRANCHIF 3023 + 3064 CONST0 + 3065 POP 2 + 3067 ACC1 + 3068 C_CALL1 ml_string_length + 3070 PUSHACC1 + 3071 EQ + 3072 BRANCHIFNOT 3077 + 3074 ACC1 + 3075 RETURN 2 + 3077 ACC0 + 3078 C_CALL1 create_string + 3080 PUSHCONST0 + 3081 ASSIGN 1 + 3083 CONST0 + 3084 PUSHACC3 + 3085 C_CALL1 ml_string_length + 3087 OFFSETINT -1 + 3089 PUSH + 3090 BRANCH 3245 + 3092 CHECK_SIGNALS + 3093 ACC1 + 3094 PUSHACC5 + 3095 GETSTRINGCHAR + 3096 PUSHACC0 + 3097 PUSHGETGLOBAL "\000\000\000\000\004\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + 3099 C_CALL2 bitvect_test + 3101 BRANCHIFNOT 3120 + 3103 CONST0 + 3104 CONSTINT 92 + 3106 PUSHACC5 + 3107 PUSHACC5 + 3108 SETSTRINGCHAR + 3109 ACC4 + 3110 OFFSETINT 1 + 3112 ASSIGN 4 + 3114 ACC0 + 3115 PUSHACC5 + 3116 PUSHACC5 + 3117 SETSTRINGCHAR + 3118 BRANCH 3233 + 3120 CONSTINT 9 + 3122 PUSHACC1 + 3123 EQ + 3124 BRANCHIFNOT 3143 + 3126 CONSTINT 92 + 3128 PUSHACC5 + 3129 PUSHACC5 + 3130 SETSTRINGCHAR + 3131 ACC4 + 3132 OFFSETINT 1 + 3134 ASSIGN 4 + 3136 CONSTINT 116 + 3138 PUSHACC5 + 3139 PUSHACC5 + 3140 SETSTRINGCHAR + 3141 BRANCH 3233 + 3143 CONSTINT 13 + 3145 PUSHACC1 + 3146 EQ + 3147 BRANCHIFNOT 3166 + 3149 CONSTINT 92 + 3151 PUSHACC5 + 3152 PUSHACC5 + 3153 SETSTRINGCHAR + 3154 ACC4 + 3155 OFFSETINT 1 + 3157 ASSIGN 4 + 3159 CONSTINT 110 + 3161 PUSHACC5 + 3162 PUSHACC5 + 3163 SETSTRINGCHAR + 3164 BRANCH 3233 + 3166 ACC0 + 3167 C_CALL1 is_printable + 3169 BRANCHIFNOT 3177 + 3171 ACC0 + 3172 PUSHACC5 + 3173 PUSHACC5 + 3174 SETSTRINGCHAR + 3175 BRANCH 3233 + 3177 ACC0 + 3178 PUSHCONSTINT 92 + 3180 PUSHACC6 + 3181 PUSHACC6 + 3182 SETSTRINGCHAR + 3183 ACC5 + 3184 OFFSETINT 1 + 3186 ASSIGN 5 + 3188 CONSTINT 100 + 3190 PUSHACC1 + 3191 DIVINT + 3192 PUSHCONSTINT 48 + 3194 ADDINT + 3195 PUSHACC6 + 3196 PUSHACC6 + 3197 SETSTRINGCHAR + 3198 ACC5 + 3199 OFFSETINT 1 + 3201 ASSIGN 5 + 3203 CONSTINT 10 + 3205 PUSHCONSTINT 10 + 3207 PUSHACC2 + 3208 DIVINT + 3209 MODINT + 3210 PUSHCONSTINT 48 + 3212 ADDINT + 3213 PUSHACC6 + 3214 PUSHACC6 + 3215 SETSTRINGCHAR + 3216 ACC5 + 3217 OFFSETINT 1 + 3219 ASSIGN 5 + 3221 CONSTINT 10 + 3223 PUSHACC1 + 3224 MODINT + 3225 PUSHCONSTINT 48 + 3227 ADDINT + 3228 PUSHACC6 + 3229 PUSHACC6 + 3230 SETSTRINGCHAR + 3231 POP 1 + 3233 POP 1 + 3235 ACC3 + 3236 OFFSETINT 1 + 3238 ASSIGN 3 + 3240 ACC1 + 3241 OFFSETINT 1 + 3243 ASSIGN 1 + 3245 ACC0 + 3246 PUSHACC2 + 3247 LEINT + 3248 BRANCHIF 3092 + 3250 CONST0 + 3251 POP 2 + 3253 ACC0 + 3254 RETURN 3 + 3256 ENVACC1 + 3257 C_CALL1 ml_string_length + 3259 PUSHENVACC3 + 3260 GETFIELD0 + 3261 PUSHENVACC2 + 3262 PUSHCONST0 + 3263 PUSHENVACC1 + 3264 C_CALL5 blit_string + 3266 ENVACC1 + 3267 C_CALL1 ml_string_length + 3269 PUSHENVACC3 + 3270 GETFIELD0 + 3271 ADDINT + 3272 PUSHENVACC3 + 3273 SETFIELD0 + 3274 ACC0 + 3275 C_CALL1 ml_string_length + 3277 PUSHENVACC3 + 3278 GETFIELD0 + 3279 PUSHENVACC2 + 3280 PUSHCONST0 + 3281 PUSHACC4 + 3282 C_CALL5 blit_string + 3284 ACC0 + 3285 C_CALL1 ml_string_length + 3287 PUSHENVACC3 + 3288 GETFIELD0 + 3289 ADDINT + 3290 PUSHENVACC3 + 3291 SETFIELD0 + 3292 RETURN 1 + 3294 ENVACC1 + 3295 OFFSETREF 1 + 3297 ACC0 + 3298 C_CALL1 ml_string_length + 3300 PUSHENVACC2 + 3301 GETFIELD0 + 3302 ADDINT + 3303 PUSHENVACC2 + 3304 SETFIELD0 + 3305 RETURN 1 + 3307 RESTART + 3308 GRAB 1 + 3310 ACC1 + 3311 BRANCHIFNOT 3374 + 3313 ACC1 + 3314 GETFIELD0 + 3315 PUSHCONST0 + 3316 MAKEBLOCK1 0 + 3318 PUSHCONST0 + 3319 MAKEBLOCK1 0 + 3321 PUSHACC4 + 3322 PUSHACC1 + 3323 PUSHACC3 + 3324 CLOSURE 2, 3294 + 3327 PUSHGETGLOBALFIELD List, 9 + 3330 APPLY2 + 3331 ACC1 + 3332 GETFIELD0 + 3333 OFFSETINT -1 + 3335 PUSHACC4 + 3336 C_CALL1 ml_string_length + 3338 MULINT + 3339 PUSHACC1 + 3340 GETFIELD0 + 3341 ADDINT + 3342 C_CALL1 create_string + 3344 PUSHACC3 + 3345 C_CALL1 ml_string_length + 3347 PUSHCONST0 + 3348 PUSHACC2 + 3349 PUSHCONST0 + 3350 PUSHACC7 + 3351 C_CALL5 blit_string + 3353 ACC3 + 3354 C_CALL1 ml_string_length + 3356 MAKEBLOCK1 0 + 3358 PUSHACC6 + 3359 GETFIELD1 + 3360 PUSHACC1 + 3361 PUSHACC3 + 3362 PUSHACC 8 + 3364 CLOSURE 3, 3256 + 3367 PUSHGETGLOBALFIELD List, 9 + 3370 APPLY2 + 3371 ACC1 + 3372 RETURN 7 + 3374 GETGLOBAL "" + 3376 RETURN 2 + 3378 RESTART + 3379 GRAB 4 + 3381 CONST0 + 3382 PUSHACC5 + 3383 LTINT + 3384 BRANCHIF 3414 + 3386 CONST0 + 3387 PUSHACC2 + 3388 LTINT + 3389 BRANCHIF 3414 + 3391 ACC0 + 3392 C_CALL1 ml_string_length + 3394 PUSHACC5 + 3395 PUSHACC3 + 3396 ADDINT + 3397 GTINT + 3398 BRANCHIF 3414 + 3400 CONST0 + 3401 PUSHACC4 + 3402 LTINT + 3403 BRANCHIF 3414 + 3405 ACC2 + 3406 C_CALL1 ml_string_length + 3408 PUSHACC5 + 3409 PUSHACC5 + 3410 ADDINT + 3411 GTINT + 3412 BRANCHIFNOT 3421 + 3414 GETGLOBAL "String.blit" + 3416 PUSHGETGLOBALFIELD Pervasives, 2 + 3419 APPTERM1 6 + 3421 ACC4 + 3422 PUSHACC4 + 3423 PUSHACC4 + 3424 PUSHACC4 + 3425 PUSHACC4 + 3426 C_CALL5 blit_string + 3428 RETURN 5 + 3430 RESTART + 3431 GRAB 3 + 3433 CONST0 + 3434 PUSHACC2 + 3435 LTINT + 3436 BRANCHIF 3452 + 3438 CONST0 + 3439 PUSHACC3 + 3440 LTINT + 3441 BRANCHIF 3452 + 3443 ACC0 + 3444 C_CALL1 ml_string_length + 3446 PUSHACC3 + 3447 PUSHACC3 + 3448 ADDINT + 3449 GTINT + 3450 BRANCHIFNOT 3459 + 3452 GETGLOBAL "String.fill" + 3454 PUSHGETGLOBALFIELD Pervasives, 2 + 3457 APPTERM1 5 + 3459 ACC3 + 3460 PUSHACC3 + 3461 PUSHACC3 + 3462 PUSHACC3 + 3463 C_CALL4 fill_string + 3465 RETURN 4 + 3467 RESTART + 3468 GRAB 2 + 3470 CONST0 + 3471 PUSHACC2 + 3472 LTINT + 3473 BRANCHIF 3489 + 3475 CONST0 + 3476 PUSHACC3 + 3477 LTINT + 3478 BRANCHIF 3489 + 3480 ACC0 + 3481 C_CALL1 ml_string_length + 3483 PUSHACC3 + 3484 PUSHACC3 + 3485 ADDINT + 3486 GTINT + 3487 BRANCHIFNOT 3496 + 3489 GETGLOBAL "String.sub" + 3491 PUSHGETGLOBALFIELD Pervasives, 2 + 3494 APPTERM1 4 + 3496 ACC2 + 3497 C_CALL1 create_string + 3499 PUSHACC3 + 3500 PUSHCONST0 + 3501 PUSHACC2 + 3502 PUSHACC5 + 3503 PUSHACC5 + 3504 C_CALL5 blit_string + 3506 ACC0 + 3507 RETURN 4 + 3509 ACC0 + 3510 C_CALL1 ml_string_length + 3512 PUSHACC0 + 3513 C_CALL1 create_string + 3515 PUSHACC1 + 3516 PUSHCONST0 + 3517 PUSHACC2 + 3518 PUSHCONST0 + 3519 PUSHACC6 + 3520 C_CALL5 blit_string + 3522 ACC0 + 3523 RETURN 3 + 3525 RESTART + 3526 GRAB 1 + 3528 ACC0 + 3529 C_CALL1 create_string + 3531 PUSHACC2 + 3532 PUSHACC2 + 3533 PUSHCONST0 + 3534 PUSHACC3 + 3535 C_CALL4 fill_string + 3537 ACC0 + 3538 RETURN 3 + 3540 CLOSURE 0, 3526 + 3543 PUSH + 3544 CLOSURE 0, 3509 + 3547 PUSH + 3548 CLOSURE 0, 3468 + 3551 PUSH + 3552 CLOSURE 0, 3431 + 3555 PUSH + 3556 CLOSURE 0, 3379 + 3559 PUSH + 3560 CLOSURE 0, 3308 + 3563 PUSH + 3564 CLOSURE 0, 3013 + 3567 PUSH + 3568 CLOSURE 0, 2965 + 3571 PUSHACC0 + 3572 CLOSURE 1, 2957 + 3575 PUSHACC1 + 3576 CLOSURE 1, 2950 + 3579 PUSHACC 8 + 3581 CLOSURE 1, 2924 + 3584 PUSHACC0 + 3585 CLOSURE 1, 2916 + 3588 PUSHACC1 + 3589 CLOSURE 1, 2909 + 3592 PUSH + 3593 CLOSUREREC 0, 2651 + 3597 ACC0 + 3598 CLOSURE 1, 2897 + 3601 PUSHACC1 + 3602 CLOSURE 1, 2865 + 3605 PUSH + 3606 CLOSUREREC 0, 2684 + 3610 ACC0 + 3611 CLOSURE 1, 2852 + 3614 PUSHACC1 + 3615 CLOSURE 1, 2824 + 3618 PUSHACC5 + 3619 CLOSURE 1, 2769 + 3622 PUSHACC3 + 3623 CLOSURE 1, 2724 + 3626 PUSHACC1 + 3627 CLOSURE 1, 2715 + 3630 PUSHACC 9 + 3632 PUSHACC 11 + 3634 PUSHACC 14 + 3636 PUSHACC 16 + 3638 PUSHACC5 + 3639 PUSHACC7 + 3640 PUSHACC6 + 3641 PUSHACC 10 + 3643 PUSHACC 14 + 3645 PUSHACC 13 + 3647 PUSHACC 17 + 3649 PUSHACC 26 + 3651 PUSHACC 28 + 3653 PUSHACC 30 + 3655 PUSHACC 32 + 3657 PUSHACC 34 + 3659 PUSHACC 36 + 3661 PUSHACC 38 + 3663 MAKEBLOCK 18, 0 + 3666 POP 22 + 3668 SETGLOBAL String + 3670 GETGLOBAL "" + 3672 PUSHCONSTINT 20 + 3674 C_CALL2 make_vect + 3676 PUSHCONSTINT 20 + 3678 C_CALL1 weak_create + 3680 PUSHCONST0 + 3681 PUSHCONSTINT 19 + 3683 PUSH + 3684 BRANCH 3712 + 3686 CHECK_SIGNALS + 3687 CONSTINT 115 + 3689 PUSHCONSTINT 20 + 3691 PUSHGETGLOBALFIELD String, 0 + 3694 APPLY2 + 3695 PUSHACC2 + 3696 PUSHACC5 + 3697 SETVECTITEM + 3698 ACC1 + 3699 PUSHACC4 + 3700 GETVECTITEM + 3701 MAKEBLOCK1 0 + 3703 PUSHACC2 + 3704 PUSHACC4 + 3705 C_CALL3 weak_set + 3707 ACC1 + 3708 OFFSETINT 1 + 3710 ASSIGN 1 + 3712 ACC0 + 3713 PUSHACC2 + 3714 LEINT + 3715 BRANCHIF 3686 + 3717 CONST0 + 3718 POP 2 + 3720 CONST0 + 3721 C_CALL1 gc_full_major + 3723 CONST0 + 3724 PUSHCONSTINT 19 + 3726 PUSH + 3727 BRANCH 3750 + 3729 CHECK_SIGNALS + 3730 ACC1 + 3731 PUSHACC3 + 3732 C_CALL2 weak_get + 3734 PUSHACC0 + 3735 BRANCHIF 3742 + 3737 GETGLOBAL Not_found + 3739 MAKEBLOCK1 0 + 3741 RAISE + 3742 CONST0 + 3743 POP 1 + 3745 ACC1 + 3746 OFFSETINT 1 + 3748 ASSIGN 1 + 3750 ACC0 + 3751 PUSHACC2 + 3752 LEINT + 3753 BRANCHIF 3729 + 3755 CONST0 + 3756 POP 2 + 3758 CONST0 + 3759 PUSHCONSTINT 19 + 3761 PUSH + 3762 BRANCH 3782 + 3764 CHECK_SIGNALS + 3765 CONST0 + 3766 PUSHCONST2 + 3767 PUSHACC3 + 3768 MODINT + 3769 EQ + 3770 BRANCHIFNOT 3777 + 3772 GETGLOBAL "" + 3774 PUSHACC2 + 3775 PUSHACC5 + 3776 SETVECTITEM + 3777 ACC1 + 3778 OFFSETINT 1 + 3780 ASSIGN 1 + 3782 ACC0 + 3783 PUSHACC2 + 3784 LEINT + 3785 BRANCHIF 3764 + 3787 CONST0 + 3788 POP 2 + 3790 CONST0 + 3791 C_CALL1 gc_full_major + 3793 CONST0 + 3794 PUSHCONSTINT 19 + 3796 PUSH + 3797 BRANCH 3851 + 3799 CHECK_SIGNALS + 3800 ACC1 + 3801 PUSHACC3 + 3802 C_CALL2 weak_get + 3804 PUSHACC0 + 3805 BRANCHIFNOT 3829 + 3807 CONST1 + 3808 PUSHCONST2 + 3809 PUSHACC4 + 3810 MODINT + 3811 EQ + 3812 BRANCHIFNOT 3839 + 3814 CONSTINT 115 + 3816 PUSHCONSTINT 5 + 3818 PUSHACC2 + 3819 GETFIELD0 + 3820 GETSTRINGCHAR + 3821 NEQ + 3822 BRANCHIFNOT 3844 + 3824 GETGLOBAL Not_found + 3826 MAKEBLOCK1 0 + 3828 RAISE + 3829 CONST0 + 3830 PUSHCONST2 + 3831 PUSHACC4 + 3832 MODINT + 3833 EQ + 3834 BRANCHIFNOT 3839 + 3836 CONST0 + 3837 BRANCH 3844 + 3839 GETGLOBAL Not_found + 3841 MAKEBLOCK1 0 + 3843 RAISE + 3844 POP 1 + 3846 ACC1 + 3847 OFFSETINT 1 + 3849 ASSIGN 1 + 3851 ACC0 + 3852 PUSHACC2 + 3853 LEINT + 3854 BRANCHIF 3799 + 3856 CONST0 + 3857 POP 4 + 3859 ATOM0 + 3860 SETGLOBAL T340-weak + 3862 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t350-heapcheck.ml b/testsuite/tests/tool-ocaml/t350-heapcheck.ml new file mode 100644 index 00000000..ef4557cd --- /dev/null +++ b/testsuite/tests/tool-ocaml/t350-heapcheck.ml @@ -0,0 +1,2554 @@ +open Lib;; +ignore (Gc.stat ()); +let x = Array.make 20 "" in +let w = weak_create 20 in +for i = 0 to 19 do + x.(i) <- String.make 20 's'; + weak_set w i (Some x.(i)); +done; +Gc.full_major (); +for i = 0 to 19 do + match weak_get w i with + | None -> raise Not_found + | _ -> () +done; +for i = 0 to 19 do + if i mod 2 = 0 then x.(i) <- "" +done; +Gc.full_major (); +for i = 0 to 19 do + match weak_get w i with + | None when i mod 2 = 0 -> () + | Some s when i mod 2 = 1 -> if s.[5] <> 's' then raise Not_found + | _ -> raise Not_found +done +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 746 + 11 RESTART + 12 GRAB 1 + 14 ACC0 + 15 BRANCHIFNOT 28 + 17 ACC1 + 18 PUSHACC1 + 19 GETFIELD1 + 20 PUSHOFFSETCLOSURE0 + 21 APPLY2 + 22 PUSHACC1 + 23 GETFIELD0 + 24 MAKEBLOCK2 0 + 26 RETURN 2 + 28 ACC1 + 29 RETURN 2 + 31 RESTART + 32 GRAB 3 + 34 CONST0 + 35 PUSHACC4 + 36 LEINT + 37 BRANCHIFNOT 42 + 39 CONST0 + 40 RETURN 4 + 42 ACC3 + 43 PUSHACC3 + 44 PUSHACC3 + 45 PUSHACC3 + 46 C_CALL4 caml_input + 48 PUSHCONST0 + 49 PUSHACC1 + 50 EQ + 51 BRANCHIFNOT 58 + 53 GETGLOBAL End_of_file + 55 MAKEBLOCK1 0 + 57 RAISE + 58 ACC0 + 59 PUSHACC5 + 60 SUBINT + 61 PUSHACC1 + 62 PUSHACC5 + 63 ADDINT + 64 PUSHACC4 + 65 PUSHACC4 + 66 PUSHOFFSETCLOSURE0 + 67 APPTERM 4, 9 + 70 ACC0 + 71 C_CALL1 caml_input_scan_line + 73 PUSHCONST0 + 74 PUSHACC1 + 75 EQ + 76 BRANCHIFNOT 83 + 78 GETGLOBAL End_of_file + 80 MAKEBLOCK1 0 + 82 RAISE + 83 CONST0 + 84 PUSHACC1 + 85 GTINT + 86 BRANCHIFNOT 107 + 88 ACC0 + 89 OFFSETINT -1 + 91 C_CALL1 create_string + 93 PUSHACC1 + 94 OFFSETINT -1 + 96 PUSHCONST0 + 97 PUSHACC2 + 98 PUSHACC5 + 99 C_CALL4 caml_input + 101 ACC2 + 102 C_CALL1 caml_input_char + 104 ACC0 + 105 RETURN 3 + 107 ACC0 + 108 NEGINT + 109 C_CALL1 create_string + 111 PUSHACC1 + 112 NEGINT + 113 PUSHCONST0 + 114 PUSHACC2 + 115 PUSHACC5 + 116 C_CALL4 caml_input + 118 CONST0 + 119 PUSHTRAP 130 + 121 ACC6 + 122 PUSHOFFSETCLOSURE0 + 123 APPLY1 + 124 PUSHACC5 + 125 PUSHENVACC1 + 126 APPLY2 + 127 POPTRAP + 128 RETURN 3 + 130 PUSHGETGLOBAL End_of_file + 132 PUSHACC1 + 133 GETFIELD0 + 134 EQ + 135 BRANCHIFNOT 140 + 137 ACC1 + 138 RETURN 4 + 140 ACC0 + 141 RAISE + 142 ACC0 + 143 C_CALL1 caml_flush + 145 RETURN 1 + 147 RESTART + 148 GRAB 1 + 150 ACC1 + 151 PUSHACC1 + 152 C_CALL2 caml_output_char + 154 RETURN 2 + 156 RESTART + 157 GRAB 1 + 159 ACC1 + 160 PUSHACC1 + 161 C_CALL2 caml_output_char + 163 RETURN 2 + 165 RESTART + 166 GRAB 1 + 168 ACC1 + 169 PUSHACC1 + 170 C_CALL2 caml_output_int + 172 RETURN 2 + 174 RESTART + 175 GRAB 1 + 177 ACC1 + 178 PUSHACC1 + 179 C_CALL2 caml_seek_out + 181 RETURN 2 + 183 ACC0 + 184 C_CALL1 caml_pos_out + 186 RETURN 1 + 188 ACC0 + 189 C_CALL1 caml_channel_size + 191 RETURN 1 + 193 RESTART + 194 GRAB 1 + 196 ACC1 + 197 PUSHACC1 + 198 C_CALL2 caml_set_binary_mode + 200 RETURN 2 + 202 ACC0 + 203 C_CALL1 caml_input_char + 205 RETURN 1 + 207 ACC0 + 208 C_CALL1 caml_input_char + 210 RETURN 1 + 212 ACC0 + 213 C_CALL1 caml_input_int + 215 RETURN 1 + 217 ACC0 + 218 C_CALL1 input_value + 220 RETURN 1 + 222 RESTART + 223 GRAB 1 + 225 ACC1 + 226 PUSHACC1 + 227 C_CALL2 caml_seek_in + 229 RETURN 2 + 231 ACC0 + 232 C_CALL1 caml_pos_in + 234 RETURN 1 + 236 ACC0 + 237 C_CALL1 caml_channel_size + 239 RETURN 1 + 241 ACC0 + 242 C_CALL1 caml_close_channel + 244 RETURN 1 + 246 RESTART + 247 GRAB 1 + 249 ACC1 + 250 PUSHACC1 + 251 C_CALL2 caml_set_binary_mode + 253 RETURN 2 + 255 CONST0 + 256 PUSHENVACC1 + 257 APPLY1 + 258 ACC0 + 259 C_CALL1 sys_exit + 261 RETURN 1 + 263 CONST0 + 264 PUSHENVACC1 + 265 GETFIELD0 + 266 APPTERM1 2 + 268 CONST0 + 269 PUSHENVACC1 + 270 APPLY1 + 271 CONST0 + 272 PUSHENVACC2 + 273 APPTERM1 2 + 275 ENVACC1 + 276 GETFIELD0 + 277 PUSHACC0 + 278 PUSHACC2 + 279 CLOSURE 2, 268 + 282 PUSHENVACC1 + 283 SETFIELD0 + 284 RETURN 2 + 286 ENVACC1 + 287 C_CALL1 caml_flush + 289 ENVACC2 + 290 C_CALL1 caml_flush + 292 RETURN 1 + 294 CONST0 + 295 PUSHENVACC1 + 296 APPLY1 + 297 C_CALL1 float_of_string + 299 RETURN 1 + 301 CONST0 + 302 PUSHENVACC1 + 303 APPLY1 + 304 C_CALL1 int_of_string + 306 RETURN 1 + 308 ENVACC2 + 309 C_CALL1 caml_flush + 311 ENVACC1 + 312 PUSHENVACC3 + 313 APPTERM1 2 + 315 CONSTINT 13 + 317 PUSHENVACC1 + 318 C_CALL2 caml_output_char + 320 ENVACC1 + 321 C_CALL1 caml_flush + 323 RETURN 1 + 325 ACC0 + 326 PUSHENVACC1 + 327 PUSHENVACC2 + 328 APPLY2 + 329 CONSTINT 13 + 331 PUSHENVACC1 + 332 C_CALL2 caml_output_char + 334 ENVACC1 + 335 C_CALL1 caml_flush + 337 RETURN 1 + 339 ACC0 + 340 PUSHENVACC1 + 341 APPLY1 + 342 PUSHENVACC2 + 343 PUSHENVACC3 + 344 APPTERM2 3 + 346 ACC0 + 347 PUSHENVACC1 + 348 APPLY1 + 349 PUSHENVACC2 + 350 PUSHENVACC3 + 351 APPTERM2 3 + 353 ACC0 + 354 PUSHENVACC1 + 355 PUSHENVACC2 + 356 APPTERM2 3 + 358 ACC0 + 359 PUSHENVACC1 + 360 C_CALL2 caml_output_char + 362 RETURN 1 + 364 CONSTINT 13 + 366 PUSHENVACC1 + 367 C_CALL2 caml_output_char + 369 ENVACC1 + 370 C_CALL1 caml_flush + 372 RETURN 1 + 374 ACC0 + 375 PUSHENVACC1 + 376 PUSHENVACC2 + 377 APPLY2 + 378 CONSTINT 13 + 380 PUSHENVACC1 + 381 C_CALL2 caml_output_char + 383 RETURN 1 + 385 ACC0 + 386 PUSHENVACC1 + 387 APPLY1 + 388 PUSHENVACC2 + 389 PUSHENVACC3 + 390 APPTERM2 3 + 392 ACC0 + 393 PUSHENVACC1 + 394 APPLY1 + 395 PUSHENVACC2 + 396 PUSHENVACC3 + 397 APPTERM2 3 + 399 ACC0 + 400 PUSHENVACC1 + 401 PUSHENVACC2 + 402 APPTERM2 3 + 404 ACC0 + 405 PUSHENVACC1 + 406 C_CALL2 caml_output_char + 408 RETURN 1 + 410 RESTART + 411 GRAB 3 + 413 CONST0 + 414 PUSHACC3 + 415 LTINT + 416 BRANCHIF 427 + 418 ACC1 + 419 C_CALL1 ml_string_length + 421 PUSHACC4 + 422 PUSHACC4 + 423 ADDINT + 424 GTINT + 425 BRANCHIFNOT 432 + 427 GETGLOBAL "really_input" + 429 PUSHENVACC1 + 430 APPTERM1 5 + 432 ACC3 + 433 PUSHACC3 + 434 PUSHACC3 + 435 PUSHACC3 + 436 PUSHENVACC2 + 437 APPTERM 4, 8 + 440 RESTART + 441 GRAB 3 + 443 CONST0 + 444 PUSHACC3 + 445 LTINT + 446 BRANCHIF 457 + 448 ACC1 + 449 C_CALL1 ml_string_length + 451 PUSHACC4 + 452 PUSHACC4 + 453 ADDINT + 454 GTINT + 455 BRANCHIFNOT 462 + 457 GETGLOBAL "input" + 459 PUSHENVACC1 + 460 APPTERM1 5 + 462 ACC3 + 463 PUSHACC3 + 464 PUSHACC3 + 465 PUSHACC3 + 466 C_CALL4 caml_input + 468 RETURN 4 + 470 ACC0 + 471 PUSHCONST0 + 472 PUSHGETGLOBAL <0>(0, <0>(6, 0)) + 474 PUSHENVACC1 + 475 APPTERM3 4 + 477 ACC0 + 478 PUSHCONST0 + 479 PUSHGETGLOBAL <0>(0, <0>(7, 0)) + 481 PUSHENVACC1 + 482 APPTERM3 4 + 484 RESTART + 485 GRAB 2 + 487 ACC1 + 488 PUSHACC1 + 489 PUSHACC4 + 490 C_CALL3 sys_open + 492 C_CALL1 caml_open_descriptor + 494 RETURN 3 + 496 ACC0 + 497 C_CALL1 caml_flush + 499 ACC0 + 500 C_CALL1 caml_close_channel + 502 RETURN 1 + 504 RESTART + 505 GRAB 1 + 507 CONST0 + 508 PUSHACC2 + 509 PUSHACC2 + 510 C_CALL3 output_value + 512 RETURN 2 + 514 RESTART + 515 GRAB 3 + 517 CONST0 + 518 PUSHACC3 + 519 LTINT + 520 BRANCHIF 531 + 522 ACC1 + 523 C_CALL1 ml_string_length + 525 PUSHACC4 + 526 PUSHACC4 + 527 ADDINT + 528 GTINT + 529 BRANCHIFNOT 536 + 531 GETGLOBAL "output" + 533 PUSHENVACC1 + 534 APPTERM1 5 + 536 ACC3 + 537 PUSHACC3 + 538 PUSHACC3 + 539 PUSHACC3 + 540 C_CALL4 caml_output + 542 RETURN 4 + 544 RESTART + 545 GRAB 1 + 547 ACC1 + 548 C_CALL1 ml_string_length + 550 PUSHCONST0 + 551 PUSHACC3 + 552 PUSHACC3 + 553 C_CALL4 caml_output + 555 RETURN 2 + 557 ACC0 + 558 PUSHCONSTINT 438 + 560 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(6, 0)))) + 562 PUSHENVACC1 + 563 APPTERM3 4 + 565 ACC0 + 566 PUSHCONSTINT 438 + 568 PUSHGETGLOBAL <0>(1, <0>(3, <0>(4, <0>(7, 0)))) + 570 PUSHENVACC1 + 571 APPTERM3 4 + 573 RESTART + 574 GRAB 2 + 576 ACC1 + 577 PUSHACC1 + 578 PUSHACC4 + 579 C_CALL3 sys_open + 581 C_CALL1 caml_open_descriptor + 583 RETURN 3 + 585 ACC0 + 586 PUSHGETGLOBAL "%.12g" + 588 C_CALL2 format_float + 590 RETURN 1 + 592 ACC0 + 593 PUSHGETGLOBAL "%d" + 595 C_CALL2 format_int + 597 RETURN 1 + 599 GETGLOBAL "false" + 601 PUSHACC1 + 602 C_CALL2 string_equal + 604 BRANCHIFNOT 609 + 606 CONST0 + 607 RETURN 1 + 609 GETGLOBAL "true" + 611 PUSHACC1 + 612 C_CALL2 string_equal + 614 BRANCHIFNOT 619 + 616 CONST1 + 617 RETURN 1 + 619 GETGLOBAL "bool_of_string" + 621 PUSHENVACC1 + 622 APPTERM1 2 + 624 ACC0 + 625 BRANCHIFNOT 631 + 627 GETGLOBAL "true" + 629 RETURN 1 + 631 GETGLOBAL "false" + 633 RETURN 1 + 635 CONST0 + 636 PUSHACC1 + 637 LTINT + 638 BRANCHIF 646 + 640 CONSTINT 255 + 642 PUSHACC1 + 643 GTINT + 644 BRANCHIFNOT 651 + 646 GETGLOBAL "char_of_int" + 648 PUSHENVACC1 + 649 APPTERM1 2 + 651 ACC0 + 652 RETURN 1 + 654 RESTART + 655 GRAB 1 + 657 ACC0 + 658 C_CALL1 ml_string_length + 660 PUSHACC2 + 661 C_CALL1 ml_string_length + 663 PUSHACC0 + 664 PUSHACC2 + 665 ADDINT + 666 C_CALL1 create_string + 668 PUSHACC2 + 669 PUSHCONST0 + 670 PUSHACC2 + 671 PUSHCONST0 + 672 PUSHACC7 + 673 C_CALL5 blit_string + 675 ACC1 + 676 PUSHACC3 + 677 PUSHACC2 + 678 PUSHCONST0 + 679 PUSHACC 8 + 681 C_CALL5 blit_string + 683 ACC0 + 684 RETURN 5 + 686 CONSTINT -1 + 688 PUSHACC1 + 689 XORINT + 690 RETURN 1 + 692 CONST0 + 693 PUSHACC1 + 694 GEINT + 695 BRANCHIFNOT 700 + 697 ACC0 + 698 RETURN 1 + 700 ACC0 + 701 NEGINT + 702 RETURN 1 + 704 RESTART + 705 GRAB 1 + 707 ACC1 + 708 PUSHACC1 + 709 C_CALL2 greaterequal + 711 BRANCHIFNOT 716 + 713 ACC0 + 714 RETURN 2 + 716 ACC1 + 717 RETURN 2 + 719 RESTART + 720 GRAB 1 + 722 ACC1 + 723 PUSHACC1 + 724 C_CALL2 lessequal + 726 BRANCHIFNOT 731 + 728 ACC0 + 729 RETURN 2 + 731 ACC1 + 732 RETURN 2 + 734 ACC0 + 735 PUSHGETGLOBAL Invalid_argument + 737 MAKEBLOCK2 0 + 739 RAISE + 740 ACC0 + 741 PUSHGETGLOBAL Failure + 743 MAKEBLOCK2 0 + 745 RAISE + 746 CLOSURE 0, 740 + 749 PUSH + 750 CLOSURE 0, 734 + 753 PUSHGETGLOBAL "Pervasives.Exit" + 755 MAKEBLOCK1 0 + 757 PUSHGETGLOBAL "Pervasives.Assert_failure" + 759 MAKEBLOCK1 0 + 761 PUSH + 762 CLOSURE 0, 720 + 765 PUSH + 766 CLOSURE 0, 705 + 769 PUSH + 770 CLOSURE 0, 692 + 773 PUSH + 774 CLOSURE 0, 686 + 777 PUSHCONST0 + 778 PUSHCONSTINT 31 + 780 PUSHCONST1 + 781 LSLINT + 782 EQ + 783 BRANCHIFNOT 789 + 785 CONSTINT 30 + 787 BRANCH 791 + 789 CONSTINT 62 + 791 PUSHCONST1 + 792 LSLINT + 793 PUSHACC0 + 794 OFFSETINT -1 + 796 PUSH + 797 CLOSURE 0, 655 + 800 PUSHACC 9 + 802 CLOSURE 1, 635 + 805 PUSH + 806 CLOSURE 0, 624 + 809 PUSHACC 11 + 811 CLOSURE 1, 599 + 814 PUSH + 815 CLOSURE 0, 592 + 818 PUSH + 819 CLOSURE 0, 585 + 822 PUSH + 823 CLOSUREREC 0, 12 + 827 CONST0 + 828 C_CALL1 caml_open_descriptor + 830 PUSHCONST1 + 831 C_CALL1 caml_open_descriptor + 833 PUSHCONST2 + 834 C_CALL1 caml_open_descriptor + 836 PUSH + 837 CLOSURE 0, 574 + 840 PUSHACC0 + 841 CLOSURE 1, 565 + 844 PUSHACC1 + 845 CLOSURE 1, 557 + 848 PUSH + 849 CLOSURE 0, 545 + 852 PUSHACC 22 + 854 CLOSURE 1, 515 + 857 PUSH + 858 CLOSURE 0, 505 + 861 PUSH + 862 CLOSURE 0, 496 + 865 PUSH + 866 CLOSURE 0, 485 + 869 PUSHACC0 + 870 CLOSURE 1, 477 + 873 PUSHACC1 + 874 CLOSURE 1, 470 + 877 PUSHACC 28 + 879 CLOSURE 1, 441 + 882 PUSH + 883 CLOSUREREC 0, 32 + 887 ACC0 + 888 PUSHACC 31 + 890 CLOSURE 2, 411 + 893 PUSHACC 22 + 895 CLOSUREREC 1, 70 + 899 ACC 15 + 901 CLOSURE 1, 404 + 904 PUSHACC 11 + 906 PUSHACC 17 + 908 CLOSURE 2, 399 + 911 PUSHACC 12 + 913 PUSHACC 18 + 915 PUSHACC 23 + 917 CLOSURE 3, 392 + 920 PUSHACC 13 + 922 PUSHACC 19 + 924 PUSHACC 23 + 926 CLOSURE 3, 385 + 929 PUSHACC 14 + 931 PUSHACC 20 + 933 CLOSURE 2, 374 + 936 PUSHACC 20 + 938 CLOSURE 1, 364 + 941 PUSHACC 20 + 943 CLOSURE 1, 358 + 946 PUSHACC 17 + 948 PUSHACC 22 + 950 CLOSURE 2, 353 + 953 PUSHACC 18 + 955 PUSHACC 23 + 957 PUSHACC 29 + 959 CLOSURE 3, 346 + 962 PUSHACC 19 + 964 PUSHACC 24 + 966 PUSHACC 29 + 968 CLOSURE 3, 339 + 971 PUSHACC 20 + 973 PUSHACC 25 + 975 CLOSURE 2, 325 + 978 PUSHACC 25 + 980 CLOSURE 1, 315 + 983 PUSHACC 12 + 985 PUSHACC 28 + 987 PUSHACC 30 + 989 CLOSURE 3, 308 + 992 PUSHACC0 + 993 CLOSURE 1, 301 + 996 PUSHACC1 + 997 CLOSURE 1, 294 + 1000 PUSHACC 29 + 1002 PUSHACC 31 + 1004 CLOSURE 2, 286 + 1007 MAKEBLOCK1 0 + 1009 PUSHACC0 + 1010 CLOSURE 1, 275 + 1013 PUSHACC1 + 1014 CLOSURE 1, 263 + 1017 PUSHACC0 + 1018 CLOSURE 1, 255 + 1021 PUSHACC1 + 1022 PUSHACC 22 + 1024 PUSHACC4 + 1025 PUSHACC3 + 1026 PUSH + 1027 CLOSURE 0, 247 + 1030 PUSH + 1031 CLOSURE 0, 241 + 1034 PUSH + 1035 CLOSURE 0, 236 + 1038 PUSH + 1039 CLOSURE 0, 231 + 1042 PUSH + 1043 CLOSURE 0, 223 + 1046 PUSH + 1047 CLOSURE 0, 217 + 1050 PUSH + 1051 CLOSURE 0, 212 + 1054 PUSH + 1055 CLOSURE 0, 207 + 1058 PUSHACC 32 + 1060 PUSHACC 35 + 1062 PUSHACC 33 + 1064 PUSH + 1065 CLOSURE 0, 202 + 1068 PUSHACC 41 + 1070 PUSHACC 40 + 1072 PUSHACC 42 + 1074 PUSH + 1075 CLOSURE 0, 194 + 1078 PUSHACC 46 + 1080 PUSH + 1081 CLOSURE 0, 188 + 1084 PUSH + 1085 CLOSURE 0, 183 + 1088 PUSH + 1089 CLOSURE 0, 175 + 1092 PUSHACC 51 + 1094 PUSH + 1095 CLOSURE 0, 166 + 1098 PUSH + 1099 CLOSURE 0, 157 + 1102 PUSHACC 55 + 1104 PUSHACC 57 + 1106 PUSH + 1107 CLOSURE 0, 148 + 1110 PUSH + 1111 CLOSURE 0, 142 + 1114 PUSHACC 63 + 1116 PUSHACC 62 + 1118 PUSHACC 64 + 1120 PUSHACC 38 + 1122 PUSHACC 40 + 1124 PUSHACC 42 + 1126 PUSHACC 44 + 1128 PUSHACC 46 + 1130 PUSHACC 48 + 1132 PUSHACC 50 + 1134 PUSHACC 52 + 1136 PUSHACC 54 + 1138 PUSHACC 56 + 1140 PUSHACC 58 + 1142 PUSHACC 60 + 1144 PUSHACC 62 + 1146 PUSHACC 64 + 1148 PUSHACC 66 + 1150 PUSHACC 82 + 1152 PUSHACC 84 + 1154 PUSHACC 86 + 1156 PUSHACC 88 + 1158 PUSHACC 90 + 1160 PUSHACC 92 + 1162 PUSHACC 94 + 1164 PUSHACC 96 + 1166 PUSHACC 98 + 1168 PUSHACC 100 + 1170 PUSHACC 104 + 1172 PUSHACC 104 + 1174 PUSHACC 104 + 1176 PUSHACC 108 + 1178 PUSHACC 110 + 1180 PUSHACC 112 + 1182 PUSHACC 117 + 1184 PUSHACC 117 + 1186 PUSHACC 117 + 1188 PUSHACC 117 + 1190 MAKEBLOCK 69, 0 + 1193 POP 53 + 1195 SETGLOBAL Pervasives + 1197 BRANCH 2177 + 1199 RESTART + 1200 GRAB 1 + 1202 ACC1 + 1203 BRANCHIFNOT 1213 + 1205 ACC1 + 1206 GETFIELD1 + 1207 PUSHACC1 + 1208 OFFSETINT 1 + 1210 PUSHOFFSETCLOSURE0 + 1211 APPTERM2 4 + 1213 ACC0 + 1214 RETURN 2 + 1216 RESTART + 1217 GRAB 1 + 1219 ACC0 + 1220 BRANCHIFNOT 1251 + 1222 CONST0 + 1223 PUSHACC2 + 1224 EQ + 1225 BRANCHIFNOT 1231 + 1227 ACC0 + 1228 GETFIELD0 + 1229 RETURN 2 + 1231 CONST0 + 1232 PUSHACC2 + 1233 GTINT + 1234 BRANCHIFNOT 1244 + 1236 ACC1 + 1237 OFFSETINT -1 + 1239 PUSHACC1 + 1240 GETFIELD1 + 1241 PUSHOFFSETCLOSURE0 + 1242 APPTERM2 4 + 1244 GETGLOBAL "List.nth" + 1246 PUSHGETGLOBALFIELD Pervasives, 2 + 1249 APPTERM1 3 + 1251 GETGLOBAL "nth" + 1253 PUSHGETGLOBALFIELD Pervasives, 3 + 1256 APPTERM1 3 + 1258 RESTART + 1259 GRAB 1 + 1261 ACC0 + 1262 BRANCHIFNOT 1274 + 1264 ACC1 + 1265 PUSHACC1 + 1266 GETFIELD0 + 1267 MAKEBLOCK2 0 + 1269 PUSHACC1 + 1270 GETFIELD1 + 1271 PUSHOFFSETCLOSURE0 + 1272 APPTERM2 4 + 1274 ACC1 + 1275 RETURN 2 + 1277 ACC0 + 1278 BRANCHIFNOT 1291 + 1280 ACC0 + 1281 GETFIELD1 + 1282 PUSHOFFSETCLOSURE0 + 1283 APPLY1 + 1284 PUSHACC1 + 1285 GETFIELD0 + 1286 PUSHGETGLOBALFIELD Pervasives, 16 + 1289 APPTERM2 3 + 1291 RETURN 1 + 1293 RESTART + 1294 GRAB 1 + 1296 ACC1 + 1297 BRANCHIFNOT 1313 + 1299 ACC1 + 1300 GETFIELD0 + 1301 PUSHACC1 + 1302 APPLY1 + 1303 PUSHACC2 + 1304 GETFIELD1 + 1305 PUSHACC2 + 1306 PUSHOFFSETCLOSURE0 + 1307 APPLY2 + 1308 PUSHACC1 + 1309 MAKEBLOCK2 0 + 1311 POP 1 + 1313 RETURN 2 + 1315 RESTART + 1316 GRAB 1 + 1318 ACC1 + 1319 BRANCHIFNOT 1331 + 1321 ACC1 + 1322 GETFIELD0 + 1323 PUSHACC1 + 1324 APPLY1 + 1325 ACC1 + 1326 GETFIELD1 + 1327 PUSHACC1 + 1328 PUSHOFFSETCLOSURE0 + 1329 APPTERM2 4 + 1331 RETURN 2 + 1333 RESTART + 1334 GRAB 2 + 1336 ACC2 + 1337 BRANCHIFNOT 1350 + 1339 ACC2 + 1340 GETFIELD1 + 1341 PUSHACC3 + 1342 GETFIELD0 + 1343 PUSHACC3 + 1344 PUSHACC3 + 1345 APPLY2 + 1346 PUSHACC2 + 1347 PUSHOFFSETCLOSURE0 + 1348 APPTERM3 6 + 1350 ACC1 + 1351 RETURN 3 + 1353 RESTART + 1354 GRAB 2 + 1356 ACC1 + 1357 BRANCHIFNOT 1370 + 1359 ACC2 + 1360 PUSHACC2 + 1361 GETFIELD1 + 1362 PUSHACC2 + 1363 PUSHOFFSETCLOSURE0 + 1364 APPLY3 + 1365 PUSHACC2 + 1366 GETFIELD0 + 1367 PUSHACC2 + 1368 APPTERM2 5 + 1370 ACC2 + 1371 RETURN 3 + 1373 RESTART + 1374 GRAB 2 + 1376 ACC1 + 1377 BRANCHIFNOT 1400 + 1379 ACC2 + 1380 BRANCHIFNOT 1407 + 1382 ACC2 + 1383 GETFIELD0 + 1384 PUSHACC2 + 1385 GETFIELD0 + 1386 PUSHACC2 + 1387 APPLY2 + 1388 PUSHACC3 + 1389 GETFIELD1 + 1390 PUSHACC3 + 1391 GETFIELD1 + 1392 PUSHACC3 + 1393 PUSHOFFSETCLOSURE0 + 1394 APPLY3 + 1395 PUSHACC1 + 1396 MAKEBLOCK2 0 + 1398 RETURN 4 + 1400 ACC2 + 1401 BRANCHIFNOT 1405 + 1403 BRANCH 1407 + 1405 RETURN 3 + 1407 GETGLOBAL "List.map2" + 1409 PUSHGETGLOBALFIELD Pervasives, 2 + 1412 APPTERM1 4 + 1414 RESTART + 1415 GRAB 2 + 1417 ACC1 + 1418 BRANCHIFNOT 1437 + 1420 ACC2 + 1421 BRANCHIFNOT 1444 + 1423 ACC2 + 1424 GETFIELD0 + 1425 PUSHACC2 + 1426 GETFIELD0 + 1427 PUSHACC2 + 1428 APPLY2 + 1429 ACC2 + 1430 GETFIELD1 + 1431 PUSHACC2 + 1432 GETFIELD1 + 1433 PUSHACC2 + 1434 PUSHOFFSETCLOSURE0 + 1435 APPTERM3 6 + 1437 ACC2 + 1438 BRANCHIFNOT 1442 + 1440 BRANCH 1444 + 1442 RETURN 3 + 1444 GETGLOBAL "List.iter2" + 1446 PUSHGETGLOBALFIELD Pervasives, 2 + 1449 APPTERM1 4 + 1451 RESTART + 1452 GRAB 3 + 1454 ACC2 + 1455 BRANCHIFNOT 1476 + 1457 ACC3 + 1458 BRANCHIFNOT 1482 + 1460 ACC3 + 1461 GETFIELD1 + 1462 PUSHACC3 + 1463 GETFIELD1 + 1464 PUSHACC5 + 1465 GETFIELD0 + 1466 PUSHACC5 + 1467 GETFIELD0 + 1468 PUSHACC5 + 1469 PUSHACC5 + 1470 APPLY3 + 1471 PUSHACC3 + 1472 PUSHOFFSETCLOSURE0 + 1473 APPTERM 4, 8 + 1476 ACC3 + 1477 BRANCHIF 1482 + 1479 ACC1 + 1480 RETURN 4 + 1482 GETGLOBAL "List.fold_left2" + 1484 PUSHGETGLOBALFIELD Pervasives, 2 + 1487 APPTERM1 5 + 1489 RESTART + 1490 GRAB 3 + 1492 ACC1 + 1493 BRANCHIFNOT 1516 + 1495 ACC2 + 1496 BRANCHIFNOT 1522 + 1498 PUSH_RETADDR 1509 + 1500 ACC6 + 1501 PUSHACC6 + 1502 GETFIELD1 + 1503 PUSHACC6 + 1504 GETFIELD1 + 1505 PUSHACC6 + 1506 PUSHOFFSETCLOSURE0 + 1507 APPLY 4 + 1509 PUSHACC3 + 1510 GETFIELD0 + 1511 PUSHACC3 + 1512 GETFIELD0 + 1513 PUSHACC3 + 1514 APPTERM3 7 + 1516 ACC2 + 1517 BRANCHIF 1522 + 1519 ACC3 + 1520 RETURN 4 + 1522 GETGLOBAL "List.fold_right2" + 1524 PUSHGETGLOBALFIELD Pervasives, 2 + 1527 APPTERM1 5 + 1529 RESTART + 1530 GRAB 1 + 1532 ACC1 + 1533 BRANCHIFNOT 1549 + 1535 ACC1 + 1536 GETFIELD0 + 1537 PUSHACC1 + 1538 APPLY1 + 1539 BRANCHIFNOT 1547 + 1541 ACC1 + 1542 GETFIELD1 + 1543 PUSHACC1 + 1544 PUSHOFFSETCLOSURE0 + 1545 APPTERM2 4 + 1547 RETURN 2 + 1549 CONST1 + 1550 RETURN 2 + 1552 RESTART + 1553 GRAB 1 + 1555 ACC1 + 1556 BRANCHIFNOT 1570 + 1558 ACC1 + 1559 GETFIELD0 + 1560 PUSHACC1 + 1561 APPLY1 + 1562 BRANCHIF 1570 + 1564 ACC1 + 1565 GETFIELD1 + 1566 PUSHACC1 + 1567 PUSHOFFSETCLOSURE0 + 1568 APPTERM2 4 + 1570 RETURN 2 + 1572 RESTART + 1573 GRAB 2 + 1575 ACC1 + 1576 BRANCHIFNOT 1599 + 1578 ACC2 + 1579 BRANCHIFNOT 1605 + 1581 ACC2 + 1582 GETFIELD0 + 1583 PUSHACC2 + 1584 GETFIELD0 + 1585 PUSHACC2 + 1586 APPLY2 + 1587 BRANCHIFNOT 1597 + 1589 ACC2 + 1590 GETFIELD1 + 1591 PUSHACC2 + 1592 GETFIELD1 + 1593 PUSHACC2 + 1594 PUSHOFFSETCLOSURE0 + 1595 APPTERM3 6 + 1597 RETURN 3 + 1599 ACC2 + 1600 BRANCHIF 1605 + 1602 CONST1 + 1603 RETURN 3 + 1605 GETGLOBAL "List.for_all2" + 1607 PUSHGETGLOBALFIELD Pervasives, 2 + 1610 APPTERM1 4 + 1612 RESTART + 1613 GRAB 2 + 1615 ACC1 + 1616 BRANCHIFNOT 1639 + 1618 ACC2 + 1619 BRANCHIFNOT 1646 + 1621 ACC2 + 1622 GETFIELD0 + 1623 PUSHACC2 + 1624 GETFIELD0 + 1625 PUSHACC2 + 1626 APPLY2 + 1627 BRANCHIF 1637 + 1629 ACC2 + 1630 GETFIELD1 + 1631 PUSHACC2 + 1632 GETFIELD1 + 1633 PUSHACC2 + 1634 PUSHOFFSETCLOSURE0 + 1635 APPTERM3 6 + 1637 RETURN 3 + 1639 ACC2 + 1640 BRANCHIFNOT 1644 + 1642 BRANCH 1646 + 1644 RETURN 3 + 1646 GETGLOBAL "List.exists2" + 1648 PUSHGETGLOBALFIELD Pervasives, 2 + 1651 APPTERM1 4 + 1653 RESTART + 1654 GRAB 1 + 1656 ACC1 + 1657 BRANCHIFNOT 1672 + 1659 ACC0 + 1660 PUSHACC2 + 1661 GETFIELD0 + 1662 C_CALL2 equal + 1664 BRANCHIF 1672 + 1666 ACC1 + 1667 GETFIELD1 + 1668 PUSHACC1 + 1669 PUSHOFFSETCLOSURE0 + 1670 APPTERM2 4 + 1672 RETURN 2 + 1674 RESTART + 1675 GRAB 1 + 1677 ACC1 + 1678 BRANCHIFNOT 1692 + 1680 ACC0 + 1681 PUSHACC2 + 1682 GETFIELD0 + 1683 EQ + 1684 BRANCHIF 1692 + 1686 ACC1 + 1687 GETFIELD1 + 1688 PUSHACC1 + 1689 PUSHOFFSETCLOSURE0 + 1690 APPTERM2 4 + 1692 RETURN 2 + 1694 RESTART + 1695 GRAB 1 + 1697 ACC1 + 1698 BRANCHIFNOT 1719 + 1700 ACC1 + 1701 GETFIELD0 + 1702 PUSHACC1 + 1703 PUSHACC1 + 1704 GETFIELD0 + 1705 C_CALL2 equal + 1707 BRANCHIFNOT 1713 + 1709 ACC0 + 1710 GETFIELD1 + 1711 RETURN 3 + 1713 ACC2 + 1714 GETFIELD1 + 1715 PUSHACC2 + 1716 PUSHOFFSETCLOSURE0 + 1717 APPTERM2 5 + 1719 GETGLOBAL Not_found + 1721 MAKEBLOCK1 0 + 1723 RAISE + 1724 RESTART + 1725 GRAB 1 + 1727 ACC1 + 1728 BRANCHIFNOT 1748 + 1730 ACC1 + 1731 GETFIELD0 + 1732 PUSHACC1 + 1733 PUSHACC1 + 1734 GETFIELD0 + 1735 EQ + 1736 BRANCHIFNOT 1742 + 1738 ACC0 + 1739 GETFIELD1 + 1740 RETURN 3 + 1742 ACC2 + 1743 GETFIELD1 + 1744 PUSHACC2 + 1745 PUSHOFFSETCLOSURE0 + 1746 APPTERM2 5 + 1748 GETGLOBAL Not_found + 1750 MAKEBLOCK1 0 + 1752 RAISE + 1753 RESTART + 1754 GRAB 1 + 1756 ACC1 + 1757 BRANCHIFNOT 1773 + 1759 ACC0 + 1760 PUSHACC2 + 1761 GETFIELD0 + 1762 GETFIELD0 + 1763 C_CALL2 equal + 1765 BRANCHIF 1773 + 1767 ACC1 + 1768 GETFIELD1 + 1769 PUSHACC1 + 1770 PUSHOFFSETCLOSURE0 + 1771 APPTERM2 4 + 1773 RETURN 2 + 1775 RESTART + 1776 GRAB 1 + 1778 ACC1 + 1779 BRANCHIFNOT 1794 + 1781 ACC0 + 1782 PUSHACC2 + 1783 GETFIELD0 + 1784 GETFIELD0 + 1785 EQ + 1786 BRANCHIF 1794 + 1788 ACC1 + 1789 GETFIELD1 + 1790 PUSHACC1 + 1791 PUSHOFFSETCLOSURE0 + 1792 APPTERM2 4 + 1794 RETURN 2 + 1796 RESTART + 1797 GRAB 1 + 1799 ACC1 + 1800 BRANCHIFNOT 1825 + 1802 ACC1 + 1803 GETFIELD0 + 1804 PUSHACC2 + 1805 GETFIELD1 + 1806 PUSHACC2 + 1807 PUSHACC2 + 1808 GETFIELD0 + 1809 C_CALL2 equal + 1811 BRANCHIFNOT 1816 + 1813 ACC0 + 1814 RETURN 4 + 1816 ACC0 + 1817 PUSHACC3 + 1818 PUSHOFFSETCLOSURE0 + 1819 APPLY2 + 1820 PUSHACC2 + 1821 MAKEBLOCK2 0 + 1823 POP 2 + 1825 RETURN 2 + 1827 RESTART + 1828 GRAB 1 + 1830 ACC1 + 1831 BRANCHIFNOT 1855 + 1833 ACC1 + 1834 GETFIELD0 + 1835 PUSHACC2 + 1836 GETFIELD1 + 1837 PUSHACC2 + 1838 PUSHACC2 + 1839 GETFIELD0 + 1840 EQ + 1841 BRANCHIFNOT 1846 + 1843 ACC0 + 1844 RETURN 4 + 1846 ACC0 + 1847 PUSHACC3 + 1848 PUSHOFFSETCLOSURE0 + 1849 APPLY2 + 1850 PUSHACC2 + 1851 MAKEBLOCK2 0 + 1853 POP 2 + 1855 RETURN 2 + 1857 RESTART + 1858 GRAB 1 + 1860 ACC1 + 1861 BRANCHIFNOT 1879 + 1863 ACC1 + 1864 GETFIELD0 + 1865 PUSHACC0 + 1866 PUSHACC2 + 1867 APPLY1 + 1868 BRANCHIFNOT 1873 + 1870 ACC0 + 1871 RETURN 3 + 1873 ACC2 + 1874 GETFIELD1 + 1875 PUSHACC2 + 1876 PUSHOFFSETCLOSURE0 + 1877 APPTERM2 5 + 1879 GETGLOBAL Not_found + 1881 MAKEBLOCK1 0 + 1883 RAISE + 1884 RESTART + 1885 GRAB 2 + 1887 ACC2 + 1888 BRANCHIFNOT 1917 + 1890 ACC2 + 1891 GETFIELD0 + 1892 PUSHACC3 + 1893 GETFIELD1 + 1894 PUSHACC1 + 1895 PUSHENVACC2 + 1896 APPLY1 + 1897 BRANCHIFNOT 1908 + 1899 ACC0 + 1900 PUSHACC4 + 1901 PUSHACC4 + 1902 PUSHACC4 + 1903 MAKEBLOCK2 0 + 1905 PUSHOFFSETCLOSURE0 + 1906 APPTERM3 8 + 1908 ACC0 + 1909 PUSHACC4 + 1910 PUSHACC3 + 1911 MAKEBLOCK2 0 + 1913 PUSHACC4 + 1914 PUSHOFFSETCLOSURE0 + 1915 APPTERM3 8 + 1917 ACC1 + 1918 PUSHENVACC1 + 1919 APPLY1 + 1920 PUSHACC1 + 1921 PUSHENVACC1 + 1922 APPLY1 + 1923 MAKEBLOCK2 0 + 1925 RETURN 3 + 1927 RESTART + 1928 GRAB 1 + 1930 ACC0 + 1931 PUSHENVACC1 + 1932 CLOSUREREC 2, 1885 + 1936 ACC2 + 1937 PUSHCONST0 + 1938 PUSHCONST0 + 1939 PUSHACC3 + 1940 APPTERM3 6 + 1942 ACC0 + 1943 BRANCHIFNOT 1967 + 1945 ACC0 + 1946 GETFIELD0 + 1947 PUSHACC1 + 1948 GETFIELD1 + 1949 PUSHOFFSETCLOSURE0 + 1950 APPLY1 + 1951 PUSHACC0 + 1952 GETFIELD1 + 1953 PUSHACC2 + 1954 GETFIELD1 + 1955 MAKEBLOCK2 0 + 1957 PUSHACC1 + 1958 GETFIELD0 + 1959 PUSHACC3 + 1960 GETFIELD0 + 1961 MAKEBLOCK2 0 + 1963 MAKEBLOCK2 0 + 1965 RETURN 3 + 1967 GETGLOBAL <0>(0, 0) + 1969 RETURN 1 + 1971 RESTART + 1972 GRAB 1 + 1974 ACC0 + 1975 BRANCHIFNOT 1996 + 1977 ACC1 + 1978 BRANCHIFNOT 2003 + 1980 ACC1 + 1981 GETFIELD1 + 1982 PUSHACC1 + 1983 GETFIELD1 + 1984 PUSHOFFSETCLOSURE0 + 1985 APPLY2 + 1986 PUSHACC2 + 1987 GETFIELD0 + 1988 PUSHACC2 + 1989 GETFIELD0 + 1990 MAKEBLOCK2 0 + 1992 MAKEBLOCK2 0 + 1994 RETURN 2 + 1996 ACC1 + 1997 BRANCHIFNOT 2001 + 1999 BRANCH 2003 + 2001 RETURN 2 + 2003 GETGLOBAL "List.combine" + 2005 PUSHGETGLOBALFIELD Pervasives, 2 + 2008 APPTERM1 3 + 2010 RESTART + 2011 GRAB 1 + 2013 ACC1 + 2014 BRANCHIFNOT 2038 + 2016 ACC1 + 2017 GETFIELD0 + 2018 PUSHACC2 + 2019 GETFIELD1 + 2020 PUSHACC1 + 2021 PUSHENVACC2 + 2022 APPLY1 + 2023 BRANCHIFNOT 2033 + 2025 ACC0 + 2026 PUSHACC3 + 2027 PUSHACC3 + 2028 MAKEBLOCK2 0 + 2030 PUSHOFFSETCLOSURE0 + 2031 APPTERM2 6 + 2033 ACC0 + 2034 PUSHACC3 + 2035 PUSHOFFSETCLOSURE0 + 2036 APPTERM2 6 + 2038 ACC0 + 2039 PUSHENVACC1 + 2040 APPTERM1 3 + 2042 ACC0 + 2043 PUSHENVACC1 + 2044 CLOSUREREC 2, 2011 + 2048 CONST0 + 2049 PUSHACC1 + 2050 APPTERM1 3 + 2052 RESTART + 2053 GRAB 2 + 2055 ACC1 + 2056 BRANCHIFNOT 2077 + 2058 ACC2 + 2059 BRANCHIFNOT 2084 + 2061 ACC2 + 2062 GETFIELD1 + 2063 PUSHACC2 + 2064 GETFIELD1 + 2065 PUSHACC2 + 2066 PUSHACC5 + 2067 GETFIELD0 + 2068 PUSHACC5 + 2069 GETFIELD0 + 2070 PUSHENVACC1 + 2071 APPLY2 + 2072 MAKEBLOCK2 0 + 2074 PUSHOFFSETCLOSURE0 + 2075 APPTERM3 6 + 2077 ACC2 + 2078 BRANCHIFNOT 2082 + 2080 BRANCH 2084 + 2082 RETURN 3 + 2084 GETGLOBAL "List.rev_map2" + 2086 PUSHGETGLOBALFIELD Pervasives, 2 + 2089 APPTERM1 4 + 2091 RESTART + 2092 GRAB 2 + 2094 ACC0 + 2095 CLOSUREREC 1, 2053 + 2099 ACC3 + 2100 PUSHACC3 + 2101 PUSHCONST0 + 2102 PUSHACC3 + 2103 APPTERM3 7 + 2105 RESTART + 2106 GRAB 1 + 2108 ACC1 + 2109 BRANCHIFNOT 2123 + 2111 ACC1 + 2112 GETFIELD1 + 2113 PUSHACC1 + 2114 PUSHACC3 + 2115 GETFIELD0 + 2116 PUSHENVACC1 + 2117 APPLY1 + 2118 MAKEBLOCK2 0 + 2120 PUSHOFFSETCLOSURE0 + 2121 APPTERM2 4 + 2123 ACC0 + 2124 RETURN 2 + 2126 RESTART + 2127 GRAB 1 + 2129 ACC0 + 2130 CLOSUREREC 1, 2106 + 2134 ACC2 + 2135 PUSHCONST0 + 2136 PUSHACC2 + 2137 APPTERM2 5 + 2139 CONST0 + 2140 PUSHACC1 + 2141 PUSHENVACC1 + 2142 APPTERM2 3 + 2144 ACC0 + 2145 BRANCHIFNOT 2151 + 2147 ACC0 + 2148 GETFIELD1 + 2149 RETURN 1 + 2151 GETGLOBAL "tl" + 2153 PUSHGETGLOBALFIELD Pervasives, 3 + 2156 APPTERM1 2 + 2158 ACC0 + 2159 BRANCHIFNOT 2165 + 2161 ACC0 + 2162 GETFIELD0 + 2163 RETURN 1 + 2165 GETGLOBAL "hd" + 2167 PUSHGETGLOBALFIELD Pervasives, 3 + 2170 APPTERM1 2 + 2172 ACC0 + 2173 PUSHCONST0 + 2174 PUSHENVACC1 + 2175 APPTERM2 3 + 2177 CLOSUREREC 0, 1200 + 2181 ACC0 + 2182 CLOSURE 1, 2172 + 2185 PUSH + 2186 CLOSURE 0, 2158 + 2189 PUSH + 2190 CLOSURE 0, 2144 + 2193 PUSH + 2194 CLOSUREREC 0, 1217 + 2198 GETGLOBALFIELD Pervasives, 16 + 2201 PUSH + 2202 CLOSUREREC 0, 1259 + 2206 ACC0 + 2207 CLOSURE 1, 2139 + 2210 PUSH + 2211 CLOSUREREC 0, 1277 + 2215 CLOSUREREC 0, 1294 + 2219 CLOSURE 0, 2127 + 2222 PUSH + 2223 CLOSUREREC 0, 1316 + 2227 CLOSUREREC 0, 1334 + 2231 CLOSUREREC 0, 1354 + 2235 CLOSUREREC 0, 1374 + 2239 CLOSURE 0, 2092 + 2242 PUSH + 2243 CLOSUREREC 0, 1415 + 2247 CLOSUREREC 0, 1452 + 2251 CLOSUREREC 0, 1490 + 2255 CLOSUREREC 0, 1530 + 2259 CLOSUREREC 0, 1553 + 2263 CLOSUREREC 0, 1573 + 2267 CLOSUREREC 0, 1613 + 2271 CLOSUREREC 0, 1654 + 2275 CLOSUREREC 0, 1675 + 2279 CLOSUREREC 0, 1695 + 2283 CLOSUREREC 0, 1725 + 2287 CLOSUREREC 0, 1754 + 2291 CLOSUREREC 0, 1776 + 2295 CLOSUREREC 0, 1797 + 2299 CLOSUREREC 0, 1828 + 2303 CLOSUREREC 0, 1858 + 2307 ACC 24 + 2309 CLOSURE 1, 2042 + 2312 PUSHACC 25 + 2314 CLOSUREREC 1, 1928 + 2318 CLOSUREREC 0, 1942 + 2322 CLOSUREREC 0, 1972 + 2326 ACC0 + 2327 PUSHACC2 + 2328 PUSHACC7 + 2329 PUSHACC 9 + 2331 PUSHACC 11 + 2333 PUSHACC 13 + 2335 PUSHACC 15 + 2337 PUSHACC 17 + 2339 PUSHACC 10 + 2341 PUSHACC 12 + 2343 PUSHACC 13 + 2345 PUSHACC 15 + 2347 PUSHACC 23 + 2349 PUSHACC 25 + 2351 PUSHACC 27 + 2353 PUSHACC 29 + 2355 PUSHACC 31 + 2357 PUSHACC 33 + 2359 PUSHACC 35 + 2361 PUSHACC 37 + 2363 PUSHACC 40 + 2365 PUSHACC 42 + 2367 PUSHACC 41 + 2369 PUSHACC 45 + 2371 PUSHACC 47 + 2373 PUSHACC 50 + 2375 PUSHACC 52 + 2377 PUSHACC 51 + 2379 PUSHACC 55 + 2381 PUSHACC 56 + 2383 PUSHACC 59 + 2385 PUSHACC 61 + 2387 PUSHACC 60 + 2389 PUSHACC 64 + 2391 PUSHACC 66 + 2393 PUSHACC 68 + 2395 PUSHACC 70 + 2397 MAKEBLOCK 37, 0 + 2400 POP 36 + 2402 SETGLOBAL List + 2404 BRANCH 2622 + 2406 CONSTINT 97 + 2408 PUSHACC1 + 2409 GEINT + 2410 BRANCHIFNOT 2418 + 2412 CONSTINT 122 + 2414 PUSHACC1 + 2415 LEINT + 2416 BRANCHIF 2442 + 2418 CONSTINT 224 + 2420 PUSHACC1 + 2421 GEINT + 2422 BRANCHIFNOT 2430 + 2424 CONSTINT 246 + 2426 PUSHACC1 + 2427 LEINT + 2428 BRANCHIF 2442 + 2430 CONSTINT 248 + 2432 PUSHACC1 + 2433 GEINT + 2434 BRANCHIFNOT 2447 + 2436 CONSTINT 254 + 2438 PUSHACC1 + 2439 LEINT + 2440 BRANCHIFNOT 2447 + 2442 ACC0 + 2443 OFFSETINT -32 + 2445 RETURN 1 + 2447 ACC0 + 2448 RETURN 1 + 2450 CONSTINT 65 + 2452 PUSHACC1 + 2453 GEINT + 2454 BRANCHIFNOT 2462 + 2456 CONSTINT 90 + 2458 PUSHACC1 + 2459 LEINT + 2460 BRANCHIF 2486 + 2462 CONSTINT 192 + 2464 PUSHACC1 + 2465 GEINT + 2466 BRANCHIFNOT 2474 + 2468 CONSTINT 214 + 2470 PUSHACC1 + 2471 LEINT + 2472 BRANCHIF 2486 + 2474 CONSTINT 216 + 2476 PUSHACC1 + 2477 GEINT + 2478 BRANCHIFNOT 2491 + 2480 CONSTINT 222 + 2482 PUSHACC1 + 2483 LEINT + 2484 BRANCHIFNOT 2491 + 2486 ACC0 + 2487 OFFSETINT 32 + 2489 RETURN 1 + 2491 ACC0 + 2492 RETURN 1 + 2494 CONSTINT 39 + 2496 PUSHACC1 + 2497 LTINT + 2498 BRANCHIFNOT 2520 + 2500 CONSTINT 9 + 2502 PUSHACC1 + 2503 EQ + 2504 BRANCHIFNOT 2510 + 2506 GETGLOBAL "\\t" + 2508 RETURN 1 + 2510 CONSTINT 13 + 2512 PUSHACC1 + 2513 EQ + 2514 BRANCHIFNOT 2540 + 2516 GETGLOBAL "\\n" + 2518 RETURN 1 + 2520 CONSTINT 39 + 2522 PUSHACC1 + 2523 EQ + 2524 BRANCHIFNOT 2530 + 2526 GETGLOBAL "\\'" + 2528 RETURN 1 + 2530 CONSTINT 92 + 2532 PUSHACC1 + 2533 EQ + 2534 BRANCHIFNOT 2540 + 2536 GETGLOBAL "\\\\" + 2538 RETURN 1 + 2540 ACC0 + 2541 C_CALL1 is_printable + 2543 BRANCHIFNOT 2555 + 2545 CONST1 + 2546 C_CALL1 create_string + 2548 PUSHACC1 + 2549 PUSHCONST0 + 2550 PUSHACC2 + 2551 SETSTRINGCHAR + 2552 ACC0 + 2553 RETURN 2 + 2555 ACC0 + 2556 PUSHCONSTINT 4 + 2558 C_CALL1 create_string + 2560 PUSHCONSTINT 92 + 2562 PUSHCONST0 + 2563 PUSHACC2 + 2564 SETSTRINGCHAR + 2565 CONSTINT 100 + 2567 PUSHACC2 + 2568 DIVINT + 2569 PUSHCONSTINT 48 + 2571 ADDINT + 2572 PUSHCONST1 + 2573 PUSHACC2 + 2574 SETSTRINGCHAR + 2575 CONSTINT 10 + 2577 PUSHCONSTINT 10 + 2579 PUSHACC3 + 2580 DIVINT + 2581 MODINT + 2582 PUSHCONSTINT 48 + 2584 ADDINT + 2585 PUSHCONST2 + 2586 PUSHACC2 + 2587 SETSTRINGCHAR + 2588 CONSTINT 10 + 2590 PUSHACC2 + 2591 MODINT + 2592 PUSHCONSTINT 48 + 2594 ADDINT + 2595 PUSHCONST3 + 2596 PUSHACC2 + 2597 SETSTRINGCHAR + 2598 ACC0 + 2599 RETURN 3 + 2601 CONST0 + 2602 PUSHACC1 + 2603 LTINT + 2604 BRANCHIF 2612 + 2606 CONSTINT 255 + 2608 PUSHACC1 + 2609 GTINT + 2610 BRANCHIFNOT 2619 + 2612 GETGLOBAL "Char.chr" + 2614 PUSHGETGLOBALFIELD Pervasives, 2 + 2617 APPTERM1 2 + 2619 ACC0 + 2620 RETURN 1 + 2622 CLOSURE 0, 2601 + 2625 PUSH + 2626 CLOSURE 0, 2494 + 2629 PUSH + 2630 CLOSURE 0, 2450 + 2633 PUSH + 2634 CLOSURE 0, 2406 + 2637 PUSHACC0 + 2638 PUSHACC2 + 2639 PUSHACC4 + 2640 PUSHACC6 + 2641 MAKEBLOCK 4, 0 + 2644 POP 4 + 2646 SETGLOBAL Char + 2648 BRANCH 3540 + 2650 RESTART + 2651 GRAB 3 + 2653 ACC1 + 2654 PUSHACC3 + 2655 GEINT + 2656 BRANCHIFNOT 2663 + 2658 GETGLOBAL Not_found + 2660 MAKEBLOCK1 0 + 2662 RAISE + 2663 ACC3 + 2664 PUSHACC3 + 2665 PUSHACC2 + 2666 GETSTRINGCHAR + 2667 EQ + 2668 BRANCHIFNOT 2673 + 2670 ACC2 + 2671 RETURN 4 + 2673 ACC3 + 2674 PUSHACC3 + 2675 OFFSETINT 1 + 2677 PUSHACC3 + 2678 PUSHACC3 + 2679 PUSHOFFSETCLOSURE0 + 2680 APPTERM 4, 8 + 2683 RESTART + 2684 GRAB 2 + 2686 CONST0 + 2687 PUSHACC2 + 2688 LTINT + 2689 BRANCHIFNOT 2696 + 2691 GETGLOBAL Not_found + 2693 MAKEBLOCK1 0 + 2695 RAISE + 2696 ACC2 + 2697 PUSHACC2 + 2698 PUSHACC2 + 2699 GETSTRINGCHAR + 2700 EQ + 2701 BRANCHIFNOT 2706 + 2703 ACC1 + 2704 RETURN 3 + 2706 ACC2 + 2707 PUSHACC2 + 2708 OFFSETINT -1 + 2710 PUSHACC2 + 2711 PUSHOFFSETCLOSURE0 + 2712 APPTERM3 6 + 2714 RESTART + 2715 GRAB 1 + 2717 ACC1 + 2718 PUSHCONST0 + 2719 PUSHACC2 + 2720 PUSHENVACC1 + 2721 APPTERM3 5 + 2723 RESTART + 2724 GRAB 2 + 2726 CONST0 + 2727 PUSHACC2 + 2728 LTINT + 2729 BRANCHIF 2738 + 2731 ACC0 + 2732 C_CALL1 ml_string_length + 2734 PUSHACC2 + 2735 GEINT + 2736 BRANCHIFNOT 2745 + 2738 GETGLOBAL "String.rcontains_from" + 2740 PUSHGETGLOBALFIELD Pervasives, 2 + 2743 APPTERM1 4 + 2745 PUSHTRAP 2756 + 2747 ACC6 + 2748 PUSHACC6 + 2749 PUSHACC6 + 2750 PUSHENVACC1 + 2751 APPLY3 + 2752 CONST1 + 2753 POPTRAP + 2754 RETURN 3 + 2756 PUSHGETGLOBAL Not_found + 2758 PUSHACC1 + 2759 GETFIELD0 + 2760 EQ + 2761 BRANCHIFNOT 2766 + 2763 CONST0 + 2764 RETURN 4 + 2766 ACC0 + 2767 RAISE + 2768 RESTART + 2769 GRAB 2 + 2771 CONST0 + 2772 PUSHACC2 + 2773 LTINT + 2774 BRANCHIF 2783 + 2776 ACC0 + 2777 C_CALL1 ml_string_length + 2779 PUSHACC2 + 2780 GTINT + 2781 BRANCHIFNOT 2790 + 2783 GETGLOBAL "String.contains_from" + 2785 PUSHGETGLOBALFIELD Pervasives, 2 + 2788 APPTERM1 4 + 2790 PUSHTRAP 2811 + 2792 PUSH_RETADDR 2807 + 2794 ACC 9 + 2796 PUSHACC 9 + 2798 PUSHACC 9 + 2800 C_CALL1 ml_string_length + 2802 PUSHACC 10 + 2804 PUSHENVACC1 + 2805 APPLY 4 + 2807 CONST1 + 2808 POPTRAP + 2809 RETURN 3 + 2811 PUSHGETGLOBAL Not_found + 2813 PUSHACC1 + 2814 GETFIELD0 + 2815 EQ + 2816 BRANCHIFNOT 2821 + 2818 CONST0 + 2819 RETURN 4 + 2821 ACC0 + 2822 RAISE + 2823 RESTART + 2824 GRAB 2 + 2826 CONST0 + 2827 PUSHACC2 + 2828 LTINT + 2829 BRANCHIF 2838 + 2831 ACC0 + 2832 C_CALL1 ml_string_length + 2834 PUSHACC2 + 2835 GEINT + 2836 BRANCHIFNOT 2845 + 2838 GETGLOBAL "String.rindex_from" + 2840 PUSHGETGLOBALFIELD Pervasives, 2 + 2843 APPTERM1 4 + 2845 ACC2 + 2846 PUSHACC2 + 2847 PUSHACC2 + 2848 PUSHENVACC1 + 2849 APPTERM3 6 + 2851 RESTART + 2852 GRAB 1 + 2854 ACC1 + 2855 PUSHACC1 + 2856 C_CALL1 ml_string_length + 2858 OFFSETINT -1 + 2860 PUSHACC2 + 2861 PUSHENVACC1 + 2862 APPTERM3 5 + 2864 RESTART + 2865 GRAB 2 + 2867 CONST0 + 2868 PUSHACC2 + 2869 LTINT + 2870 BRANCHIF 2879 + 2872 ACC0 + 2873 C_CALL1 ml_string_length + 2875 PUSHACC2 + 2876 GTINT + 2877 BRANCHIFNOT 2886 + 2879 GETGLOBAL "String.index_from" + 2881 PUSHGETGLOBALFIELD Pervasives, 2 + 2884 APPTERM1 4 + 2886 ACC2 + 2887 PUSHACC2 + 2888 PUSHACC2 + 2889 C_CALL1 ml_string_length + 2891 PUSHACC3 + 2892 PUSHENVACC1 + 2893 APPTERM 4, 7 + 2896 RESTART + 2897 GRAB 1 + 2899 ACC1 + 2900 PUSHCONST0 + 2901 PUSHACC2 + 2902 C_CALL1 ml_string_length + 2904 PUSHACC3 + 2905 PUSHENVACC1 + 2906 APPTERM 4, 6 + 2909 ACC0 + 2910 PUSHGETGLOBALFIELD Char, 2 + 2913 PUSHENVACC1 + 2914 APPTERM2 3 + 2916 ACC0 + 2917 PUSHGETGLOBALFIELD Char, 3 + 2920 PUSHENVACC1 + 2921 APPTERM2 3 + 2923 RESTART + 2924 GRAB 1 + 2926 CONST0 + 2927 PUSHACC2 + 2928 C_CALL1 ml_string_length + 2930 EQ + 2931 BRANCHIFNOT 2936 + 2933 ACC1 + 2934 RETURN 2 + 2936 ACC1 + 2937 PUSHENVACC1 + 2938 APPLY1 + 2939 PUSHCONST0 + 2940 PUSHACC3 + 2941 GETSTRINGCHAR + 2942 PUSHACC2 + 2943 APPLY1 + 2944 PUSHCONST0 + 2945 PUSHACC2 + 2946 SETSTRINGCHAR + 2947 ACC0 + 2948 RETURN 3 + 2950 ACC0 + 2951 PUSHGETGLOBALFIELD Char, 2 + 2954 PUSHENVACC1 + 2955 APPTERM2 3 + 2957 ACC0 + 2958 PUSHGETGLOBALFIELD Char, 3 + 2961 PUSHENVACC1 + 2962 APPTERM2 3 + 2964 RESTART + 2965 GRAB 1 + 2967 ACC1 + 2968 C_CALL1 ml_string_length + 2970 PUSHCONST0 + 2971 PUSHACC1 + 2972 EQ + 2973 BRANCHIFNOT 2978 + 2975 ACC2 + 2976 RETURN 3 + 2978 ACC0 + 2979 C_CALL1 create_string + 2981 PUSHCONST0 + 2982 PUSHACC2 + 2983 OFFSETINT -1 + 2985 PUSH + 2986 BRANCH 3002 + 2988 CHECK_SIGNALS + 2989 ACC1 + 2990 PUSHACC6 + 2991 GETSTRINGCHAR + 2992 PUSHACC5 + 2993 APPLY1 + 2994 PUSHACC2 + 2995 PUSHACC4 + 2996 SETSTRINGCHAR + 2997 ACC1 + 2998 OFFSETINT 1 + 3000 ASSIGN 1 + 3002 ACC0 + 3003 PUSHACC2 + 3004 LEINT + 3005 BRANCHIF 2988 + 3007 CONST0 + 3008 POP 2 + 3010 ACC0 + 3011 RETURN 4 + 3013 CONST0 + 3014 PUSHCONST0 + 3015 PUSHACC2 + 3016 C_CALL1 ml_string_length + 3018 OFFSETINT -1 + 3020 PUSH + 3021 BRANCH 3059 + 3023 CHECK_SIGNALS + 3024 ACC1 + 3025 PUSHACC4 + 3026 GETSTRINGCHAR + 3027 PUSHACC0 + 3028 PUSHGETGLOBAL "\000\"\000\000\004\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + 3030 C_CALL2 bitvect_test + 3032 BRANCHIFNOT 3038 + 3034 CONST0 + 3035 CONST2 + 3036 BRANCH 3048 + 3038 ACC0 + 3039 C_CALL1 is_printable + 3041 BRANCHIFNOT 3046 + 3043 CONST1 + 3044 BRANCH 3048 + 3046 CONSTINT 4 + 3048 POP 1 + 3050 PUSHACC3 + 3051 ADDINT + 3052 ASSIGN 2 + 3054 ACC1 + 3055 OFFSETINT 1 + 3057 ASSIGN 1 + 3059 ACC0 + 3060 PUSHACC2 + 3061 LEINT + 3062 BRANCHIF 3023 + 3064 CONST0 + 3065 POP 2 + 3067 ACC1 + 3068 C_CALL1 ml_string_length + 3070 PUSHACC1 + 3071 EQ + 3072 BRANCHIFNOT 3077 + 3074 ACC1 + 3075 RETURN 2 + 3077 ACC0 + 3078 C_CALL1 create_string + 3080 PUSHCONST0 + 3081 ASSIGN 1 + 3083 CONST0 + 3084 PUSHACC3 + 3085 C_CALL1 ml_string_length + 3087 OFFSETINT -1 + 3089 PUSH + 3090 BRANCH 3245 + 3092 CHECK_SIGNALS + 3093 ACC1 + 3094 PUSHACC5 + 3095 GETSTRINGCHAR + 3096 PUSHACC0 + 3097 PUSHGETGLOBAL "\000\000\000\000\004\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + 3099 C_CALL2 bitvect_test + 3101 BRANCHIFNOT 3120 + 3103 CONST0 + 3104 CONSTINT 92 + 3106 PUSHACC5 + 3107 PUSHACC5 + 3108 SETSTRINGCHAR + 3109 ACC4 + 3110 OFFSETINT 1 + 3112 ASSIGN 4 + 3114 ACC0 + 3115 PUSHACC5 + 3116 PUSHACC5 + 3117 SETSTRINGCHAR + 3118 BRANCH 3233 + 3120 CONSTINT 9 + 3122 PUSHACC1 + 3123 EQ + 3124 BRANCHIFNOT 3143 + 3126 CONSTINT 92 + 3128 PUSHACC5 + 3129 PUSHACC5 + 3130 SETSTRINGCHAR + 3131 ACC4 + 3132 OFFSETINT 1 + 3134 ASSIGN 4 + 3136 CONSTINT 116 + 3138 PUSHACC5 + 3139 PUSHACC5 + 3140 SETSTRINGCHAR + 3141 BRANCH 3233 + 3143 CONSTINT 13 + 3145 PUSHACC1 + 3146 EQ + 3147 BRANCHIFNOT 3166 + 3149 CONSTINT 92 + 3151 PUSHACC5 + 3152 PUSHACC5 + 3153 SETSTRINGCHAR + 3154 ACC4 + 3155 OFFSETINT 1 + 3157 ASSIGN 4 + 3159 CONSTINT 110 + 3161 PUSHACC5 + 3162 PUSHACC5 + 3163 SETSTRINGCHAR + 3164 BRANCH 3233 + 3166 ACC0 + 3167 C_CALL1 is_printable + 3169 BRANCHIFNOT 3177 + 3171 ACC0 + 3172 PUSHACC5 + 3173 PUSHACC5 + 3174 SETSTRINGCHAR + 3175 BRANCH 3233 + 3177 ACC0 + 3178 PUSHCONSTINT 92 + 3180 PUSHACC6 + 3181 PUSHACC6 + 3182 SETSTRINGCHAR + 3183 ACC5 + 3184 OFFSETINT 1 + 3186 ASSIGN 5 + 3188 CONSTINT 100 + 3190 PUSHACC1 + 3191 DIVINT + 3192 PUSHCONSTINT 48 + 3194 ADDINT + 3195 PUSHACC6 + 3196 PUSHACC6 + 3197 SETSTRINGCHAR + 3198 ACC5 + 3199 OFFSETINT 1 + 3201 ASSIGN 5 + 3203 CONSTINT 10 + 3205 PUSHCONSTINT 10 + 3207 PUSHACC2 + 3208 DIVINT + 3209 MODINT + 3210 PUSHCONSTINT 48 + 3212 ADDINT + 3213 PUSHACC6 + 3214 PUSHACC6 + 3215 SETSTRINGCHAR + 3216 ACC5 + 3217 OFFSETINT 1 + 3219 ASSIGN 5 + 3221 CONSTINT 10 + 3223 PUSHACC1 + 3224 MODINT + 3225 PUSHCONSTINT 48 + 3227 ADDINT + 3228 PUSHACC6 + 3229 PUSHACC6 + 3230 SETSTRINGCHAR + 3231 POP 1 + 3233 POP 1 + 3235 ACC3 + 3236 OFFSETINT 1 + 3238 ASSIGN 3 + 3240 ACC1 + 3241 OFFSETINT 1 + 3243 ASSIGN 1 + 3245 ACC0 + 3246 PUSHACC2 + 3247 LEINT + 3248 BRANCHIF 3092 + 3250 CONST0 + 3251 POP 2 + 3253 ACC0 + 3254 RETURN 3 + 3256 ENVACC1 + 3257 C_CALL1 ml_string_length + 3259 PUSHENVACC3 + 3260 GETFIELD0 + 3261 PUSHENVACC2 + 3262 PUSHCONST0 + 3263 PUSHENVACC1 + 3264 C_CALL5 blit_string + 3266 ENVACC1 + 3267 C_CALL1 ml_string_length + 3269 PUSHENVACC3 + 3270 GETFIELD0 + 3271 ADDINT + 3272 PUSHENVACC3 + 3273 SETFIELD0 + 3274 ACC0 + 3275 C_CALL1 ml_string_length + 3277 PUSHENVACC3 + 3278 GETFIELD0 + 3279 PUSHENVACC2 + 3280 PUSHCONST0 + 3281 PUSHACC4 + 3282 C_CALL5 blit_string + 3284 ACC0 + 3285 C_CALL1 ml_string_length + 3287 PUSHENVACC3 + 3288 GETFIELD0 + 3289 ADDINT + 3290 PUSHENVACC3 + 3291 SETFIELD0 + 3292 RETURN 1 + 3294 ENVACC1 + 3295 OFFSETREF 1 + 3297 ACC0 + 3298 C_CALL1 ml_string_length + 3300 PUSHENVACC2 + 3301 GETFIELD0 + 3302 ADDINT + 3303 PUSHENVACC2 + 3304 SETFIELD0 + 3305 RETURN 1 + 3307 RESTART + 3308 GRAB 1 + 3310 ACC1 + 3311 BRANCHIFNOT 3374 + 3313 ACC1 + 3314 GETFIELD0 + 3315 PUSHCONST0 + 3316 MAKEBLOCK1 0 + 3318 PUSHCONST0 + 3319 MAKEBLOCK1 0 + 3321 PUSHACC4 + 3322 PUSHACC1 + 3323 PUSHACC3 + 3324 CLOSURE 2, 3294 + 3327 PUSHGETGLOBALFIELD List, 9 + 3330 APPLY2 + 3331 ACC1 + 3332 GETFIELD0 + 3333 OFFSETINT -1 + 3335 PUSHACC4 + 3336 C_CALL1 ml_string_length + 3338 MULINT + 3339 PUSHACC1 + 3340 GETFIELD0 + 3341 ADDINT + 3342 C_CALL1 create_string + 3344 PUSHACC3 + 3345 C_CALL1 ml_string_length + 3347 PUSHCONST0 + 3348 PUSHACC2 + 3349 PUSHCONST0 + 3350 PUSHACC7 + 3351 C_CALL5 blit_string + 3353 ACC3 + 3354 C_CALL1 ml_string_length + 3356 MAKEBLOCK1 0 + 3358 PUSHACC6 + 3359 GETFIELD1 + 3360 PUSHACC1 + 3361 PUSHACC3 + 3362 PUSHACC 8 + 3364 CLOSURE 3, 3256 + 3367 PUSHGETGLOBALFIELD List, 9 + 3370 APPLY2 + 3371 ACC1 + 3372 RETURN 7 + 3374 GETGLOBAL "" + 3376 RETURN 2 + 3378 RESTART + 3379 GRAB 4 + 3381 CONST0 + 3382 PUSHACC5 + 3383 LTINT + 3384 BRANCHIF 3414 + 3386 CONST0 + 3387 PUSHACC2 + 3388 LTINT + 3389 BRANCHIF 3414 + 3391 ACC0 + 3392 C_CALL1 ml_string_length + 3394 PUSHACC5 + 3395 PUSHACC3 + 3396 ADDINT + 3397 GTINT + 3398 BRANCHIF 3414 + 3400 CONST0 + 3401 PUSHACC4 + 3402 LTINT + 3403 BRANCHIF 3414 + 3405 ACC2 + 3406 C_CALL1 ml_string_length + 3408 PUSHACC5 + 3409 PUSHACC5 + 3410 ADDINT + 3411 GTINT + 3412 BRANCHIFNOT 3421 + 3414 GETGLOBAL "String.blit" + 3416 PUSHGETGLOBALFIELD Pervasives, 2 + 3419 APPTERM1 6 + 3421 ACC4 + 3422 PUSHACC4 + 3423 PUSHACC4 + 3424 PUSHACC4 + 3425 PUSHACC4 + 3426 C_CALL5 blit_string + 3428 RETURN 5 + 3430 RESTART + 3431 GRAB 3 + 3433 CONST0 + 3434 PUSHACC2 + 3435 LTINT + 3436 BRANCHIF 3452 + 3438 CONST0 + 3439 PUSHACC3 + 3440 LTINT + 3441 BRANCHIF 3452 + 3443 ACC0 + 3444 C_CALL1 ml_string_length + 3446 PUSHACC3 + 3447 PUSHACC3 + 3448 ADDINT + 3449 GTINT + 3450 BRANCHIFNOT 3459 + 3452 GETGLOBAL "String.fill" + 3454 PUSHGETGLOBALFIELD Pervasives, 2 + 3457 APPTERM1 5 + 3459 ACC3 + 3460 PUSHACC3 + 3461 PUSHACC3 + 3462 PUSHACC3 + 3463 C_CALL4 fill_string + 3465 RETURN 4 + 3467 RESTART + 3468 GRAB 2 + 3470 CONST0 + 3471 PUSHACC2 + 3472 LTINT + 3473 BRANCHIF 3489 + 3475 CONST0 + 3476 PUSHACC3 + 3477 LTINT + 3478 BRANCHIF 3489 + 3480 ACC0 + 3481 C_CALL1 ml_string_length + 3483 PUSHACC3 + 3484 PUSHACC3 + 3485 ADDINT + 3486 GTINT + 3487 BRANCHIFNOT 3496 + 3489 GETGLOBAL "String.sub" + 3491 PUSHGETGLOBALFIELD Pervasives, 2 + 3494 APPTERM1 4 + 3496 ACC2 + 3497 C_CALL1 create_string + 3499 PUSHACC3 + 3500 PUSHCONST0 + 3501 PUSHACC2 + 3502 PUSHACC5 + 3503 PUSHACC5 + 3504 C_CALL5 blit_string + 3506 ACC0 + 3507 RETURN 4 + 3509 ACC0 + 3510 C_CALL1 ml_string_length + 3512 PUSHACC0 + 3513 C_CALL1 create_string + 3515 PUSHACC1 + 3516 PUSHCONST0 + 3517 PUSHACC2 + 3518 PUSHCONST0 + 3519 PUSHACC6 + 3520 C_CALL5 blit_string + 3522 ACC0 + 3523 RETURN 3 + 3525 RESTART + 3526 GRAB 1 + 3528 ACC0 + 3529 C_CALL1 create_string + 3531 PUSHACC2 + 3532 PUSHACC2 + 3533 PUSHCONST0 + 3534 PUSHACC3 + 3535 C_CALL4 fill_string + 3537 ACC0 + 3538 RETURN 3 + 3540 CLOSURE 0, 3526 + 3543 PUSH + 3544 CLOSURE 0, 3509 + 3547 PUSH + 3548 CLOSURE 0, 3468 + 3551 PUSH + 3552 CLOSURE 0, 3431 + 3555 PUSH + 3556 CLOSURE 0, 3379 + 3559 PUSH + 3560 CLOSURE 0, 3308 + 3563 PUSH + 3564 CLOSURE 0, 3013 + 3567 PUSH + 3568 CLOSURE 0, 2965 + 3571 PUSHACC0 + 3572 CLOSURE 1, 2957 + 3575 PUSHACC1 + 3576 CLOSURE 1, 2950 + 3579 PUSHACC 8 + 3581 CLOSURE 1, 2924 + 3584 PUSHACC0 + 3585 CLOSURE 1, 2916 + 3588 PUSHACC1 + 3589 CLOSURE 1, 2909 + 3592 PUSH + 3593 CLOSUREREC 0, 2651 + 3597 ACC0 + 3598 CLOSURE 1, 2897 + 3601 PUSHACC1 + 3602 CLOSURE 1, 2865 + 3605 PUSH + 3606 CLOSUREREC 0, 2684 + 3610 ACC0 + 3611 CLOSURE 1, 2852 + 3614 PUSHACC1 + 3615 CLOSURE 1, 2824 + 3618 PUSHACC5 + 3619 CLOSURE 1, 2769 + 3622 PUSHACC3 + 3623 CLOSURE 1, 2724 + 3626 PUSHACC1 + 3627 CLOSURE 1, 2715 + 3630 PUSHACC 9 + 3632 PUSHACC 11 + 3634 PUSHACC 14 + 3636 PUSHACC 16 + 3638 PUSHACC5 + 3639 PUSHACC7 + 3640 PUSHACC6 + 3641 PUSHACC 10 + 3643 PUSHACC 14 + 3645 PUSHACC 13 + 3647 PUSHACC 17 + 3649 PUSHACC 26 + 3651 PUSHACC 28 + 3653 PUSHACC 30 + 3655 PUSHACC 32 + 3657 PUSHACC 34 + 3659 PUSHACC 36 + 3661 PUSHACC 38 + 3663 MAKEBLOCK 18, 0 + 3666 POP 22 + 3668 SETGLOBAL String + 3670 CONST0 + 3671 C_CALL1 gc_stat + 3673 GETGLOBAL "" + 3675 PUSHCONSTINT 20 + 3677 C_CALL2 make_vect + 3679 PUSHCONSTINT 20 + 3681 C_CALL1 weak_create + 3683 PUSHCONST0 + 3684 PUSHCONSTINT 19 + 3686 PUSH + 3687 BRANCH 3715 + 3689 CHECK_SIGNALS + 3690 CONSTINT 115 + 3692 PUSHCONSTINT 20 + 3694 PUSHGETGLOBALFIELD String, 0 + 3697 APPLY2 + 3698 PUSHACC2 + 3699 PUSHACC5 + 3700 SETVECTITEM + 3701 ACC1 + 3702 PUSHACC4 + 3703 GETVECTITEM + 3704 MAKEBLOCK1 0 + 3706 PUSHACC2 + 3707 PUSHACC4 + 3708 C_CALL3 weak_set + 3710 ACC1 + 3711 OFFSETINT 1 + 3713 ASSIGN 1 + 3715 ACC0 + 3716 PUSHACC2 + 3717 LEINT + 3718 BRANCHIF 3689 + 3720 CONST0 + 3721 POP 2 + 3723 CONST0 + 3724 C_CALL1 gc_full_major + 3726 CONST0 + 3727 PUSHCONSTINT 19 + 3729 PUSH + 3730 BRANCH 3753 + 3732 CHECK_SIGNALS + 3733 ACC1 + 3734 PUSHACC3 + 3735 C_CALL2 weak_get + 3737 PUSHACC0 + 3738 BRANCHIF 3745 + 3740 GETGLOBAL Not_found + 3742 MAKEBLOCK1 0 + 3744 RAISE + 3745 CONST0 + 3746 POP 1 + 3748 ACC1 + 3749 OFFSETINT 1 + 3751 ASSIGN 1 + 3753 ACC0 + 3754 PUSHACC2 + 3755 LEINT + 3756 BRANCHIF 3732 + 3758 CONST0 + 3759 POP 2 + 3761 CONST0 + 3762 PUSHCONSTINT 19 + 3764 PUSH + 3765 BRANCH 3785 + 3767 CHECK_SIGNALS + 3768 CONST0 + 3769 PUSHCONST2 + 3770 PUSHACC3 + 3771 MODINT + 3772 EQ + 3773 BRANCHIFNOT 3780 + 3775 GETGLOBAL "" + 3777 PUSHACC2 + 3778 PUSHACC5 + 3779 SETVECTITEM + 3780 ACC1 + 3781 OFFSETINT 1 + 3783 ASSIGN 1 + 3785 ACC0 + 3786 PUSHACC2 + 3787 LEINT + 3788 BRANCHIF 3767 + 3790 CONST0 + 3791 POP 2 + 3793 CONST0 + 3794 C_CALL1 gc_full_major + 3796 CONST0 + 3797 PUSHCONSTINT 19 + 3799 PUSH + 3800 BRANCH 3854 + 3802 CHECK_SIGNALS + 3803 ACC1 + 3804 PUSHACC3 + 3805 C_CALL2 weak_get + 3807 PUSHACC0 + 3808 BRANCHIFNOT 3832 + 3810 CONST1 + 3811 PUSHCONST2 + 3812 PUSHACC4 + 3813 MODINT + 3814 EQ + 3815 BRANCHIFNOT 3842 + 3817 CONSTINT 115 + 3819 PUSHCONSTINT 5 + 3821 PUSHACC2 + 3822 GETFIELD0 + 3823 GETSTRINGCHAR + 3824 NEQ + 3825 BRANCHIFNOT 3847 + 3827 GETGLOBAL Not_found + 3829 MAKEBLOCK1 0 + 3831 RAISE + 3832 CONST0 + 3833 PUSHCONST2 + 3834 PUSHACC4 + 3835 MODINT + 3836 EQ + 3837 BRANCHIFNOT 3842 + 3839 CONST0 + 3840 BRANCH 3847 + 3842 GETGLOBAL Not_found + 3844 MAKEBLOCK1 0 + 3846 RAISE + 3847 POP 1 + 3849 ACC1 + 3850 OFFSETINT 1 + 3852 ASSIGN 1 + 3854 ACC0 + 3855 PUSHACC2 + 3856 LEINT + 3857 BRANCHIF 3802 + 3859 CONST0 + 3860 POP 4 + 3862 ATOM0 + 3863 SETGLOBAL T350-heapcheck + 3865 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t360-stacks-1.ml b/testsuite/tests/tool-ocaml/t360-stacks-1.ml new file mode 100644 index 00000000..100fbabb --- /dev/null +++ b/testsuite/tests/tool-ocaml/t360-stacks-1.ml @@ -0,0 +1,43 @@ +open Lib;; +let rec f n = + if n <= 0 then 12 + else 1 + f (n-1) +in +if f 30000 <> 30012 then raise Not_found +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 29 + 11 CONST0 + 12 PUSHACC1 + 13 LEINT + 14 BRANCHIFNOT 20 + 16 CONSTINT 12 + 18 RETURN 1 + 20 ACC0 + 21 OFFSETINT -1 + 23 PUSHOFFSETCLOSURE0 + 24 APPLY1 + 25 PUSHCONST1 + 26 ADDINT + 27 RETURN 1 + 29 CLOSUREREC 0, 11 + 33 CONSTINT 30012 + 35 PUSHCONSTINT 30000 + 37 PUSHACC2 + 38 APPLY1 + 39 NEQ + 40 BRANCHIFNOT 47 + 42 GETGLOBAL Not_found + 44 MAKEBLOCK1 0 + 46 RAISE + 47 POP 1 + 49 ATOM0 + 50 SETGLOBAL T360-stacks-1 + 52 STOP +**) diff --git a/testsuite/tests/tool-ocaml/t360-stacks-2.ml b/testsuite/tests/tool-ocaml/t360-stacks-2.ml new file mode 100644 index 00000000..8d13c7d7 --- /dev/null +++ b/testsuite/tests/tool-ocaml/t360-stacks-2.ml @@ -0,0 +1,54 @@ +open Lib;; +let rec f n = + if n <= 0 then 12 + else 1 + f (n-1) +in +try + ignore (f 3000000); + raise Not_found +with Stack_overflow -> () +;; + +(** + 0 CONSTINT 42 + 2 PUSHACC0 + 3 MAKEBLOCK1 0 + 5 POP 1 + 7 SETGLOBAL Lib + 9 BRANCH 29 + 11 CONST0 + 12 PUSHACC1 + 13 LEINT + 14 BRANCHIFNOT 20 + 16 CONSTINT 12 + 18 RETURN 1 + 20 ACC0 + 21 OFFSETINT -1 + 23 PUSHOFFSETCLOSURE0 + 24 APPLY1 + 25 PUSHCONST1 + 26 ADDINT + 27 RETURN 1 + 29 CLOSUREREC 0, 11 + 33 PUSHTRAP 44 + 35 CONSTINT 3000000 + 37 PUSHACC5 + 38 APPLY1 + 39 GETGLOBAL Not_found + 41 MAKEBLOCK1 0 + 43 RAISE + 44 PUSHGETGLOBAL Stack_overflow + 46 PUSHACC1 + 47 GETFIELD0 + 48 EQ + 49 BRANCHIFNOT 54 + 51 CONST0 + 52 BRANCH 56 + 54 ACC0 + 55 RAISE + 56 POP 1 + 58 POP 1 + 60 ATOM0 + 61 SETGLOBAL T360-stacks-2 + 63 STOP +**) diff --git a/testsuite/tests/tool-ocamldoc/Makefile b/testsuite/tests/tool-ocamldoc/Makefile new file mode 100644 index 00000000..e61924e6 --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/Makefile @@ -0,0 +1,14 @@ +CUSTOM_MODULE=odoc_test +ADD_COMPFLAGS=-I +ocamldoc + +run: $(CUSTOM_MODULE).cmo + @for file in t*.ml; do \ + printf " ... testing '$$file'"; \ + $(OCAMLDOC) -g $(CUSTOM_MODULE).cmo -o `basename $$file ml`result $$file; \ + diff -q `basename $$file ml`reference `basename $$file ml`result > /dev/null && echo " => passed" || (echo " => failed" && exit 1); \ + done + +clean: defaultclean + @rm -f *.result + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/tool-ocamldoc/odoc_test.ml b/testsuite/tests/tool-ocamldoc/odoc_test.ml new file mode 100644 index 00000000..8bd11270 --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/odoc_test.ml @@ -0,0 +1,112 @@ +(***********************************************************************) +(* OCamldoc *) +(* *) +(* Maxence Guesdon, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2004 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id: odoc_test.ml 6127 2004-02-20 16:28:27Z guesdon $ *) + +(** Custom generator to perform test on ocamldoc. *) + +open Odoc_info +open Odoc_info.Module +open Odoc_info.Type + +type test_kind = + Types_display + +let p = Format.fprintf + +class string_gen = + object(self) + inherit Odoc_info.Scan.scanner + + val mutable test_kinds = [] + val mutable fmt = Format.str_formatter + + method must_display_types = List.mem Types_display test_kinds + + method set_test_kinds_from_module m = + test_kinds <- List.fold_left + (fun acc (s, _) -> + match s with + "test_types_display" -> Types_display :: acc + | _ -> acc + ) + [] + ( + match m.m_info with + None -> [] + | Some i -> i.i_custom + ) + method! scan_type t = + match test_kinds with + [] -> () + | _ -> + p fmt "# type %s:\n" t.ty_name; + if self#must_display_types then + ( + p fmt "# manifest (Odoc_info.string_of_type_expr):\n<[%s]>\n" + (match t.ty_manifest with + None -> "None" + | Some e -> Odoc_info.string_of_type_expr e + ); + ); + + + method! scan_module_pre m = + p fmt "#\n# module %s:\n" m.m_name ; + if self#must_display_types then + ( + p fmt "# Odoc_info.string_of_module_type:\n<[%s]>\n" + (Odoc_info.string_of_module_type m.m_type); + p fmt "# Odoc_info.string_of_module_type ~complete: true :\n<[%s]>\n" + (Odoc_info.string_of_module_type ~complete: true m.m_type); + ); + true + + method! scan_module_type_pre m = + p fmt "#\n# module type %s:\n" m.mt_name ; + if self#must_display_types then + ( + p fmt "# Odoc_info.string_of_module_type:\n<[%s]>\n" + (match m.mt_type with + None -> "None" + | Some t -> Odoc_info.string_of_module_type t + ); + p fmt "# Odoc_info.string_of_module_type ~complete: true :\n<[%s]>\n" + (match m.mt_type with + None -> "None" + | Some t -> Odoc_info.string_of_module_type ~complete: true t + ); + ); + true + + method generate (module_list: Odoc_info.Module.t_module list) = + let oc = open_out !Odoc_info.Args.out_file in + fmt <- Format.formatter_of_out_channel oc; + ( + try + List.iter + (fun m -> + self#set_test_kinds_from_module m; + self#scan_module_list [m]; + ) + module_list + with + e -> + prerr_endline (Printexc.to_string e) + ); + Format.pp_print_flush fmt (); + close_out oc + end + + +let my_generator = new string_gen +let _ = Odoc_info.Args.set_doc_generator + (Some (my_generator :> Odoc_info.Args.doc_generator)) diff --git a/testsuite/tests/tool-ocamldoc/t01.ml b/testsuite/tests/tool-ocamldoc/t01.ml new file mode 100644 index 00000000..6caf3d7a --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/t01.ml @@ -0,0 +1,19 @@ +(** Testing display of types. + + @test_types_display + *) + +let x = 1 + + +module M = struct + let y = 2 + +end + +module type MT = sig + type t = string -> int -> string -> (string * string * string) -> + (string * string * string) -> + (string * string * string) -> unit + val y : int +end diff --git a/testsuite/tests/tool-ocamldoc/t01.reference b/testsuite/tests/tool-ocamldoc/t01.reference new file mode 100644 index 00000000..72345ffe --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/t01.reference @@ -0,0 +1,33 @@ +# +# module T01: +# Odoc_info.string_of_module_type: +<[sig end]> +# Odoc_info.string_of_module_type ~complete: true : +<[sig end]> +# +# module T01.M: +# Odoc_info.string_of_module_type: +<[sig end]> +# Odoc_info.string_of_module_type ~complete: true : +<[sig val y : int end]> +# +# module type T01.MT: +# Odoc_info.string_of_module_type: +<[sig end]> +# Odoc_info.string_of_module_type ~complete: true : +<[sig + type t = + string -> + int -> + string -> + string * string * string -> + string * string * string -> string * string * string -> unit + val y : int +end]> +# type T01.MT.t: +# manifest (Odoc_info.string_of_type_expr): +<[string -> + int -> + string -> + string * string * string -> + string * string * string -> string * string * string -> unit]> diff --git a/testsuite/tests/typing-fstclassmod/Makefile b/testsuite/tests/typing-fstclassmod/Makefile new file mode 100644 index 00000000..68001d76 --- /dev/null +++ b/testsuite/tests/typing-fstclassmod/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=fstclassmod +ADD_COMPFLAGS=-w a + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-fstclassmod/fstclassmod.ml b/testsuite/tests/typing-fstclassmod/fstclassmod.ml new file mode 100644 index 00000000..905af534 --- /dev/null +++ b/testsuite/tests/typing-fstclassmod/fstclassmod.ml @@ -0,0 +1,142 @@ +(* Example of algorithm parametrized with modules *) + +let sort (type s) set l = + let module Set = (val set : Set.S with type elt = s) in + Set.elements (List.fold_right Set.add l Set.empty) + +let make_set (type s) cmp = + let module S = Set.Make(struct + type t = s + let compare = cmp + end) in + (module S : Set.S with type elt = s) + +let both l = + List.map + (fun set -> sort set l) + [ make_set compare; make_set (fun x y -> compare y x) ] + +let () = + print_endline (String.concat " " (List.map (String.concat "/") (both ["abc";"xyz";"def"]))) + + +(* Hiding the internal representation *) + +module type S = sig + type t + val to_string: t -> string + val apply: t -> t + val x: t +end + +let create (type s) to_string apply x = + let module M = struct + type t = s + let to_string = to_string + let apply = apply + let x = x + end in + (module M : S with type t = s) + +let forget (type s) x = + let module M = (val x : S with type t = s) in + (module M : S) + +let print x = + let module M = (val x : S) in + print_endline (M.to_string M.x) + +let apply x = + let module M = (val x : S) in + let module N = struct + include M + let x = apply x + end in + (module N : S) + +let () = + let int = forget (create string_of_int succ 0) in + let str = forget (create (fun s -> s) (fun s -> s ^ s) "X") in + List.iter print (List.map apply [int; apply int; apply (apply str)]) + + +(* Existential types + type equality witnesses -> pseudo GADT *) + +module TypEq : sig + type ('a, 'b) t + val apply: ('a, 'b) t -> 'a -> 'b + val refl: ('a, 'a) t + val sym: ('a, 'b) t -> ('b, 'a) t +end = struct + type ('a, 'b) t = unit + let apply _ = Obj.magic + let refl = () + let sym () = () +end + + +module rec Typ : sig + module type PAIR = sig + type t + type t1 + type t2 + val eq: (t, t1 * t2) TypEq.t + val t1: t1 Typ.typ + val t2: t2 Typ.typ + end + + type 'a typ = + | Int of ('a, int) TypEq.t + | String of ('a, string) TypEq.t + | Pair of (module PAIR with type t = 'a) +end = struct + module type PAIR = sig + type t + type t1 + type t2 + val eq: (t, t1 * t2) TypEq.t + val t1: t1 Typ.typ + val t2: t2 Typ.typ + end + + type 'a typ = + | Int of ('a, int) TypEq.t + | String of ('a, string) TypEq.t + | Pair of (module PAIR with type t = 'a) +end + +open Typ + +let int = Int TypEq.refl + +let str = String TypEq.refl + +let pair (type s1) (type s2) t1 t2 = + let module P = struct + type t = s1 * s2 + type t1 = s1 + type t2 = s2 + let eq = TypEq.refl + let t1 = t1 + let t2 = t2 + end in + let pair = (module P : PAIR with type t = s1 * s2) in + Pair pair + +module rec Print : sig + val to_string: 'a Typ.typ -> 'a -> string +end = struct + let to_string (type s) t x = + match t with + | Int eq -> string_of_int (TypEq.apply eq x) + | String eq -> Printf.sprintf "%S" (TypEq.apply eq x) + | Pair p -> + let module P = (val p : PAIR with type t = s) in + let (x1, x2) = TypEq.apply P.eq x in + Printf.sprintf "(%s,%s)" (Print.to_string P.t1 x1) (Print.to_string P.t2 x2) +end + +let () = + print_endline (Print.to_string int 10); + print_endline (Print.to_string (pair int (pair str int)) (123, ("A", 456))) + diff --git a/testsuite/tests/typing-fstclassmod/fstclassmod.reference b/testsuite/tests/typing-fstclassmod/fstclassmod.reference new file mode 100644 index 00000000..59c7aa11 --- /dev/null +++ b/testsuite/tests/typing-fstclassmod/fstclassmod.reference @@ -0,0 +1,6 @@ +abc/def/xyz xyz/def/abc +1 +2 +XXXXXXXX +10 +(123,("A",456)) diff --git a/testsuite/tests/typing-labels/Makefile b/testsuite/tests/typing-labels/Makefile new file mode 100644 index 00000000..a226dd11 --- /dev/null +++ b/testsuite/tests/typing-labels/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.several +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-labels/mixin.ml b/testsuite/tests/typing-labels/mixin.ml new file mode 100644 index 00000000..742bd59d --- /dev/null +++ b/testsuite/tests/typing-labels/mixin.ml @@ -0,0 +1,157 @@ +(* $Id: mixin.ml 5929 2003-11-19 02:36:58Z garrigue $ *) + +open StdLabels +open MoreLabels + +(* Use maps for substitutions and sets for free variables *) + +module Subst = Map.Make(struct type t = string let compare = compare end) +module Names = Set.Make(struct type t = string let compare = compare end) + + +(* Variables are common to lambda and expr *) + +type var = [`Var of string] + +let subst_var ~subst : var -> _ = + function `Var s as x -> + try Subst.find s subst + with Not_found -> x + +let free_var : var -> _ = function `Var s -> Names.singleton s + + +(* The lambda language: free variables, substitutions, and evaluation *) + +type 'a lambda = [`Var of string | `Abs of string * 'a | `App of 'a * 'a] + +let free_lambda ~free_rec : _ lambda -> _ = function + #var as x -> free_var x + | `Abs (s, t) -> Names.remove s (free_rec t) + | `App (t1, t2) -> Names.union (free_rec t1) (free_rec t2) + +let map_lambda ~map_rec : _ lambda -> _ = function + #var as x -> x + | `Abs (s, t) as l -> + let t' = map_rec t in + if t == t' then l else `Abs(s, t') + | `App (t1, t2) as l -> + let t'1 = map_rec t1 and t'2 = map_rec t2 in + if t'1 == t1 && t'2 == t2 then l else `App (t'1, t'2) + +let next_id = + let current = ref 3 in + fun () -> incr current; !current + +let subst_lambda ~subst_rec ~free ~subst : _ lambda -> _ = function + #var as x -> subst_var ~subst x + | `Abs(s, t) as l -> + let used = free t in + let used_expr = + Subst.fold subst ~init:[] + ~f:(fun ~key ~data acc -> + if Names.mem s used then data::acc else acc) in + if List.exists used_expr ~f:(fun t -> Names.mem s (free t)) then + let name = s ^ string_of_int (next_id ()) in + `Abs(name, + subst_rec ~subst:(Subst.add ~key:s ~data:(`Var name) subst) t) + else + map_lambda ~map_rec:(subst_rec ~subst:(Subst.remove s subst)) l + | `App _ as l -> + map_lambda ~map_rec:(subst_rec ~subst) l + +let eval_lambda ~eval_rec ~subst l = + match map_lambda ~map_rec:eval_rec l with + `App(`Abs(s,t1), t2) -> + eval_rec (subst ~subst:(Subst.add ~key:s ~data:t2 Subst.empty) t1) + | t -> t + +(* Specialized versions to use on lambda *) + +let rec free1 x = free_lambda ~free_rec:free1 x +let rec subst1 ~subst = subst_lambda ~subst_rec:subst1 ~free:free1 ~subst +let rec eval1 x = eval_lambda ~eval_rec:eval1 ~subst:subst1 x + + +(* The expr language of arithmetic expressions *) + +type 'a expr = + [`Var of string | `Num of int | `Add of 'a * 'a + | `Neg of 'a | `Mult of 'a * 'a] + +let free_expr ~free_rec : _ expr -> _ = function + #var as x -> free_var x + | `Num _ -> Names.empty + | `Add(x, y) -> Names.union (free_rec x) (free_rec y) + | `Neg x -> free_rec x + | `Mult(x, y) -> Names.union (free_rec x) (free_rec y) + +(* Here map_expr helps a lot *) +let map_expr ~map_rec : _ expr -> _ = function + #var as x -> x + | `Num _ as x -> x + | `Add(x, y) as e -> + let x' = map_rec x and y' = map_rec y in + if x == x' && y == y' then e + else `Add(x', y') + | `Neg x as e -> + let x' = map_rec x in + if x == x' then e else `Neg x' + | `Mult(x, y) as e -> + let x' = map_rec x and y' = map_rec y in + if x == x' && y == y' then e + else `Mult(x', y') + +let subst_expr ~subst_rec ~subst : _ expr -> _ = function + #var as x -> subst_var ~subst x + | #expr as e -> map_expr ~map_rec:(subst_rec ~subst) e + +let eval_expr ~eval_rec e = + match map_expr ~map_rec:eval_rec e with + `Add(`Num m, `Num n) -> `Num (m+n) + | `Neg(`Num n) -> `Num (-n) + | `Mult(`Num m, `Num n) -> `Num (m*n) + | #expr as e -> e + +(* Specialized versions *) + +let rec free2 x = free_expr ~free_rec:free2 x +let rec subst2 ~subst = subst_expr ~subst_rec:subst2 ~subst +let rec eval2 x = eval_expr ~eval_rec:eval2 x + + +(* The lexpr language, reunion of lambda and expr *) + +type lexpr = + [ `Var of string | `Abs of string * lexpr | `App of lexpr * lexpr + | `Num of int | `Add of lexpr * lexpr | `Neg of lexpr + | `Mult of lexpr * lexpr ] + +let rec free : lexpr -> _ = function + #lambda as x -> free_lambda ~free_rec:free x + | #expr as x -> free_expr ~free_rec:free x + +let rec subst ~subst:s : lexpr -> _ = function + #lambda as x -> subst_lambda ~subst_rec:subst ~subst:s ~free x + | #expr as x -> subst_expr ~subst_rec:subst ~subst:s x + +let rec eval : lexpr -> _ = function + #lambda as x -> eval_lambda ~eval_rec:eval ~subst x + | #expr as x -> eval_expr ~eval_rec:eval x + +let rec print = function + | `Var id -> print_string id + | `Abs (id, l) -> print_string ("\ " ^ id ^ " . "); print l + | `App (l1, l2) -> print l1; print_string " "; print l2 + | `Num x -> print_int x + | `Add (e1, e2) -> print e1; print_string " + "; print e2 + | `Neg e -> print_string "-"; print e + | `Mult (e1, e2) -> print e1; print_string " * "; print e2 + +let () = + let e1 = eval1 (`App(`Abs("x",`Var"x"), `Var"y")) in + let e2 = eval2 (`Add(`Mult(`Num 3,`Neg(`Num 2)), `Var"x")) in + let e3 = eval (`Add(`App(`Abs("x",`Mult(`Var"x",`Var"x")),`Num 2), `Num 5)) in + print e1; print_newline (); + print e2; print_newline (); + print e3; print_newline () diff --git a/testsuite/tests/typing-labels/mixin.reference b/testsuite/tests/typing-labels/mixin.reference new file mode 100644 index 00000000..27087bd9 --- /dev/null +++ b/testsuite/tests/typing-labels/mixin.reference @@ -0,0 +1,3 @@ +y +-6 + x +9 diff --git a/testsuite/tests/typing-labels/mixin2.ml b/testsuite/tests/typing-labels/mixin2.ml new file mode 100644 index 00000000..edf20b6d --- /dev/null +++ b/testsuite/tests/typing-labels/mixin2.ml @@ -0,0 +1,190 @@ +(* $Id: mixin2.ml 5929 2003-11-19 02:36:58Z garrigue $ *) + +(* Full fledge version, using objects to structure code *) + +open StdLabels +open MoreLabels + +(* Use maps for substitutions and sets for free variables *) + +module Subst = Map.Make(struct type t = string let compare = compare end) +module Names = Set.Make(struct type t = string let compare = compare end) + +(* To build recursive objects *) + +let lazy_fix make = + let rec obj () = make (lazy (obj ()) : _ Lazy.t) in + obj () + +let (!!) = Lazy.force + +(* The basic operations *) + +class type ['a, 'b] ops = + object + method free : 'b -> Names.t + method subst : sub:'a Subst.t -> 'b -> 'a + method eval : 'b -> 'a + end + +(* Variables are common to lambda and expr *) + +type var = [`Var of string] + +class ['a] var_ops = object (self : ('a, var) #ops) + constraint 'a = [> var] + method subst ~sub (`Var s as x) = + try Subst.find s sub with Not_found -> x + method free (`Var s) = + Names.singleton s + method eval (#var as v) = v +end + +(* The lambda language: free variables, substitutions, and evaluation *) + +type 'a lambda = [`Var of string | `Abs of string * 'a | `App of 'a * 'a] + +let next_id = + let current = ref 3 in + fun () -> incr current; !current + +class ['a] lambda_ops (ops : ('a,'a) #ops Lazy.t) = + let var : 'a var_ops = new var_ops + and free = lazy !!ops#free + and subst = lazy !!ops#subst + and eval = lazy !!ops#eval in + object (self : ('a, 'a lambda) #ops) + constraint 'a = [> 'a lambda] + method free = function + #var as x -> var#free x + | `Abs (s, t) -> Names.remove s (!!free t) + | `App (t1, t2) -> Names.union (!!free t1) (!!free t2) + + method map ~f = function + #var as x -> x + | `Abs (s, t) as l -> + let t' = f t in + if t == t' then l else `Abs(s, t') + | `App (t1, t2) as l -> + let t'1 = f t1 and t'2 = f t2 in + if t'1 == t1 && t'2 == t2 then l else `App (t'1, t'2) + + method subst ~sub = function + #var as x -> var#subst ~sub x + | `Abs(s, t) as l -> + let used = !!free t in + let used_expr = + Subst.fold sub ~init:[] + ~f:(fun ~key ~data acc -> + if Names.mem s used then data::acc else acc) in + if List.exists used_expr ~f:(fun t -> Names.mem s (!!free t)) then + let name = s ^ string_of_int (next_id ()) in + `Abs(name, + !!subst ~sub:(Subst.add ~key:s ~data:(`Var name) sub) t) + else + self#map ~f:(!!subst ~sub:(Subst.remove s sub)) l + | `App _ as l -> + self#map ~f:(!!subst ~sub) l + + method eval l = + match self#map ~f:!!eval l with + `App(`Abs(s,t1), t2) -> + !!eval (!!subst ~sub:(Subst.add ~key:s ~data:t2 Subst.empty) t1) + | t -> t +end + +(* Operations specialized to lambda *) + +let lambda = lazy_fix (new lambda_ops) + +(* The expr language of arithmetic expressions *) + +type 'a expr = + [ `Var of string | `Num of int | `Add of 'a * 'a + | `Neg of 'a | `Mult of 'a * 'a] + +class ['a] expr_ops (ops : ('a,'a) #ops Lazy.t) = + let var : 'a var_ops = new var_ops + and free = lazy !!ops#free + and subst = lazy !!ops#subst + and eval = lazy !!ops#eval in + object (self : ('a, 'a expr) #ops) + constraint 'a = [> 'a expr] + method free = function + #var as x -> var#free x + | `Num _ -> Names.empty + | `Add(x, y) -> Names.union (!!free x) (!!free y) + | `Neg x -> !!free x + | `Mult(x, y) -> Names.union (!!free x) (!!free y) + + method map ~f = function + #var as x -> x + | `Num _ as x -> x + | `Add(x, y) as e -> + let x' = f x and y' = f y in + if x == x' && y == y' then e + else `Add(x', y') + | `Neg x as e -> + let x' = f x in + if x == x' then e else `Neg x' + | `Mult(x, y) as e -> + let x' = f x and y' = f y in + if x == x' && y == y' then e + else `Mult(x', y') + + method subst ~sub = function + #var as x -> var#subst ~sub x + | #expr as e -> self#map ~f:(!!subst ~sub) e + + method eval (#expr as e) = + match self#map ~f:!!eval e with + `Add(`Num m, `Num n) -> `Num (m+n) + | `Neg(`Num n) -> `Num (-n) + | `Mult(`Num m, `Num n) -> `Num (m*n) + | e -> e + end + +(* Specialized versions *) + +let expr = lazy_fix (new expr_ops) + +(* The lexpr language, reunion of lambda and expr *) + +type 'a lexpr = [ 'a lambda | 'a expr ] + +class ['a] lexpr_ops (ops : ('a,'a) #ops Lazy.t) = + let lambda = new lambda_ops ops in + let expr = new expr_ops ops in + object (self : ('a, 'a lexpr) #ops) + constraint 'a = [> 'a lexpr] + method free = function + #lambda as x -> lambda#free x + | #expr as x -> expr#free x + + method subst ~sub = function + #lambda as x -> lambda#subst ~sub x + | #expr as x -> expr#subst ~sub x + + method eval = function + #lambda as x -> lambda#eval x + | #expr as x -> expr#eval x +end + +let lexpr = lazy_fix (new lexpr_ops) + +let rec print = function + | `Var id -> print_string id + | `Abs (id, l) -> print_string ("\ " ^ id ^ " . "); print l + | `App (l1, l2) -> print l1; print_string " "; print l2 + | `Num x -> print_int x + | `Add (e1, e2) -> print e1; print_string " + "; print e2 + | `Neg e -> print_string "-"; print e + | `Mult (e1, e2) -> print e1; print_string " * "; print e2 + +let () = + let e1 = lambda#eval (`App(`Abs("x",`Var"x"), `Var"y")) in + let e2 = expr#eval (`Add(`Mult(`Num 3,`Neg(`Num 2)), `Var"x")) in + let e3 = lexpr#eval (`Add(`App(`Abs("x",`Mult(`Var"x",`Var"x")),`Num 2), `Num 5)) in + print e1; print_newline (); + print e2; print_newline (); + print e3; print_newline () diff --git a/testsuite/tests/typing-labels/mixin2.reference b/testsuite/tests/typing-labels/mixin2.reference new file mode 100644 index 00000000..27087bd9 --- /dev/null +++ b/testsuite/tests/typing-labels/mixin2.reference @@ -0,0 +1,3 @@ +y +-6 + x +9 diff --git a/testsuite/tests/typing-labels/mixin3.ml b/testsuite/tests/typing-labels/mixin3.ml new file mode 100644 index 00000000..5113eeb6 --- /dev/null +++ b/testsuite/tests/typing-labels/mixin3.ml @@ -0,0 +1,184 @@ +(* $Id: mixin3.ml 5929 2003-11-19 02:36:58Z garrigue $ *) + +(* Full fledge version, using objects to structure code *) + +open StdLabels +open MoreLabels + +(* Use maps for substitutions and sets for free variables *) + +module Subst = Map.Make(struct type t = string let compare = compare end) +module Names = Set.Make(struct type t = string let compare = compare end) + +(* To build recursive objects *) + +let lazy_fix make = + let rec obj () = make (lazy (obj ()) : _ Lazy.t) in + obj () + +let (!!) = Lazy.force + +(* The basic operations *) + +class type ['a, 'b] ops = + object + method free : 'b -> Names.t + method subst : sub:'a Subst.t -> 'b -> 'a + method eval : 'b -> 'a + end + +(* Variables are common to lambda and expr *) + +type var = [`Var of string] + +let var = object (self : ([>var], var) #ops) + method subst ~sub (`Var s as x) = + try Subst.find s sub with Not_found -> x + method free (`Var s) = + Names.singleton s + method eval (#var as v) = v +end + +(* The lambda language: free variables, substitutions, and evaluation *) + +type 'a lambda = [`Var of string | `Abs of string * 'a | `App of 'a * 'a] + +let next_id = + let current = ref 3 in + fun () -> incr current; !current + +let lambda_ops (ops : ('a,'a) #ops Lazy.t) = + let free = lazy !!ops#free + and subst = lazy !!ops#subst + and eval = lazy !!ops#eval in + object (self : ([> 'a lambda], 'a lambda) #ops) + method free = function + #var as x -> var#free x + | `Abs (s, t) -> Names.remove s (!!free t) + | `App (t1, t2) -> Names.union (!!free t1) (!!free t2) + + method private map ~f = function + #var as x -> x + | `Abs (s, t) as l -> + let t' = f t in + if t == t' then l else `Abs(s, t') + | `App (t1, t2) as l -> + let t'1 = f t1 and t'2 = f t2 in + if t'1 == t1 && t'2 == t2 then l else `App (t'1, t'2) + + method subst ~sub = function + #var as x -> var#subst ~sub x + | `Abs(s, t) as l -> + let used = !!free t in + let used_expr = + Subst.fold sub ~init:[] + ~f:(fun ~key ~data acc -> + if Names.mem s used then data::acc else acc) in + if List.exists used_expr ~f:(fun t -> Names.mem s (!!free t)) then + let name = s ^ string_of_int (next_id ()) in + `Abs(name, + !!subst ~sub:(Subst.add ~key:s ~data:(`Var name) sub) t) + else + self#map ~f:(!!subst ~sub:(Subst.remove s sub)) l + | `App _ as l -> + self#map ~f:(!!subst ~sub) l + + method eval l = + match self#map ~f:!!eval l with + `App(`Abs(s,t1), t2) -> + !!eval (!!subst ~sub:(Subst.add ~key:s ~data:t2 Subst.empty) t1) + | t -> t +end + +(* Operations specialized to lambda *) + +let lambda = lazy_fix lambda_ops + +(* The expr language of arithmetic expressions *) + +type 'a expr = + [ `Var of string | `Num of int | `Add of 'a * 'a + | `Neg of 'a | `Mult of 'a * 'a] + +let expr_ops (ops : ('a,'a) #ops Lazy.t) = + let free = lazy !!ops#free + and subst = lazy !!ops#subst + and eval = lazy !!ops#eval in + object (self : ([> 'a expr], 'a expr) #ops) + method free = function + #var as x -> var#free x + | `Num _ -> Names.empty + | `Add(x, y) -> Names.union (!!free x) (!!free y) + | `Neg x -> !!free x + | `Mult(x, y) -> Names.union (!!free x) (!!free y) + + method private map ~f = function + #var as x -> x + | `Num _ as x -> x + | `Add(x, y) as e -> + let x' = f x and y' = f y in + if x == x' && y == y' then e + else `Add(x', y') + | `Neg x as e -> + let x' = f x in + if x == x' then e else `Neg x' + | `Mult(x, y) as e -> + let x' = f x and y' = f y in + if x == x' && y == y' then e + else `Mult(x', y') + + method subst ~sub = function + #var as x -> var#subst ~sub x + | #expr as e -> self#map ~f:(!!subst ~sub) e + + method eval (#expr as e) = + match self#map ~f:!!eval e with + `Add(`Num m, `Num n) -> `Num (m+n) + | `Neg(`Num n) -> `Num (-n) + | `Mult(`Num m, `Num n) -> `Num (m*n) + | e -> e + end + +(* Specialized versions *) + +let expr = lazy_fix expr_ops + +(* The lexpr language, reunion of lambda and expr *) + +type 'a lexpr = [ 'a lambda | 'a expr ] + +let lexpr_ops (ops : ('a,'a) #ops Lazy.t) = + let lambda = lambda_ops ops in + let expr = expr_ops ops in + object (self : ([> 'a lexpr], 'a lexpr) #ops) + method free = function + #lambda as x -> lambda#free x + | #expr as x -> expr#free x + + method subst ~sub = function + #lambda as x -> lambda#subst ~sub x + | #expr as x -> expr#subst ~sub x + + method eval = function + #lambda as x -> lambda#eval x + | #expr as x -> expr#eval x +end + +let lexpr = lazy_fix lexpr_ops + +let rec print = function + | `Var id -> print_string id + | `Abs (id, l) -> print_string ("\ " ^ id ^ " . "); print l + | `App (l1, l2) -> print l1; print_string " "; print l2 + | `Num x -> print_int x + | `Add (e1, e2) -> print e1; print_string " + "; print e2 + | `Neg e -> print_string "-"; print e + | `Mult (e1, e2) -> print e1; print_string " * "; print e2 + +let () = + let e1 = lambda#eval (`App(`Abs("x",`Var"x"), `Var"y")) in + let e2 = expr#eval (`Add(`Mult(`Num 3,`Neg(`Num 2)), `Var"x")) in + let e3 = lexpr#eval (`Add(`App(`Abs("x",`Mult(`Var"x",`Var"x")),`Num 2), `Num 5)) in + print e1; print_newline (); + print e2; print_newline (); + print e3; print_newline () diff --git a/testsuite/tests/typing-labels/mixin3.reference b/testsuite/tests/typing-labels/mixin3.reference new file mode 100644 index 00000000..27087bd9 --- /dev/null +++ b/testsuite/tests/typing-labels/mixin3.reference @@ -0,0 +1,3 @@ +y +-6 + x +9 diff --git a/testsuite/tests/typing-objects-bugs/Makefile b/testsuite/tests/typing-objects-bugs/Makefile new file mode 100644 index 00000000..9375ddba --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.okbad +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-objects-bugs/pr3968_bad.ml b/testsuite/tests/typing-objects-bugs/pr3968_bad.ml new file mode 100644 index 00000000..3d393120 --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/pr3968_bad.ml @@ -0,0 +1,21 @@ +type expr = + [ `Abs of string * expr + | `App of expr * expr + ] + +class type exp = +object + method eval : (string, exp) Hashtbl.t -> expr +end;; + +class app e1 e2 : exp = +object + val l = e1 + val r = e2 + method eval env = + match l with + | `Abs(var,body) -> + Hashtbl.add env var r; + body + | _ -> `App(l,r); +end diff --git a/testsuite/tests/typing-objects-bugs/pr4018_bad.ml b/testsuite/tests/typing-objects-bugs/pr4018_bad.ml new file mode 100644 index 00000000..90ee7878 --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/pr4018_bad.ml @@ -0,0 +1,46 @@ + +class virtual ['subject, 'event] observer = + object + method virtual notify : 'subject -> 'event -> unit + end + +class ['event] subject = + object (self : 'subject) + val mutable observers = ([]: (('subject, 'event) observer) list) + method add_observer obs = observers <- (obs :: observers) + method notify_observers (e : 'event) = + List.iter (fun x -> x#notify self e) observers + end + +type id = int + +class entity (id : id) = + object + val ent_destroy_subject = new subject + method destroy_subject : (id) subject = ent_destroy_subject + + method entity_id = id + end + +class ['entity] entity_container = + object (self) + inherit ['entity, id] observer as observer + + method add_entity (e : 'entity) = + e#destroy_subject#add_observer (self) + + method notify _ id = () + end + +let f (x : entity entity_container) = () + +(* +class world = + object + val entity_container : entity entity_container = new entity_container + + method add_entity (s : entity) = + entity_container#add_entity (s :> entity) + + end +*) diff --git a/testsuite/tests/typing-objects-bugs/pr4435_bad.ml b/testsuite/tests/typing-objects-bugs/pr4435_bad.ml new file mode 100644 index 00000000..c9e1d499 --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/pr4435_bad.ml @@ -0,0 +1,11 @@ +(* Two v's in the same class *) +class c v = object initializer print_endline v val v = 42 end;; +new c "42";; + +(* Two hidden v's in the same class! *) +class c (v : int) = + object + method v0 = v + inherit ((fun v -> object method v : string = v end) "42") + end;; +(new c 42)#v0;; diff --git a/testsuite/tests/typing-objects-bugs/pr4766_ok.ml b/testsuite/tests/typing-objects-bugs/pr4766_ok.ml new file mode 100644 index 00000000..c5809c1d --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/pr4766_ok.ml @@ -0,0 +1,10 @@ +class virtual ['a] c = +object (s : 'a) + method virtual m : 'b +end + +let o = + object (s :'a) + inherit ['a] c + method m = 42 + end diff --git a/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml b/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml new file mode 100644 index 00000000..627158bc --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/woodyatt_ok.ml @@ -0,0 +1,14 @@ +(* test.ml *) +class alfa = object(_:'self) + method x: 'a. ('a, out_channel, unit) format -> 'a = Printf.printf +end + +class bravo a = object + val y = (a :> alfa) + initializer y#x "bravo initialized" +end + +class charlie a = object + inherit bravo a + initializer y#x "charlie initialized" +end diff --git a/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml b/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml new file mode 100644 index 00000000..212a1683 --- /dev/null +++ b/testsuite/tests/typing-objects-bugs/yamagata021012_ok.ml @@ -0,0 +1,193 @@ +(* The module begins *) +exception Out_of_range + +class type ['a] cursor = + object + method get : 'a + method incr : unit -> unit + method is_last : bool + end + +class type ['a] storage = + object ('self) + method first : 'a cursor + method len : int + method nth : int -> 'a cursor + method copy : 'self + method sub : int -> int -> 'self + method concat : 'a storage -> 'self + method fold : 'b. ('a -> int -> 'b -> 'b) -> 'b -> 'b + method iter : ('a -> unit) -> unit + end + +class virtual ['a, 'cursor] storage_base = + object (self : 'self) + constraint 'cursor = 'a #cursor + method virtual first : 'cursor + method virtual len : int + method virtual copy : 'self + method virtual sub : int -> int -> 'self + method virtual concat : 'a storage -> 'self + method fold : 'b. ('a -> int -> 'b -> 'b) -> 'b -> 'b = fun f a0 -> + let cur = self#first in + let rec loop count a = + if count >= self#len then a else + let a' = f cur#get count a in + cur#incr (); loop (count + 1) a' + in + loop 0 a0 + method iter proc = + let p = self#first in + for i = 0 to self#len - 2 do proc p#get; p#incr () done; + if self#len > 0 then proc p#get else () + end + +class type ['a] obj_input_channel = + object + method get : unit -> 'a + method close : unit -> unit + end + +class type ['a] obj_output_channel = + object + method put : 'a -> unit + method flush : unit -> unit + method close : unit -> unit + end + +module UChar = +struct + + type t = int + + let highest_bit = 1 lsl 30 + let lower_bits = highest_bit - 1 + + let char_of c = + try Char.chr c with Invalid_argument _ -> raise Out_of_range + + let of_char = Char.code + + let code c = + if c lsr 30 = 0 + then c + else raise Out_of_range + + let chr n = + if n >= 0 && (n lsr 31 = 0) then n else raise Out_of_range + + let uint_code c = c + let chr_of_uint n = n + +end + +type uchar = UChar.t + +let int_of_uchar u = UChar.uint_code u +let uchar_of_int n = UChar.chr_of_uint n + +class type ucursor = [uchar] cursor + +class type ustorage = [uchar] storage + +class virtual ['ucursor] ustorage_base = [uchar, 'ucursor] storage_base + +module UText = +struct + +(* the internal representation is UCS4 with big endian*) +(* The most significant digit appears first. *) +let get_buf s i = + let n = Char.code s.[i] in + let n = (n lsl 8) lor (Char.code s.[i + 1]) in + let n = (n lsl 8) lor (Char.code s.[i + 2]) in + let n = (n lsl 8) lor (Char.code s.[i + 3]) in + UChar.chr_of_uint n + +let set_buf s i u = + let n = UChar.uint_code u in + begin + s.[i] <- Char.chr (n lsr 24); + s.[i + 1] <- Char.chr (n lsr 16 lor 0xff); + s.[i + 2] <- Char.chr (n lsr 8 lor 0xff); + s.[i + 3] <- Char.chr (n lor 0xff); + end + +let init_buf buf pos init = + if init#len = 0 then () else + let cur = init#first in + for i = 0 to init#len - 2 do + set_buf buf (pos + i lsl 2) (cur#get); cur#incr () + done; + set_buf buf (pos + (init#len - 1) lsl 2) (cur#get) + +let make_buf init = + let s = String.create (init#len lsl 2) in + init_buf s 0 init; s + +class text_raw buf = + object (self : 'self) + inherit [cursor] ustorage_base + val contents = buf + method first = new cursor (self :> text_raw) 0 + method len = (String.length contents) / 4 + method get i = get_buf contents (4 * i) + method nth i = new cursor (self :> text_raw) i + method copy = {< contents = String.copy contents >} + method sub pos len = + {< contents = String.sub contents (pos * 4) (len * 4) >} + method concat (text : ustorage) = + let buf = String.create (String.length contents + 4 * text#len) in + String.blit contents 0 buf 0 (String.length contents); + init_buf buf (String.length contents) text; + {< contents = buf >} + end +and cursor text i = + object + val contents = text + val mutable pos = i + method get = contents#get pos + method incr () = pos <- pos + 1 + method is_last = (pos + 1 >= contents#len) + end + +class string_raw buf = + object + inherit text_raw buf + method set i u = set_buf contents (4 * i) u + end + +class text init = text_raw (make_buf init) +class string init = string_raw (make_buf init) + +let of_string s = + let buf = String.make (4 * String.length s) '\000' in + for i = 0 to String.length s - 1 do + buf.[4 * i] <- s.[i] + done; + new text_raw buf + +let make len u = + let s = String.create (4 * len) in + for i = 0 to len - 1 do set_buf s (4 * i) u done; + new string_raw s + +let create len = make len (UChar.chr 0) + +let copy s = s#copy + +let sub s start len = s#sub start len + +let fill s start len u = + for i = start to start + len - 1 do s#set i u done + +let blit src srcoff dst dstoff len = + for i = 0 to len - 1 do + let u = src#get (srcoff + i) in + dst#set (dstoff + i) u + done + +let concat s1 s2 = s1#concat (s2 (* : #ustorage *) :> uchar storage) + +let iter proc s = s#iter proc +end diff --git a/testsuite/tests/typing-objects/Exemples.ml b/testsuite/tests/typing-objects/Exemples.ml new file mode 100644 index 00000000..212396cd --- /dev/null +++ b/testsuite/tests/typing-objects/Exemples.ml @@ -0,0 +1,333 @@ + +class point x_init = object + val mutable x = x_init + method get_x = x + method move d = x <- x + d +end;; + +let p = new point 7;; + +p#get_x;; +p#move 3;; +p#get_x;; + +let q = Oo.copy p;; + +q#move 7; p#get_x, q#get_x;; + +class color_point x (c : string) = object + inherit point x + val c = c + method color = c +end;; + +let p' = new color_point 5 "red";; + +p'#get_x, p'#color;; + +let l = [p; (p' :> point)];; + +let get_x p = p#get_x;; +let set_x p = p#set_x;; +List.map get_x l;; + +class ref x_init = object + val mutable x = x_init + method get = x + method set y = x <- y +end;; + +class ref (x_init:int) = object + val mutable x = x_init + method get = x + method set y = x <- y +end;; + +class ['a] ref x_init = object + val mutable x = (x_init : 'a) + method get = x + method set y = x <- y +end;; + +let r = new ref 1 in r#set 2; (r#get);; + +class ['a] circle (c : 'a) = object + val mutable center = c + method center = center + method set_center c = center <- c + method move = (center#move : int -> unit) +end;; + +class ['a] circle (c : 'a) = object + constraint 'a = #point + val mutable center = c + method center = center + method set_center c = center <- c + method move = center#move +end;; + +let (c, c') = (new circle p, new circle p');; + +class ['a] color_circle c = object + constraint 'a = #color_point + inherit ['a] circle c + method color = center#color +end;; + +let c'' = new color_circle p;; +let c'' = new color_circle p';; + +(c'' :> color_point circle);; +(c'' :> point circle);; (* Echec *) +fun x -> (x : color_point color_circle :> point circle);; + +class printable_point y = object (s) + inherit point y + method print = print_int s#get_x +end;; + +let p = new printable_point 7;; +p#print;; + +class printable_color_point y c = object (self) + inherit color_point y c + inherit printable_point y as super + method print = + print_string "("; + super#print; + print_string ", "; + print_string (self#color); + print_string ")" +end;; + +let p' = new printable_color_point 7 "red";; +p'#print;; + +class functional_point y = object + val x = y + method get_x = x + method move d = {< x = x + d >} +end;; + +let p = new functional_point 7;; + +p#get_x;; +(p#move 3)#get_x;; +p#get_x;; + +fun x -> (x :> functional_point);; + +(*******************************************************************) + +class virtual ['a] lst () = object (self) + method virtual null : bool + method virtual hd : 'a + method virtual tl : 'a lst + method map f = + (if self#null then + new nil () + else + new cons (f self#hd) (self#tl#map f) + : 'a lst) + method iter (f : 'a -> unit) = + if self#null then () + else begin + f self#hd; + self#tl#iter f + end + method print (f : 'a -> unit) = + print_string "("; + self#iter (fun x -> f x; print_string "::"); + print_string "[]"; + print_string ")" +end and ['a] nil () = object + inherit ['a] lst () + method null = true + method hd = failwith "hd" + method tl = failwith "tl" +end and ['a] cons h t = object + inherit ['a] lst () + val h = h val t = t + method null = false + method hd = h + method tl = t +end;; + +let l1 = new cons 3 (new cons 10 (new nil ()));; + +l1#print print_int;; + +let l2 = l1#map (fun x -> x + 1);; +l2#print print_int;; + +let rec map_list f (x:'a lst) = + if x#null then new nil() + else new cons (f x#hd) (map_list f x#tl);; + +let p1 = (map_list (fun x -> new printable_color_point x "red") l1);; +p1#print (fun x -> x#print);; + +(*******************************************************************) + +class virtual comparable () = object (self : 'a) + method virtual leq : 'a -> bool + end;; + +class int_comparable (x : int) = object + inherit comparable () + val x = x + method x = x + method leq p = x <= p#x +end;; + +class int_comparable2 xi = object + inherit int_comparable xi + val mutable x' = xi + method set_x y = x' <- y +end;; + +class ['a] sorted_list () = object + constraint 'a = #comparable + val mutable l = ([] : 'a list) + method add x = + let rec insert = + function + [] -> [x] + | a::l as l' -> if a#leq x then a::(insert l) else x::l' + in + l <- insert l + method hd = List.hd l +end;; + +let l = new sorted_list ();; +let c = new int_comparable 10;; +l#add c;; + +let c2 = new int_comparable2 15;; +l#add (c2 :> int_comparable);; (* Echec : 'a comp2 n'est un sous-type *) +(new sorted_list ())#add c2;; + +class int_comparable3 (x : int) = object + val mutable x = x + method leq (y : int_comparable) = x < y#x + method x = x + method setx y = x <- y +end;; + +let c3 = new int_comparable3 15;; +l#add (c3 :> int_comparable);; +(new sorted_list ())#add c3;; (* Echec : leq n'est pas binaire *) + +let sort (l : #comparable list) = Sort.list (fun x -> x#leq) l;; +let pr l = + List.map (fun c -> print_int c#x; print_string " ") l; + print_newline ();; +let l = [new int_comparable 5; (new int_comparable3 2 :> int_comparable); + new int_comparable 4];; +pr l;; +pr (sort l);; +let l = [new int_comparable2 2; new int_comparable2 0];; +pr l;; +pr (sort l);; + +let min (x : #comparable) y = + if x#leq y then x else y;; + +(min (new int_comparable 7) (new int_comparable 11))#x;; +(min (new int_comparable2 5) (new int_comparable2 3))#x;; + +(*******************************************************************) + +class ['a] link (x : 'a) = object (self : 'b) + val mutable x = x + val mutable next = (None : 'b option) + method x = x + method next = next + method set_x y = x <- y + method set_next l = next <- l + method append l = + match next with + None -> + self#set_next l + | Some l' -> + l'#append l +end;; + +class ['a] double_link x = object (self) + inherit ['a] link x + val mutable prev = None + method prev = prev + method set_next l = + next <- l; + match l with Some l -> l#set_prev (Some self) | None -> () + method set_prev l = prev <- l +end;; + +let rec fold_right f (l : 'a #link option) accu = + match l with + None -> accu + | Some l -> + f l#x (fold_right f l#next accu);; + +(*******************************************************************) + +class calculator () = object (self) + val mutable arg = 0. + val mutable acc = 0. + val mutable equals = function s -> s#arg + method arg = arg + method acc = acc + method enter n = arg <- n; self + method add = + acc <- equals self; + equals <- (function s -> s#acc +. s#arg); + self + method sub = + acc <- equals self; + equals <- (function s -> s#acc -. s#arg); + self + method equals = equals self +end;; + +((new calculator ())#enter 5.)#equals;; +(((new calculator ())#enter 5.)#sub#enter 3.5)#equals;; +((new calculator ())#enter 5.)#add#add#equals;; + +class calculator () = object (self) + val mutable arg = 0. + val mutable acc = 0. + val mutable equals = function s -> s#arg + method arg = arg + method acc = acc + method enter n = arg <- n; self + method add = {< acc = equals self; equals = function s -> s#acc +. s#arg >} + method sub = {< acc = equals self; equals = function s -> s#acc -. s#arg >} + method equals = equals self +end;; + +((new calculator ())#enter 5.)#equals;; +(((new calculator ())#enter 5.)#sub#enter 3.5)#equals;; +((new calculator ())#enter 5.)#add#add#equals;; + +class calculator arg acc = object (self) + val arg = arg + val acc = acc + method enter n = new calculator n acc + method add = new calculator_add arg self#equals + method sub = new calculator_sub arg self#equals + method equals = arg +end and calculator_add arg acc = object + inherit calculator arg acc + method enter n = new calculator_add n acc + method equals = acc +. arg +end and calculator_sub arg acc = object + inherit calculator arg acc + method enter n = new calculator_sub n acc + method equals = acc -. arg +end;; + +let calculator = new calculator 0. 0.;; + +(calculator#enter 5.)#equals;; +((calculator#enter 5.)#sub#enter 3.5)#equals;; +(calculator#enter 5.)#add#add#equals;; diff --git a/testsuite/tests/typing-objects/Exemples.ml.reference b/testsuite/tests/typing-objects/Exemples.ml.reference new file mode 100644 index 00000000..42fa5963 --- /dev/null +++ b/testsuite/tests/typing-objects/Exemples.ml.reference @@ -0,0 +1,480 @@ + +# class point : + int -> + object val mutable x : int method get_x : int method move : int -> unit end +# val p : point = +# - : int = 7 +# - : unit = () +# - : int = 10 +# val q : point = +# - : int * int = (10, 17) +# class color_point : + int -> + string -> + object + val c : string + val mutable x : int + method color : string + method get_x : int + method move : int -> unit + end +# val p' : color_point = +# - : int * string = (5, "red") +# val l : point list = [; ] +# val get_x : < get_x : 'a; .. > -> 'a = +# val set_x : < set_x : 'a; .. > -> 'a = +# - : int list = [10; 5] +# # + class ref x_init = object + val mutable x = x_init + method get = x + method set y = x <- y + end;; +Error: Some type variables are unbound in this type: + class ref : + 'a -> + object + val mutable x : 'a + method get : 'a + method set : 'a -> unit + end + The method get has type 'a where 'a is unbound +# class ref : + int -> + object val mutable x : int method get : int method set : int -> unit end +# class ['a] ref : + 'a -> object val mutable x : 'a method get : 'a method set : 'a -> unit end +# - : int = 2 +# class ['a] circle : + 'a -> + object + constraint 'a = < move : int -> unit; .. > + val mutable center : 'a + method center : 'a + method move : int -> unit + method set_center : 'a -> unit + end +# class ['a] circle : + 'a -> + object + constraint 'a = #point + val mutable center : 'a + method center : 'a + method move : int -> unit + method set_center : 'a -> unit + end +# val c : point circle = +val c' : color_point circle = +# class ['a] color_circle : + 'a -> + object + constraint 'a = #color_point + val mutable center : 'a + method center : 'a + method color : string + method move : int -> unit + method set_center : 'a -> unit + end +# # + let c'' = new color_circle p;; +Error: This expression has type point but an expression was expected of type + #color_point + The first object type has no method color +# val c'' : color_point color_circle = +# - : color_point circle = +# # (c'' :> point circle);; (* Echec *) +Error: Type + color_point color_circle = + < center : color_point; color : string; move : int -> unit; + set_center : color_point -> unit > + is not a subtype of + point circle = + < center : point; move : int -> unit; set_center : point -> unit > +Type point = point is not a subtype of color_point = color_point +# # fun x -> (x : color_point color_circle :> point circle);; +Error: Type + color_point color_circle = + < center : color_point; color : string; move : int -> unit; + set_center : color_point -> unit > + is not a subtype of + point circle = + < center : point; move : int -> unit; set_center : point -> unit > +Type point = point is not a subtype of color_point = color_point +# class printable_point : + int -> + object + val mutable x : int + method get_x : int + method move : int -> unit + method print : unit + end +# val p : printable_point = +# 7- : unit = () +# # + class printable_color_point y c = object (self) + inherit color_point y c + inherit printable_point y as super + method print = + print_string "("; + super#print; + print_string ", "; + print_string (self#color); + print_string ")" + end;; +Warning 7: the following methods are overriden by the class printable_point : + get_x move +# + class printable_color_point y c = object (self) + inherit color_point y c + inherit printable_point y as super + method print = + print_string "("; + super#print; + print_string ", "; + print_string (self#color); + print_string ")" + end;; + + +Warning 13: the following instance variables are overriden by the class printable_point : + x +The behaviour changed in ocaml 3.10 (previous behaviour was hiding.) +# + class printable_color_point y c = object (self) + inherit color_point y c + inherit printable_point y as super + method print = + print_string "("; + super#print; + print_string ", "; + print_string (self#color); + print_string ")" + end;; + + + + + +Warning 7: the method print is overridden. +class printable_color_point : + int -> + string -> + object + val c : string + val mutable x : int + method color : string + method get_x : int + method move : int -> unit + method print : unit + end +# val p' : printable_color_point = +# (7, red)- : unit = () +# class functional_point : + int -> + object ('a) val x : int method get_x : int method move : int -> 'a end +# val p : functional_point = +# - : int = 7 +# - : int = 10 +# - : int = 7 +# - : #functional_point -> functional_point = +# class virtual ['a] lst : + unit -> + object + method virtual hd : 'a + method iter : ('a -> unit) -> unit + method map : ('a -> 'a) -> 'a lst + method virtual null : bool + method print : ('a -> unit) -> unit + method virtual tl : 'a lst + end +and ['a] nil : + unit -> + object + method hd : 'a + method iter : ('a -> unit) -> unit + method map : ('a -> 'a) -> 'a lst + method null : bool + method print : ('a -> unit) -> unit + method tl : 'a lst + end +and ['a] cons : + 'a -> + 'a lst -> + object + val h : 'a + val t : 'a lst + method hd : 'a + method iter : ('a -> unit) -> unit + method map : ('a -> 'a) -> 'a lst + method null : bool + method print : ('a -> unit) -> unit + method tl : 'a lst + end +# val l1 : int lst = +# (3::10::[])- : unit = () +# val l2 : int lst = +# (4::11::[])- : unit = () +# val map_list : ('a -> 'b) -> 'a lst -> 'b lst = +# val p1 : printable_color_point lst = +# ((3, red)::(10, red)::[])- : unit = () +# class virtual comparable : + unit -> object ('a) method virtual leq : 'a -> bool end +# class int_comparable : + int -> object ('a) val x : int method leq : 'a -> bool method x : int end +# class int_comparable2 : + int -> + object ('a) + val x : int + val mutable x' : int + method leq : 'a -> bool + method set_x : int -> unit + method x : int + end +# class ['a] sorted_list : + unit -> + object + constraint 'a = #comparable + val mutable l : 'a list + method add : 'a -> unit + method hd : 'a + end +# val l : _#comparable sorted_list = +# val c : int_comparable = +# - : unit = () +# val c2 : int_comparable2 = +# # l#add (c2 :> int_comparable);; (* Echec : 'a comp2 n'est un sous-type *) +Error: Type + int_comparable2 = + < leq : int_comparable2 -> bool; set_x : int -> unit; x : int > + is not a subtype of + int_comparable = < leq : int_comparable -> bool; x : int > +Type int_comparable = < leq : int_comparable -> bool; x : int > +is not a subtype of + int_comparable2 = + < leq : int_comparable2 -> bool; set_x : int -> unit; x : int > +# - : unit = () +# class int_comparable3 : + int -> + object + val mutable x : int + method leq : int_comparable -> bool + method setx : int -> unit + method x : int + end +# val c3 : int_comparable3 = +# - : unit = () +# # (new sorted_list ())#add c3;; (* Echec : leq n'est pas binaire *) +Error: This expression has type + int_comparable3 = + < leq : int_comparable -> bool; setx : int -> unit; x : int > + but an expression was expected of type + #comparable as 'a = < leq : 'a -> bool; .. > + Type int_comparable = < leq : int_comparable -> bool; x : int > + is not compatible with type + int_comparable3 = + < leq : int_comparable -> bool; setx : int -> unit; x : int > + The first object type has no method setx +# val sort : (#comparable as 'a) list -> 'a list = +# # let pr l = + List.map (fun c -> print_int c#x; print_string " ") l; + print_newline ();; +Warning 10: this expression should have type unit. +val pr : < x : int; .. > list -> unit = +# val l : int_comparable list = [; ; ] +# 5 2 4 +- : unit = () +# 2 4 5 +- : unit = () +# val l : int_comparable2 list = [; ] +# 2 0 +- : unit = () +# 0 2 +- : unit = () +# val min : (#comparable as 'a) -> 'a -> 'a = +# - : int = 7 +# - : int = 3 +# class ['a] link : + 'a -> + object ('b) + val mutable next : 'b option + val mutable x : 'a + method append : 'b option -> unit + method next : 'b option + method set_next : 'b option -> unit + method set_x : 'a -> unit + method x : 'a + end +# # + class ['a] double_link x = object (self) + inherit ['a] link x + val mutable prev = None + method prev = prev + method set_next l = + next <- l; + match l with Some l -> l#set_prev (Some self) | None -> () + method set_prev l = prev <- l + end;; +Warning 7: the method set_next is overridden. +class ['a] double_link : + 'a -> + object ('b) + val mutable next : 'b option + val mutable prev : 'b option + val mutable x : 'a + method append : 'b option -> unit + method next : 'b option + method prev : 'b option + method set_next : 'b option -> unit + method set_prev : 'b option -> unit + method set_x : 'a -> unit + method x : 'a + end +# val fold_right : ('a -> 'b -> 'b) -> 'a #link option -> 'b -> 'b = +# class calculator : + unit -> + object ('a) + val mutable acc : float + val mutable arg : float + val mutable equals : 'a -> float + method acc : float + method add : 'a + method arg : float + method enter : float -> 'a + method equals : float + method sub : 'a + end +# - : float = 5. +# - : float = 1.5 +# - : float = 15. +# class calculator : + unit -> + object ('a) + val mutable acc : float + val mutable arg : float + val mutable equals : 'a -> float + method acc : float + method add : 'a + method arg : float + method enter : float -> 'a + method equals : float + method sub : 'a + end +# - : float = 5. +# - : float = 1.5 +# - : float = 15. +# # + class calculator arg acc = object (self) + val arg = arg + val acc = acc + method enter n = new calculator n acc + method add = new calculator_add arg self#equals + method sub = new calculator_sub arg self#equals + method equals = arg + end and calculator_add arg acc = object + inherit calculator arg acc + method enter n = new calculator_add n acc + method equals = acc +. arg + end and calculator_sub arg acc = object + inherit calculator arg acc + method enter n = new calculator_sub n acc + method equals = acc -. arg + end;; +Warning 7: the method enter is overridden. +# + class calculator arg acc = object (self) + val arg = arg + val acc = acc + method enter n = new calculator n acc + method add = new calculator_add arg self#equals + method sub = new calculator_sub arg self#equals + method equals = arg + end and calculator_add arg acc = object + inherit calculator arg acc + method enter n = new calculator_add n acc + method equals = acc +. arg + end and calculator_sub arg acc = object + inherit calculator arg acc + method enter n = new calculator_sub n acc + method equals = acc -. arg + end;; + +Warning 7: the method equals is overridden. +# + class calculator arg acc = object (self) + val arg = arg + val acc = acc + method enter n = new calculator n acc + method add = new calculator_add arg self#equals + method sub = new calculator_sub arg self#equals + method equals = arg + end and calculator_add arg acc = object + inherit calculator arg acc + method enter n = new calculator_add n acc + method equals = acc +. arg + end and calculator_sub arg acc = object + inherit calculator arg acc + method enter n = new calculator_sub n acc + method equals = acc -. arg + end;; + + +Warning 7: the method enter is overridden. +# + class calculator arg acc = object (self) + val arg = arg + val acc = acc + method enter n = new calculator n acc + method add = new calculator_add arg self#equals + method sub = new calculator_sub arg self#equals + method equals = arg + end and calculator_add arg acc = object + inherit calculator arg acc + method enter n = new calculator_add n acc + method equals = acc +. arg + end and calculator_sub arg acc = object + inherit calculator arg acc + method enter n = new calculator_sub n acc + method equals = acc -. arg + end;; + + + +Warning 7: the method equals is overridden. +class calculator : + float -> + float -> + object + val acc : float + val arg : float + method add : calculator + method enter : float -> calculator + method equals : float + method sub : calculator + end +and calculator_add : + float -> + float -> + object + val acc : float + val arg : float + method add : calculator + method enter : float -> calculator + method equals : float + method sub : calculator + end +and calculator_sub : + float -> + float -> + object + val acc : float + val arg : float + method add : calculator + method enter : float -> calculator + method equals : float + method sub : calculator + end +# val calculator : calculator = +# - : float = 5. +# - : float = 1.5 +# - : float = 15. +# diff --git a/testsuite/tests/typing-objects/Makefile b/testsuite/tests/typing-objects/Makefile new file mode 100644 index 00000000..9add1557 --- /dev/null +++ b/testsuite/tests/typing-objects/Makefile @@ -0,0 +1,3 @@ +include ../../makefiles/Makefile.toplevel +include ../../makefiles/Makefile.common + diff --git a/testsuite/tests/typing-objects/Tests.ml b/testsuite/tests/typing-objects/Tests.ml new file mode 100644 index 00000000..19d20d88 --- /dev/null +++ b/testsuite/tests/typing-objects/Tests.ml @@ -0,0 +1,304 @@ +(* Le sous-typage est "syntaxique" *) +fun (x : < x : int >) y z -> (y :> 'a), (x :> 'a), (z :> 'a);; +(* - : (< x : int > as 'a) -> 'a -> 'a * 'a = *) + +(* Bizarrerie du typage des classes *) +class ['a] c () = object + method f = (new c (): int c) +end and ['a] d () = object + inherit ['a] c () +end;; +(* 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 *) + +(* 'a libre dans classe d *) +class ['a] c () = object + method f (x : 'a) = () +end and d () = object + inherit ['a] c () +end;; + +(* Instancie #c *) +class virtual c () = object +end and ['a] d () = object + constraint 'a = #c + method f (x : #c) = (x#x : int) +end;; +(* class virtual c : unit -> object end *) +(* and ['a] d : *) +(* unit -> object constraint 'a = < x : int; .. > method f : 'a -> int end *) + +class ['a] c () = object + constraint 'a = int +end and ['a] d () = object + constraint 'a = 'b #c +end;; +(* class ['a] c : unit -> object constraint 'a = int end + and ['a] d : unit -> object constraint 'a = int #c end *) + +(* Self en parametre *) +class ['a] c (x : 'a) = object (self : 'b) + constraint 'a = 'b + method f = self +end;; +new c;; +(* class ['a] c : + 'a -> object ('a) constraint 'a = < f : 'a; .. > method f : 'a end *) +(* - : ('a c as 'a) -> 'a = *) + +class x () = object + method virtual f : int +end;; +(* The class x should be virtual: its methods f is undefined *) + +(* Methode g en trop *) +class virtual c ((x : 'a): < f : int >) = object (_ : 'a) end +and virtual d x = object (_ : 'a) + inherit c x + method g = true +end;; + +(* Contrainte non respectee *) +class ['a] c () = object + constraint 'a = int + method f x = (x : bool c) +end;; + +(* Differentes contraintes *) +class ['a, 'b] c () = object + constraint 'a = int -> 'c + constraint 'b = 'a * * 'c * 'd + method f (x : 'a) (y : 'b) = () +end;; +class ['a, 'b] d () = object + inherit ['a, 'b] c () +end;; + +(* Contrainte non generique *) +let x = ref [];; +class ['a] c () = object + method f = (x : 'a) +end;; + +(* Abreviations *) +type 'a c = +and 'a d = ;; +type 'a c = +and 'a d = ;; +type 'a c = +and 'a d = ;; +type 'a u = < x : 'a> +and 'a t = 'a t u;; +type 'a u = 'a +and 'a t = 'a t u;; +type 'a u = 'a;; +type t = t u * t u;; + +type t = as 'a;; +type 'a u = 'a;; +fun (x : t) (y : 'a u) -> x = y;; +fun (x : t) (y : 'a u) -> y = x;; +(* - : t -> t u -> bool = *) + +(* Modules *) +module M = + struct + class ['a, 'b] c (x: int) (y: 'b) = object + constraint 'a = int -> bool + val x : float list = [] + val y = y + method f (x : 'a) = () + method g = y + end + end;; +module M' = (M : + sig + class virtual ['a, 'b] c : int -> 'b -> object + constraint 'a = int -> bool + val x : float list + val y : 'b + method f : 'a -> unit + method g : 'b + end + end);; +class ['a, 'b] d () y = object inherit ['a, 'b] M.c 7 y end;; +class ['a, 'b] e () y = object inherit ['a, 'b] M'.c 1 y end;; +(new M.c 3 "a")#g;; +(new d () 10)#g;; +(new e () 7.1)#g;; +open M;; +(new c 5 true)#g;; + +(* #cl quand cl est fermee *) +module M = struct class ['a] c () = object method f (x : 'a) = () end end;; +module M' = + (M : sig class ['a] c : unit -> object method f : 'a -> unit end end);; +fun x -> (x :> 'a #M.c);; +fun x -> (x :> 'a #M'.c);; +class ['a] c (x : 'b #c) = object end;; +class ['a] c (x : 'b #c) = object end;; + +(* Ordre de calcul *) +class c () = object method f = 1 end and d () = object method f = 2 end;; +class e () = object inherit c () inherit d () end;; +(new e ())#f;; +class c () = object val x = - true val y = -. () end;; + +class c () = object method f = 1 method g = 1 method h = 1 end;; +class d () = object method h = 2 method i = 2 method j = 2 end;; +class e () = object + method f = 3 + inherit c () + method g = 3 + method i = 3 + inherit d () + method j = 3 +end;; +let e = new e ();; +e#f, e#g, e#h, e#i, e#j;; + +class c a = object val x = 1 val y = 1 val z = 1 val a = a end;; +class d b = object val z = 2 val t = 2 val u = 2 val b = b end;; +class e () = object + val x = 3 + inherit c 5 + val y = 3 + val t = 3 + inherit d 7 + val u = 3 + method x = x + method y = y + method z = z + method t = t + method u = u + method a = a + method b = b +end;; +let e = new e ();; +e#x, e#y, e#z, e#t, e#u, e#a, e#b;; + +class c (x : int) (y : int) = object + val x = x + val y = y + method x = x + method y = y +end;; +class d x y = object inherit c x y end;; +let c = new c 1 2 in c#x, c#y;; +let d = new d 1 2 in d#x, d#y;; + +(* Parametres n'apparaissant pas dans le type de l'objet *) +class ['a] c (x : 'a) = object end;; +new c;; + +(* Variables privees *) +(* +module type M = sig + class c : unit -> object val x : int end + class d : unit -> object inherit c val private x : int val x : bool end +end;; +class c (x : int) = + val private mutable x = x + method get = x + method set y = x <- y +end;; +let c = new c 5;; +c#get;; +c#set 7; c#get;; + + +class c () = val x = 1 val y = 1 method c = x end;; +class d () = inherit c () val private x method d = x end;; +class e () = + val x = 2 val y = 2 inherit d () method x = x method y = y +end;; +let e = new e () in e#x, e#y, e#c, e#d;; +*) + +(* Oubli de variables dans l'interface *) +module M : + sig + class c : unit -> object + method xc : int + end + end = + struct + class c () = object + val x = 1 + method xc = x + end + end;; +class d () = object + val x = 2 + method xd = x + inherit M.c () +end;; +let d = new d () in d#xc, d#xd;; + +class virtual ['a] matrix (sz, init : int * 'a) = object + val m = Array.create_matrix sz sz init + method add (mtx : 'a matrix) = (mtx#m.(0).(0) : 'a) +end;; + +class c () = object method m = new c () end;; +(new c ())#m;; +module M = struct class c () = object method m = new c () end end;; +(new M.c ())#m;; + +type uu = A of int | B of ( as 'a);; + +class virtual c () = object (_ : 'a) method virtual m : 'a end;; +module S = (struct + let f (x : #c) = x +end : sig + val f : (#c as 'a) -> 'a +end);; +module S = (struct + let f (x : #c) = x +end : sig + val f : #c -> #c +end);; + +module M = struct type t = int class t () = object end end;; + +fun x -> (x :> < m : 'a -> 'a > as 'a);; + +fun x -> (x : int -> bool :> 'a -> 'a);; +fun x -> (x : int -> bool :> int -> int);; +fun x -> (x : < > :> < .. >);; +fun x -> (x : < .. > :> < >);; + +let x = ref [];; +module F(X : sig end) = + struct type t = int let _ = (x : < m : t> list ref) end;; +x;; + +type 'a t;; +fun (x : 'a t as 'a) -> ();; +fun (x : 'a t) -> (x : 'a); ();; +type 'a t = < x : 'a >;; +fun (x : 'a t as 'a) -> ();; +fun (x : 'a t) -> (x : 'a); ();; + +class ['a] c () = object + constraint 'a = < .. > -> unit + method m = (fun x -> () : 'a) +end;; +class ['a] c () = object + constraint 'a = unit -> < .. > + method m (f : 'a) = f () +end;; + +class c () = object (self) + method private m = 1 + method n = self#m +end;; + +class d () = object (self) + inherit c () + method o = self#m +end;; + +let x = new d () in x#n, x#o;; + +class c () = object method virtual m : int method private m = 1 end;; diff --git a/testsuite/tests/typing-objects/Tests.ml.reference b/testsuite/tests/typing-objects/Tests.ml.reference new file mode 100644 index 00000000..5c26800e --- /dev/null +++ b/testsuite/tests/typing-objects/Tests.ml.reference @@ -0,0 +1,386 @@ + +# - : < x : int > -> + < x : int > -> < x : int > -> < x : int > * < x : int > * < x : int > += +# 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 +# # (* 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 *) + + (* 'a libre dans classe d *) + class ['a] c () = object + method f (x : 'a) = () + end and d () = object + inherit ['a] c () + end;; +Error: Some type variables are unbound in this type: + class d : unit -> object method f : 'a -> unit end + The method f has type 'a -> unit where 'a is unbound +# class virtual c : unit -> object end +and ['a] d : + unit -> object constraint 'a = < x : int; .. > method f : 'a -> int end +# class ['a] c : unit -> object constraint 'a = int end +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 = +# * # (* class ['a] c : + 'a -> object ('a) constraint 'a = < f : 'a; .. > method f : 'a end *) + (* - : ('a c as 'a) -> 'a = *) + + class x () = object + method virtual f : int + end;; +Error: This class should be virtual. The following methods are undefined : f +# # (* The class x should be virtual: its methods f is undefined *) + + (* Methode g en trop *) + class virtual c ((x : 'a): < f : int >) = object (_ : 'a) end + and virtual d x = object (_ : 'a) + inherit c x + method g = true + end;; +Error: This pattern cannot match self: it only matches values of type + < f : int > +# # + (* Contrainte non respectee *) + class ['a] c () = object + constraint 'a = int + method f x = (x : bool c) + end;; +Error: The abbreviation c is used with parameters bool c + wich are incompatible with constraints int c +# class ['a, 'b] c : + unit -> + object + constraint 'a = int -> 'c + constraint 'b = 'a * < x : 'b > * 'c * 'd + method f : 'a -> 'b -> unit + end +# class ['a, 'b] d : + unit -> + object + constraint 'a = int -> 'c + constraint 'b = 'a * < x : 'b > * 'c * 'd + method f : 'a -> 'b -> unit + end +# val x : '_a list ref = {contents = []} +# # 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 +# # + (* Abreviations *) + type 'a c =  + and '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 > +# type 'a c = < f : 'a c > +and 'a d = < f : int c > +# type 'a u = < x : 'a > +and 'a t = 'a t u +# # type 'a u = 'a + and 'a t = 'a t u;; +Error: The type abbreviation t is cyclic +# type 'a u = 'a +# # type t = t u * t u;; +Error: The type abbreviation t is cyclic +# type t = < x : 'a > as 'a +# type 'a u = 'a +# - : t -> t u -> bool = +# - : t -> t u -> bool = +# module M : + sig + class ['a, 'b] c : + int -> + 'b -> + object + constraint 'a = int -> bool + val x : float list + val y : 'b + method f : 'a -> unit + method g : 'b + end + end +# module M' : + sig + class virtual ['a, 'b] c : + int -> + 'b -> + object + constraint 'a = int -> bool + val x : float list + val y : 'b + method f : 'a -> unit + method g : 'b + end + end +# class ['a, 'b] d : + unit -> + 'b -> + object + constraint 'a = int -> bool + val x : float list + val y : 'b + method f : 'a -> unit + method g : 'b + end +# class ['a, 'b] e : + unit -> + 'b -> + object + constraint 'a = int -> bool + val x : float list + val y : 'b + method f : 'a -> unit + method g : 'b + end +# - : string = "a" +# - : int = 10 +# - : float = 7.1 +# # - : bool = true +# module M : sig class ['a] c : unit -> object method f : 'a -> unit end end +# module M' : sig class ['a] c : unit -> object method f : 'a -> unit end end +# - : ('b #M.c as 'a) -> 'a = +# - : ('b #M'.c as 'a) -> 'a = +# class ['a] c : 'a #c -> object end +# class ['a] c : 'a #c -> object end +# class c : unit -> object method f : int end +and d : unit -> object method f : int end +# # class e () = object inherit c () inherit d () end;; +Warning 7: the following methods are overriden by the class d : + f +class e : unit -> object method f : int end +# - : int = 2 +# # class c () = object val x = - true val y = -. () end;; +Error: This expression has type bool but an expression was expected of type + int +# class c : unit -> object method f : int method g : int method h : int end +# class d : unit -> object method h : int method i : int method j : int end +# # class e () = object + method f = 3 + inherit c () + method g = 3 + method i = 3 + inherit d () + method j = 3 + end;; +Warning 7: the following methods are overriden by the class c : + f +# class e () = object + method f = 3 + inherit c () + method g = 3 + method i = 3 + inherit d () + method j = 3 + end;; + + +Warning 7: the method g is overridden. +# class e () = object + method f = 3 + inherit c () + method g = 3 + method i = 3 + inherit d () + method j = 3 + end;; + + + +Warning 7: the following methods are overriden by the class d : + h i +# class e () = object + method f = 3 + inherit c () + method g = 3 + method i = 3 + inherit d () + method j = 3 + end;; + + + + + +Warning 7: the method j is overridden. +class e : + unit -> + object + method f : int + method g : int + method h : int + method i : int + method j : int + end +# val e : e = +# - : int * int * int * int * int = (1, 3, 2, 2, 3) +# class c : 'a -> object val a : 'a val x : int val y : int val z : int end +# class d : 'a -> object val b : 'a val t : int val u : int val z : int end +# # class e () = object + val x = 3 + inherit c 5 + val y = 3 + val t = 3 + inherit d 7 + val u = 3 + method x = x + method y = y + method z = z + method t = t + method u = u + method a = a + method b = b + end;; +Warning 13: the following instance variables are overriden by the class c : + x +The behaviour changed in ocaml 3.10 (previous behaviour was hiding.) +# class e () = object + val x = 3 + inherit c 5 + val y = 3 + val t = 3 + inherit d 7 + val u = 3 + method x = x + method y = y + method z = z + method t = t + method u = u + method a = a + method b = b + end;; + + + +Warning 13: the instance variable y is overridden. +The behaviour changed in ocaml 3.10 (previous behaviour was hiding.) +# class e () = object + val x = 3 + inherit c 5 + val y = 3 + val t = 3 + inherit d 7 + val u = 3 + method x = x + method y = y + method z = z + method t = t + method u = u + method a = a + method b = b + end;; + + + + + +Warning 13: the following instance variables are overriden by the class d : + t z +The behaviour changed in ocaml 3.10 (previous behaviour was hiding.) +Characters 91-96: +Warning 13: the instance variable u is overridden. +The behaviour changed in ocaml 3.10 (previous behaviour was hiding.) +class e : + unit -> + object + val a : int + val b : int + val t : int + val u : int + val x : int + val y : int + val z : int + method a : int + method b : int + method t : int + method u : int + method x : int + method y : int + method z : int + end +# val e : e = +# - : int * int * int * int * int * int * int = (1, 3, 2, 2, 3, 5, 7) +# class c : + int -> + int -> object val x : int val y : int method x : int method y : int end +# class d : + int -> + int -> object val x : int val y : int method x : int method y : int end +# - : int * int = (1, 2) +# - : int * int = (1, 2) +# class ['a] c : 'a -> object end +# - : 'a -> 'a c = +# * * * * * * * * * * * * * * * * * * * * * 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) +# # + class virtual ['a] matrix (sz, init : int * 'a) = object + val m = Array.create_matrix sz sz init + method add (mtx : 'a matrix) = (mtx#m.(0).(0) : 'a) + end;; +Error: The abbreviation 'a matrix expands to type < add : 'a matrix -> 'a > + but is used with type < m : 'a array array; .. > +# class c : unit -> object method m : c end +# - : c = +# module M : sig class c : unit -> object method m : c end end +# - : M.c = +# type uu = A of int | B of (< leq : 'a > as 'a) +# class virtual c : unit -> object ('a) method virtual m : 'a end +# module S : sig val f : (#c as 'a) -> 'a end +# # module S = (struct + let f (x : #c) = x + end : sig + val f : #c -> #c + end);; +Error: Signature mismatch: + Modules do not match: + sig val f : (#c as 'a) -> 'a end + is not included in + sig val f : #c -> #c end + Values do not match: + val f : (#c as 'a) -> 'a + is not included in + val f : #c -> #c +# # + module M = struct type t = int class t () = object end end;; +Error: Multiple definition of the type name t. + Names must be unique in a given structure or signature. +# - : < m : (< m : 'a > as 'b) -> 'b as 'a; .. > -> 'b = +# # + fun x -> (x : int -> bool :> 'a -> 'a);; +Error: Type int -> bool is not a subtype of int -> int +# # fun x -> (x : int -> bool :> int -> int);; +Error: Type int -> bool is not a subtype of int -> int +# - : < > -> < > = +# - : < .. > -> < > = +# val x : '_a list ref = {contents = []} +# module F : functor (X : sig end) -> sig type t = int end +# - : < m : int > list ref = {contents = []} +# type 'a t +# # fun (x : 'a t as 'a) -> ();; +Error: This alias is bound to type 'a t but is used as an instance of type 'a +# # fun (x : 'a t) -> (x : 'a); ();; +Error: This expression has type 'a t but an expression was expected of type + 'a +# type 'a t = < x : 'a > +# - : ('a t as 'a) -> unit = +# # fun (x : 'a t) -> (x : 'a); ();; +Warning 10: this expression should have type unit. +- : ('a t as 'a) -> unit = +# class ['a] c : + unit -> object constraint 'a = (< .. > as 'b) -> unit method m : 'a end +# class ['a] c : + unit -> + object constraint 'a = unit -> (< .. > as 'b) method m : 'a -> 'b end +# class c : unit -> object method private m : int method n : int end +# class d : + unit -> object method private m : int method n : int method o : int end +# - : int * int = (1, 1) +# class c : unit -> object method m : int end +# diff --git a/testsuite/tests/typing-poly/Makefile b/testsuite/tests/typing-poly/Makefile new file mode 100644 index 00000000..9add1557 --- /dev/null +++ b/testsuite/tests/typing-poly/Makefile @@ -0,0 +1,3 @@ +include ../../makefiles/Makefile.toplevel +include ../../makefiles/Makefile.common + diff --git a/testsuite/tests/typing-poly/poly.ml b/testsuite/tests/typing-poly/poly.ml new file mode 100644 index 00000000..d1a9ee16 --- /dev/null +++ b/testsuite/tests/typing-poly/poly.ml @@ -0,0 +1,614 @@ +(* $Id: poly.ml 9396 2009-10-26 07:11:36Z garrigue $ *) +(* + Polymorphic methods are now available in the main branch. + Enjoy. +*) + +(* Tests for explicit polymorphism *) +open StdLabels;; + +type 'a t = { t : 'a };; +type 'a fold = { fold : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b };; +let f l = { fold = List.fold_left l };; +(f [1;2;3]).fold ~f:(+) ~init:0;; + +class ['b] ilist l = object + val l = l + method add x = {< l = x :: l >} + method fold : 'a. f:('a -> 'b -> 'a) -> init:'a -> 'a = + List.fold_left l +end +;; +class virtual ['a] vlist = object (_ : 'self) + method virtual add : 'a -> 'self + method virtual fold : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b +end +;; +class ilist2 l = object + inherit [int] vlist + val l = l + method add x = {< l = x :: l >} + method fold = List.fold_left l +end +;; +let ilist2 l = object + inherit [_] vlist + val l = l + method add x = {< l = x :: l >} + method fold = List.fold_left l +end +;; +class ['a] ilist3 l = object + inherit ['a] vlist + val l = l + method add x = {< l = x :: l >} + method fold = List.fold_left l +end +;; +class ['a] ilist4 (l : 'a list) = object + val l = l + method virtual add : _ + method add x = {< l = x :: l >} + method virtual fold : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b + method fold = List.fold_left l +end +;; +class ['a] ilist5 (l : 'a list) = object (self) + val l = l + method add x = {< l = x :: l >} + method virtual fold : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b + method virtual fold2 : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b + method fold2 ~f ~init = self#fold ~f ~init:(self#fold ~f ~init) + method fold = List.fold_left l +end +;; +class ['a] ilist6 l = object (self) + inherit ['a] vlist + val l = l + method add x = {< l = x :: l >} + method virtual fold2 : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b + method fold2 ~f ~init = self#fold ~f ~init:(self#fold ~f ~init) + method fold = List.fold_left l +end +;; +class virtual ['a] olist = object + method virtual fold : 'c. f:('a -> 'c -> 'c) -> init:'c -> 'c +end +;; +class ['a] onil = object + inherit ['a] olist + method fold ~f ~init = init +end +;; +class ['a] ocons ~hd ~tl = object (_ : 'b) + inherit ['a] olist + val hd : 'a = hd + val tl : 'a olist = tl + method fold ~f ~init = f hd (tl#fold ~f ~init) +end +;; +class ['a] ostream ~hd ~tl = object (_ : 'b) + inherit ['a] olist + val hd : 'a = hd + val tl : _ #olist = (tl : 'a ostream) + method fold ~f ~init = f hd (tl#fold ~f ~init) + method empty = false +end +;; +class ['a] ostream1 ~hd ~tl = object (self : 'b) + inherit ['a] olist + val hd = hd + val tl : 'b = tl + method hd = hd + method tl = tl + method fold ~f ~init = + self#tl#fold ~f ~init:(f self#hd init) +end +;; + +class vari = object + method virtual m : 'a. ([< `A|`B|`C] as 'a) -> int + method m = function `A -> 1 | `B|`C -> 0 +end +;; +class vari = object + method m : 'a. ([< `A|`B|`C] as 'a) -> int = function `A -> 1 | `B|`C -> 0 +end +;; +module V = + struct + type v = [`A | `B | `C] + let m : [< v] -> int = function `A -> 1 | #v -> 0 + end +;; +class varj = object + method virtual m : 'a. ([< V.v] as 'a) -> int + method m = V.m +end +;; + +module type T = sig + class vari : object method m : 'a. ([< `A | `B | `C] as 'a) -> int end +end +;; +module M0 = struct + class vari = object + method virtual m : 'a. ([< `A|`B|`C] as 'a) -> int + method m = function `A -> 1 | `B|`C -> 0 + end +end +;; +module M : T = M0 +;; +let v = new M.vari;; +v#m `A;; + +class point ~x ~y = object + val x : int = x + val y : int = y + method x = x + method y = y +end +;; +class color_point ~x ~y ~color = object + inherit point ~x ~y + val color : string = color + method color = color +end +;; +class circle (p : #point) ~r = object + val p = (p :> point) + val r = r + method virtual distance : 'a. (#point as 'a) -> float + method distance p' = + let dx = p#x - p'#x and dy = p#y - p'#y in + let d = sqrt (float (dx * dx + dy * dy)) -. float r in + if d < 0. then 0. else d +end +;; +let p0 = new point ~x:3 ~y:5 +let p1 = new point ~x:10 ~y:13 +let cp = new color_point ~x:12 ~y:(-5) ~color:"green" +let c = new circle p0 ~r:2 +let d = c#distance cp +;; +let f (x : < m : 'a. 'a -> 'a >) = (x : < m : 'b. 'b -> 'b >) +;; +let f (x : < m : 'a. 'a -> 'a list >) = (x : < m : 'b. 'b -> 'c >) +;; + +class id = object + method virtual id : 'a. 'a -> 'a + method id x = x +end +;; + +class type id_spec = object + method id : 'a -> 'a +end +;; +class id_impl = object (_ : #id_spec) + method id x = x +end +;; + +class a = object + method m = (new b : id_spec)#id true +end +and b = object (_ : #id_spec) + method id x = x +end +;; + +class ['a] id1 = object + method virtual id : 'b. 'b -> 'a + method id x = x +end +;; +class id2 (x : 'a) = object + method virtual id : 'b. 'b -> 'a + method id x = x +end +;; +class id3 x = object + val x = x + method virtual id : 'a. 'a -> 'a + method id _ = x +end +;; +class id4 () = object + val mutable r = None + method virtual id : 'a. 'a -> 'a + method id x = + match r with + None -> r <- Some x; x + | Some y -> y +end +;; +class c = object + method virtual m : 'a 'b. 'a -> 'b -> 'a + method m x y = x +end +;; + +let f1 (f : id) = f#id 1, f#id true +;; +let f2 f = (f : id)#id 1, (f : id)#id true +;; +let f3 f = f#id 1, f#id true +;; +let f4 f = ignore(f : id); f#id 1, f#id true +;; + +class c = object + method virtual m : 'a. (#id as 'a) -> int * bool + method m (f : #id) = f#id 1, f#id true +end +;; + +class id2 = object (_ : 'b) + method virtual id : 'a. 'a -> 'a + method id x = x + method mono (x : int) = x +end +;; +let app = new c #m (new id2) +;; +type 'a foo = 'a foo list +;; + +class ['a] bar (x : 'a) = object end +;; +type 'a foo = 'a foo bar +;; + +fun x -> (x : < m : 'a. 'a * 'b > as 'b)#m;; +fun x -> (x : < m : 'a. 'b * 'a list> as 'b)#m;; +let f x = (x : < m : 'a. 'b * (< n : 'a; .. > as 'a) > as 'b)#m;; +fun (x : < p : 'a. < m : 'a ; n : 'b ; .. > as 'a > as 'b) -> x#p;; +fun (x : as 'c> as 'd) -> x#m;; +(* printer is wrong on the next (no official syntax) *) +fun (x : >) -> x#m;; + +type sum = T of < id: 'a. 'a -> 'a > ;; +fun (T x) -> x#id;; + +type record = { r: < id: 'a. 'a -> 'a > } ;; +fun x -> x.r#id;; +fun {r=x} -> x#id;; + +class myself = object (self) + method self : 'a. 'a -> 'b = fun _ -> self +end;; + +class number = object (self : 'self) + val num = 0 + method num = num + method succ = {< num = num + 1 >} + method prev = + self#switch ~zero:(fun () -> failwith "zero") ~prev:(fun x -> x) + method switch : 'a. zero:(unit -> 'a) -> prev:('self -> 'a) -> 'a = + fun ~zero ~prev -> + if num = 0 then zero () else prev {< num = num - 1 >} +end +;; + +let id x = x +;; +class c = object + method id : 'a. 'a -> 'a = id +end +;; +class c' = object + inherit c + method id = id +end +;; +class d = object + inherit c as c + val mutable count = 0 + method id x = count <- count+1; x + method count = count + method old : 'a. 'a -> 'a = c#id +end +;; +class ['a] olist l = object + val l = l + method fold : 'b. f:('a -> 'b -> 'b) -> init:'b -> 'b + = List.fold_right l + method cons a = {< l = a :: l >} +end +;; +let sum (l : 'a #olist) = l#fold ~f:(fun x acc -> x+acc) ~init:0 +;; +let count (l : 'a #olist) = l#fold ~f:(fun _ acc -> acc+1) ~init:0 +;; +let append (l : 'a #olist) (l' : 'b #olist) = + l#fold ~init:l' ~f:(fun x acc -> acc#cons x) +;; + +type 'a t = unit +;; +class o = object method x : 'a. ([> `A] as 'a) t -> unit = fun _ -> () end +;; + +class c = object method m = new d () end and d ?(x=0) () = object end;; +class d ?(x=0) () = object end and c = object method m = new d () end;; + +class type numeral = object method fold : ('a -> 'a) -> 'a -> 'a end +class zero = object (_ : #numeral) method fold f x = x end +class next (n : #numeral) = + object (_ : #numeral) method fold f x = n#fold f (f x) end +;; + +class type node_type = object + method as_variant : [> `Node of node_type] +end;; +class node : node_type = object (self) + method as_variant : 'a. [> `Node of node_type] as 'a + = `Node (self :> node_type) +end;; +class node = object (self : #node_type) + method as_variant = `Node (self :> node_type) +end;; + +type bad = {bad : 'a. 'a option ref};; +let bad = {bad = ref None};; +type bad2 = {mutable bad2 : 'a. 'a option ref option};; +let bad2 = {bad2 = None};; +bad2.bad2 <- Some (ref None);; + +(* Type variable scope *) + +let f (x: as 'b>) (y : 'b) = ();; +let f (x: as 'b)>) (y : 'b) = ();; + +(* PR#1374 *) + +type 'a t= [`A of 'a];; +class c = object (self) + method m : 'a. ([> 'a t] as 'a) -> unit + = fun x -> self#m x +end;; +class c = object (self) + method m : 'a. ([> 'a t] as 'a) -> unit = function + | `A x' -> self#m x' + | _ -> failwith "c#m" +end;; +class c = object (self) + method m : 'a. ([> 'a t] as 'a) -> 'a = fun x -> self#m x +end;; + +(* usage avant instance *) +class c = object method m : 'a. 'a option -> ([> `A] as 'a) = fun x -> `A end;; + +(* various old bugs *) +class virtual ['a] visitor = +object method virtual caseNil : 'a end +and virtual int_list = +object method virtual visit : 'a.('a visitor -> 'a) end;; + +type ('a,'b) list_visitor = < caseNil : 'a; caseCons : 'b -> 'b list -> 'a > +type 'b alist = < visit : 'a. ('a,'b) list_visitor -> 'a > + +(* PR#1607 *) +class type ct = object ('s) + method fold : ('b -> 's -> 'b) -> 'b -> 'b +end +type t = {f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b};; + +(* PR#1663 *) +type t = u and u = t;; + +(* PR#1731 *) +class ['t] a = object constraint 't = [> `A of 't a] end +type t = [ `A of t a ];; + +(* Wrong in 3.06 *) +type ('a,'b) t constraint 'a = 'b and ('a,'b) u = ('a,'b) t;; + +(* Full polymorphism if we do not expand *) +type 'a t = 'a and u = int t;; + +(* Loose polymorphism if we expand *) +type 'a t constraint 'a = int;; +type 'a u = 'a and 'a v = 'a u t;; +type 'a u = 'a and 'a v = 'a u t constraint 'a = int;; + +(* Behaviour is unstable *) +type g = int;; +type 'a t = unit constraint 'a = g;; +type 'a u = 'a and 'a v = 'a u t;; +type 'a u = 'a and 'a v = 'a u t constraint 'a = int;; + +(* Example of wrong expansion *) +type 'a u = < m : 'a v > and 'a v = 'a list u;; + +(* PR#1744: Ctype.matches *) +type 'a t = 'a +type 'a u = A of 'a t;; + +(* Unification of cyclic terms *) +type 'a t = < a : 'a >;; +fun (x : 'a t as 'a) -> (x : 'b t);; +type u = 'a t as 'a;; + + +(* Variant tests *) +type t = A | B;; +function `A,_ -> 1 | _,A -> 2 | _,B -> 3;; +function `A,_ -> 1 | _,(A|B) -> 2;; +function Some `A, _ -> 1 | Some _, A -> 2 | None, A -> 3 | _, B -> 4;; +function Some `A, A -> 1 | Some `A, B -> 1 + | Some _, A -> 2 | None, A -> 3 | _, B -> 4;; +function A, `A -> 1 | A, `B -> 2 | B, _ -> 3;; +function `A, A -> 1 | `B, A -> 2 | _, B -> 3;; +function (`A|`B), _ -> 0 | _,(`A|`B) -> 1;; +function `B,1 -> 1 | _,1 -> 2;; +function 1,`B -> 1 | 1,_ -> 2;; + +(* pass typetexp, but fails during Typedecl.check_recursion *) +type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] +and ('a, 'b) b = 'b -> unit constraint 'b = [> `A of ('a, 'b) a as 'a];; + +(* PR#1917: expanding may change original in Ctype.unify2 *) +(* Note: since 3.11, the abbreviations are not used when printing + a type where they occur recursively inside. *) +class type ['a, 'b] a = object + method b: ('a, 'b) #b as 'b + method as_a: ('a, 'b) a +end and ['a, 'b] b = object + method a: ('a, 'b) #a as 'a + method as_b: ('a, 'b) b +end + +class type ['b] ca = object ('s) inherit ['s, 'b] a end +class type ['a] cb = object ('s) inherit ['a, 's] b end + +type bt = 'b ca cb as 'b +;; + +(* final classes, etc... *) +class c = object method m = 1 end;; +let f () = object (self:c) method m = 1 end;; +let f () = object (self:c) method private n = 1 method m = self#n end;; +let f () = object method private n = 1 method m = {<>}#n end;; +let f () = object (self:c) method n = 1 method m = 2 end;; +let f () = object (_:'s) constraint 's = < n : int > method m = 1 end;; +class c = object (_ : 's) + method x = 1 + method private m = + object (self: 's) method x = 3 method private m = self end +end;; +let o = object (_ : 's) + method x = 1 + method private m = + object (self: 's) method x = 3 method private m = self end +end;; + + +(* Unsound! *) +fun (x : > as 'foo) -> + (x : > as 'bar) >);; +type 'a foo = +type foo' = +type 'a bar = > +type bar' = +let f (x : foo') = (x : bar');; + +fun (x : as 'foo)>) -> + (x : )> as 'bar);; +fun (x : as 'foo)>) -> + (x : )> as 'bar);; +fun (x : as 'foo) -> + (x : as 'bar)>);; +let f x = + (x : ('a * 'bar> as 'bar)> + :> ('a * 'foo)> as 'foo);; + +module M +: sig val f : ( as 'bar)>) -> unit end += struct let f (x : as 'foo) = () end;; +module M +: sig type t = as 'bar)> end += struct type t = as 'foo end;; + +module M : sig type 'a t type u = end += struct type 'a t = int type u = end;; +module M : sig type 'a t val f : -> int end += struct type 'a t = int let f (x : ) = x#m end;; +(* The following should be accepted too! *) +module M : sig type 'a t val f : -> int end += struct type 'a t = int let f x = x#m end;; + +let f x y = + ignore (x :> 'c * < > > as 'c); + ignore (y :> 'd * < > > as 'd); + x = y;; + + +(* Subtyping *) + +type t = [`A|`B];; +type v = private [> t];; +fun x -> (x : t :> v);; +type u = private [< t];; +fun x -> (x : u :> v);; +fun x -> (x : v :> u);; +type v = private [< t];; +fun x -> (x : u :> v);; +type p = ;; +type q = private ;; +fun x -> (x : q :> p);; +fun x -> (x : p :> q);; + +let f1 x = + (x : as 'a) -> int> + :> as 'b) -> int>);; +let f2 x = + (x : ;..> as 'a) -> int> + :> ;..> as 'b) -> int>);; +let f3 x = + (x : ;..> as 'a) -> int> + :> ;..> as 'b) -> int>);; +let f4 x = (x : ;..> :> ;..>);; +let f5 x = + (x : ] as 'a> :> ] as 'a>);; +let f6 x = + (x : ] as 'a> :> ] as 'a>);; + +(* Not really principal? *) +class c = object method id : 'a. 'a -> 'a = fun x -> x end;; +type u = c option;; +let just = function None -> failwith "just" | Some x -> x;; +let f x = let l = [Some x; (None : u)] in (just(List.hd l))#id;; +let g x = + let none = match None with y -> ignore [y;(None:u)]; y in + let x = List.hd [Some x; none] in (just x)#id;; +let h x = + let none = let y = None in ignore [y;(None:u)]; y in + let x = List.hd [Some x; none] in (just x)#id;; + +(* polymorphic recursion *) + +let rec f : 'a. 'a -> _ = fun x -> 1 and g x = f x;; +type 'a t = Leaf of 'a | Node of ('a * 'a) t;; +let rec depth : 'a. 'a t -> _ = + function Leaf _ -> 1 | Node x -> 1 + depth x;; +let rec depth : 'a. 'a t -> _ = + function Leaf _ -> 1 | Node x -> 1 + d x +and d x = depth x;; (* fails *) +let rec depth : 'a. 'a t -> _ = + function Leaf x -> x | Node x -> 1 + depth x;; (* fails *) +let rec depth : 'a. 'a t -> _ = + function Leaf x -> x | Node x -> depth x;; (* fails *) +let rec depth : 'a 'b. 'a t -> 'b = + function Leaf x -> x | Node x -> depth x;; (* fails *) +let rec r : 'a. 'a list * 'b list ref = [], ref [] +and q () = r;; +let f : 'a. _ -> _ = fun x -> x;; +let zero : 'a. [> `Int of int | `B of 'a] as 'a = `Int 0;; (* ok *) +let zero : 'a. [< `Int of int] as 'a = `Int 0;; (* fails *) + +(* compare with records (should be the same) *) +type t = {f: 'a. [> `Int of int | `B of 'a] as 'a} +let zero = {f = `Int 0} ;; +type t = {f: 'a. [< `Int of int] as 'a} +let zero = {f = `Int 0} ;; (* fails *) + +(* Yet another example *) +let rec id : 'a. 'a -> 'a = fun x -> x +and neg i b = (id (-i), id (not b));; + +(* De Xavier *) + +type t = A of int | B of (int*t) list | C of (string*t) list + +let rec transf f = function + | A x -> f x + | B l -> B (transf_alist f l) + | C l -> C (transf_alist f l) +and transf_alist : 'a. _ -> ('a*t) list -> ('a*t) list = fun f -> function + | [] -> [] + | (k,v)::tl -> (k, transf f v) :: transf_alist f tl +;; diff --git a/testsuite/tests/typing-poly/poly.ml.principal.reference b/testsuite/tests/typing-poly/poly.ml.principal.reference new file mode 100644 index 00000000..9187c712 --- /dev/null +++ b/testsuite/tests/typing-poly/poly.ml.principal.reference @@ -0,0 +1,590 @@ + +# * * * # type 'a t = { t : 'a; } +# type 'a fold = { fold : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b; } +# val f : 'a list -> 'a fold = +# - : int = 6 +# class ['a] ilist : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class virtual ['a] vlist : + object ('b) + method virtual add : 'a -> 'b + method virtual fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class ilist2 : + int list -> + object ('a) + val l : int list + method add : int -> 'a + method fold : f:('b -> int -> 'b) -> init:'b -> 'b + end +# val ilist2 : 'a list -> 'a vlist = +# class ['a] ilist3 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class ['a] ilist4 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class ['a] ilist5 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + method fold2 : f:('d -> 'a -> 'd) -> init:'d -> 'd + end +# class ['a] ilist6 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + method fold2 : f:('d -> 'a -> 'd) -> init:'d -> 'd + end +# class virtual ['a] olist : + object method virtual fold : f:('a -> 'b -> 'b) -> init:'b -> 'b end +# class ['a] onil : + object method fold : f:('a -> 'b -> 'b) -> init:'b -> 'b end +# class ['a] ocons : + hd:'a -> + tl:'a olist -> + object + val hd : 'a + val tl : 'a olist + method fold : f:('a -> 'b -> 'b) -> init:'b -> 'b + end +# class ['a] ostream : + hd:'a -> + tl:'a ostream -> + object + val hd : 'a + val tl : < empty : bool; fold : 'b. f:('a -> 'b -> 'b) -> init:'b -> 'b > + method empty : bool + method fold : f:('a -> 'c -> 'c) -> init:'c -> 'c + end +# class ['a] ostream1 : + hd:'a -> + tl:'b -> + object ('b) + val hd : 'a + val tl : 'b + method fold : f:('a -> 'c -> 'c) -> init:'c -> 'c + method hd : 'a + method tl : 'b + end +# class vari : object method m : [< `A | `B | `C ] -> int end +# class vari : object method m : [< `A | `B | `C ] -> int end +# module V : sig type v = [ `A | `B | `C ] val m : [< v ] -> int end +# class varj : object method m : [< V.v ] -> int end +# module type T = + sig class vari : object method m : [< `A | `B | `C ] -> int end end +# module M0 : + sig class vari : object method m : [< `A | `B | `C ] -> int end end +# module M : T +# val v : M.vari = +# - : int = 1 +# class point : + x:int -> + y:int -> object val x : int val y : int method x : int method y : int end +# class color_point : + x:int -> + y:int -> + color:string -> + object + val color : string + val x : int + val y : int + method color : string + method x : int + method y : int + end +# class circle : + #point -> + r:int -> + object val p : point val r : int method distance : #point -> float end +# val p0 : point = +val p1 : point = +val cp : color_point = +val c : circle = +val d : float = 11.4536240470737098 +# val f : < m : 'a. 'a -> 'a > -> < m : 'b. 'b -> 'b > = +# # let f (x : < m : 'a. 'a -> 'a list >) = (x : < m : 'b. 'b -> 'c >) + ;; +Error: This expression has type < m : 'a. 'a -> 'a list > + but an expression was expected of type < m : 'a. 'a -> 'b > + The universal variable 'a would escape its scope +# class id : object method id : 'a -> 'a end +# class type id_spec = object method id : 'a -> 'a end +# class id_impl : object method id : 'a -> 'a end +# class a : object method m : bool end +and b : object method id : 'a -> 'a end +# # + class ['a] id1 = object + method virtual id : 'b. 'b -> 'a + method id x = x + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'a +# # class id2 (x : 'a) = object + method virtual id : 'b. 'b -> 'a + method id x = x + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'a +# # class id3 x = object + val x = x + method virtual id : 'a. 'a -> 'a + method id _ = x + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'b +# # class id4 () = object + val mutable r = None + method virtual id : 'a. 'a -> 'a + method id x = + match r with + None -> r <- Some x; x + | Some y -> y + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'b +# class c : object method m : 'a -> 'b -> 'a end +# val f1 : id -> int * bool = +# val f2 : id -> int * bool = +# # let f3 f = f#id 1, f#id true + ;; +Error: This expression has type bool but an expression was expected of type + int +# # let f4 f = ignore(f : id); f#id 1, f#id true + ;; +Warning 18: this use of a polymorphic method is not principal. +# let f4 f = ignore(f : id); f#id 1, f#id true + ;; + +Warning 18: this use of a polymorphic method is not principal. +val f4 : id -> int * bool = +# 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) +# # 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 +# - : (< m : 'b. 'b * 'a > as 'a) -> 'c * (< m : 'e. 'e * 'd > as 'd) = +# - : (< m : 'b. 'a * 'b list > as 'a) -> + (< m : 'd. 'c * 'd list > as 'c) * 'e list += +# val f : + (< m : 'b. 'a * (< n : 'b; .. > as 'b) > as 'a) -> + (< m : 'd. 'c * (< n : 'd; .. > as 'd) > as 'c) * (< n : 'e; .. > as 'e) = + +# - : (< p : 'b. < m : 'b; n : 'a; .. > as 'b > as 'a) -> + (< m : 'c; n : < p : 'e. < m : 'e; n : 'd; .. > as 'e > as 'd; .. > as 'c) += +# - : (< m : 'b. 'b * < p : 'd. 'd * 'c * 'a > as 'c > as 'a) -> + ('f * + < p : 'g. + 'g * 'e * + (< m : 'i. 'i * < p : 'k. 'k * 'j * 'h > as 'j > as 'h) > + as 'e) += +# - : < m : 'a. < p : 'a; .. > as 'b > -> 'b = +# type sum = T of < id : 'a. 'a -> 'a > +# - : sum -> 'a -> 'a = +# type record = { r : < id : 'a. 'a -> 'a >; } +# - : record -> 'a -> 'a = +# - : record -> 'a -> 'a = +# class myself : object ('a) method self : 'b -> 'a end +# class number : + object ('a) + val num : int + method num : int + method prev : 'a + method succ : 'a + method switch : zero:(unit -> 'b) -> prev:('a -> 'b) -> 'b + end +# val id : 'a -> 'a = +# class c : object method id : 'a -> 'a end +# # class c' = object + inherit c + method id = id + end + ;; +Warning 7: the method id is overridden. +class c' : object method id : 'a -> 'a end +# # class d = object + inherit c as c + val mutable count = 0 + method id x = count <- count+1; x + method count = count + method old : 'a. 'a -> 'a = c#id + end + ;; +Warning 7: the method id is overridden. +class d : + object + val mutable count : int + method count : int + method id : 'a -> 'a + method old : 'b -> 'b + end +# class ['a] olist : + 'a list -> + object ('b) + val l : 'a list + method cons : 'a -> 'b + method fold : f:('a -> 'c -> 'c) -> init:'c -> 'c + end +# val sum : int #olist -> int = +# val count : 'a #olist -> int = +# val append : 'a #olist -> ('a #olist as 'b) -> 'b = +# type 'a t = unit +# class o : object method x : [> `A ] t -> unit end +# class c : object method m : d end +and d : ?x:int -> unit -> object end +# class d : ?x:int -> unit -> object end +and c : object method m : d end +# class type numeral = object method fold : ('a -> 'a) -> 'a -> 'a end +class zero : object method fold : ('a -> 'a) -> 'a -> 'a end +class next : #numeral -> object method fold : ('a -> 'a) -> 'a -> 'a end +# class type node_type = object method as_variant : [> `Node of node_type ] end +# class node : node_type +# class node : object method as_variant : [> `Node of node_type ] end +# type bad = { bad : 'a. 'a option ref; } +# # let bad = {bad = ref None};; +Error: This field value has type 'a option ref which is less general than + 'b. 'b option ref +# type bad2 = { mutable bad2 : 'a. 'a option ref option; } +# val bad2 : bad2 = {bad2 = None} +# # bad2.bad2 <- Some (ref None);; +Error: This field value has type 'a option ref option + which is less general than 'b. 'b option ref option +# val f : < m : 'a. < p : 'a * 'b > as 'b > -> 'c -> unit = +# val f : + < m : 'a. 'a * (< p : int * 'b > as 'b) > -> + (< p : int * 'c > as 'c) -> unit = +# type 'a t = [ `A of 'a ] +# class c : object method m : ([> 'a t ] as 'a) -> unit end +# class c : object method m : ([> 'a t ] as 'a) -> unit end +# class c : object method m : ([> 'a t ] as 'a) -> 'a end +# class c : object method m : ([> `A ] as 'a) option -> 'a end +# # + (* various old bugs *) + class virtual ['a] visitor = + object method virtual caseNil : 'a end + and virtual int_list = + object method virtual visit : 'a.('a visitor -> 'a) end;; +Error: This type scheme cannot quantify 'a : +it escapes this scope. +# type ('a, 'b) list_visitor = < caseCons : 'b -> 'b list -> 'a; caseNil : 'a > +type 'a alist = < visit : 'b. ('b, 'a) list_visitor -> 'b > +class type ct = object ('a) method fold : ('b -> 'a -> 'b) -> 'b -> 'b end +type t = { f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b; } +# # + (* PR#1663 *) + 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 ] +# # + (* Wrong in 3.06 *) + type ('a,'b) t constraint 'a = 'b and ('a,'b) u = ('a,'b) t;; +Error: Constraints are not satisfied in this type. +Type ('a, 'b) t should be an instance of ('c, 'c) t +# type 'a t = 'a +and u = int t +# type 'a t constraint 'a = int +# # type 'a u = 'a and 'a v = 'a u t;; +Error: Constraints are not satisfied in this type. +Type 'a u t should be an instance of int t +# type 'a u = 'a constraint 'a = int +and 'a v = 'a u t constraint 'a = int +# type g = int +# type 'a t = unit constraint 'a = g +# # type 'a u = 'a and 'a v = 'a u t;; +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 = int +# # + (* Example of wrong expansion *) + 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 +# type 'a t = < a : 'a > +# - : ('a t as 'a) -> ('b t as 'b) t = +# type u = 'a t as 'a +# type t = A | B +# - : [> `A ] * t -> int = +# - : [> `A ] * t -> int = +# - : [> `A ] option * t -> int = +# - : [> `A ] option * t -> int = +# - : t * [< `A | `B ] -> int = +# - : [< `A | `B ] * t -> int = +# # function (`A|`B), _ -> 0 | _,(`A|`B) -> 1;; +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +(`AnyExtraTag, `AnyExtraTag) +- : [> `A | `B ] * [> `A | `B ] -> int = +# # function `B,1 -> 1 | _,1 -> 2;; +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +(_, 0) +# function `B,1 -> 1 | _,1 -> 2;; + + + +Warning 11: this match case is unused. +- : [< `B ] * int -> int = +# # function 1,`B -> 1 | 1,_ -> 2;; +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +(0, _) +# function 1,`B -> 1 | 1,_ -> 2;; + + + +Warning 11: this match case is unused. +- : int * [< `B ] -> int = +# # + (* pass typetexp, but fails during Typedecl.check_recursion *) + type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] + and ('a, 'b) b = 'b -> unit constraint 'b = [> `A of ('a, 'b) a as 'a];; +Error: Constraints are not satisfied in this type. +Type +([> `B of 'a ], 'a) b as 'a +should be an instance of +(('b, [> `A of ('d, 'c) a as 'd ] as 'c) a as 'b, 'c) b +# * class type ['a, 'b] a = + object + constraint 'a = < as_a : ('a, 'b) a as 'c; b : 'b; .. > + constraint 'b = < a : 'a; as_b : ('a, 'b) b; .. > + method as_a : 'c + method b : 'b + end +and ['a, 'b] b = + object + constraint 'a = < as_a : ('a, 'b) a; b : 'b; .. > + constraint 'b = < a : 'a; as_b : ('a, 'b) b; .. > + method a : 'a + method as_b : ('a, 'b) b + end +class type ['a] ca = + object ('b) + constraint 'a = < a : 'b; as_b : ('b, 'a) b; .. > + method as_a : ('b, 'a) a + method b : 'a + end +class type ['a] cb = + object ('b) + constraint 'a = < as_a : ('a, 'b) a; b : 'b; .. > + method a : 'a + method as_b : ('a, 'b) b + end +type bt = 'a ca cb as 'a +# class c : object method m : int end +# val f : unit -> c = +# val f : unit -> c = +# # let f () = object method private n = 1 method m = {<>}#n end;; +Warning 15: the following private methods were made public implicitly: + n. +val f : unit -> < m : int; n : int > = +# # let f () = object (self:c) method n = 1 method m = 2 end;; +Error: This object is expected to have type c but actually has type + < m : int; n : 'a > + The first object type has no method n +# # let f () = object (_:'s) constraint 's = < n : int > method m = 1 end;; +Error: This object is expected to have type < n : int > but actually has type + < m : 'a > + The second object type has no method n +# # class c = object (_ : 's) + method x = 1 + method private m = + object (self: 's) method x = 3 method private m = self end + end;; +Error: This object is expected to have type < x : int; .. > + but actually has type < x : int > + Self type cannot be unified with a closed object type +# val o : < x : int > = +# # + + (* Unsound! *) + fun (x : > as 'foo) -> + (x : > as 'bar) >);; +Error: This expression has type < m : 'b. 'b * < m : 'b * 'a > > as 'a + but an expression was expected of type + < m : 'b. 'b * (< m : 'b * < m : 'd. 'd * 'c > > as 'c) > + Types for method m are incompatible +# # type 'a foo = + type foo' = + type 'a bar = > + type bar' = + let f (x : foo') = (x : bar');; +Error: This expression has type foo' = < m : 'a. 'a * 'a foo > + but an expression was expected of type bar' = < m : 'a. 'a * 'a bar > + Type 'a foo = < m : 'a * 'a foo > is not compatible with type + 'a bar = < m : 'a * < m : 'b. 'b * 'a bar > > + Type 'a foo = < m : 'a * 'a foo > is not compatible with type + < m : 'b. 'b * 'a bar > + Types for method m are incompatible +# # + fun (x : as 'foo)>) -> + (x : )> as 'bar);; +Error: This expression has type + < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > + but an expression was expected of type + < m : 'a. 'a * ('a * < m : 'c. 'c * ('c * 'd) >) > as 'd + Types for method m are incompatible +# # fun (x : as 'foo)>) -> + (x : )> as 'bar);; +Error: This expression has type + < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > + but an expression was expected of type + < m : 'a. 'a * ('a * < m : 'c. 'c * ('a * 'd) >) > as 'd + Types for method m are incompatible +# # fun (x : as 'foo) -> + (x : as 'bar)>);; +Error: This expression has type < m : 'b. 'b * ('b * 'a) > as 'a + but an expression was expected of type + < m : 'b. 'b * ('b * < m : 'd. 'd * 'c > as 'c) > + Types for method m are incompatible +# # let f x = + (x : ('a * 'bar> as 'bar)> + :> ('a * 'foo)> as 'foo);; +Error: Type < m : 'a. 'a -> ('a * (< m : 'd. 'd -> 'b as 'e > as 'c) as 'b) > + is not a subtype of < m : 'a. 'a -> ('a * 'f as 'h) as 'g > as 'f +# # + module M + : sig val f : ( as 'bar)>) -> unit end + = struct let f (x : as 'foo) = () end;; +Error: Signature mismatch: + Modules do not match: + sig val f : (< m : 'b. 'b * ('b * 'a) > as 'a) -> unit end + is not included in + sig + val f : < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > -> unit + end + Values do not match: + val f : (< m : 'b. 'b * ('b * 'a) > as 'a) -> unit + is not included in + val f : < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > -> unit +# # module M + : sig type t = as 'bar)> end + = struct type t = as 'foo end;; +Error: Signature mismatch: + Modules do not match: + sig type t = < m : 'b. 'b * ('b * 'a) > as 'a end + is not included in + sig type t = < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > end + Type declarations do not match: + type t = < m : 'b. 'b * ('b * 'a) > as 'a + is not included in + type t = < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > +# module M : sig type 'a t type u = < m : 'a. 'a t > end +# module M : sig type 'a t val f : < m : 'a. 'a t > -> int end +# module M : sig type 'a t val f : < m : 'a. 'a t > -> int end +# val f : + (< m : 'b. 'b -> (< m : 'b. 'b -> 'c * < > > as 'c) * < .. >; .. > as 'a) -> + 'a -> bool = +# type t = [ `A | `B ] +# type v = private [> t ] +# - : t -> v = +# type u = private [< t ] +# - : u -> v = +# # fun x -> (x : v :> u);; +Error: Type v = [> `A | `B ] is not a subtype of u = [< `A | `B ] +# type v = private [< t ] +# # fun x -> (x : u :> v);; +Error: Type u = [< `A | `B ] is not a subtype of v = [< `A | `B ] +# type p = < x : p > +# type q = private < x : p; .. > +# - : q -> p = +# # fun x -> (x : p :> q);; +Error: Type p = < x : p > is not a subtype of q = < x : p; .. > +# # + let f1 x = + (x : as 'a) -> int> + :> as 'b) -> int>);; +Error: Type < m : 'a. (< p : int; .. > as 'a) -> int > is not a subtype of + < m : 'b. (< p : int; q : int; .. > as 'b) -> int > +# val f2 : + < m : 'a. (< p : < a : int >; .. > as 'a) -> int > -> + < m : 'a. (< p : < a : int; b : int >; .. > as 'a) -> int > = +# # let f3 x = + (x : ;..> as 'a) -> int> + :> ;..> as 'b) -> int>);; +Error: Type < m : 'a. (< p : < a : int; b : int >; .. > as 'a) -> int > + is not a subtype of < m : 'a. (< p : < a : int >; .. > as 'a) -> int > +# # let f4 x = (x : ;..> :> ;..>);; +Error: Type < p : < a : int; b : int >; .. > is not a subtype of + < p : < a : int >; .. > +The second object type has no method b +# val f5 : + < m : 'a. [< `A of < p : int > ] as 'a > -> + < m : 'a. [< `A of < > ] as 'a > = +# # let f6 x = + (x : ] as 'a> :> ] as 'a>);; +Error: Type < m : 'a. [< `A of < > ] as 'a > is not a subtype of + < m : 'a. [< `A of < p : int > ] as 'a > +# class c : object method id : 'a -> 'a end +# type u = c option +# val just : 'a option -> 'a = +# val f : c -> 'a -> 'a = +# val g : c -> 'a -> 'a = +# val h : < id : 'a; .. > -> 'a = +# val f : 'a -> int = +val g : 'a -> int = +# type 'a t = Leaf of 'a | Node of ('a * 'a) t +# val depth : 'a t -> int = +# # let rec depth : 'a. 'a t -> _ = + function Leaf _ -> 1 | Node x -> 1 + d x + and d x = depth x;; (* fails *) +Error: This definition has type 'a t -> int which is less general than + 'b. 'b t -> int +# # let rec depth : 'a. 'a t -> _ = + function Leaf x -> x | Node x -> 1 + depth x;; (* fails *) +Error: This definition has type int t -> int which is less general than + 'a. 'a t -> int +# # let rec depth : 'a. 'a t -> _ = + function Leaf x -> x | Node x -> depth x;; (* fails *) +Error: This definition has type 'a t -> 'a which is less general than + 'b. 'b t -> 'a +# # let rec depth : 'a 'b. 'a t -> 'b = + function Leaf x -> x | Node x -> depth x;; (* fails *) +Error: This definition has type 'a. 'a t -> 'a which is less general than + 'b 'c. 'c t -> 'b +# val r : 'a list * '_b list ref = ([], {contents = []}) +val q : unit -> 'a list * '_b list ref = +# val f : 'a -> 'a = +# val zero : [> `B of 'a | `Int of int ] as 'a = `Int 0 +# # let zero : 'a. [< `Int of int] as 'a = `Int 0;; (* fails *) +Error: This expression has type [> `Int of int ] + but an expression was expected of type [< `Int of int ] + Types for tag `Int are incompatible +# type t = { f : 'a. [> `B of 'a | `Int of int ] as 'a; } +val zero : t = {f = `Int 0} +# # type t = {f: 'a. [< `Int of int] as 'a} + let zero = {f = `Int 0} ;; (* fails *) +Error: This expression has type [> `Int of int ] + but an expression was expected of type [< `Int of int ] + Types for tag `Int are incompatible +# val id : 'a -> 'a = +val neg : int -> bool -> int * bool = +# type t = A of int | B of (int * t) list | C of (string * t) list +val transf : (int -> t) -> t -> t = +val transf_alist : (int -> t) -> ('a * t) list -> ('a * t) list = +# diff --git a/testsuite/tests/typing-poly/poly.ml.reference b/testsuite/tests/typing-poly/poly.ml.reference new file mode 100644 index 00000000..48b47f3c --- /dev/null +++ b/testsuite/tests/typing-poly/poly.ml.reference @@ -0,0 +1,574 @@ + +# * * * # type 'a t = { t : 'a; } +# type 'a fold = { fold : 'b. f:('b -> 'a -> 'b) -> init:'b -> 'b; } +# val f : 'a list -> 'a fold = +# - : int = 6 +# class ['a] ilist : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class virtual ['a] vlist : + object ('b) + method virtual add : 'a -> 'b + method virtual fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class ilist2 : + int list -> + object ('a) + val l : int list + method add : int -> 'a + method fold : f:('b -> int -> 'b) -> init:'b -> 'b + end +# val ilist2 : 'a list -> 'a vlist = +# class ['a] ilist3 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class ['a] ilist4 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + end +# class ['a] ilist5 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + method fold2 : f:('d -> 'a -> 'd) -> init:'d -> 'd + end +# class ['a] ilist6 : + 'a list -> + object ('b) + val l : 'a list + method add : 'a -> 'b + method fold : f:('c -> 'a -> 'c) -> init:'c -> 'c + method fold2 : f:('d -> 'a -> 'd) -> init:'d -> 'd + end +# class virtual ['a] olist : + object method virtual fold : f:('a -> 'b -> 'b) -> init:'b -> 'b end +# class ['a] onil : + object method fold : f:('a -> 'b -> 'b) -> init:'b -> 'b end +# class ['a] ocons : + hd:'a -> + tl:'a olist -> + object + val hd : 'a + val tl : 'a olist + method fold : f:('a -> 'b -> 'b) -> init:'b -> 'b + end +# class ['a] ostream : + hd:'a -> + tl:'a ostream -> + object + val hd : 'a + val tl : 'a ostream + method empty : bool + method fold : f:('a -> 'b -> 'b) -> init:'b -> 'b + end +# class ['a] ostream1 : + hd:'a -> + tl:'b -> + object ('b) + val hd : 'a + val tl : 'b + method fold : f:('a -> 'c -> 'c) -> init:'c -> 'c + method hd : 'a + method tl : 'b + end +# class vari : object method m : [< `A | `B | `C ] -> int end +# class vari : object method m : [< `A | `B | `C ] -> int end +# module V : sig type v = [ `A | `B | `C ] val m : [< v ] -> int end +# class varj : object method m : [< V.v ] -> int end +# module type T = + sig class vari : object method m : [< `A | `B | `C ] -> int end end +# module M0 : + sig class vari : object method m : [< `A | `B | `C ] -> int end end +# module M : T +# val v : M.vari = +# - : int = 1 +# class point : + x:int -> + y:int -> object val x : int val y : int method x : int method y : int end +# class color_point : + x:int -> + y:int -> + color:string -> + object + val color : string + val x : int + val y : int + method color : string + method x : int + method y : int + end +# class circle : + #point -> + r:int -> + object val p : point val r : int method distance : #point -> float end +# val p0 : point = +val p1 : point = +val cp : color_point = +val c : circle = +val d : float = 11.4536240470737098 +# val f : < m : 'a. 'a -> 'a > -> < m : 'a. 'a -> 'a > = +# # let f (x : < m : 'a. 'a -> 'a list >) = (x : < m : 'b. 'b -> 'c >) + ;; +Error: This expression has type < m : 'a. 'a -> 'a list > + but an expression was expected of type < m : 'a. 'a -> 'b > + The universal variable 'a would escape its scope +# class id : object method id : 'a -> 'a end +# class type id_spec = object method id : 'a -> 'a end +# class id_impl : object method id : 'a -> 'a end +# class a : object method m : bool end +and b : object method id : 'a -> 'a end +# # + class ['a] id1 = object + method virtual id : 'b. 'b -> 'a + method id x = x + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'a +# # class id2 (x : 'a) = object + method virtual id : 'b. 'b -> 'a + method id x = x + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'a +# # class id3 x = object + val x = x + method virtual id : 'a. 'a -> 'a + method id _ = x + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'b +# # class id4 () = object + val mutable r = None + method virtual id : 'a. 'a -> 'a + method id x = + match r with + None -> r <- Some x; x + | Some y -> y + end + ;; +Error: This method has type 'a -> 'a which is less general than 'b. 'b -> 'b +# class c : object method m : 'a -> 'b -> 'a end +# val f1 : id -> int * bool = +# val f2 : id -> int * bool = +# # let f3 f = f#id 1, f#id true + ;; +Error: This expression has type bool but an expression was expected of type + int +# val f4 : id -> int * bool = +# 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) +# # 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 +# - : (< m : 'b. 'b * 'a > as 'a) -> 'c * 'a = +# - : (< m : 'b. 'a * 'b list > as 'a) -> 'a * 'c list = +# val f : + (< m : 'b. 'a * (< n : 'b; .. > as 'b) > as 'a) -> + 'a * (< n : 'c; .. > as 'c) = +# - : (< p : 'b. < m : 'b; n : 'a; .. > as 'b > as 'a) -> + (< m : 'c; n : 'a; .. > as 'c) += +# - : (< m : 'b. 'b * < p : 'd. 'd * 'c * 'a > as 'c > as 'a) -> + ('f * < p : 'g. 'g * 'e * 'a > as 'e) += +# - : < m : 'a. < p : 'a; .. > as 'b > -> 'b = +# type sum = T of < id : 'a. 'a -> 'a > +# - : sum -> 'a -> 'a = +# type record = { r : < id : 'a. 'a -> 'a >; } +# - : record -> 'a -> 'a = +# - : record -> 'a -> 'a = +# class myself : object ('a) method self : 'b -> 'a end +# class number : + object ('a) + val num : int + method num : int + method prev : 'a + method succ : 'a + method switch : zero:(unit -> 'b) -> prev:('a -> 'b) -> 'b + end +# val id : 'a -> 'a = +# class c : object method id : 'a -> 'a end +# # class c' = object + inherit c + method id = id + end + ;; +Warning 7: the method id is overridden. +class c' : object method id : 'a -> 'a end +# # class d = object + inherit c as c + val mutable count = 0 + method id x = count <- count+1; x + method count = count + method old : 'a. 'a -> 'a = c#id + end + ;; +Warning 7: the method id is overridden. +class d : + object + val mutable count : int + method count : int + method id : 'a -> 'a + method old : 'b -> 'b + end +# class ['a] olist : + 'a list -> + object ('b) + val l : 'a list + method cons : 'a -> 'b + method fold : f:('a -> 'c -> 'c) -> init:'c -> 'c + end +# val sum : int #olist -> int = +# val count : 'a #olist -> int = +# val append : 'a #olist -> ('a #olist as 'b) -> 'b = +# type 'a t = unit +# class o : object method x : [> `A ] t -> unit end +# class c : object method m : d end +and d : ?x:int -> unit -> object end +# class d : ?x:int -> unit -> object end +and c : object method m : d end +# class type numeral = object method fold : ('a -> 'a) -> 'a -> 'a end +class zero : object method fold : ('a -> 'a) -> 'a -> 'a end +class next : #numeral -> object method fold : ('a -> 'a) -> 'a -> 'a end +# class type node_type = object method as_variant : [> `Node of node_type ] end +# class node : node_type +# class node : object method as_variant : [> `Node of node_type ] end +# type bad = { bad : 'a. 'a option ref; } +# # let bad = {bad = ref None};; +Error: This field value has type 'a option ref which is less general than + 'b. 'b option ref +# type bad2 = { mutable bad2 : 'a. 'a option ref option; } +# val bad2 : bad2 = {bad2 = None} +# # bad2.bad2 <- Some (ref None);; +Error: This field value has type 'a option ref option + which is less general than 'b. 'b option ref option +# val f : < m : 'a. < p : 'a * 'b > as 'b > -> 'c -> unit = +# val f : < m : 'a. 'a * (< p : int * 'b > as 'b) > -> 'b -> unit = +# type 'a t = [ `A of 'a ] +# class c : object method m : ([> 'a t ] as 'a) -> unit end +# class c : object method m : ([> 'a t ] as 'a) -> unit end +# class c : object method m : ([> 'a t ] as 'a) -> 'a end +# class c : object method m : ([> `A ] as 'a) option -> 'a end +# # + (* various old bugs *) + class virtual ['a] visitor = + object method virtual caseNil : 'a end + and virtual int_list = + object method virtual visit : 'a.('a visitor -> 'a) end;; +Error: This type scheme cannot quantify 'a : +it escapes this scope. +# type ('a, 'b) list_visitor = < caseCons : 'b -> 'b list -> 'a; caseNil : 'a > +type 'a alist = < visit : 'b. ('b, 'a) list_visitor -> 'b > +class type ct = object ('a) method fold : ('b -> 'a -> 'b) -> 'b -> 'b end +type t = { f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b; } +# # + (* PR#1663 *) + 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 ] +# # + (* Wrong in 3.06 *) + type ('a,'b) t constraint 'a = 'b and ('a,'b) u = ('a,'b) t;; +Error: Constraints are not satisfied in this type. +Type ('a, 'b) t should be an instance of ('c, 'c) t +# type 'a t = 'a +and u = int t +# type 'a t constraint 'a = int +# # type 'a u = 'a and 'a v = 'a u t;; +Error: Constraints are not satisfied in this type. +Type 'a u t should be an instance of int t +# type 'a u = 'a constraint 'a = int +and 'a v = 'a u t constraint 'a = int +# type g = int +# type 'a t = unit constraint 'a = g +# # type 'a u = 'a and 'a v = 'a u t;; +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 = int +# # + (* Example of wrong expansion *) + 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 +# type 'a t = < a : 'a > +# - : ('a t as 'a) -> 'a t = +# type u = 'a t as 'a +# type t = A | B +# - : [> `A ] * t -> int = +# - : [> `A ] * t -> int = +# - : [> `A ] option * t -> int = +# - : [> `A ] option * t -> int = +# - : t * [< `A | `B ] -> int = +# - : [< `A | `B ] * t -> int = +# # function (`A|`B), _ -> 0 | _,(`A|`B) -> 1;; +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +(`AnyExtraTag, `AnyExtraTag) +- : [> `A | `B ] * [> `A | `B ] -> int = +# # function `B,1 -> 1 | _,1 -> 2;; +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +(_, 0) +# function `B,1 -> 1 | _,1 -> 2;; + + + +Warning 11: this match case is unused. +- : [< `B ] * int -> int = +# # function 1,`B -> 1 | 1,_ -> 2;; +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +(0, _) +# function 1,`B -> 1 | 1,_ -> 2;; + + + +Warning 11: this match case is unused. +- : int * [< `B ] -> int = +# # + (* pass typetexp, but fails during Typedecl.check_recursion *) + type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] + and ('a, 'b) b = 'b -> unit constraint 'b = [> `A of ('a, 'b) a as 'a];; +Error: Constraints are not satisfied in this type. +Type +([> `B of 'a ], 'a) b as 'a +should be an instance of +(('b, [> `A of 'b ] as 'c) a as 'b, 'c) b +# * class type ['a, 'b] a = + object + constraint 'a = < as_a : ('a, 'b) a as 'c; b : 'b; .. > + constraint 'b = < a : 'a; as_b : ('a, 'b) b; .. > + method as_a : 'c + method b : 'b + end +and ['a, 'b] b = + object + constraint 'a = < as_a : ('a, 'b) a; b : 'b; .. > + constraint 'b = < a : 'a; as_b : ('a, 'b) b; .. > + method a : 'a + method as_b : ('a, 'b) b + end +class type ['a] ca = + object ('b) + constraint 'a = < a : 'b; as_b : ('b, 'a) b; .. > + method as_a : ('b, 'a) a + method b : 'a + end +class type ['a] cb = + object ('b) + constraint 'a = < as_a : ('a, 'b) a; b : 'b; .. > + method a : 'a + method as_b : ('a, 'b) b + end +type bt = 'a ca cb as 'a +# class c : object method m : int end +# val f : unit -> c = +# val f : unit -> c = +# # let f () = object method private n = 1 method m = {<>}#n end;; +Warning 15: the following private methods were made public implicitly: + n. +val f : unit -> < m : int; n : int > = +# # let f () = object (self:c) method n = 1 method m = 2 end;; +Error: This object is expected to have type c but actually has type + < m : int; n : 'a > + The first object type has no method n +# # let f () = object (_:'s) constraint 's = < n : int > method m = 1 end;; +Error: This object is expected to have type < n : int > but actually has type + < m : 'a > + The second object type has no method n +# # class c = object (_ : 's) + method x = 1 + method private m = + object (self: 's) method x = 3 method private m = self end + end;; +Error: This object is expected to have type < x : int; .. > + but actually has type < x : int > + Self type cannot be unified with a closed object type +# val o : < x : int > = +# # + + (* Unsound! *) + fun (x : > as 'foo) -> + (x : > as 'bar) >);; +Error: This expression has type < m : 'b. 'b * < m : 'b * 'a > > as 'a + but an expression was expected of type + < m : 'b. 'b * (< m : 'b * < m : 'd. 'd * 'c > > as 'c) > + Types for method m are incompatible +# # type 'a foo = + type foo' = + type 'a bar = > + type bar' = + let f (x : foo') = (x : bar');; +Error: This expression has type foo' = < m : 'a. 'a * 'a foo > + but an expression was expected of type bar' = < m : 'a. 'a * 'a bar > + Type 'a foo = < m : 'a * 'a foo > is not compatible with type + 'a bar = < m : 'a * < m : 'b. 'b * 'a bar > > + Type 'a foo = < m : 'a * 'a foo > is not compatible with type + < m : 'b. 'b * 'a bar > + Types for method m are incompatible +# # + fun (x : as 'foo)>) -> + (x : )> as 'bar);; +Error: This expression has type + < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > + but an expression was expected of type + < m : 'a. 'a * ('a * < m : 'c. 'c * ('c * 'd) >) > as 'd + Types for method m are incompatible +# # fun (x : as 'foo)>) -> + (x : )> as 'bar);; +Error: This expression has type + < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > + but an expression was expected of type + < m : 'a. 'a * ('a * < m : 'c. 'c * ('a * 'd) >) > as 'd + Types for method m are incompatible +# # fun (x : as 'foo) -> + (x : as 'bar)>);; +Error: This expression has type < m : 'b. 'b * ('b * 'a) > as 'a + but an expression was expected of type + < m : 'b. 'b * ('b * < m : 'd. 'd * 'c > as 'c) > + Types for method m are incompatible +# # let f x = + (x : ('a * 'bar> as 'bar)> + :> ('a * 'foo)> as 'foo);; +Error: Type < m : 'a. 'a -> ('a * (< m : 'd. 'd -> 'b as 'e > as 'c) as 'b) > + is not a subtype of < m : 'a. 'a -> ('a * 'f as 'h) as 'g > as 'f +# # + module M + : sig val f : ( as 'bar)>) -> unit end + = struct let f (x : as 'foo) = () end;; +Error: Signature mismatch: + Modules do not match: + sig val f : (< m : 'b. 'b * ('b * 'a) > as 'a) -> unit end + is not included in + sig + val f : < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > -> unit + end + Values do not match: + val f : (< m : 'b. 'b * ('b * 'a) > as 'a) -> unit + is not included in + val f : < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > -> unit +# # module M + : sig type t = as 'bar)> end + = struct type t = as 'foo end;; +Error: Signature mismatch: + Modules do not match: + sig type t = < m : 'b. 'b * ('b * 'a) > as 'a end + is not included in + sig type t = < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > end + Type declarations do not match: + type t = < m : 'b. 'b * ('b * 'a) > as 'a + is not included in + type t = < m : 'a. 'a * ('a * < m : 'c. 'c * 'b > as 'b) > +# module M : sig type 'a t type u = < m : 'a. 'a t > end +# module M : sig type 'a t val f : < m : 'a. 'a t > -> int end +# module M : sig type 'a t val f : < m : 'a. 'a t > -> int end +# val f : + (< m : 'b. 'b -> (< m : 'b. 'b -> 'c * < > > as 'c) * < .. >; .. > as 'a) -> + 'a -> bool = +# type t = [ `A | `B ] +# type v = private [> t ] +# - : t -> v = +# type u = private [< t ] +# - : u -> v = +# # fun x -> (x : v :> u);; +Error: Type v = [> `A | `B ] is not a subtype of u = [< `A | `B ] +# type v = private [< t ] +# # fun x -> (x : u :> v);; +Error: Type u = [< `A | `B ] is not a subtype of v = [< `A | `B ] +# type p = < x : p > +# type q = private < x : p; .. > +# - : q -> p = +# # fun x -> (x : p :> q);; +Error: Type p = < x : p > is not a subtype of q = < x : p; .. > +# # + let f1 x = + (x : as 'a) -> int> + :> as 'b) -> int>);; +Error: Type < m : 'a. (< p : int; .. > as 'a) -> int > is not a subtype of + < m : 'b. (< p : int; q : int; .. > as 'b) -> int > +# val f2 : + < m : 'a. (< p : < a : int >; .. > as 'a) -> int > -> + < m : 'a. (< p : < a : int; b : int >; .. > as 'a) -> int > = +# # let f3 x = + (x : ;..> as 'a) -> int> + :> ;..> as 'b) -> int>);; +Error: Type < m : 'a. (< p : < a : int; b : int >; .. > as 'a) -> int > + is not a subtype of < m : 'a. (< p : < a : int >; .. > as 'a) -> int > +# # let f4 x = (x : ;..> :> ;..>);; +Error: Type < p : < a : int; b : int >; .. > is not a subtype of + < p : < a : int >; .. > +The second object type has no method b +# val f5 : + < m : 'a. [< `A of < p : int > ] as 'a > -> + < m : 'a. [< `A of < > ] as 'a > = +# # let f6 x = + (x : ] as 'a> :> ] as 'a>);; +Error: Type < m : 'a. [< `A of < > ] as 'a > is not a subtype of + < m : 'a. [< `A of < p : int > ] as 'a > +# class c : object method id : 'a -> 'a end +# type u = c option +# val just : 'a option -> 'a = +# val f : c -> 'a -> 'a = +# val g : c -> 'a -> 'a = +# val h : < id : 'a; .. > -> 'a = +# val f : 'a -> int = +val g : 'a -> int = +# type 'a t = Leaf of 'a | Node of ('a * 'a) t +# val depth : 'a t -> int = +# # let rec depth : 'a. 'a t -> _ = + function Leaf _ -> 1 | Node x -> 1 + d x + and d x = depth x;; (* fails *) +Error: This definition has type 'a t -> int which is less general than + 'b. 'b t -> int +# # let rec depth : 'a. 'a t -> _ = + function Leaf x -> x | Node x -> 1 + depth x;; (* fails *) +Error: This definition has type int t -> int which is less general than + 'a. 'a t -> int +# # let rec depth : 'a. 'a t -> _ = + function Leaf x -> x | Node x -> depth x;; (* fails *) +Error: This definition has type 'a t -> 'a which is less general than + 'b. 'b t -> 'a +# # let rec depth : 'a 'b. 'a t -> 'b = + function Leaf x -> x | Node x -> depth x;; (* fails *) +Error: This definition has type 'a. 'a t -> 'a which is less general than + 'b 'c. 'c t -> 'b +# val r : 'a list * '_b list ref = ([], {contents = []}) +val q : unit -> 'a list * '_b list ref = +# val f : 'a -> 'a = +# val zero : [> `B of 'a | `Int of int ] as 'a = `Int 0 +# # let zero : 'a. [< `Int of int] as 'a = `Int 0;; (* fails *) +Error: This expression has type [> `Int of int ] + but an expression was expected of type [< `Int of int ] + Types for tag `Int are incompatible +# type t = { f : 'a. [> `B of 'a | `Int of int ] as 'a; } +val zero : t = {f = `Int 0} +# # type t = {f: 'a. [< `Int of int] as 'a} + let zero = {f = `Int 0} ;; (* fails *) +Error: This expression has type [> `Int of int ] + but an expression was expected of type [< `Int of int ] + Types for tag `Int are incompatible +# val id : 'a -> 'a = +val neg : int -> bool -> int * bool = +# type t = A of int | B of (int * t) list | C of (string * t) list +val transf : (int -> t) -> t -> t = +val transf_alist : (int -> t) -> ('a * t) list -> ('a * t) list = +# diff --git a/testsuite/tests/typing-polyvariants-bugs-2/Makefile b/testsuite/tests/typing-polyvariants-bugs-2/Makefile new file mode 100644 index 00000000..3f01800f --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs-2/Makefile @@ -0,0 +1,7 @@ +default: + @printf " ... testing 'pr3918':" + @($(OCAMLC) -c pr3918a.mli && $(OCAMLC) -c pr3918b.mli && $(OCAMLC) -c pr3918c.ml && echo " => passed") || echo " => failed" + +clean: defaultclean + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-polyvariants-bugs-2/pr3918a.mli b/testsuite/tests/typing-polyvariants-bugs-2/pr3918a.mli new file mode 100644 index 00000000..b0afbbe5 --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs-2/pr3918a.mli @@ -0,0 +1 @@ +type 'a voption = [ `None | `Some of 'a] diff --git a/testsuite/tests/typing-polyvariants-bugs-2/pr3918b.mli b/testsuite/tests/typing-polyvariants-bugs-2/pr3918b.mli new file mode 100644 index 00000000..3513ff9c --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs-2/pr3918b.mli @@ -0,0 +1 @@ +type 'a vlist = ('a * 'b) Pr3918a.voption as 'b diff --git a/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml b/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml new file mode 100644 index 00000000..c49ed6e0 --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.ml @@ -0,0 +1,10 @@ +(* + ocamlc -c pr3918a.mli pr3918b.mli + rm -f pr3918a.cmi + ocamlc -c pr3918c.ml +*) + +open Pr3918b + +let f x = (x : 'a vlist :> 'b vlist) +let f (x : 'a vlist) = (x : 'b vlist) diff --git a/testsuite/tests/typing-polyvariants-bugs/Makefile b/testsuite/tests/typing-polyvariants-bugs/Makefile new file mode 100644 index 00000000..9375ddba --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.okbad +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml b/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml new file mode 100644 index 00000000..ef857149 --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs/pr4775_ok.ml @@ -0,0 +1,11 @@ +module type Poly = sig + type 'a t = 'a constraint 'a = [> ] +end + +module Combine (A : Poly) (B : Poly) = struct + type ('a, 'b) t = 'a A.t constraint 'a = 'b B.t +end + +module C = Combine + (struct type 'a t = 'a constraint 'a = [> ] end) + (struct type 'a t = 'a constraint 'a = [> ] end) diff --git a/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml b/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml new file mode 100644 index 00000000..b486290c --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs/pr4933_ok.ml @@ -0,0 +1,15 @@ +module type Priv = sig + type t = private int +end + +module Make (Unit:sig end): Priv = struct type t = int end + +module A = Make (struct end) + +module type Priv' = sig + type t = private [> `A] +end + +module Make' (Unit:sig end): Priv' = struct type t = [`A] end + +module A' = Make' (struct end) diff --git a/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml b/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml new file mode 100644 index 00000000..4e31243b --- /dev/null +++ b/testsuite/tests/typing-polyvariants-bugs/privrowsabate_ok.ml @@ -0,0 +1,53 @@ +type 'a termpc = + [`And of 'a * 'a + |`Or of 'a * 'a + |`Not of 'a + |`Atom of string + ] + +type 'a termk = + [`Dia of 'a + |`Box of 'a + |'a termpc + ] + +module type T = sig + type term + val map : (term -> term) -> term -> term + val nnf : term -> term + val nnf_not : term -> term +end + +module Fpc(X : T with type term = private [> 'a termpc] as 'a) = + struct + type term = X.term termpc + let nnf = function + |`Not(`Atom _) as x -> x + |`Not x -> X.nnf_not x + | x -> X.map X.nnf x + let map f : term -> X.term = function + |`Not x -> `Not (f x) + |`And(x,y) -> `And (f x, f y) + |`Or (x,y) -> `Or (f x, f y) + |`Atom _ as x -> x + let nnf_not : term -> _ = function + |`Not x -> X.nnf x + |`And(x,y) -> `Or (X.nnf_not x, X.nnf_not y) + |`Or (x,y) -> `And (X.nnf_not x, X.nnf_not y) + |`Atom _ as x -> `Not x + end + +module Fk(X : T with type term = private [> 'a termk] as 'a) = + struct + type term = X.term termk + module Pc = Fpc(X) + let map f : term -> _ = function + |`Dia x -> `Dia (f x) + |`Box x -> `Box (f x) + |#termpc as x -> Pc.map f x + let nnf = Pc.nnf + let nnf_not : term -> _ = function + |`Dia x -> `Box (X.nnf_not x) + |`Box x -> `Dia (X.nnf_not x) + |#termpc as x -> Pc.nnf_not x + end diff --git a/testsuite/tests/typing-private/Makefile b/testsuite/tests/typing-private/Makefile new file mode 100644 index 00000000..9add1557 --- /dev/null +++ b/testsuite/tests/typing-private/Makefile @@ -0,0 +1,3 @@ +include ../../makefiles/Makefile.toplevel +include ../../makefiles/Makefile.common + diff --git a/testsuite/tests/typing-private/private.ml b/testsuite/tests/typing-private/private.ml new file mode 100644 index 00000000..636f231b --- /dev/null +++ b/testsuite/tests/typing-private/private.ml @@ -0,0 +1,89 @@ +module Foobar : sig + type t = private int +end = struct + type t = int +end;; + +module F0 : sig type t = private int end = Foobar;; + +let f (x : F0.t) = (x : Foobar.t);; (* fails *) + +module F = Foobar;; + +let f (x : F.t) = (x : Foobar.t);; + +module M = struct type t = end;; +module M1 : sig type t = private end = M;; +module M2 : sig type t = private end = M1;; +fun (x : M1.t) -> (x : M2.t);; (* fails *) + +module M3 : sig type t = private M1.t end = M1;; +fun x -> (x : M3.t :> M1.t);; +fun x -> (x : M3.t :> M.t);; +module M4 : sig type t = private M3.t end = M2;; (* fails *) +module M4 : sig type t = private M3.t end = M;; (* fails *) +module M4 : sig type t = private M3.t end = M1;; (* might be ok *) +module M5 : sig type t = private M1.t end = M3;; +module M6 : sig type t = private < n:int; .. > end = M1;; (* fails *) + +module Bar : sig type t = private Foobar.t val f : int -> t end = + struct type t = int let f (x : int) = (x : t) end;; (* must fail *) + +module M : sig + type t = private T of int + val mk : int -> t +end = struct + type t = T of int + let mk x = T(x) +end;; + +module M1 : sig + type t = M.t + val mk : int -> t +end = struct + type t = M.t + let mk = M.mk +end;; + +module M2 : sig + type t = M.t + val mk : int -> t +end = struct + include M +end;; + +module M3 : sig + type t = M.t + val mk : int -> t +end = M;; + +module M4 : sig + type t = M.t = T of int + val mk : int -> t + end = M;; +(* Error: The variant or record definition does not match that of type M.t *) + +module M5 : sig + type t = M.t = private T of int + val mk : int -> t +end = M;; + +module M6 : sig + type t = private T of int + val mk : int -> t +end = M;; + +module M' : sig + type t_priv = private T of int + type t = t_priv + val mk : int -> t +end = struct + type t_priv = T of int + type t = t_priv + let mk x = T(x) +end;; + +module M3' : sig + type t = M'.t + val mk : int -> t +end = M';; diff --git a/testsuite/tests/typing-private/private.ml.reference b/testsuite/tests/typing-private/private.ml.reference new file mode 100644 index 00000000..5bf3c16e --- /dev/null +++ b/testsuite/tests/typing-private/private.ml.reference @@ -0,0 +1,88 @@ + +# module Foobar : sig type t = private int end +# module F0 : sig type t = private int end +# # + let f (x : F0.t) = (x : Foobar.t);; (* fails *) +Error: This expression has type F0.t but an expression was expected of type + Foobar.t +# module F : sig type t = Foobar.t end +# val f : F.t -> F.t = +# module M : sig type t = < m : int > end +# module M1 : sig type t = private < m : int; .. > end +# module M2 : sig type t = private < m : int; .. > end +# # fun (x : M1.t) -> (x : M2.t);; (* fails *) +Error: This expression has type M1.t but an expression was expected of type + M2.t +# module M3 : sig type t = private M1.t end +# - : M3.t -> M1.t = +# - : M3.t -> M.t = +# # module M4 : sig type t = private M3.t end = M2;; (* fails *) +Error: Signature mismatch: + Modules do not match: + sig type t = M2.t end + is not included in + sig type t = private M3.t end + Type declarations do not match: + type t = M2.t + is not included in + type t = private M3.t +# # module M4 : sig type t = private M3.t end = M;; (* fails *) +Error: Signature mismatch: + Modules do not match: + sig type t = < m : int > end + is not included in + sig type t = private M3.t end + Type declarations do not match: + type t = < m : int > + is not included in + type t = private M3.t +# # module M4 : sig type t = private M3.t end = M1;; (* might be ok *) +Error: Signature mismatch: + Modules do not match: + sig type t = M1.t end + is not included in + sig type t = private M3.t end + Type declarations do not match: + type t = M1.t + is not included in + type t = private M3.t +# module M5 : sig type t = private M1.t end +# # module M6 : sig type t = private < n:int; .. > end = M1;; (* fails *) +Error: Signature mismatch: + Modules do not match: + sig type t = M1.t end + is not included in + sig type t = private < n : int; .. > end + Type declarations do not match: + type t = M1.t + is not included in + type t = private < n : int; .. > +# # + module Bar : sig type t = private Foobar.t val f : int -> t end = + struct type t = int let f (x : int) = (x : t) end;; (* must fail *) +Error: Signature mismatch: + Modules do not match: + sig type t = int val f : t -> t end + is not included in + sig type t = private Foobar.t val f : int -> t end + Type declarations do not match: + type t = int + is not included in + type t = private Foobar.t +# module M : sig type t = private T of int val mk : int -> t end +# 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 +# # + module M4 : sig + type t = M.t = T of int + val mk : int -> t + end = M;; +Error: The variant or record definition does not match that of type +M.t +# module M5 : sig type t = M.t = private T of int val mk : int -> t end +# module M6 : sig type t = private T of int val mk : int -> t end +# module M' : + sig type t_priv = private T of int type t = t_priv val mk : int -> t end +# module M3' : sig type t = M'.t val mk : int -> t end +# diff --git a/testsuite/tests/typing-recmod/Makefile b/testsuite/tests/typing-recmod/Makefile new file mode 100644 index 00000000..9375ddba --- /dev/null +++ b/testsuite/tests/typing-recmod/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.okbad +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-recmod/t01bad.ml b/testsuite/tests/typing-recmod/t01bad.ml new file mode 100644 index 00000000..8a471e07 --- /dev/null +++ b/testsuite/tests/typing-recmod/t01bad.ml @@ -0,0 +1,2 @@ +(* Bad (t = t) *) +module rec A : sig type t = A.t end = struct type t = A.t end;; diff --git a/testsuite/tests/typing-recmod/t02bad.ml b/testsuite/tests/typing-recmod/t02bad.ml new file mode 100644 index 00000000..ac9d6390 --- /dev/null +++ b/testsuite/tests/typing-recmod/t02bad.ml @@ -0,0 +1,4 @@ +(* Bad (t = t) *) +module rec A : sig type t = B.t end = struct type t = B.t end + and B : sig type t = A.t end = struct type t = A.t end;; + diff --git a/testsuite/tests/typing-recmod/t03ok.ml b/testsuite/tests/typing-recmod/t03ok.ml new file mode 100644 index 00000000..577ea20a --- /dev/null +++ b/testsuite/tests/typing-recmod/t03ok.ml @@ -0,0 +1,3 @@ +(* OK (t = int) *) +module rec A : sig type t = B.t end = struct type t = B.t end + and B : sig type t = int end = struct type t = int end;; diff --git a/testsuite/tests/typing-recmod/t04bad.ml b/testsuite/tests/typing-recmod/t04bad.ml new file mode 100644 index 00000000..ad3f985a --- /dev/null +++ b/testsuite/tests/typing-recmod/t04bad.ml @@ -0,0 +1,2 @@ +(* Bad (t = int * t) *) +module rec A : sig type t = int * A.t end = struct type t = int * A.t end;; diff --git a/testsuite/tests/typing-recmod/t05bad.ml b/testsuite/tests/typing-recmod/t05bad.ml new file mode 100644 index 00000000..08fe60f0 --- /dev/null +++ b/testsuite/tests/typing-recmod/t05bad.ml @@ -0,0 +1,3 @@ +(* Bad (t = t -> int) *) +module rec A : sig type t = B.t -> int end = struct type t = B.t -> int end + and B : sig type t = A.t end = struct type t = A.t end;; diff --git a/testsuite/tests/typing-recmod/t06ok.ml b/testsuite/tests/typing-recmod/t06ok.ml new file mode 100644 index 00000000..a220a8e0 --- /dev/null +++ b/testsuite/tests/typing-recmod/t06ok.ml @@ -0,0 +1,3 @@ +(* OK (t = ) *) +module rec A : sig type t = end = struct type t = end + and B : sig type t = A.t end = struct type t = A.t end;; diff --git a/testsuite/tests/typing-recmod/t07bad.ml b/testsuite/tests/typing-recmod/t07bad.ml new file mode 100644 index 00000000..ec24ea4d --- /dev/null +++ b/testsuite/tests/typing-recmod/t07bad.ml @@ -0,0 +1,3 @@ +(* Bad (not regular) *) +module rec A : sig type 'a t = end + = struct type 'a t = end;; diff --git a/testsuite/tests/typing-recmod/t08bad.ml b/testsuite/tests/typing-recmod/t08bad.ml new file mode 100644 index 00000000..7df3d476 --- /dev/null +++ b/testsuite/tests/typing-recmod/t08bad.ml @@ -0,0 +1,5 @@ +(* Bad (not regular) *) +module rec A : sig type 'a t = end + = struct type 'a t = end + and B : sig type 'a t = 'a A.t end = struct type 'a t = 'a A.t end;; + diff --git a/testsuite/tests/typing-recmod/t09bad.ml b/testsuite/tests/typing-recmod/t09bad.ml new file mode 100644 index 00000000..ade5bcb7 --- /dev/null +++ b/testsuite/tests/typing-recmod/t09bad.ml @@ -0,0 +1,5 @@ +(* Bad (not regular) *) +module rec A : sig type 'a t = 'a B.t end + = struct type 'a t = 'a B.t end + and B : sig type 'a t = end + = struct type 'a t = end;; diff --git a/testsuite/tests/typing-recmod/t10ok.ml b/testsuite/tests/typing-recmod/t10ok.ml new file mode 100644 index 00000000..3094a42a --- /dev/null +++ b/testsuite/tests/typing-recmod/t10ok.ml @@ -0,0 +1,5 @@ +(* OK *) +module rec A : sig type 'a t = 'a array B.t * 'a list B.t end + = struct type 'a t = 'a array B.t * 'a list B.t end + and B : sig type 'a t = end + = struct type 'a t = end;; diff --git a/testsuite/tests/typing-recmod/t11bad.ml b/testsuite/tests/typing-recmod/t11bad.ml new file mode 100644 index 00000000..e18339ac --- /dev/null +++ b/testsuite/tests/typing-recmod/t11bad.ml @@ -0,0 +1,5 @@ +(* Bad (not regular) *) +module rec A : sig type 'a t = 'a list B.t end + = struct type 'a t = 'a list B.t end + and B : sig type 'a t = end + = struct type 'a t = end;; diff --git a/testsuite/tests/typing-recmod/t12bad.ml b/testsuite/tests/typing-recmod/t12bad.ml new file mode 100644 index 00000000..71100e6e --- /dev/null +++ b/testsuite/tests/typing-recmod/t12bad.ml @@ -0,0 +1,13 @@ +(* Bad (not regular) *) +module rec M : + sig + class ['a] c : 'a -> object + method map : ('a -> 'b) -> 'b M.c + end + end + = struct + class ['a] c (x : 'a) = object + method map : 'b. ('a -> 'b) -> 'b M.c + = fun f -> new M.c (f x) + end + end;; diff --git a/testsuite/tests/typing-recmod/t13ok.ml b/testsuite/tests/typing-recmod/t13ok.ml new file mode 100644 index 00000000..729afd51 --- /dev/null +++ b/testsuite/tests/typing-recmod/t13ok.ml @@ -0,0 +1,5 @@ +(* OK *) +class type [ 'node ] extension = object method node : 'node end +class type [ 'ext ] node = object constraint 'ext = 'ext node #extension end +class x = object method node : x node = assert false end +type t = x node;; diff --git a/testsuite/tests/typing-recmod/t14bad.ml b/testsuite/tests/typing-recmod/t14bad.ml new file mode 100644 index 00000000..5c665368 --- /dev/null +++ b/testsuite/tests/typing-recmod/t14bad.ml @@ -0,0 +1,17 @@ +(* Bad - PR 4261 *) + +module PR_4261 = struct + module type S = + sig + type t + end + + module type T = + sig + module D : S + type t = D.t + end + + module rec U : T with module D = U' = U + and U' : S with type t = U'.t = U +end;; diff --git a/testsuite/tests/typing-recmod/t15bad.ml b/testsuite/tests/typing-recmod/t15bad.ml new file mode 100644 index 00000000..b387ae53 --- /dev/null +++ b/testsuite/tests/typing-recmod/t15bad.ml @@ -0,0 +1,3 @@ +(* Bad - PR 4512 *) +module type S' = sig type t = int end +module rec M : S' with type t = M.t = struct type t = M.t end;; diff --git a/testsuite/tests/typing-recmod/t16ok.ml b/testsuite/tests/typing-recmod/t16ok.ml new file mode 100644 index 00000000..f42de7b7 --- /dev/null +++ b/testsuite/tests/typing-recmod/t16ok.ml @@ -0,0 +1,31 @@ +(* PR#4450 *) + +module PR_4450_1 = struct + module type MyT = sig type 'a t = Succ of 'a t end + module MyMap(X : MyT) = X + module rec MyList : MyT = MyMap(MyList) +end;; + +module PR_4450_2 = struct + module type MyT = sig + type 'a wrap = My of 'a t + and 'a t = private < map : 'b. ('a -> 'b) ->'b wrap; .. > + val create : 'a list -> 'a t + end + module MyMap(X : MyT) = struct + include X + class ['a] c l = object (self) + method map : 'b. ('a -> 'b) -> 'b wrap = + fun f -> My (create (List.map f l)) + end + end + module rec MyList : sig + type 'a wrap = My of 'a t + and 'a t = < map : 'b. ('a -> 'b) ->'b wrap > + val create : 'a list -> 'a t + end = struct + include MyMap(MyList) + let create l = new c l + end +end;; + diff --git a/testsuite/tests/typing-recmod/t17ok.ml b/testsuite/tests/typing-recmod/t17ok.ml new file mode 100644 index 00000000..a2ea895a --- /dev/null +++ b/testsuite/tests/typing-recmod/t17ok.ml @@ -0,0 +1,42 @@ +(* A synthetic example of bootstrapped data structure + (suggested by J-C Filliatre) *) + +module type ORD = sig + type t + val compare : t -> t -> int +end + +module type SET = sig + type elt + type t + val iter : (elt -> unit) -> t -> unit +end + +type 'a tree = E | N of 'a tree * 'a * 'a tree + +module Bootstrap2 + (MakeDiet : functor (X: ORD) -> SET with type t = X.t tree and type elt = X.t) + : SET with type elt = int = +struct + + type elt = int + + module rec Elt : sig + type t = I of int * int | D of int * Diet.t * int + val compare : t -> t -> int + val iter : (int -> unit) -> t -> unit + end = + struct + type t = I of int * int | D of int * Diet.t * int + let compare x1 x2 = 0 + let rec iter f = function + | I (l, r) -> for i = l to r do f i done + | D (_, d, _) -> Diet.iter (iter f) d + end + + and Diet : SET with type t = Elt.t tree and type elt = Elt.t = MakeDiet(Elt) + + type t = Diet.t + let iter f = Diet.iter (Elt.iter f) +end + diff --git a/testsuite/tests/typing-recmod/t18ok.ml b/testsuite/tests/typing-recmod/t18ok.ml new file mode 100644 index 00000000..4f5814de --- /dev/null +++ b/testsuite/tests/typing-recmod/t18ok.ml @@ -0,0 +1,26 @@ +(* PR 4470: simplified from OMake's sources *) + +module rec DirElt + : sig + type t = DirRoot | DirSub of DirHash.t + end + = struct + type t = DirRoot | DirSub of DirHash.t + end + +and DirCompare + : sig + type t = DirElt.t + end + = struct + type t = DirElt.t + end + +and DirHash + : sig + type t = DirElt.t list + end + = struct + type t = DirCompare.t list + end + diff --git a/testsuite/tests/typing-recmod/t19ok.ml b/testsuite/tests/typing-recmod/t19ok.ml new file mode 100644 index 00000000..cd2dde8e --- /dev/null +++ b/testsuite/tests/typing-recmod/t19ok.ml @@ -0,0 +1,13 @@ +(* PR 4758, PR 4266 *) + +module PR_4758 = struct + module type S = sig end + module type Mod = sig + module Other : S + end + module rec A : S = struct + end and C : sig include Mod with module Other = A end = struct + module Other = A + end +end + diff --git a/testsuite/tests/typing-recmod/t20ok.ml b/testsuite/tests/typing-recmod/t20ok.ml new file mode 100644 index 00000000..fec78c1d --- /dev/null +++ b/testsuite/tests/typing-recmod/t20ok.ml @@ -0,0 +1,30 @@ +(* PR 4557 *) +module PR_4557 = struct + module F ( X : Set.OrderedType ) = struct + module rec Mod : sig + module XSet : + sig + type elt = X.t + type t = Set.Make( X ).t + end + module XMap : + sig + type key = X.t + type 'a t = 'a Map.Make(X).t + end + type elt = X.t + type t = XSet.t XMap.t + val compare: t -> t -> int + end + = + struct + module XSet = Set.Make( X ) + module XMap = Map.Make( X ) + + type elt = X.t + type t = XSet.t XMap.t + let compare = (fun x y -> 0) + end + and ModSet : Set.S with type elt = Mod.t = Set.Make( Mod ) + end +end diff --git a/testsuite/tests/typing-recmod/t21ok.ml b/testsuite/tests/typing-recmod/t21ok.ml new file mode 100644 index 00000000..0415fe48 --- /dev/null +++ b/testsuite/tests/typing-recmod/t21ok.ml @@ -0,0 +1,27 @@ +module F ( X : Set.OrderedType ) = struct + module rec Mod : sig + module XSet : + sig + type elt = X.t + type t = Set.Make( X ).t + end + module XMap : + sig + type key = X.t + type 'a t = 'a Map.Make(X).t + end + type elt = X.t + type t = XSet.t XMap.t + val compare: t -> t -> int + end + = + struct + module XSet = Set.Make( X ) + module XMap = Map.Make( X ) + + type elt = X.t + type t = XSet.t XMap.t + let compare = (fun x y -> 0) + end + and ModSet : Set.S with type elt = Mod.t = Set.Make( Mod ) +end diff --git a/testsuite/tests/typing-recmod/t22ok.ml b/testsuite/tests/typing-recmod/t22ok.ml new file mode 100644 index 00000000..0aa63afd --- /dev/null +++ b/testsuite/tests/typing-recmod/t22ok.ml @@ -0,0 +1,511 @@ +(* Tests for recursive modules *) + +let test number result expected = + if result = expected + then Printf.printf "Test %d passed.\n" number + else Printf.printf "Test %d FAILED.\n" number; + flush stdout + +(* Tree of sets *) + +module rec A + : sig + type t = Leaf of int | Node of ASet.t + val compare: t -> t -> int + end + = struct + type t = Leaf of int | Node of ASet.t + let compare x y = + match (x,y) with + (Leaf i, Leaf j) -> Pervasives.compare i j + | (Leaf i, Node t) -> -1 + | (Node s, Leaf j) -> 1 + | (Node s, Node t) -> ASet.compare s t + end + +and ASet : Set.S with type elt = A.t = Set.Make(A) +;; + +let _ = + let x = A.Node (ASet.add (A.Leaf 3) (ASet.singleton (A.Leaf 2))) in + let y = A.Node (ASet.add (A.Leaf 1) (ASet.singleton x)) in + test 10 (A.compare x x) 0; + test 11 (A.compare x (A.Leaf 3)) 1; + test 12 (A.compare (A.Leaf 0) x) (-1); + test 13 (A.compare y y) 0; + test 14 (A.compare x y) 1 +;; + +(* Simple value recursion *) + +module rec Fib + : sig val f : int -> int end + = struct let f x = if x < 2 then 1 else Fib.f(x-1) + Fib.f(x-2) end +;; + +let _ = + test 20 (Fib.f 10) 89 +;; + +(* Update function by infix *) + +module rec Fib2 + : sig val f : int -> int end + = struct let rec g x = Fib2.f(x-1) + Fib2.f(x-2) + and f x = if x < 2 then 1 else g x + end +;; + +let _ = + test 21 (Fib2.f 10) 89 +;; + +(* Early application *) + +let _ = + let res = + try + let module A = + struct + module rec Bad + : sig val f : int -> int end + = struct let f = let y = Bad.f 5 in fun x -> x+y end + end in + false + with Undefined_recursive_module _ -> + true in + test 30 res true +;; + +(* Early strict evaluation *) + +(* +module rec Cyclic + : sig val x : int end + = struct let x = Cyclic.x + 1 end +;; +*) + +(* Reordering of evaluation based on dependencies *) + +module rec After + : sig val x : int end + = struct let x = Before.x + 1 end +and Before + : sig val x : int end + = struct let x = 3 end +;; + +let _ = + test 40 After.x 4 +;; + +(* Type identity between A.t and t within A's definition *) + +module rec Strengthen + : sig type t val f : t -> t end + = struct + type t = A | B + let _ = (A : Strengthen.t) + let f x = if true then A else Strengthen.f B + end +;; + +module rec Strengthen2 + : sig type t + val f : t -> t + module M : sig type u end + module R : sig type v end + end + = struct + type t = A | B + let _ = (A : Strengthen2.t) + let f x = if true then A else Strengthen2.f B + module M = + struct + type u = C + let _ = (C: Strengthen2.M.u) + end + module rec R : sig type v = Strengthen2.R.v end = + struct + type v = D + let _ = (D : R.v) + let _ = (D : Strengthen2.R.v) + end + end +;; + +(* Polymorphic recursion *) + +module rec PolyRec + : sig + type 'a t = Leaf of 'a | Node of 'a list t * 'a list t + val depth: 'a t -> int + end + = struct + type 'a t = Leaf of 'a | Node of 'a list t * 'a list t + let x = (PolyRec.Leaf 1 : int t) + let depth = function + Leaf x -> 0 + | Node(l,r) -> 1 + max (PolyRec.depth l) (PolyRec.depth r) + end +;; + +(* Wrong LHS signatures (PR#4336) *) + +(* +module type ASig = sig type a val a:a val print:a -> unit end +module type BSig = sig type b val b:b val print:b -> unit end + +module A = struct type a = int let a = 0 let print = print_int end +module B = struct type b = float let b = 0.0 let print = print_float end + +module MakeA (Empty:sig end) : ASig = A +module MakeB (Empty:sig end) : BSig = B + +module + rec NewA : ASig = MakeA (struct end) + and NewB : BSig with type b = NewA.a = MakeB (struct end);; + +*) + +(* Expressions and bindings *) + +module StringSet = Set.Make(String);; + +module rec Expr + : sig + type t = + Var of string + | Const of int + | Add of t * t + | Binding of Binding.t * t + val make_let: string -> t -> t -> t + val fv: t -> StringSet.t + val simpl: t -> t + end + = struct + type t = + Var of string + | Const of int + | Add of t * t + | Binding of Binding.t * t + let make_let id e1 e2 = Binding([id, e1], e2) + let rec fv = function + Var s -> StringSet.singleton s + | Const n -> StringSet.empty + | Add(t1,t2) -> StringSet.union (fv t1) (fv t2) + | Binding(b,t) -> + StringSet.union (Binding.fv b) + (StringSet.diff (fv t) (Binding.bv b)) + let rec simpl = function + Var s -> Var s + | Const n -> Const n + | Add(Const i, Const j) -> Const (i+j) + | Add(Const 0, t) -> simpl t + | Add(t, Const 0) -> simpl t + | Add(t1,t2) -> Add(simpl t1, simpl t2) + | Binding(b, t) -> Binding(Binding.simpl b, simpl t) + end + +and Binding + : sig + type t = (string * Expr.t) list + val fv: t -> StringSet.t + val bv: t -> StringSet.t + val simpl: t -> t + end + = struct + type t = (string * Expr.t) list + let fv b = + List.fold_left (fun v (id,e) -> StringSet.union v (Expr.fv e)) + StringSet.empty b + let bv b = + List.fold_left (fun v (id,e) -> StringSet.add id v) + StringSet.empty b + let simpl b = + List.map (fun (id,e) -> (id, Expr.simpl e)) b + end +;; + +let _ = + let e = Expr.make_let "x" (Expr.Add (Expr.Var "y", Expr.Const 0)) + (Expr.Var "x") in + let e' = Expr.make_let "x" (Expr.Var "y") (Expr.Var "x") in + test 50 (StringSet.elements (Expr.fv e)) ["y"]; + test 51 (Expr.simpl e) e' +;; + +(* Okasaki's bootstrapping *) + +module type ORDERED = + sig + type t + val eq: t -> t -> bool + val lt: t -> t -> bool + val leq: t -> t -> bool + end + +module type HEAP = + sig + module Elem: ORDERED + type heap + val empty: heap + val isEmpty: heap -> bool + val insert: Elem.t -> heap -> heap + val merge: heap -> heap -> heap + val findMin: heap -> Elem.t + val deleteMin: heap -> heap + end + +module Bootstrap (MakeH: functor (Element:ORDERED) -> + HEAP with module Elem = Element) + (Element: ORDERED) : HEAP with module Elem = Element = + struct + module Elem = Element + module rec BE + : sig type t = E | H of Elem.t * PrimH.heap + val eq: t -> t -> bool + val lt: t -> t -> bool + val leq: t -> t -> bool + end + = struct + type t = E | H of Elem.t * PrimH.heap + let leq t1 t2 = + match t1, t2 with + | (H(x, _)), (H(y, _)) -> Elem.leq x y + | H _, E -> false + | E, H _ -> true + | E, E -> true + let eq t1 t2 = + match t1, t2 with + | (H(x, _)), (H(y, _)) -> Elem.eq x y + | H _, E -> false + | E, H _ -> false + | E, E -> true + let lt t1 t2 = + match t1, t2 with + | (H(x, _)), (H(y, _)) -> Elem.lt x y + | H _, E -> false + | E, H _ -> true + | E, E -> false + end + and PrimH + : HEAP with type Elem.t = BE.t + = MakeH(BE) + type heap = BE.t + let empty = BE.E + let isEmpty = function BE.E -> true | _ -> false + let rec merge x y = + match (x,y) with + (BE.E, _) -> y + | (_, BE.E) -> x + | (BE.H(e1,p1) as h1), (BE.H(e2,p2) as h2) -> + if Elem.leq e1 e2 + then BE.H(e1, PrimH.insert h2 p1) + else BE.H(e2, PrimH.insert h1 p2) + let insert x h = + merge (BE.H(x, PrimH.empty)) h + let findMin = function + BE.E -> raise Not_found + | BE.H(x, _) -> x + let deleteMin = function + BE.E -> raise Not_found + | BE.H(x, p) -> + if PrimH.isEmpty p then BE.E else begin + match PrimH.findMin p with + | (BE.H(y, p1)) -> + let p2 = PrimH.deleteMin p in + BE.H(y, PrimH.merge p1 p2) + | BE.E -> assert false + end + end +;; + +module LeftistHeap(Element: ORDERED): HEAP with module Elem = Element = + struct + module Elem = Element + type heap = E | T of int * Elem.t * heap * heap + let rank = function E -> 0 | T(r,_,_,_) -> r + let make x a b = + if rank a >= rank b + then T(rank b + 1, x, a, b) + else T(rank a + 1, x, b, a) + let empty = E + let isEmpty = function E -> true | _ -> false + let rec merge h1 h2 = + match (h1, h2) with + (_, E) -> h1 + | (E, _) -> h2 + | (T(_, x1, a1, b1), T(_, x2, a2, b2)) -> + if Elem.leq x1 x2 + then make x1 a1 (merge b1 h2) + else make x2 a2 (merge h1 b2) + let insert x h = merge (T(1, x, E, E)) h + let findMin = function + E -> raise Not_found + | T(_, x, _, _) -> x + let deleteMin = function + E -> raise Not_found + | T(_, x, a, b) -> merge a b + end +;; + +module Ints = + struct + type t = int + let eq = (=) + let lt = (<) + let leq = (<=) + end +;; + +module C = Bootstrap(LeftistHeap)(Ints);; + +let _ = + let h = List.fold_right C.insert [6;4;8;7;3;1] C.empty in + test 60 (C.findMin h) 1; + test 61 (C.findMin (C.deleteMin h)) 3; + test 62 (C.findMin (C.deleteMin (C.deleteMin h))) 4 +;; + +(* Classes *) + +module rec Class1 + : sig + class c : object method m : int -> int end + end + = struct + class c = + object + method m x = if x <= 0 then x else (new Class2.d)#m x + end + end +and Class2 + : sig + class d : object method m : int -> int end + end + = struct + class d = + object(self) + inherit Class1.c as super + method m (x:int) = super#m 0 + end + end +;; + +let _ = + test 70 ((new Class1.c)#m 7) 0 +;; + +let _ = + try + let module A = struct + module rec BadClass1 + : sig + class c : object method m : int end + end + = struct + class c = object method m = 123 end + end + and BadClass2 + : sig + val x: int + end + = struct + let x = (new BadClass1.c)#m + end + end in + test 71 true false + with Undefined_recursive_module _ -> + test 71 true true +;; + +(* Coercions *) + +module rec Coerce1 + : sig + val g: int -> int + val f: int -> int + end + = struct + module A = (Coerce1: sig val f: int -> int end) + let g x = x + let f x = if x <= 0 then 1 else A.f (x-1) * x + end +;; + +let _ = + test 80 (Coerce1.f 10) 3628800 +;; + +module CoerceF(S: sig end) = struct + let f1 () = 1 + let f2 () = 2 + let f3 () = 3 + let f4 () = 4 + let f5 () = 5 +end + +module rec Coerce2: sig val f1: unit -> int end = CoerceF(Coerce3) + and Coerce3: sig end = struct end +;; + +let _ = + test 81 (Coerce2.f1 ()) 1 +;; + +module Coerce4(A : sig val f : int -> int end) = struct + let x = 0 + let at a = A.f a +end + +module rec Coerce5 + : sig val blabla: int -> int val f: int -> int end + = struct let blabla x = 0 let f x = 5 end +and Coerce6 + : sig val at: int -> int end + = Coerce4(Coerce5) + +let _ = + test 82 (Coerce6.at 100) 5 +;; + +(* Miscellaneous bug reports *) + +module rec F + : sig type t = X of int | Y of int + val f: t -> bool + end + = struct + type t = X of int | Y of int + let f = function + | X _ -> false + | _ -> true + end;; + +let _ = + test 100 (F.f (F.X 1)) false; + test 101 (F.f (F.Y 2)) true + +(* PR#4316 *) +module G(S : sig val x : int Lazy.t end) = struct include S end + +module M1 = struct let x = lazy 3 end + +let _ = Lazy.force M1.x + +module rec M2 : sig val x : int Lazy.t end = G(M1) + +let _ = + test 102 (Lazy.force M2.x) 3 + +let _ = Gc.full_major() (* will shortcut forwarding in M1.x *) + +module rec M3 : sig val x : int Lazy.t end = G(M1) + +let _ = + test 103 (Lazy.force M3.x) 3 + + +(** Pure type-checking tests: see recmod/*.ml *) diff --git a/testsuite/tests/typing-recmod/t22ok.mli b/testsuite/tests/typing-recmod/t22ok.mli new file mode 100644 index 00000000..6c1fad36 --- /dev/null +++ b/testsuite/tests/typing-recmod/t22ok.mli @@ -0,0 +1,134 @@ +module rec A : + sig type t = Leaf of int | Node of ASet.t val compare : t -> t -> int end +and ASet : Set.S with type elt = A.t +module Fib : sig val f : int -> int end +module After : sig val x : int end +module Before : sig val x : int end +module Strengthen : sig type t val f : t -> t end +module Strengthen2 : + sig + type t + val f : t -> t + module M : sig type u end + module R : sig type v end + end +module PolyRec : + sig + type 'a t = Leaf of 'a | Node of 'a list t * 'a list t + val depth : 'a t -> int + end +module StringSet : Set.S with type elt = string +module rec Expr : + sig + type t = + Var of string + | Const of int + | Add of t * t + | Binding of Binding.t * t + val make_let : string -> t -> t -> t + val fv : t -> StringSet.t + val simpl : t -> t + end +and Binding : + sig + type t = (string * Expr.t) list + val fv : t -> StringSet.t + val bv : t -> StringSet.t + val simpl : t -> t + end +module type ORDERED = + sig + type t + val eq : t -> t -> bool + val lt : t -> t -> bool + val leq : t -> t -> bool + end +module type HEAP = + sig + module Elem : ORDERED + type heap + val empty : heap + val isEmpty : heap -> bool + val insert : Elem.t -> heap -> heap + val merge : heap -> heap -> heap + val findMin : heap -> Elem.t + val deleteMin : heap -> heap + end +module Bootstrap : + functor + (MakeH : functor (Element : ORDERED) -> + sig + module Elem : + sig + type t = Element.t + val eq : t -> t -> bool + val lt : t -> t -> bool + val leq : t -> t -> bool + end + type heap + val empty : heap + val isEmpty : heap -> bool + val insert : Elem.t -> heap -> heap + val merge : heap -> heap -> heap + val findMin : heap -> Elem.t + val deleteMin : heap -> heap + end) -> + functor (Element : ORDERED) -> + sig + module Elem : + sig + type t = Element.t + val eq : t -> t -> bool + val lt : t -> t -> bool + val leq : t -> t -> bool + end + type heap + val empty : heap + val isEmpty : heap -> bool + val insert : Elem.t -> heap -> heap + val merge : heap -> heap -> heap + val findMin : heap -> Elem.t + val deleteMin : heap -> heap + end +module LeftistHeap : + functor (Element : ORDERED) -> + sig + module Elem : + sig + type t = Element.t + val eq : t -> t -> bool + val lt : t -> t -> bool + val leq : t -> t -> bool + end + type heap + val empty : heap + val isEmpty : heap -> bool + val insert : Elem.t -> heap -> heap + val merge : heap -> heap -> heap + val findMin : heap -> Elem.t + val deleteMin : heap -> heap + end +module Ints : + sig + type t = int + val eq : 'a -> 'a -> bool + val lt : 'a -> 'a -> bool + val leq : 'a -> 'a -> bool + end +module C : + sig + module Elem : + sig + type t = Ints.t + val eq : t -> t -> bool + val lt : t -> t -> bool + val leq : t -> t -> bool + end + type heap = Bootstrap(LeftistHeap)(Ints).heap + val empty : heap + val isEmpty : heap -> bool + val insert : Elem.t -> heap -> heap + val merge : heap -> heap -> heap + val findMin : heap -> Elem.t + val deleteMin : heap -> heap + end diff --git a/testsuite/tests/typing-typeparam/Makefile b/testsuite/tests/typing-typeparam/Makefile new file mode 100644 index 00000000..6ac1ce13 --- /dev/null +++ b/testsuite/tests/typing-typeparam/Makefile @@ -0,0 +1,6 @@ +MODULES= +MAIN_MODULE=newtype +ADD_COMPFLAGS=-w a + +include ../../makefiles/Makefile.one +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-typeparam/newtype.ml b/testsuite/tests/typing-typeparam/newtype.ml new file mode 100644 index 00000000..24eb2fcf --- /dev/null +++ b/testsuite/tests/typing-typeparam/newtype.ml @@ -0,0 +1,27 @@ +let property (type t) () = + let module M = struct exception E of t end in + (fun x -> M.E x), (function M.E x -> Some x | _ -> None) + +let () = + let (int_inj, int_proj) = property () in + let (string_inj, string_proj) = property () in + + let i = int_inj 3 in + let s = string_inj "abc" in + + Printf.printf "%b\n%!" (int_proj i = None); + Printf.printf "%b\n%!" (int_proj s = None); + Printf.printf "%b\n%!" (string_proj i = None); + Printf.printf "%b\n%!" (string_proj s = None) + + + + +let sort_uniq (type s) cmp l = + let module S = Set.Make(struct type t = s let compare = cmp end) in + S.elements (List.fold_right S.add l S.empty) + +let () = + print_endline (String.concat "," (sort_uniq compare [ "abc"; "xyz"; "abc" ])) + + diff --git a/testsuite/tests/typing-typeparam/newtype.reference b/testsuite/tests/typing-typeparam/newtype.reference new file mode 100644 index 00000000..ab102d7d --- /dev/null +++ b/testsuite/tests/typing-typeparam/newtype.reference @@ -0,0 +1,5 @@ +false +true +true +false +abc,xyz diff --git a/testsuite/tests/warnings/Makefile b/testsuite/tests/warnings/Makefile new file mode 100644 index 00000000..1c60154e --- /dev/null +++ b/testsuite/tests/warnings/Makefile @@ -0,0 +1,14 @@ +FLAGS=-w A +EXECNAME=./program + +run-all: + @for file in *.ml; do \ + printf " ... testing '$$file':"; \ + $(OCAMLC) $(FLAGS) -o $(EXECNAME) $$file 2> `basename $$file ml`result; \ + diff -q `basename $$file ml`reference `basename $$file ml`result > /dev/null && echo " => passed" || echo " => failed"; \ + done; + +clean: defaultclean + @rm -f *.result $(EXECNAME) + +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/warnings/w01.ml b/testsuite/tests/warnings/w01.ml new file mode 100644 index 00000000..08e2f291 --- /dev/null +++ b/testsuite/tests/warnings/w01.ml @@ -0,0 +1,44 @@ + +(* C *) + +let foo = ( *);; + + +(* F *) + +let f x y = x;; +f 1; f 1;; + + +(* M *) + +(* duh *) + + +(* P *) + +let 1 = 1;; + + +(* S *) + +1; 1;; + + +(* U *) + +match 1 with +| 1 -> () +| 1 -> () +| _ -> () +;; + + +(* V *) + +(* re-duh *) + + +(* X *) + +(* re-re *) diff --git a/testsuite/tests/warnings/w01.reference b/testsuite/tests/warnings/w01.reference new file mode 100644 index 00000000..e04d3e19 --- /dev/null +++ b/testsuite/tests/warnings/w01.reference @@ -0,0 +1,15 @@ +File "w01.ml", line 4, characters 12-14: +Warning 2: this is not the end of a comment. +File "w01.ml", line 9, characters 8-9: +Warning 27: unused variable y. +File "w01.ml", line 10, characters 0-3: +Warning 5: this function application is partial, +maybe some arguments are missing. +File "w01.ml", line 20, characters 4-5: +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +0 +File "w01.ml", line 25, characters 0-1: +Warning 10: this expression should have type unit. +File "w01.ml", line 32, characters 2-3: +Warning 11: this match case is unused. diff --git a/tools/.depend b/tools/.depend index b51459b6..9a5ab8be 100644 --- a/tools/.depend +++ b/tools/.depend @@ -1,64 +1,64 @@ -depend.cmi: ../parsing/parsetree.cmi -profiling.cmi: +depend.cmi: ../parsing/parsetree.cmi +profiling.cmi: addlabels.cmo: ../parsing/parsetree.cmi ../parsing/parse.cmi \ - ../parsing/longident.cmi ../parsing/location.cmi ../parsing/asttypes.cmi + ../parsing/longident.cmi ../parsing/location.cmi ../parsing/asttypes.cmi addlabels.cmx: ../parsing/parsetree.cmi ../parsing/parse.cmx \ - ../parsing/longident.cmx ../parsing/location.cmx ../parsing/asttypes.cmi -cvt_emit.cmo: -cvt_emit.cmx: + ../parsing/longident.cmx ../parsing/location.cmx ../parsing/asttypes.cmi +cvt_emit.cmo: +cvt_emit.cmx: depend.cmo: ../parsing/parsetree.cmi ../parsing/longident.cmi \ - ../parsing/location.cmi depend.cmi + ../parsing/location.cmi depend.cmi depend.cmx: ../parsing/parsetree.cmi ../parsing/longident.cmx \ - ../parsing/location.cmx depend.cmi + ../parsing/location.cmx depend.cmi dumpapprox.cmo: ../utils/config.cmi ../asmcomp/compilenv.cmi \ - ../asmcomp/clambda.cmi + ../asmcomp/clambda.cmi dumpapprox.cmx: ../utils/config.cmx ../asmcomp/compilenv.cmx \ - ../asmcomp/clambda.cmx + ../asmcomp/clambda.cmx dumpobj.cmo: ../utils/tbl.cmi opnames.cmo ../bytecomp/opcodes.cmo \ ../parsing/location.cmi ../bytecomp/lambda.cmi ../bytecomp/instruct.cmi \ ../typing/ident.cmi ../bytecomp/emitcode.cmi ../utils/config.cmi \ ../bytecomp/cmo_format.cmi ../bytecomp/bytesections.cmi \ - ../parsing/asttypes.cmi + ../parsing/asttypes.cmi dumpobj.cmx: ../utils/tbl.cmx opnames.cmx ../bytecomp/opcodes.cmx \ ../parsing/location.cmx ../bytecomp/lambda.cmx ../bytecomp/instruct.cmx \ ../typing/ident.cmx ../bytecomp/emitcode.cmx ../utils/config.cmx \ ../bytecomp/cmo_format.cmi ../bytecomp/bytesections.cmx \ - ../parsing/asttypes.cmi -lexer301.cmo: ../utils/warnings.cmi ../utils/misc.cmi ../parsing/location.cmi -lexer301.cmx: ../utils/warnings.cmx ../utils/misc.cmx ../parsing/location.cmx -myocamlbuild_config.cmo: -myocamlbuild_config.cmx: -objinfo.cmo: ../utils/config.cmi ../bytecomp/cmo_format.cmi -objinfo.cmx: ../utils/config.cmx ../bytecomp/cmo_format.cmi -ocaml299to3.cmo: -ocaml299to3.cmx: -ocamlcp.cmo: ../driver/main_args.cmi -ocamlcp.cmx: ../driver/main_args.cmx + ../parsing/asttypes.cmi +lexer301.cmo: ../utils/warnings.cmi ../utils/misc.cmi ../parsing/location.cmi +lexer301.cmx: ../utils/warnings.cmx ../utils/misc.cmx ../parsing/location.cmx +myocamlbuild_config.cmo: +myocamlbuild_config.cmx: +objinfo.cmo: ../utils/config.cmi ../bytecomp/cmo_format.cmi +objinfo.cmx: ../utils/config.cmx ../bytecomp/cmo_format.cmi +ocaml299to3.cmo: +ocaml299to3.cmx: +ocamlcp.cmo: ../driver/main_args.cmi +ocamlcp.cmx: ../driver/main_args.cmx ocamldep.cmo: ../parsing/syntaxerr.cmi ../parsing/parsetree.cmi \ ../parsing/parse.cmi ../utils/misc.cmi ../parsing/longident.cmi \ ../parsing/location.cmi ../parsing/lexer.cmi depend.cmi \ - ../utils/config.cmi ../utils/clflags.cmi + ../utils/config.cmi ../utils/clflags.cmi ocamldep.cmx: ../parsing/syntaxerr.cmx ../parsing/parsetree.cmi \ ../parsing/parse.cmx ../utils/misc.cmx ../parsing/longident.cmx \ ../parsing/location.cmx ../parsing/lexer.cmx depend.cmx \ - ../utils/config.cmx ../utils/clflags.cmx -ocamlmklib.cmo: myocamlbuild_config.cmo -ocamlmklib.cmx: myocamlbuild_config.cmx -ocamlmktop.cmo: ../utils/ccomp.cmi -ocamlmktop.cmx: ../utils/ccomp.cmx + ../utils/config.cmx ../utils/clflags.cmx +ocamlmklib.cmo: myocamlbuild_config.cmo +ocamlmklib.cmx: myocamlbuild_config.cmx +ocamlmktop.cmo: ../utils/ccomp.cmi +ocamlmktop.cmx: ../utils/ccomp.cmx ocamlprof.cmo: ../utils/warnings.cmi ../parsing/syntaxerr.cmi \ ../parsing/parsetree.cmi ../parsing/parse.cmi ../utils/misc.cmi \ ../parsing/location.cmi ../parsing/lexer.cmi ../utils/config.cmi \ - ../utils/clflags.cmi + ../utils/clflags.cmi ocamlprof.cmx: ../utils/warnings.cmx ../parsing/syntaxerr.cmx \ ../parsing/parsetree.cmi ../parsing/parse.cmx ../utils/misc.cmx \ ../parsing/location.cmx ../parsing/lexer.cmx ../utils/config.cmx \ - ../utils/clflags.cmx -opnames.cmo: -opnames.cmx: -primreq.cmo: ../utils/config.cmi ../bytecomp/cmo_format.cmi -primreq.cmx: ../utils/config.cmx ../bytecomp/cmo_format.cmi -profiling.cmo: profiling.cmi -profiling.cmx: profiling.cmi -scrapelabels.cmo: lexer301.cmo -scrapelabels.cmx: lexer301.cmx + ../utils/clflags.cmx +opnames.cmo: +opnames.cmx: +primreq.cmo: ../utils/config.cmi ../bytecomp/cmo_format.cmi +primreq.cmx: ../utils/config.cmx ../bytecomp/cmo_format.cmi +profiling.cmo: profiling.cmi +profiling.cmx: profiling.cmi +scrapelabels.cmo: lexer301.cmo +scrapelabels.cmx: lexer301.cmx diff --git a/tools/Characters b/tools/Characters index 2cd82df8..fb8e6868 100644 --- a/tools/Characters +++ b/tools/Characters @@ -1,6 +1,6 @@ # Characters -# $Id: Characters 2629 1999-11-29 19:04:21Z doligez $ +# $Id$ # Usage: # Characters n1 to n2 diff --git a/tools/DoMake b/tools/DoMake index 87bd7ba3..2fce3401 100644 --- a/tools/DoMake +++ b/tools/DoMake @@ -1,6 +1,6 @@ # DoMake -# $Id: DoMake 2630 1999-11-29 19:04:23Z doligez $ +# $Id$ # Execute the output of "Make -f Makefile.Mac -f Makefile.Mac.depend" # or "Make -f Makefile -f Makefile.depend" if "Makefile.Mac" does not exist @@ -41,7 +41,7 @@ if "{domake_files}" == "" else set domake_main "Makefile" end - + if "`exists "{domake_main}".depend`" != "" set domake_files "-f {domake_main} -f {domake_main}.depend" else diff --git a/tools/MakeDepend b/tools/MakeDepend index 0ca8e3d4..5693b27e 100644 --- a/tools/MakeDepend +++ b/tools/MakeDepend @@ -1,6 +1,6 @@ # MakeDepend -# $Id: MakeDepend 2631 1999-11-29 19:04:25Z doligez $ +# $Id$ # Usage: MakeDepend fileÉ diff --git a/tools/Makefile b/tools/Makefile index f7997e85..bad14c7e 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile 8616 2007-11-22 22:14:43Z doligez $ +# $Id$ include Makefile.shared diff --git a/tools/Makefile.nt b/tools/Makefile.nt index 66b4598e..b90c0c4f 100644 --- a/tools/Makefile.nt +++ b/tools/Makefile.nt @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8485 2007-11-07 10:14:21Z frisch $ +# $Id$ include Makefile.shared diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 7ec1fa49..477ba73a 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -10,16 +10,16 @@ # # ######################################################################### -# $Id: Makefile.shared 8616 2007-11-22 22:14:43Z doligez $ +# $Id$ include ../config/Makefile CAMLRUN=../boot/ocamlrun -CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot +CAMLC=$(CAMLRUN) ../boot/ocamlc -strict-sequence -nostdlib -I ../boot CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib CAMLLEX=$(CAMLRUN) ../boot/ocamllex INCLUDES=-I ../utils -I ../parsing -I ../typing -I ../bytecomp -I ../asmcomp \ - -I ../driver + -I ../driver COMPFLAGS= -warn-error A $(INCLUDES) LINKFLAGS=$(INCLUDES) @@ -105,13 +105,13 @@ clean:: ocamlmklib.ml: ocamlmklib.mlp ../config/Makefile echo '(* THIS FILE IS GENERATED FROM ocamlmklib.mlp *)' >ocamlmklib.ml sed -e "s|%%BINDIR%%|$(BINDIR)|" \ - -e "s|%%SUPPORTS_SHARED_LIBRARIES%%|$(SUPPORTS_SHARED_LIBRARIES)|" \ - -e "s|%%MKSHAREDLIB%%|$(MKSHAREDLIB)|" \ - -e "s|%%BYTECCRPATH%%|$(BYTECCRPATH)|" \ - -e "s|%%NATIVECCRPATH%%|$(NATIVECCRPATH)|" \ - -e "s|%%MKSHAREDLIBRPATH%%|$(MKSHAREDLIBRPATH)|" \ - -e "s|%%RANLIB%%|$(RANLIB)|" \ - ocamlmklib.mlp >> ocamlmklib.ml + -e "s|%%SUPPORTS_SHARED_LIBRARIES%%|$(SUPPORTS_SHARED_LIBRARIES)|" \ + -e "s|%%MKSHAREDLIB%%|$(MKSHAREDLIB)|" \ + -e "s|%%BYTECCRPATH%%|$(BYTECCRPATH)|" \ + -e "s|%%NATIVECCRPATH%%|$(NATIVECCRPATH)|" \ + -e "s|%%MKSHAREDLIBRPATH%%|$(MKSHAREDLIBRPATH)|" \ + -e "s|%%RANLIB%%|$(RANLIB)|" \ + ocamlmklib.mlp >> ocamlmklib.ml beforedepend:: ocamlmklib.ml @@ -166,9 +166,9 @@ ADDLABELS_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ linenum.cmo warnings.cmo location.cmo longident.cmo \ syntaxerr.cmo parser.cmo lexer.cmo parse.cmo -addlabels: addlabels.ml +addlabels: addlabels.cmo $(CAMLC) $(LINKFLAGS) -w sl -o addlabels \ - $(ADDLABELS_IMPORTS) addlabels.ml + $(ADDLABELS_IMPORTS) addlabels.cmo install:: cp addlabels $(LIBDIR) @@ -213,12 +213,12 @@ opnames.ml: ../byterun/instruct.h unset LC_CTYPE || : ; \ unset LC_COLLATE LANG || : ; \ sed -e '/\/\*/d' \ - -e '/^#/d' \ - -e 's/enum \(.*\) {/let names_of_\1 = [|/' \ - -e 's/};$$/ |]/' \ - -e 's/\([A-Z][A-Z_0-9a-z]*\)/"\1"/g' \ - -e 's/,/;/g' \ - ../byterun/instruct.h > opnames.ml + -e '/^#/d' \ + -e 's/enum \(.*\) {/let names_of_\1 = [|/' \ + -e 's/};$$/ |]/' \ + -e 's/\([A-Z][A-Z_0-9a-z]*\)/"\1"/g' \ + -e 's/,/;/g' \ + ../byterun/instruct.h > opnames.ml clean:: rm -f opnames.ml diff --git a/tools/addlabels.ml b/tools/addlabels.ml index 9464a02b..15ad6f5a 100644 --- a/tools/addlabels.ml +++ b/tools/addlabels.ml @@ -1,4 +1,4 @@ -(* $Id: addlabels.ml 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) open StdLabels open Asttypes @@ -58,7 +58,7 @@ let rec pattern_vars pat = | Ppat_variant (_, Some pat) | Ppat_constraint (pat, _) -> pattern_vars pat - | Ppat_record l -> + | Ppat_record(l, _) -> List.concat (List.map l ~f:(fun (_,p) -> pattern_vars p)) | Ppat_or (pat1, pat2) -> pattern_vars pat1 @ pattern_vars pat2 @@ -143,7 +143,7 @@ let rec insert_labels ~labels ~text expr = insert_labels ~labels ~text e2 | _ -> () - + let rec insert_labels_class ~labels ~text expr = match labels, expr.pcl_desc with l::labels, Pcl_fun(l', _, pat, rem) -> @@ -258,7 +258,9 @@ let rec add_labels_expr ~text ~values ~classes expr = | Pexp_letmodule (_, _, e) | Pexp_assert e | Pexp_lazy e - | Pexp_poly (e, _) -> + | Pexp_poly (e, _) + | Pexp_newtype (_, e) + | Pexp_open (_, e) -> add_labels_rec e | Pexp_record (lst, opt) -> List.iter lst ~f:(fun (_,e) -> add_labels_rec e); @@ -277,7 +279,7 @@ let rec add_labels_expr ~text ~values ~classes expr = | Pexp_override lst -> List.iter lst ~f:(fun (_,e) -> add_labels_rec e) | Pexp_ident _ | Pexp_constant _ | Pexp_construct _ | Pexp_variant _ - | Pexp_new _ | Pexp_assertfalse | Pexp_object _ -> + | Pexp_new _ | Pexp_assertfalse | Pexp_object _ | Pexp_pack _ -> () let rec add_labels_class ~text ~classes ~values ~methods cl = @@ -292,12 +294,12 @@ let rec add_labels_class ~text ~classes ~values ~methods cl = ~init:(SMap.add s [""] values) ~f:(fun m (k,l) -> SMap.add (s^"#"^k) l m) in - List.fold_left l ~init:values ~f: + ignore (List.fold_left l ~init:values ~f: begin fun values -> function - | Pcf_val (s, _, e, _) -> + | Pcf_val (s, _, _, e, _) -> add_labels_expr ~text ~classes ~values e; SMap.removes [s] values - | Pcf_meth (s, _, e, _) -> + | Pcf_meth (s, _, _, e, _) -> begin try let labels = List.assoc s methods in insert_labels ~labels ~text e @@ -310,8 +312,7 @@ let rec add_labels_class ~text ~classes ~values ~methods cl = values | Pcf_inher _ | Pcf_valvirt _ | Pcf_virt _ | Pcf_cstr _ -> values | Pcf_let _ -> values (* not in the grammar *) - end; - () + end) | Pcl_fun (_, opt, pat, cl) -> begin match opt with None -> () | Some e -> add_labels_expr ~text ~classes ~values e @@ -319,7 +320,7 @@ let rec add_labels_class ~text ~classes ~values ~methods cl = let values = SMap.removes (pattern_vars pat) values in add_labels_class ~text ~classes ~values ~methods cl | Pcl_apply (cl, args) -> - List.map args ~f:(fun (_,e) -> add_labels_expr ~text ~classes ~values e); + List.iter args ~f:(fun (_,e) -> add_labels_expr ~text ~classes ~values e); add_labels_class ~text ~classes ~values ~methods cl | Pcl_let (recp, lst, cl) -> let vars = List.concat (List.map lst ~f:(fun (p,_) -> pattern_vars p)) in @@ -352,7 +353,7 @@ let add_labels ~intf ~impl ~file = end in let text = input_file file in - List.fold_right impl ~init:(values, classes) ~f: + ignore (List.fold_right impl ~init:(values, classes) ~f: begin fun item (values, classes as acc) -> match item.pstr_desc with Pstr_value (recp, l) -> @@ -405,7 +406,7 @@ let add_labels ~intf ~impl ~file = (values, SMap.removes names classes) | _ -> acc - end; + end); if !insertions <> [] then begin let backup = file ^ ".bak" in if Sys.file_exists backup then Sys.remove file diff --git a/tools/checkstack.c b/tools/checkstack.c index 8a295800..fc760945 100644 --- a/tools/checkstack.c +++ b/tools/checkstack.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: checkstack.c 7382 2006-04-16 23:28:22Z doligez $ */ +/* $Id$ */ #include #include @@ -35,7 +35,8 @@ int main(int argc, char ** argv) "Under sh, bash, zsh: ulimit -s %lu\n" "Under csh, tcsh: limit stacksize %lu\n\n", (unsigned long) (limit.rlim_cur / 1024), - MINSTACKBYTES / 1024, MINSTACKBYTES / 1024); + (unsigned long) (MINSTACKBYTES / 1024), + (unsigned long) (MINSTACKBYTES / 1024)); exit (3); } exit (0); diff --git a/tools/cleanup-header b/tools/cleanup-header index 9c214757..6c320fb3 100644 --- a/tools/cleanup-header +++ b/tools/cleanup-header @@ -11,5 +11,3 @@ d } /\/\* \*\//,/\/\* <\/private> \*\//d - - diff --git a/tools/cvt_emit.mll b/tools/cvt_emit.mll index 23ea61f4..3e28ae97 100644 --- a/tools/cvt_emit.mll +++ b/tools/cvt_emit.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cvt_emit.mll 3304 2000-10-02 14:18:05Z maranget $ *) +(* $Id$ *) { let first_item = ref false diff --git a/tools/depend.ml b/tools/depend.ml index 3936981b..44e85702 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: depend.ml 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) open Format open Location @@ -52,6 +52,11 @@ let rec add_type bv ty = | Rinherit sty -> add_type bv sty) fl | Ptyp_poly(_, t) -> add_type bv t + | Ptyp_package pt -> add_package_type bv pt + +and add_package_type bv (lid, l) = + add bv lid; + List.iter (add_type bv) (List.map snd l) and add_field_type bv ft = match ft.pfield_desc with @@ -105,7 +110,7 @@ let rec add_pattern bv pat = | Ppat_constant _ -> () | Ppat_tuple pl -> List.iter (add_pattern bv) pl | Ppat_construct(c, op, _) -> add bv c; add_opt add_pattern bv op - | Ppat_record pl -> + | Ppat_record(pl, _) -> List.iter (fun (lbl, p) -> add bv lbl; add_pattern bv p) pl | Ppat_array pl -> List.iter (add_pattern bv) pl | Ppat_or(p1, p2) -> add_pattern bv p1; add_pattern bv p2 @@ -157,6 +162,9 @@ let rec add_expr bv exp = | Pexp_poly (e, t) -> add_expr bv e; add_opt add_type bv t | Pexp_object (pat, fieldl) -> add_pattern bv pat; List.iter (add_class_field bv) fieldl + | Pexp_newtype (_, e) -> add_expr bv e + | Pexp_pack (m, pt) -> add_package_type bv pt; add_module bv m + | Pexp_open (m, e) -> addmodule bv m; add_expr bv e and add_pat_expr_list bv pel = List.iter (fun (p, e) -> add_pattern bv p; add_expr bv e) pel @@ -170,8 +178,11 @@ and add_modtype bv mty = add_modtype bv mty; List.iter (function (_, Pwith_type td) -> add_type_declaration bv td - | (_, Pwith_module lid) -> addmodule bv lid) + | (_, Pwith_module lid) -> addmodule bv lid + | (_, Pwith_typesubst td) -> add_type_declaration bv td + | (_, Pwith_modsubst lid) -> addmodule bv lid) cstrl + | Pmty_typeof m -> add_module bv m and add_signature bv = function [] -> () @@ -217,9 +228,12 @@ and add_module bv modl = add_module bv mod1; add_module bv mod2 | Pmod_constraint(modl, mty) -> add_module bv modl; add_modtype bv mty + | Pmod_unpack(e, pt) -> + add_package_type bv pt; + add_expr bv e and add_structure bv item_list = - List.fold_left add_struct_item bv item_list + List.fold_left add_struct_item bv item_list and add_struct_item bv item = match item.pstr_desc with @@ -242,7 +256,7 @@ and add_struct_item bv item = List.fold_right StringSet.add (List.map (fun (id,_,_) -> id) bindings) bv in List.iter - (fun (id, mty, modl) -> add_modtype bv' mty; add_module bv' modl) + (fun (id, mty, modl) -> add_modtype bv' mty; add_module bv' modl) bindings; bv' | Pstr_modtype(id, mty) -> @@ -279,15 +293,14 @@ and add_class_expr bv ce = add_class_expr bv ce; add_class_type bv ct and add_class_field bv = function - Pcf_inher(ce, _) -> add_class_expr bv ce - | Pcf_val(_, _, e, _) -> add_expr bv e + 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_meth(_, _, _, e, _) -> add_expr bv e | Pcf_cstr(ty1, ty2, _) -> add_type bv ty1; add_type bv ty2 | Pcf_let(_, pel, _) -> add_pat_expr_list bv pel | Pcf_init e -> add_expr bv e and add_class_declaration bv decl = add_class_expr bv decl.pci_expr - diff --git a/tools/depend.mli b/tools/depend.mli index 682d2c6d..a1387061 100644 --- a/tools/depend.mli +++ b/tools/depend.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: depend.mli 4694 2002-04-18 07:27:47Z garrigue $ *) +(* $Id$ *) (** Module dependencies. *) diff --git a/tools/dumpapprox.ml b/tools/dumpapprox.ml index 0021052e..4270842f 100644 --- a/tools/dumpapprox.ml +++ b/tools/dumpapprox.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dumpapprox.ml 5423 2003-03-06 16:00:16Z xleroy $ *) +(* $Id$ *) (* Dump a .cmx file *) @@ -95,6 +95,3 @@ let main () = exit 0 let _ = main () - - - diff --git a/tools/dumpobj.ml b/tools/dumpobj.ml index 62fe18c8..2a054ee6 100644 --- a/tools/dumpobj.ml +++ b/tools/dumpobj.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dumpobj.ml 9015 2008-09-10 12:53:05Z doligez $ *) +(* $Id$ *) (* Disassembler for executable and .cmo object files *) diff --git a/tools/keywords.r b/tools/keywords.r deleted file mode 100644 index 1e849518..00000000 --- a/tools/keywords.r +++ /dev/null @@ -1,121 +0,0 @@ -/***********************************************************************/ -/* */ -/* Objective Caml */ -/* */ -/* 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. */ -/* */ -/***********************************************************************/ - -/* $Id: keywords.r 4144 2001-12-07 13:41:02Z xleroy $ */ - -type 'Odds' { - longint; /* resource ID of corresponding 'Sods' */ - longint = $$CountOf (suffixes); - wide array suffixes { pstring; }; -}; - -type 'Sods' { - longint = 0xA5666D66; - pstring; /* default token breaks */ - longint = $$CountOf (keywords); - wide array keywords { - pstring; /* the keyword itself */ - longint /* the keyword type */ - case=0, - caseWord=1, - noCase=2, - noCaseWord=3, - line=4, - mystery=0xB, - opening=0x10000, - closing=0x20000, - openingFill=0x50000, - closingFill=0x60000, - quote=0x80000; - literal longint; /* scoping parameter */ - longint /* color */ - red=0, - blue=1, - bluegreen=2, - bluepurple=3, - grey=4, - darkgreen=7, - black=255; - }; -}; - -resource 'Odds' (26087, "O'Caml") { - 26087, - { ".ml", ".mli", ".mll", ".mly", ".mlp" } -}; - -resource 'Sods' (26087, "O'Caml Keywords") { - "\t\r\n ~!$%^&*()/-+=<>,[]{};", - { - "(*", openingFill, '(**)', red, - "*)", closingFill, '(**)', red, - "\"", quote, 0, grey, -#define KEY caseWord, 0, blue - "and", KEY, - "as", KEY, - "assert", KEY, - "begin", KEY, - "class", KEY, - "constraint", KEY, - "do", KEY, - "done", KEY, - "downto", KEY, - "else", KEY, - "end", KEY, - "exception", KEY, - "external", KEY, - "false", KEY, - "for", KEY, - "fun", KEY, - "function", KEY, - "functor", KEY, - "if", KEY, - "in", KEY, - "include", KEY, - "inherit", KEY, - "initializer", KEY, - "lazy", KEY, - "let", KEY, - "match", KEY, - "method", KEY, - "module", KEY, - "mutable", KEY, - "new", KEY, - "object", KEY, - "of", KEY, - "open", KEY, - "or", KEY, - "parser", KEY, - "private", KEY, - "rec", KEY, - "sig", KEY, - "struct", KEY, - "then", KEY, - "to", KEY, - "true", KEY, - "try", KEY, - "type", KEY, - "val", KEY, - "virtual", KEY, - "when", KEY, - "while", KEY, - "with", KEY, - "mod", KEY, - "land", KEY, - "lor", KEY, - "lxor", KEY, - "lsl", KEY, - "lsr", KEY, - "asr", KEY, - } -}; diff --git a/tools/lexer299.mll b/tools/lexer299.mll index e85c73c3..9a244721 100644 --- a/tools/lexer299.mll +++ b/tools/lexer299.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lexer299.mll 6924 2005-06-22 13:52:36Z doligez $ *) +(* $Id$ *) (* The lexer definition *) @@ -230,7 +230,7 @@ let char_for_backslash = function let char_for_decimal_code lexbuf i = let c = 100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) + 10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) + - (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in + (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in Char.chr(c land 0xFF) (* To store the position of the beginning of a string and comment *) @@ -257,7 +257,7 @@ let report_error ppf = function let blank = [' ' '\010' '\013' '\009' '\012'] let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222'] -let identchar = +let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9'] let symbolchar = ['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] diff --git a/tools/lexer301.mll b/tools/lexer301.mll index c05db338..daec549e 100644 --- a/tools/lexer301.mll +++ b/tools/lexer301.mll @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: lexer301.mll 6720 2004-11-30 18:57:04Z doligez $ *) +(* $Id$ *) (* The lexer definition *) @@ -233,7 +233,7 @@ let char_for_backslash = function let char_for_decimal_code lexbuf i = let c = 100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) + 10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) + - (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in + (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in Char.chr(c land 0xFF) (* To store the position of the beginning of a string and comment *) @@ -263,7 +263,7 @@ let report_error ppf = function let blank = [' ' '\010' '\013' '\009' '\012'] let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222'] -let identchar = +let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9'] let symbolchar = ['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] diff --git a/tools/make-package-macosx b/tools/make-package-macosx index 0c01190a..7e671e29 100755 --- a/tools/make-package-macosx +++ b/tools/make-package-macosx @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: make-package-macosx 9093 2008-10-16 15:57:00Z doligez $ +# $Id$ cd package-macosx rm -rf ocaml.pkg ocaml-rw.dmg diff --git a/tools/objinfo.ml b/tools/objinfo.ml index f5141686..943f83f3 100644 --- a/tools/objinfo.ml +++ b/tools/objinfo.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: objinfo.ml 7469 2006-07-05 12:09:18Z pouillar $ *) +(* $Id$ *) (* Dump a compilation unit description *) @@ -48,7 +48,8 @@ let print_library_info lib = print_string (if lib.lib_custom then "YES" else "no"); print_newline(); print_string " Extra C object files:"; - List.iter print_spaced_string lib.lib_ccobjs; print_newline(); + (* PR#4949: print in linking order *) + List.iter print_spaced_string (List.rev lib.lib_ccobjs); print_newline(); print_string " Extra C options:"; List.iter print_spaced_string lib.lib_ccopts; print_newline(); List.iter print_info lib.lib_units diff --git a/tools/ocaml-objcopy-macosx b/tools/ocaml-objcopy-macosx index 99279cf8..cb2f703b 100755 --- a/tools/ocaml-objcopy-macosx +++ b/tools/ocaml-objcopy-macosx @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: ocaml-objcopy-macosx 7307 2006-01-04 16:55:50Z doligez $ +# $Id$ TMP="${TMPDIR=/tmp}" diff --git a/tools/ocaml299to3.ml b/tools/ocaml299to3.ml index e30d71c9..b1dca8da 100644 --- a/tools/ocaml299to3.ml +++ b/tools/ocaml299to3.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml299to3.ml 3838 2001-10-03 01:34:05Z garrigue $ *) +(* $Id$ *) open Lexer299 diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index 178a3b5e..7c8d725f 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlcp.ml 8232 2007-05-16 08:21:41Z doligez $ *) +(* $Id$ *) open Printf @@ -41,7 +41,7 @@ let incompatible o = fprintf stderr "ocamlcp: profiling is incompatible with the %s option\n" o; exit 2 -module Options = Main_args.Make_options (struct +module Options = Main_args.Make_bytecomp_options (struct let _a () = make_archive := true; option "-a" () let _annot = option "-annot" let _c = option "-c" @@ -62,6 +62,7 @@ module Options = Main_args.Make_options (struct let _labels = option "-labels" let _linkall = option "-linkall" let _make_runtime = option "-make-runtime" + let _no_app_funct = option "-no-app-funct" let _noassert = option "-noassert" let _nolabels = option "-nolabels" let _noautolink = option "-noautolink" @@ -72,6 +73,7 @@ module Options = Main_args.Make_options (struct let _pp s = incompatible "-pp" let _principal = option "-principal" let _rectypes = option "-rectypes" + let _strict_sequence = option "-strict-sequence" let _thread () = option "-thread" () let _vmthread () = option "-vmthread" () let _unsafe = option "-unsafe" diff --git a/tools/ocamldep.ml b/tools/ocamldep.ml index 7d3c90c4..e18d6b0a 100644 --- a/tools/ocamldep.ml +++ b/tools/ocamldep.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocamldep.ml 8963 2008-08-01 09:02:55Z xleroy $ *) +(* $Id$ *) open Format open Location @@ -82,7 +82,7 @@ let find_dependency modname (byt_deps, opt_deps) = with Not_found -> (byt_deps, opt_deps) -let (depends_on, escaped_eol) = (": ", "\\\n ") +let (depends_on, escaped_eol) = (":", " \\\n ") let print_filename s = let s = if !force_slash then fix_slash s else s in @@ -117,14 +117,14 @@ let print_dependencies target_file deps = let rec print_items pos = function [] -> print_string "\n" | dep :: rem -> - if pos + String.length dep <= 77 then begin - print_filename dep; print_string " "; + if pos + 1 + String.length dep <= 77 then begin + print_string " "; print_filename dep; print_items (pos + String.length dep + 1) rem end else begin - print_string escaped_eol; print_filename dep; print_string " "; - print_items (String.length dep + 5) rem + print_string escaped_eol; print_filename dep; + print_items (String.length dep + 4) rem end in - print_items (String.length target_file + 2) deps + print_items (String.length target_file + 1) deps let print_raw_dependencies source_file deps = print_filename source_file; print_string ":"; @@ -143,7 +143,7 @@ let preprocess sourcefile = match !preprocessor with None -> sourcefile | Some pp -> - flush stdout; + flush Pervasives.stdout; let tmpfile = Filename.temp_file "camlpp" "" in let comm = Printf.sprintf "%s %s > %s" pp sourcefile tmpfile in if Sys.command comm <> 0 then begin diff --git a/tools/ocamlmklib.mlp b/tools/ocamlmklib.mlp index 9d1e6185..80c1d9f4 100644 --- a/tools/ocamlmklib.mlp +++ b/tools/ocamlmklib.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlmklib.mlp 9507 2010-01-04 15:50:25Z xleroy $ *) +(* $Id$ *) open Printf open Myocamlbuild_config @@ -134,35 +134,35 @@ let parse_arguments argv = if !output_c = "" then output_c := !output let usage = "\ -Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a|.obj|.lib|.dll files> -Options are: - -cclib C library passed to ocamlc -a or ocamlopt -a only - -ccopt C option passed to ocamlc -a or ocamlopt -a only - -custom disable dynamic loading - -dllpath Add to the run-time search path for DLLs - -F Specify a framework directory (MacOSX) - -framework Use framework (MacOSX) - -help Print this help message and exit - --help Same as -help - -h Same as -help - -I Add to the path searched for Caml object files - -failsafe fall back to static linking if DLL construction failed - -ldopt C option passed to the shared linker only - -linkall Build Caml archive with link-all behavior - -l Specify a dependent C library - -L Add to the path searched for C libraries - -ocamlc Use in place of \"ocamlc\" - -ocamlopt Use in place of \"ocamlopt\" - -o Generated Caml library is named .cma or .cmxa - -oc Generated C library is named dll.so or lib.a - -rpath Same as -dllpath - -R Same as -rpath - -verbose Print commands before executing them - -v same as -verbose - -version Print version and exit - -Wl,-rpath, Same as -dllpath - -Wl,-rpath -Wl, Same as -dllpath - -Wl,-R Same as -dllpath +Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a|.obj|.lib|.dll files>\n\ +Options are:\n\ + -cclib C library passed to ocamlc -a or ocamlopt -a only\n\ + -ccopt C option passed to ocamlc -a or ocamlopt -a only\n\ + -custom disable dynamic loading\n\ + -dllpath Add to the run-time search path for DLLs\n\ + -F Specify a framework directory (MacOSX)\n\ + -framework Use framework (MacOSX)\n\ + -help Print this help message and exit\n\ + --help Same as -help\n\ + -h Same as -help\n\ + -I Add to the path searched for Caml object files\n\ + -failsafe fall back to static linking if DLL construction failed\n\ + -ldopt C option passed to the shared linker only\n\ + -linkall Build Caml archive with link-all behavior\n\ + -l Specify a dependent C library\n\ + -L Add to the path searched for C libraries\n\ + -ocamlc Use in place of \"ocamlc\"\n\ + -ocamlopt Use in place of \"ocamlopt\"\n\ + -o Generated Caml library is named .cma or .cmxa\n\ + -oc Generated C library is named dll.so or lib.a\n\ + -rpath Same as -dllpath \n\ + -R Same as -rpath\n\ + -verbose Print commands before executing them\n\ + -v same as -verbose\n\ + -version Print version and exit\n\ + -Wl,-rpath, Same as -dllpath \n\ + -Wl,-rpath -Wl, Same as -dllpath \n\ + -Wl,-R Same as -dllpath \n\ " let command cmd = diff --git a/tools/ocamlmktop.ml b/tools/ocamlmktop.ml index 8104607d..3d353a8f 100644 --- a/tools/ocamlmktop.ml +++ b/tools/ocamlmktop.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlmktop.ml 5454 2003-03-24 15:27:01Z xleroy $ *) +(* $Id$ *) let _ = let args = Ccomp.quote_files (List.tl (Array.to_list Sys.argv)) in diff --git a/tools/ocamlmktop.tpl b/tools/ocamlmktop.tpl index f8395e94..477f7387 100644 --- a/tools/ocamlmktop.tpl +++ b/tools/ocamlmktop.tpl @@ -11,6 +11,6 @@ # # ######################################################################### -# $Id: ocamlmktop.tpl 6128 2004-02-22 14:52:50Z xleroy $ +# $Id$ exec %%BINDIR%%/ocamlc -linkall toplevellib.cma "$@" topstart.cmo diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index f1d6e557..55f114c5 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlprof.ml 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) open Printf @@ -285,6 +285,10 @@ and rw_exp iflag sexp = | Pexp_object (_, fieldl) -> List.iter (rewrite_class_field iflag) fieldl + | Pexp_newtype (_, sexp) -> rewrite_exp iflag sexp + | Pexp_open (_, e) -> rewrite_exp iflag e + | Pexp_pack (smod, _) -> rewrite_mod iflag smod + and rewrite_ifbody iflag ghost sifbody = if !instr_if && not ghost then insert_profile rw_exp sifbody @@ -317,11 +321,11 @@ and rewrite_trymatching l = and rewrite_class_field iflag = function - Pcf_inher (cexpr, _) -> rewrite_class_expr iflag cexpr - | Pcf_val (_, _, sexp, _) -> rewrite_exp iflag sexp - | Pcf_meth (_, _, ({pexp_desc = Pexp_function _} as sexp), _) -> + Pcf_inher (_, cexpr, _) -> rewrite_class_expr iflag cexpr + | Pcf_val (_, _, _, sexp, _) -> rewrite_exp iflag sexp + | Pcf_meth (_, _, _, ({pexp_desc = Pexp_function _} as sexp), _) -> rewrite_exp iflag sexp - | Pcf_meth (_, _, sexp, loc) -> + | Pcf_meth (_, _, _, sexp, loc) -> if !instr_fun && not loc.loc_ghost then insert_profile rw_exp sexp else rewrite_exp iflag sexp | Pcf_let(_, spat_sexp_list, _) -> @@ -358,6 +362,7 @@ and rewrite_mod iflag smod = | Pmod_functor(param, smty, sbody) -> rewrite_mod iflag sbody | Pmod_apply(smod1, smod2) -> rewrite_mod iflag smod1; rewrite_mod iflag smod2 | Pmod_constraint(smod, smty) -> rewrite_mod iflag smod + | Pmod_unpack(sexp, _) -> rewrite_exp iflag sexp and rewrite_str_item iflag item = match item.pstr_desc with diff --git a/tools/primreq.ml b/tools/primreq.ml index 74b6aa36..dcace11b 100644 --- a/tools/primreq.ml +++ b/tools/primreq.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: primreq.ml 7469 2006-07-05 12:09:18Z pouillar $ *) +(* $Id$ *) (* Determine the set of C primitives required by the given .cmo and .cma files *) diff --git a/tools/profiling.ml b/tools/profiling.ml index e9bd5f9f..9c6d9dd0 100644 --- a/tools/profiling.ml +++ b/tools/profiling.ml @@ -12,7 +12,7 @@ (* *) (***********************************************************************) -(* $Id: profiling.ml 7762 2006-11-28 15:59:35Z doligez $ *) +(* $Id$ *) (* Run-time library for profiled programs *) @@ -54,4 +54,3 @@ let dump_counters () = end let _ = at_exit dump_counters - diff --git a/tools/profiling.mli b/tools/profiling.mli index 01dc1215..ca8486f4 100644 --- a/tools/profiling.mli +++ b/tools/profiling.mli @@ -12,7 +12,7 @@ (* *) (***********************************************************************) -(* $Id: profiling.mli 6824 2005-03-24 17:20:54Z doligez $ *) +(* $Id$ *) (* Run-time library for profiled programs *) diff --git a/tools/scrapelabels.ml b/tools/scrapelabels.ml index 67bbc309..dc43e97b 100644 --- a/tools/scrapelabels.ml +++ b/tools/scrapelabels.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: scrapelabels.ml 3850 2001-10-04 01:55:02Z garrigue $ *) +(* $Id$ *) open StdLabels open Lexer301 @@ -148,7 +148,7 @@ let convert_impl buffer = assert false with Closing last -> match token, last with - LPAREN, RPAREN + LPAREN, RPAREN | (LBRACKET|LBRACKETBAR|LBRACKETLESS), (RBRACKET|BARRBRACKET|GREATERRBRACKET) | (BEGIN|STRUCT|SIG|OBJECT), END diff --git a/toplevel/expunge.ml b/toplevel/expunge.ml index 81800907..5debb412 100644 --- a/toplevel/expunge.ml +++ b/toplevel/expunge.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: expunge.ml 6074 2004-01-16 15:24:03Z doligez $ *) +(* $Id$ *) (* "Expunge" a toplevel by removing compiler modules from the global List.map. Usage: expunge *) diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 52cf376d..32770040 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: genprintval.ml 8418 2007-10-09 10:29:37Z weis $ *) +(* $Id$ *) (* To print values *) @@ -320,6 +320,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type value = O.t) = struct tree_of_val (depth - 1) obj ty | Tunivar -> Oval_stuff "" + | Tpackage _ -> + Oval_stuff "" end and tree_of_val_list start depth obj ty_list = diff --git a/toplevel/genprintval.mli b/toplevel/genprintval.mli index edb8a4a3..898588b2 100644 --- a/toplevel/genprintval.mli +++ b/toplevel/genprintval.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: genprintval.mli 4694 2002-04-18 07:27:47Z garrigue $ *) +(* $Id$ *) (* Printing of values *) diff --git a/toplevel/opttopdirs.ml b/toplevel/opttopdirs.ml index 4a39a283..b586bae1 100644 --- a/toplevel/opttopdirs.ml +++ b/toplevel/opttopdirs.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opttopdirs.ml 9134 2008-11-19 02:35:40Z garrigue $ *) +(* $Id$ *) (* Toplevel directives *) @@ -37,10 +37,10 @@ let dir_directory s = Config.load_path := d :: !Config.load_path let _ = Hashtbl.add directive_table "directory" (Directive_string dir_directory) -let _ = Hashtbl.add directive_table "show_dirs" - (Directive_none +let _ = Hashtbl.add directive_table "show_dirs" + (Directive_none (fun () -> - List.iter print_endline !Config.load_path + List.iter print_endline !Config.load_path )) (* To change the current directory *) @@ -52,7 +52,7 @@ let _ = Hashtbl.add directive_table "cd" (Directive_string dir_cd) (* Load in-core a .cmxs file *) let load_file ppf name0 = - let name = + let name = try Some (find_in_path !Config.load_path name0) with Not_found -> None in match name with @@ -67,23 +67,23 @@ let load_file ppf name0 = else name,false in - let success = + let success = (* The Dynlink interface does not allow us to distinguish between a Dynlink.Error exceptions raised in the loaded modules or a genuine error during dynlink... *) try Dynlink.loadfile fn; true - with + with | Dynlink.Error err -> - fprintf ppf "Error while loading %s: %s.@." - name (Dynlink.error_message err); - false - | exn -> - print_exception_outcome ppf exn; - false + fprintf ppf "Error while loading %s: %s.@." + name (Dynlink.error_message err); + false + | exn -> + print_exception_outcome ppf exn; + false in if tmp then (try Sys.remove fn with Sys_error _ -> ()); success - + let dir_load ppf name = ignore (load_file ppf name) @@ -126,7 +126,7 @@ let find_printer_type ppf lid = with Ctype.Unify _ -> (match_printer_type ppf desc "printer_type_old", true) in (ty_arg, path, is_old_style) - with + with | Not_found -> fprintf ppf "Unbound value %a.@." Printtyp.longident lid; raise Exit @@ -134,7 +134,7 @@ let find_printer_type ppf lid = fprintf ppf "%a has a wrong type for a printing function.@." Printtyp.longident lid; raise Exit - + let dir_install_printer ppf lid = try let (ty_arg, path, is_old_style) = find_printer_type ppf lid in @@ -182,9 +182,6 @@ let _ = Hashtbl.add directive_table "principal" (Directive_bool(fun b -> Clflags.principal := b)); - Hashtbl.add directive_table "rectypes" - (Directive_none(fun () -> Clflags.recursive_types := true)); - Hashtbl.add directive_table "warnings" (Directive_string (parse_warnings std_out false)); diff --git a/toplevel/opttopdirs.mli b/toplevel/opttopdirs.mli index 77330bda..800c6cf7 100644 --- a/toplevel/opttopdirs.mli +++ b/toplevel/opttopdirs.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opttopdirs.mli 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) (* The toplevel directives. *) diff --git a/toplevel/opttoploop.ml b/toplevel/opttoploop.ml index 95baaf79..ee6b5a0e 100644 --- a/toplevel/opttoploop.ml +++ b/toplevel/opttoploop.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opttoploop.ml 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) (* The interactive toplevel loop *) @@ -333,7 +333,7 @@ let first_line = ref true let got_eof = ref false;; let read_input_default prompt buffer len = - output_string stdout prompt; flush stdout; + output_string Pervasives.stdout prompt; flush Pervasives.stdout; let i = ref 0 in try while true do diff --git a/toplevel/opttoploop.mli b/toplevel/opttoploop.mli index 86363ba7..78e45f0b 100644 --- a/toplevel/opttoploop.mli +++ b/toplevel/opttoploop.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opttoploop.mli 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) open Format diff --git a/toplevel/opttopmain.ml b/toplevel/opttopmain.ml index 76e41492..3575abbb 100644 --- a/toplevel/opttopmain.ml +++ b/toplevel/opttopmain.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opttopmain.ml 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) open Clflags @@ -53,69 +53,52 @@ let print_version () = exit 0; ;; -let main () = - Arg.parse (Arch.command_line_options @ [ - "-compact", Arg.Clear optimize_for_speed, " Optimize code size rather than speed"; - "-inline", Arg.Int(fun n -> inline_threshold := n * 8), - " Set aggressiveness of inlining to "; - "-I", Arg.String(fun dir -> - let dir = Misc.expand_directory Config.standard_library dir in - include_dirs := dir :: !include_dirs), - " Add to the list of include directories"; - "-init", Arg.String (fun s -> init_file := Some s), - " Load instead of default init file"; - "-labels", Arg.Clear classic, " Labels commute (default)"; - "-noassert", Arg.Set noassert, " Do not compile assertion checks"; - "-nolabels", Arg.Set classic, " Ignore labels and do not commute"; - "-noprompt", Arg.Set noprompt, " Suppress all prompts"; - "-nostdlib", Arg.Set no_std_include, - " do not add default directory to the list of include directories"; - "-principal", Arg.Set principal, " Check principality of type inference"; - "-rectypes", Arg.Set recursive_types, " Allow arbitrary recursive types"; - "-S", Arg.Set keep_asm_file, " Keep intermediate assembly file"; - "-unsafe", Arg.Set fast, " No bound checking on array and string access"; - "-version", Arg.Unit print_version, " Print version and exit"; - "-w", Arg.String (Warnings.parse_options false), - " Enable or disable warnings according to :\n\ - \032 A/a enable/disable all warnings\n\ - \032 C/c enable/disable suspicious comment\n\ - \032 D/d enable/disable deprecated features\n\ - \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 overriden method\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 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\ - \032 default setting is \"Aelz\""; - "-warn-error" , Arg.String (Warnings.parse_options true), - " Treat the warnings of as errors, if they are enabled.\n\ - \032 (see option -w for the list of flags)\n\ - \032 default setting is a (all warnings are non-fatal)"; +module Options = Main_args.Make_opttop_options (struct + let set r () = r := true + let clear r () = r := false + + let _compact = clear optimize_for_speed + let _I dir = + let dir = Misc.expand_directory Config.standard_library dir in + include_dirs := dir :: !include_dirs + let _init s = init_file := Some s + let _inline n = inline_threshold := n * 8 + let _labels = clear classic + let _no_app_funct = clear applicative_functors + let _noassert = set noassert + let _nolabels = set classic + let _noprompt = set noprompt + let _nostdlib = set no_std_include + let _principal = set principal + let _rectypes = set recursive_types + let _strict_sequence = set strict_sequence + let _S = set keep_asm_file + let _unsafe = set fast + let _version () = print_version () + let _w s = Warnings.parse_options false s + let _warn_error s = Warnings.parse_options true s + + let _dparsetree = set dump_parsetree + let _drawlambda = set dump_rawlambda + let _dlambda = set dump_lambda + let _dcmm = set dump_cmm + let _dsel = set dump_selection + let _dcombine = set dump_combine + let _dlive () = dump_live := true; Printmach.print_live := true + let _dspill = set dump_spill + let _dsplit = set dump_split + let _dinterf = set dump_interf + let _dprefer = set dump_prefer + let _dalloc = set dump_regalloc + let _dreload = set dump_reload + let _dscheduling = set dump_scheduling + let _dlinear = set dump_linear + let _dstartup = set keep_startup_file - "-dparsetree", Arg.Set dump_parsetree, " (undocumented)"; - "-drawlambda", Arg.Set dump_rawlambda, " (undocumented)"; - "-dlambda", Arg.Set dump_lambda, " (undocumented)"; - "-dcmm", Arg.Set dump_cmm, " (undocumented)"; - "-dsel", Arg.Set dump_selection, " (undocumented)"; - "-dcombine", Arg.Set dump_combine, " (undocumented)"; - "-dlive", Arg.Unit(fun () -> dump_live := true; - Printmach.print_live := true), - " (undocumented)"; - "-dspill", Arg.Set dump_spill, " (undocumented)"; - "-dsplit", Arg.Set dump_split, " (undocumented)"; - "-dinterf", Arg.Set dump_interf, " (undocumented)"; - "-dprefer", Arg.Set dump_prefer, " (undocumented)"; - "-dalloc", Arg.Set dump_regalloc, " (undocumented)"; - "-dreload", Arg.Set dump_reload, " (undocumented)"; - "-dscheduling", Arg.Set dump_scheduling, " (undocumented)"; - "-dlinear", Arg.Set dump_linear, " (undocumented)"; - "-dstartup", Arg.Set keep_startup_file, " (undocumented)"; - ]) file_argument usage; + let anonymous = file_argument +end);; + +let main () = + Arg.parse Options.list file_argument usage; if not (prepare Format.err_formatter) then exit 2; Opttoploop.loop Format.std_formatter - diff --git a/toplevel/opttopmain.mli b/toplevel/opttopmain.mli index 119cb000..197f88bb 100644 --- a/toplevel/opttopmain.mli +++ b/toplevel/opttopmain.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: opttopmain.mli 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) (* Start the [ocaml] toplevel loop *) diff --git a/toplevel/opttopstart.ml b/toplevel/opttopstart.ml index c13cfcbb..3e3fe58b 100644 --- a/toplevel/opttopstart.ml +++ b/toplevel/opttopstart.ml @@ -10,6 +10,6 @@ (* *) (***********************************************************************) -(* $Id: opttopstart.ml 8477 2007-11-06 15:16:56Z frisch $ *) +(* $Id$ *) let _ = Opttopmain.main() diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index d45b4f72..6516a387 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topdirs.ml 9134 2008-11-19 02:35:40Z garrigue $ *) +(* $Id$ *) (* Toplevel directives *) @@ -164,7 +164,7 @@ let find_printer_type ppf lid = with Ctype.Unify _ -> (match_printer_type ppf desc "printer_type_old", true) in (ty_arg, path, is_old_style) - with + with | Not_found -> fprintf ppf "Unbound value %a.@." Printtyp.longident lid; raise Exit @@ -172,7 +172,7 @@ let find_printer_type ppf lid = fprintf ppf "%a has a wrong type for a printing function.@." Printtyp.longident lid; raise Exit - + let dir_install_printer ppf lid = try let (ty_arg, path, is_old_style) = find_printer_type ppf lid in @@ -230,7 +230,7 @@ let dir_trace ppf lid = | None -> (* Instrument the old closure *) traced_functions := - { path = path; + { path = path; closure = clos; actual_code = get_code_pointer clos; instrumented_fun = diff --git a/toplevel/topdirs.mli b/toplevel/topdirs.mli index 1aa70859..36af2211 100644 --- a/toplevel/topdirs.mli +++ b/toplevel/topdirs.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topdirs.mli 4694 2002-04-18 07:27:47Z garrigue $ *) +(* $Id$ *) (* The toplevel directives. *) diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 2a6ff83f..250a27b5 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: toploop.ml 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) (* The interactive toplevel loop *) @@ -322,12 +322,12 @@ let first_line = ref true let got_eof = ref false;; let read_input_default prompt buffer len = - output_string stdout prompt; flush stdout; + output_string Pervasives.stdout prompt; flush Pervasives.stdout; let i = ref 0 in try while true do if !i >= len then raise Exit; - let c = input_char stdin in + let c = input_char Pervasives.stdin in buffer.[!i] <- c; incr i; if c = '\n' then raise Exit; diff --git a/toplevel/toploop.mli b/toplevel/toploop.mli index be9c27b8..35eb5dbf 100644 --- a/toplevel/toploop.mli +++ b/toplevel/toploop.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: toploop.mli 8705 2007-12-04 13:38:58Z doligez $ *) +(* $Id$ *) open Format diff --git a/toplevel/topmain.ml b/toplevel/topmain.ml index 95e6a051..b63eefcb 100644 --- a/toplevel/topmain.ml +++ b/toplevel/topmain.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topmain.ml 6758 2005-01-28 17:52:58Z doligez $ *) +(* $Id$ *) open Clflags @@ -21,7 +21,7 @@ let preload_objects = ref [] let prepare ppf = Toploop.set_paths (); try - let res = + let res = List.for_all (Topdirs.load_file ppf) (List.rev !preload_objects) in !Toploop.toplevel_startup_hook (); res @@ -50,51 +50,37 @@ let print_version () = exit 0; ;; -let main () = - Arg.parse [ - "-I", Arg.String(fun dir -> - let dir = Misc.expand_directory Config.standard_library dir in - include_dirs := dir :: !include_dirs), - " Add to the list of include directories"; - "-init", Arg.String (fun s -> init_file := Some s), - " Load instead of default init file"; - "-labels", Arg.Clear classic, " Labels commute (default)"; - "-noassert", Arg.Set noassert, " Do not compile assertion checks"; - "-nolabels", Arg.Set classic, " Ignore labels and do not commute"; - "-noprompt", Arg.Set noprompt, " Suppress all prompts"; - "-nostdlib", Arg.Set no_std_include, - " do not add default directory to the list of include directories"; - "-principal", Arg.Set principal, " Check principality of type inference"; - "-rectypes", Arg.Set recursive_types, " Allow arbitrary recursive types"; - "-unsafe", Arg.Set fast, " No bound checking on array and string access"; - "-version", Arg.Unit print_version, " Print version and exit"; - "-w", Arg.String (Warnings.parse_options false), - " Enable or disable warnings according to :\n\ - \032 A/a enable/disable all warnings\n\ - \032 C/c enable/disable suspicious comment\n\ - \032 D/d enable/disable deprecated features\n\ - \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 overriden method\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 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\ - \032 default setting is \"Aelz\""; - "-warn-error" , Arg.String (Warnings.parse_options true), - " Treat the warnings of as errors, if they are enabled.\n\ - \032 (see option -w for the list of flags)\n\ - \032 default setting is a (all warnings are non-fatal)"; +module Options = Main_args.Make_bytetop_options (struct + let set r () = r := true + let clear r () = r := false + + let _I dir = + let dir = Misc.expand_directory Config.standard_library dir in + include_dirs := dir :: !include_dirs + let _init s = init_file := Some s + let _labels = clear classic + let _no_app_funct = clear applicative_functors + let _noassert = set noassert + let _nolabels = set classic + let _noprompt = set noprompt + let _nostdlib = set no_std_include + let _principal = set principal + let _rectypes = set recursive_types + let _strict_sequence = set strict_sequence + let _unsafe = set fast + let _version () = print_version () + let _w s = Warnings.parse_options false s + let _warn_error s = Warnings.parse_options true s + let _dparsetree = set dump_parsetree + let _drawlambda = set dump_rawlambda + let _dlambda = set dump_lambda + let _dinstr = set dump_instr + + let anonymous s = file_argument s +end);; - "-dparsetree", Arg.Set dump_parsetree, " (undocumented)"; - "-drawlambda", Arg.Set dump_rawlambda, " (undocumented)"; - "-dlambda", Arg.Set dump_lambda, " (undocumented)"; - "-dinstr", Arg.Set dump_instr, " (undocumented)"; - ] file_argument usage; + +let main () = + Arg.parse Options.list file_argument usage; if not (prepare Format.err_formatter) then exit 2; Toploop.loop Format.std_formatter - diff --git a/toplevel/topmain.mli b/toplevel/topmain.mli index c2a7c896..197f88bb 100644 --- a/toplevel/topmain.mli +++ b/toplevel/topmain.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topmain.mli 4731 2002-04-24 08:02:51Z xleroy $ *) +(* $Id$ *) (* Start the [ocaml] toplevel loop *) diff --git a/toplevel/topstart.ml b/toplevel/topstart.ml index 7d853f51..570e2f20 100644 --- a/toplevel/topstart.ml +++ b/toplevel/topstart.ml @@ -10,6 +10,6 @@ (* *) (***********************************************************************) -(* $Id: topstart.ml 4731 2002-04-24 08:02:51Z xleroy $ *) +(* $Id$ *) let _ = Topmain.main() diff --git a/toplevel/trace.ml b/toplevel/trace.ml index a306d9b4..fad92d98 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: trace.ml 3490 2001-04-19 08:34:21Z garrigue $ *) +(* $Id$ *) (* The "trace" facility *) diff --git a/toplevel/trace.mli b/toplevel/trace.mli index 853509af..d708361c 100644 --- a/toplevel/trace.mli +++ b/toplevel/trace.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: trace.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) (* The "trace" facility *) @@ -30,6 +30,6 @@ val is_traced: Obj.t -> Path.t option val get_code_pointer: Obj.t -> codeptr val set_code_pointer: Obj.t -> codeptr -> unit val instrument_closure: - Env.t -> Longident.t -> formatter -> Types.type_expr -> + Env.t -> Longident.t -> formatter -> Types.type_expr -> codeptr -> Obj.t -> Obj.t -> Obj.t val print_trace: Obj.t -> Obj.t -> Obj.t diff --git a/typing/annot.mli b/typing/annot.mli index 95e72437..92b2f6ec 100644 --- a/typing/annot.mli +++ b/typing/annot.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: annot.mli 8958 2008-07-29 15:42:44Z doligez $ *) +(* $Id$ *) (* Data types for annotations (Stypes.ml) *) diff --git a/typing/btype.ml b/typing/btype.ml index 70fa4486..e57e760f 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: btype.ml 8922 2008-07-19 02:13:09Z garrigue $ *) +(* $Id$ *) (* Basic operations on core types *) @@ -51,7 +51,7 @@ let rec field_kind_repr = let rec repr = function {desc = Tlink t'} -> - (* + (* We do no path compression. Path compression does not seem to improve notably efficiency, and it prevents from changing a [Tlink] into another type (for instance, for undoing a @@ -96,11 +96,11 @@ let row_repr row = row_repr_aux [] row let rec row_field tag row = let rec find = function | (tag',f) :: fields -> - if tag = tag' then row_field_repr f else find fields + if tag = tag' then row_field_repr f else find fields | [] -> - match repr row.row_more with - | {desc=Tvariant row'} -> row_field tag row' - | _ -> Rabsent + match repr row.row_more with + | {desc=Tvariant row'} -> row_field tag row' + | _ -> Rabsent in find row.row_fields let rec row_more row = @@ -195,6 +195,7 @@ let iter_type_expr f ty = | Tsubst ty -> f ty | Tunivar -> () | Tpoly (ty, tyl) -> f ty; List.iter f tyl + | Tpackage (_, _, l) -> List.iter f l let rec iter_abbrev f = function Mnil -> () @@ -256,14 +257,14 @@ let rec copy_type_desc f = function | Tpoly (ty, tyl) -> let tyl = List.map (fun x -> norm_univar (f x)) tyl in Tpoly (f ty, tyl) - + | Tpackage (p, n, l) -> Tpackage (p, n, List.map f l) (* Utilities for copying *) let saved_desc = ref [] (* Saved association of generic nodes with their description. *) -let save_desc ty desc = +let save_desc ty desc = saved_desc := (ty, desc)::!saved_desc let saved_kinds = ref [] (* duplicated kind variables *) @@ -380,7 +381,7 @@ let rec forget_abbrev_rec mem path = Mnil -> assert false | Mcons (_, path', _, _, rem) when Path.same path path' -> - rem + rem | Mcons (priv, path', v, v', rem) -> Mcons (priv, path', v, v', forget_abbrev_rec rem path) | Mlink mem' -> @@ -445,7 +446,7 @@ let undo_change = function | Ccommu (r, v) -> r := v | Cuniv (r, v) -> r := v -type changes = +type changes = Change of change * changes ref | Unchanged | Invalid diff --git a/typing/btype.mli b/typing/btype.mli index dad6c4a0..4ea5e3b4 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: btype.mli 8922 2008-07-19 02:13:09Z garrigue $ *) +(* $Id$ *) (* Basic operations on core types *) diff --git a/typing/ctype.ml b/typing/ctype.ml index 9b9024bb..4b9e84b2 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ctype.ml 9453 2009-12-07 13:04:54Z garrigue $ *) +(* $Id$ *) (* Operations on core types *) @@ -616,6 +616,8 @@ let rec update_level env level ty = (* +++ Levels should be restored... *) raise (Unify [(ty, newvar2 level)]) end + | Tpackage (p, _, _) when level < Path.binding_time p -> + raise (Unify [(ty, newvar2 level)]) | Tobject(_, ({contents=Some(p, tl)} as nm)) when level < Path.binding_time p -> set_name nm None; @@ -657,6 +659,8 @@ let rec generalize_expansive env var_level ty = if ct then update_level env var_level t else generalize_expansive env var_level t) variance tyl + | Tpackage (_, _, tyl) -> + List.iter (update_level env var_level) tyl | Tarrow (_, t1, t2, _) -> update_level env var_level t1; generalize_expansive env var_level t2 @@ -953,7 +957,7 @@ let rec copy_sep fixed free bound visited ty = let t = newvar() in (* Stub *) let visited = match ty.desc with - Tarrow _ | Ttuple _ | Tvariant _ | Tconstr _ | Tobject _ -> + Tarrow _ | Ttuple _ | Tvariant _ | Tconstr _ | Tobject _ | Tpackage _ -> (ty,(t,bound)) :: visited | _ -> visited in let copy_rec = copy_sep fixed free bound visited in @@ -1653,6 +1657,8 @@ and unify3 env t1 t1' t2 t2' = unify env t1 t2 | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> enter_poly env univar_pairs t1 tl1 t2 tl2 (unify env) + | (Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2)) when Path.same p1 p2 && n1 = n2 -> + unify_list env tl1 tl2 | (_, _) -> raise (Unify []) end; @@ -1834,7 +1840,7 @@ and unify_row_field env fixed1 fixed2 l f1 f2 = if e1 == e2 then () else let redo = (m1 || m2 || - !rigid_variants && (List.length tl1 = 1 || List.length tl2 = 1)) && + !rigid_variants && (List.length tl1 = 1 || List.length tl2 = 1)) && begin match tl1 @ tl2 with [] -> false | t1 :: tl -> if c1 || c2 then raise (Unify []); @@ -2053,6 +2059,8 @@ let rec moregen inst_nongen type_pairs env t1 t2 = | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> moregen_list inst_nongen type_pairs env tl1 tl2 + | Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2) when Path.same p1 p2 && n1 = n2 -> + moregen_list inst_nongen type_pairs env tl1 tl2 | (Tvariant row1, Tvariant row2) -> moregen_row inst_nongen type_pairs env row1 row2 | (Tobject (fi1, nm1), Tobject (fi2, nm2)) -> @@ -2312,6 +2320,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> eqtype_list rename type_pairs subst env tl1 tl2 + | Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2) when Path.same p1 p2 && n1 = n2 -> + eqtype_list rename type_pairs subst env tl1 tl2 | (Tvariant row1, Tvariant row2) -> eqtype_row rename type_pairs subst env row1 row2 | (Tobject (fi1, nm1), Tobject (fi2, nm2)) -> @@ -2918,7 +2928,7 @@ let rec build_subtype env visited loops posi level t = 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 -> + | Tunivar | Tpackage _ -> (t, Unchanged) let enlarge_type env ty = @@ -3216,15 +3226,15 @@ let rec normalize_type_rec env visited ty = begin match !nm with | None -> () | Some (n, v :: l) -> - if deep_occur ty (newgenty (Ttuple l)) then - (* The abbreviation may be hiding something, so remove it *) - set_name nm None - else let v' = repr v in + if deep_occur ty (newgenty (Ttuple l)) then + (* The abbreviation may be hiding something, so remove it *) + set_name nm None + else let v' = repr v in begin match v'.desc with | Tvar|Tunivar -> if v' != v then set_name nm (Some (n, v' :: l)) | Tnil -> - log_type ty; ty.desc <- Tconstr (n, l, ref Mnil) + log_type ty; ty.desc <- Tconstr (n, l, ref Mnil) | _ -> set_name nm None end | _ -> @@ -3252,38 +3262,38 @@ let normalize_type env ty = (* Variables are left unchanged. Other type nodes are duplicated, with levels set to generic level. - During copying, the description of a (non-variable) node is first - replaced by a link to a stub ([Tsubst (newgenvar ())]). - Once the copy is made, it replaces the stub. - After copying, the description of node, which was stored by - [save_desc], must be put back, using [cleanup_types]. + We cannot use Tsubst here, because unification may be called by + expand_abbrev. *) +let nondep_hash = TypeHash.create 47 +let nondep_variants = TypeHash.create 17 +let clear_hash () = + TypeHash.clear nondep_hash; TypeHash.clear nondep_variants + let rec nondep_type_rec env id ty = - let ty = repr ty in match ty.desc with Tvar | Tunivar -> ty - | Tsubst ty -> ty - | _ -> - let desc = ty.desc in - save_desc ty desc; + | Tlink ty -> nondep_type_rec env id ty + | _ -> try TypeHash.find nondep_hash ty + with Not_found -> let ty' = newgenvar () in (* Stub *) - ty.desc <- Tsubst ty'; + TypeHash.add nondep_hash ty ty'; ty'.desc <- - begin match desc with + begin match ty.desc with | Tconstr(p, tl, abbrev) -> if Path.isfree id p then begin try Tlink (nondep_type_rec env id - (expand_abbrev env (newty2 ty.level desc))) + (expand_abbrev env (newty2 ty.level ty.desc))) (* The [Tlink] is important. The expanded type may be a variable, or may not be completely copied yet (recursive type), so one cannot just take its description. *) - with Cannot_expand | Unify _ -> (* expand_abbrev failed *) - raise Not_found (* cf. PR4775 for Unify *) + with Cannot_expand | Unify _ -> + raise Not_found end else Tconstr(p, List.map (nondep_type_rec env id) tl, ref Mnil) @@ -3297,39 +3307,36 @@ let rec nondep_type_rec env id ty = | Tvariant row -> let row = row_repr row in let more = repr row.row_more in - (* We must substitute in a subtle way *) - (* Tsubst denotes the variant itself, as the row var is unchanged *) - begin match more.desc with - Tsubst ty2 -> - (* This variant type has been already copied *) - ty.desc <- Tsubst ty2; (* avoid Tlink in the new type *) - Tlink ty2 - | _ -> - let static = static_row row in - (* Register new type first for recursion *) - save_desc more more.desc; - more.desc <- ty.desc; - let more' = if static then newgenvar () else more in - (* Return a new copy *) - let row = - copy_row (nondep_type_rec env id) true row true more' in - match row.row_name with - Some (p, tl) when Path.isfree id p -> - Tvariant {row with row_name = None} - | _ -> Tvariant row + (* We must keep sharing according to the row variable *) + begin try + let ty2 = TypeHash.find nondep_variants more in + (* This variant type has been already copied *) + TypeHash.add nondep_hash ty ty2; + Tlink ty2 + with Not_found -> + (* Register new type first for recursion *) + TypeHash.add nondep_variants more ty'; + let static = static_row row in + let more' = if static then newgenvar () else more in + (* Return a new copy *) + let row = + copy_row (nondep_type_rec env id) true row true more' in + match row.row_name with + Some (p, tl) when Path.isfree id p -> + Tvariant {row with row_name = None} + | _ -> Tvariant row end - | _ -> copy_type_desc (nondep_type_rec env id) desc + | _ -> copy_type_desc (nondep_type_rec env id) ty.desc end; ty' let nondep_type env id ty = try let ty' = nondep_type_rec env id ty in - cleanup_types (); - unmark_type ty'; + clear_hash (); ty' with Not_found -> - cleanup_types (); + clear_hash (); raise Not_found (* Preserve sharing inside type declarations. *) @@ -3360,19 +3367,7 @@ let nondep_type_decl env mid id is_covariant decl = with Not_found when is_covariant -> None in - cleanup_types (); - List.iter unmark_type decl.type_params; - begin match decl.type_kind with - Type_abstract -> () - | Type_variant cstrs -> - List.iter (fun (c, tl) -> List.iter unmark_type tl) cstrs - | Type_record(lbls, rep) -> - List.iter (fun (c, mut, t) -> unmark_type t) lbls - end; - begin match decl.type_manifest with - None -> () - | Some ty -> unmark_type ty - end; + clear_hash (); let priv = match tm with | Some ty when Btype.has_constr_row ty -> Private @@ -3386,7 +3381,7 @@ let nondep_type_decl env mid id is_covariant decl = type_variance = decl.type_variance; } with Not_found -> - cleanup_types (); + clear_hash (); raise Not_found (* Preserve sharing inside class types. *) @@ -3425,13 +3420,7 @@ let nondep_class_declaration env id decl = | Some ty -> Some (nondep_type_rec env id ty) end } in - cleanup_types (); - List.iter unmark_type decl.cty_params; - unmark_class_type decl.cty_type; - begin match decl.cty_new with - None -> () - | Some ty -> unmark_type ty - end; + clear_hash (); decl let nondep_cltype_declaration env id decl = @@ -3442,9 +3431,7 @@ let nondep_cltype_declaration env id decl = clty_type = nondep_class_type env id decl.clty_type; clty_path = decl.clty_path } in - cleanup_types (); - List.iter unmark_type decl.clty_params; - unmark_class_type decl.clty_type; + clear_hash (); decl (* collapse conjonctive types in class parameters *) diff --git a/typing/ctype.mli b/typing/ctype.mli index eea10b49..32b1b166 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ctype.mli 9168 2009-02-13 05:05:36Z garrigue $ *) +(* $Id$ *) (* Operations on core types *) diff --git a/typing/datarepr.ml b/typing/datarepr.ml index 157dd75e..80b94132 100644 --- a/typing/datarepr.ml +++ b/typing/datarepr.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: datarepr.ml 5643 2003-07-02 09:14:35Z xleroy $ *) +(* $Id$ *) (* Compute constructor and label descriptions from type declarations, determining their representation. *) @@ -57,7 +57,7 @@ let exception_descr path_exc decl = let none = {desc = Ttuple []; level = -1; id = -1} (* Clearly ill-formed type *) let dummy_label = - { lbl_res = none; lbl_arg = none; lbl_mut = Immutable; + { lbl_name = ""; lbl_res = none; lbl_arg = none; lbl_mut = Immutable; lbl_pos = (-1); lbl_all = [||]; lbl_repres = Record_regular; lbl_private = Public } @@ -67,7 +67,8 @@ let label_descrs ty_res lbls repres priv = [] -> [] | (name, mut_flag, ty_arg) :: rest -> let lbl = - { lbl_res = ty_res; + { lbl_name = name; + lbl_res = ty_res; lbl_arg = ty_arg; lbl_mut = mut_flag; lbl_pos = num; diff --git a/typing/datarepr.mli b/typing/datarepr.mli index 563d5f77..283dbd29 100644 --- a/typing/datarepr.mli +++ b/typing/datarepr.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: datarepr.mli 5643 2003-07-02 09:14:35Z xleroy $ *) +(* $Id$ *) (* Compute constructor and label descriptions from type declarations, determining their representation. *) @@ -25,7 +25,7 @@ val exception_descr: Path.t -> type_expr list -> constructor_description val label_descrs: type_expr -> (string * mutable_flag * type_expr) list -> - record_representation -> private_flag -> + record_representation -> private_flag -> (string * label_description) list exception Constr_not_found diff --git a/typing/env.ml b/typing/env.ml index 2fcf9c1b..c7bcb61d 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: env.ml 9240 2009-04-28 05:11:54Z garrigue $ *) +(* $Id$ *) (* Environment handling *) @@ -675,7 +675,7 @@ let components_of_functor_appl f p1 p2 = Hashtbl.find f.fcomp_cache p2 with Not_found -> let p = Papply(p1, p2) in - let mty = + let mty = Subst.modtype (Subst.add_module f.fcomp_param p2 Subst.identity) f.fcomp_res in let comps = components_of_module f.fcomp_env f.fcomp_subst p mty in @@ -739,10 +739,32 @@ let add_item comp env = | Tsig_class(id, decl, _) -> add_class id decl env | Tsig_cltype(id, decl, _) -> add_cltype id decl env +(* Remove a previous identifier with same name *) +let rec filter_value id = function + Env_empty -> Env_empty + | Env_value (sum, id', vd) -> + if Ident.equal id id' then sum + else Env_value(filter_value id sum, id', vd) + | Env_type (sum, id', td) -> Env_type (filter_value id sum, id', td) + | Env_exception (sum, id', ed) -> Env_exception (filter_value id sum, id', ed) + | Env_module (sum, id', mty) -> Env_module (filter_value id sum, id', mty) + | Env_modtype (sum, id', mty) -> Env_modtype (filter_value id sum, id', mty) + | Env_class (sum, id', cty) -> Env_class (filter_value id sum, id', cty) + | Env_cltype (sum, id', cty) -> Env_cltype (filter_value id sum, id', cty) + | Env_open (sum, path) -> Env_open (filter_value id sum, path) + +let remove_value id env = + { env with summary = filter_value id env.summary } + +let add_item_for_signature comp env = + match comp with + Tsig_value(id, decl) -> add_value id decl (remove_value id env) + | _ -> add_item comp env + let rec add_signature sg env = match sg with [] -> env - | comp :: rem -> add_signature rem (add_item comp env) + | comp :: rem -> add_signature rem (add_item_for_signature comp env) (* Open a signature path *) @@ -777,7 +799,7 @@ let open_signature root sg env = (Subst.cltype_declaration sub decl) env) env sg pl in { newenv with summary = Env_open(env.summary, root) } - + (* Open a signature from a file *) let open_pers_signature name env = diff --git a/typing/env.mli b/typing/env.mli index 5ee7af39..8f00972a 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: env.mli 9074 2008-10-06 13:53:54Z doligez $ *) +(* $Id$ *) (* Environment handling *) diff --git a/typing/ident.ml b/typing/ident.ml index 4cd5c811..c5bc09f4 100644 --- a/typing/ident.ml +++ b/typing/ident.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ident.ml 6055 2004-01-04 14:32:34Z doligez $ *) +(* $Id$ *) open Format @@ -63,7 +63,7 @@ let set_current_time t = currentstamp := max !currentstamp t let reinit_level = ref (-1) -let reinit () = +let reinit () = if !reinit_level < 0 then reinit_level := !currentstamp else currentstamp := !reinit_level diff --git a/typing/ident.mli b/typing/ident.mli index a6d0a190..03e2eee4 100644 --- a/typing/ident.mli +++ b/typing/ident.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ident.mli 6055 2004-01-04 14:32:34Z doligez $ *) +(* $Id$ *) (* Identifiers (unique names) *) @@ -25,7 +25,7 @@ val unique_name: t -> string val unique_toplevel_name: t -> string val persistent: t -> bool val equal: t -> t -> bool - (* Compare identifiers by name. *) + (* Compare identifiers by name. *) val same: t -> t -> bool (* Compare identifiers by binding location. Two identifiers are the same either if they are both diff --git a/typing/includeclass.ml b/typing/includeclass.ml index c722ae72..ca860ffc 100644 --- a/typing/includeclass.ml +++ b/typing/includeclass.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includeclass.ml 9236 2009-04-19 08:42:43Z xleroy $ *) +(* $Id$ *) (* Inclusion checks for the class language *) @@ -42,7 +42,7 @@ let include_err ppf = fprintf ppf "A class cannot be changed from virtual to concrete" | CM_Parameter_arity_mismatch (ls, lp) -> fprintf ppf - "The classes do not have the same number of type parameters" + "The classes do not have the same number of type parameters" | CM_Type_parameter_mismatch trace -> fprintf ppf "@[%a@]" (Printtyp.unification_error false trace @@ -102,6 +102,3 @@ let report_error ppf = function let print_errs ppf errs = List.iter (fun err -> fprintf ppf "@ %a" include_err err) errs in fprintf ppf "@[%a%a@]" include_err err print_errs errs - - - diff --git a/typing/includeclass.mli b/typing/includeclass.mli index 8f9cdca1..5596056d 100644 --- a/typing/includeclass.mli +++ b/typing/includeclass.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includeclass.mli 2908 2000-03-06 22:12:09Z weis $ *) +(* $Id$ *) (* Inclusion checks for the class language *) diff --git a/typing/includecore.ml b/typing/includecore.ml index 5b6d66fe..b8911f2e 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includecore.ml 9298 2009-06-13 10:26:05Z garrigue $ *) +(* $Id$ *) (* Inclusion checks for the core language *) @@ -63,27 +63,27 @@ let type_manifest env ty1 params1 ty2 params2 priv2 = Ctype.equal env true (ty1::params1) (row2.row_more::params2) && (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 + Ctype.merge_row_fields row1.row_fields row2.row_fields in (not row2.row_closed || row1.row_closed && Ctype.filter_row_fields false r1 = []) && List.for_all - (fun (_,f) -> match Btype.row_field_repr f with - Rabsent | Reither _ -> true | Rpresent _ -> false) - r2 && + (fun (_,f) -> match Btype.row_field_repr f with + Rabsent | Reither _ -> true | Rpresent _ -> false) + r2 && let to_equal = ref (List.combine params1 params2) in List.for_all - (fun (_, f1, f2) -> - match Btype.row_field_repr f1, Btype.row_field_repr f2 with - Rpresent(Some t1), - (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,_,_) - when List.length tl1 = List.length tl2 && c1 = c2 -> - to_equal := List.combine tl1 tl2 @ !to_equal; true - | Rabsent, (Reither _ | Rabsent) -> true - | _ -> false) - pairs && + (fun (_, f1, f2) -> + match Btype.row_field_repr f1, Btype.row_field_repr f2 with + Rpresent(Some t1), + (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,_,_) + when List.length tl1 = List.length tl2 && c1 = c2 -> + to_equal := List.combine tl1 tl2 @ !to_equal; true + | Rabsent, (Reither _ | Rabsent) -> true + | _ -> false) + pairs && let tl1, tl2 = List.split !to_equal in Ctype.equal env true tl1 tl2 | Tobject (fi1, _), Tobject (fi2, _) @@ -95,7 +95,7 @@ let type_manifest env ty1 params1 ty2 params2 priv2 = let pairs, miss1, miss2 = Ctype.associate_fields fields1 fields2 in miss2 = [] && let tl1, tl2 = - List.split (List.map (fun (_,_,t1,_,t2) -> t1, t2) pairs) in + List.split (List.map (fun (_,_,t1,_,t2) -> t1, t2) pairs) in Ctype.equal env true (params1 @ tl1) (params2 @ tl2) | _ -> let rec check_super ty1 = @@ -137,7 +137,7 @@ let type_declarations env id decl1 decl2 = (_, None) -> Ctype.equal env true decl1.type_params decl2.type_params | (Some ty1, Some ty2) -> - type_manifest env ty1 decl1.type_params ty2 decl2.type_params + type_manifest env ty1 decl1.type_params ty2 decl2.type_params decl2.type_private | (None, Some ty2) -> let ty1 = diff --git a/typing/includecore.mli b/typing/includecore.mli index 2336c028..c68ad237 100644 --- a/typing/includecore.mli +++ b/typing/includecore.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includecore.mli 2553 1999-11-17 18:59:06Z xleroy $ *) +(* $Id$ *) (* Inclusion checks for the core language *) diff --git a/typing/includemod.ml b/typing/includemod.ml index 3d7efe1d..bda604a2 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includemod.ml 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Inclusion checks for the module language *) @@ -124,14 +124,14 @@ let simplify_structure_coercion cc = then Tcoerce_none else Tcoerce_structure cc -(* Inclusion between module types. +(* Inclusion between module types. 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 = try try_modtypes env subst mty1 mty2 - with + with Dont_match -> raise(Error[Module_types(mty1, Subst.modtype subst mty2)]) | Error reasons -> @@ -363,7 +363,7 @@ let include_err ppf = function | Modtype_permutation -> fprintf ppf "Illegal permutation of structure fields" | Interface_mismatch(impl_name, intf_name) -> - fprintf ppf "@[The implementation %s@ does not match the interface %s:" + fprintf ppf "@[The implementation %s@ does not match the interface %s:" impl_name intf_name | Class_type_declarations(id, d1, d2, reason) -> fprintf ppf diff --git a/typing/includemod.mli b/typing/includemod.mli index cc50b134..b0a2acd9 100644 --- a/typing/includemod.mli +++ b/typing/includemod.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includemod.mli 7619 2006-09-20 11:14:37Z doligez $ *) +(* $Id$ *) (* Inclusion checks for the module language *) diff --git a/typing/mtype.ml b/typing/mtype.ml index 485b6be7..dddc65a0 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: mtype.ml 9291 2009-06-08 02:35:15Z garrigue $ *) +(* $Id$ *) (* Operations on module types *) @@ -36,7 +36,7 @@ let rec strengthen env mty p = match scrape env mty with Tmty_signature sg -> Tmty_signature(strengthen_sig env sg p) - | Tmty_functor(param, arg, res) -> + | Tmty_functor(param, arg, res) when !Clflags.applicative_functors -> Tmty_functor(param, arg, strengthen env res (Papply(p, Pident param))) | mty -> mty @@ -89,23 +89,24 @@ type variance = Co | Contra | Strict let nondep_supertype env mid mty = - let rec nondep_mty va mty = + let rec nondep_mty env va mty = match mty with Tmty_ident p -> if Path.isfree mid p then - nondep_mty va (Env.find_modtype_expansion p env) + nondep_mty env va (Env.find_modtype_expansion p env) else mty | Tmty_signature sg -> - Tmty_signature(nondep_sig va sg) + Tmty_signature(nondep_sig env va sg) | Tmty_functor(param, arg, res) -> let var_inv = match va with Co -> Contra | Contra -> Co | Strict -> Strict in - Tmty_functor(param, nondep_mty var_inv arg, nondep_mty va res) + Tmty_functor(param, nondep_mty env var_inv arg, + nondep_mty (Env.add_module param arg env) va res) - and nondep_sig va = function + and nondep_sig env va = function [] -> [] | item :: rem -> - let rem' = nondep_sig va rem in + let rem' = nondep_sig env va rem in match item with Tsig_value(id, d) -> Tsig_value(id, {val_type = Ctype.nondep_type env mid d.val_type; @@ -116,10 +117,10 @@ let nondep_supertype env mid mty = | Tsig_exception(id, d) -> Tsig_exception(id, List.map (Ctype.nondep_type env mid) d) :: rem' | Tsig_module(id, mty, rs) -> - Tsig_module(id, nondep_mty va mty, rs) :: rem' + Tsig_module(id, nondep_mty env va mty, rs) :: rem' | Tsig_modtype(id, d) -> begin try - Tsig_modtype(id, nondep_modtype_decl d) :: rem' + Tsig_modtype(id, nondep_modtype_decl env d) :: rem' with Not_found -> match va with Co -> Tsig_modtype(id, Tmodtype_abstract) :: rem' @@ -132,12 +133,12 @@ let nondep_supertype env mid mty = Tsig_cltype(id, Ctype.nondep_cltype_declaration env mid d, rs) :: rem' - and nondep_modtype_decl = function + and nondep_modtype_decl env = function Tmodtype_abstract -> Tmodtype_abstract - | Tmodtype_manifest mty -> Tmodtype_manifest(nondep_mty Strict mty) + | Tmodtype_manifest mty -> Tmodtype_manifest(nondep_mty env Strict mty) in - nondep_mty Co mty + nondep_mty env Co mty let enrich_typedecl env p decl = match decl.type_manifest with @@ -145,7 +146,7 @@ let enrich_typedecl env p decl = | None -> try let orig_decl = Env.find_type p env in - if orig_decl.type_arity <> decl.type_arity + if orig_decl.type_arity <> decl.type_arity then decl else {decl with type_manifest = Some(Btype.newgenty(Tconstr(p, decl.type_params, ref Mnil)))} @@ -196,7 +197,7 @@ let rec no_code_needed env mty = match scrape env mty with Tmty_ident p -> false | Tmty_signature sg -> no_code_needed_sig env sg - | Tmty_functor(_, _, _) -> false + | Tmty_functor(_, _, _) -> false and no_code_needed_sig env sg = match sg with diff --git a/typing/mtype.mli b/typing/mtype.mli index 855b35df..b15b09ec 100644 --- a/typing/mtype.mli +++ b/typing/mtype.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: mtype.mli 6196 2004-04-09 13:32:28Z xleroy $ *) +(* $Id$ *) (* Operations on module types *) diff --git a/typing/oprint.ml b/typing/oprint.ml index 63d31034..2344436b 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: oprint.ml 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) open Format open Outcometree @@ -209,6 +209,16 @@ and print_simple_out_type ppf = | 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 (_, _) -> () + | Otyp_module (p, n, tyl) -> + fprintf ppf "@[<1>(module %s" p; + let first = ref true in + List.iter2 + (fun s t -> + let sep = if !first then (first := false; "with") else "and" in + fprintf ppf " %s type %s = %a" sep s print_out_type t + ) + n tyl; + fprintf ppf ")@]" and print_fields rest ppf = function [] -> diff --git a/typing/oprint.mli b/typing/oprint.mli index 7687b999..902d3cf2 100644 --- a/typing/oprint.mli +++ b/typing/oprint.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: oprint.mli 4694 2002-04-18 07:27:47Z garrigue $ *) +(* $Id$ *) open Format open Outcometree diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 42d68d3d..80c28ea0 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: outcometree.mli 7372 2006-04-05 02:28:13Z garrigue $ *) +(* $Id$ *) (* Module [Outcometree]: results displayed by the toplevel *) @@ -60,6 +60,8 @@ type out_type = | Otyp_variant of bool * out_variant * bool * (string list) option | Otyp_poly of string list * out_type + | Otyp_module of string * string list * out_type list + and out_variant = | Ovar_fields of (string * bool * out_type list) list | Ovar_name of out_ident * out_type list diff --git a/typing/parmatch.ml b/typing/parmatch.ml index 518cd9eb..d73f79af 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parmatch.ml 9187 2009-03-16 04:24:05Z garrigue $ *) +(* $Id$ *) (* Detection of partial matches and unused match cases. *) @@ -31,7 +31,7 @@ let omega = make_pat Tpat_any Ctype.none Env.empty let extra_pat = make_pat (Tpat_var (Ident.create "+")) Ctype.none Env.empty - + let rec omegas i = if i <= 0 then [] else omega :: omegas (i-1) @@ -80,7 +80,7 @@ let rec compat p q = | (Tpat_any|Tpat_var _),_ -> true | _,(Tpat_any|Tpat_var _) -> true | Tpat_or (p1,p2,_),_ -> compat p1 q || compat p2 q - | _,Tpat_or (q1,q2,_) -> compat p q1 || compat p q2 + | _,Tpat_or (q1,q2,_) -> compat p q1 || compat p q2 | Tpat_constant c1, Tpat_constant c2 -> c1=c2 | Tpat_tuple ps, Tpat_tuple qs -> compats ps qs | Tpat_lazy p, Tpat_lazy q -> compat p q @@ -89,7 +89,7 @@ let rec compat p q = | Tpat_variant(l1,Some p1, r1), Tpat_variant(l2,Some p2,_) -> l1=l2 && compat p1 p2 | Tpat_variant (l1,None,r1), Tpat_variant(l2,None,_) -> - l1 = l2 + l1 = l2 | Tpat_variant (_, None, _), Tpat_variant (_,Some _, _) -> false | Tpat_variant (_, Some _, _), Tpat_variant (_, None, _) -> false | Tpat_record l1,Tpat_record l2 -> @@ -100,7 +100,7 @@ let rec compat p q = compats ps qs | _,_ -> assert false - + and compats ps qs = match ps,qs with | [], [] -> true | p::ps, q::qs -> compat p q && compats ps qs @@ -260,14 +260,14 @@ let top_pretty ppf v = let prerr_pat v = top_pretty str_formatter v ; prerr_string (flush_str_formatter ()) - + (****************************) (* Utilities for matching *) (****************************) (* Check top matching *) -let simple_match p1 p2 = +let simple_match p1 p2 = match p1.pat_desc, p2.pat_desc with | Tpat_construct(c1, _), Tpat_construct(c2, _) -> c1.cstr_tag = c2.cstr_tag @@ -385,7 +385,7 @@ let rec normalize_pat q = match q.pat_desc with let discr_pat q pss = let rec acc_pat acc pss = match pss with - ({pat_desc = Tpat_alias (p,_)}::ps)::pss -> + ({pat_desc = Tpat_alias (p,_)}::ps)::pss -> acc_pat acc ((p::ps)::pss) | ({pat_desc = Tpat_or (p1,p2,_)}::ps)::pss -> acc_pat acc ((p1::ps)::(p2::ps)::pss) @@ -483,7 +483,7 @@ and set_args_erase_mutable q r = do_set_args true q r (* filter pss acording to pattern q *) let filter_one q pss = let rec filter_rec = function - ({pat_desc = Tpat_alias(p,_)}::ps)::pss -> + ({pat_desc = Tpat_alias(p,_)}::ps)::pss -> filter_rec ((p::ps)::pss) | ({pat_desc = Tpat_or(p1,p2,_)}::ps)::pss -> filter_rec ((p1::ps)::(p2::ps)::pss) @@ -501,7 +501,7 @@ let filter_one q pss = *) let filter_extra pss = let rec filter_rec = function - ({pat_desc = Tpat_alias(p,_)}::ps)::pss -> + ({pat_desc = Tpat_alias(p,_)}::ps)::pss -> filter_rec ((p::ps)::pss) | ({pat_desc = Tpat_or(p1,p2,_)}::ps)::pss -> filter_rec ((p1::ps)::(p2::ps)::pss) @@ -511,7 +511,7 @@ let filter_extra pss = | [] -> [] in filter_rec pss -(* +(* Pattern p0 is the discriminating pattern, returns [(q0,pss0) ; ... ; (qn,pssn)] where the qi's are simple patterns and the pssi's are @@ -557,7 +557,7 @@ let filter_all pat0 pss = pss | _::pss -> filter_omega env pss | [] -> env in - + filter_omega (filter_rec (match pat0.pat_desc with @@ -575,7 +575,7 @@ let rec set_last a = function (* mark constructor lines for failure when they are incomplete *) let rec mark_partial = function - ({pat_desc = Tpat_alias(p,_)}::ps)::pss -> + ({pat_desc = Tpat_alias(p,_)}::ps)::pss -> mark_partial ((p::ps)::pss) | ({pat_desc = Tpat_or(p1,p2,_)}::ps)::pss -> mark_partial ((p1::ps)::(p2::ps)::pss) @@ -691,17 +691,17 @@ let complete_tags nconsts nconstrs tags = for i = 0 to nconstrs-1 do if not seen_constr.(i) then r := Cstr_block i :: !r - done ; + done ; !r (* build a pattern from a constructor list *) let pat_of_constr ex_pat cstr = {ex_pat with pat_desc = Tpat_construct (cstr,omegas cstr.cstr_arity)} - + let rec pat_of_constrs ex_pat = function | [] -> raise Empty | [cstr] -> pat_of_constr ex_pat cstr -| cstr::rem -> +| cstr::rem -> {ex_pat with pat_desc= Tpat_or @@ -801,7 +801,7 @@ let build_other ext env = match env with | Tpat_constant (Const_char c) -> c | _ -> assert false) env in - + let rec find_other i imax = if i > imax then raise Not_found else @@ -870,7 +870,7 @@ let build_other ext env = match env with p.pat_type p.pat_env in try_arrays 0 | [] -> omega -| _ -> omega +| _ -> omega (* Core function : @@ -889,17 +889,17 @@ let rec has_instance p = match p.pat_desc with | Tpat_construct (_,ps) | Tpat_tuple ps | Tpat_array ps -> has_instances ps | Tpat_record lps -> has_instances (List.map snd lps) | Tpat_lazy p -> has_instance p - + and has_instances = function | [] -> true | q::rem -> has_instance q && has_instances rem - + let rec satisfiable pss qs = match pss with -| [] -> has_instances qs +| [] -> has_instances qs | _ -> match qs with | [] -> false - | {pat_desc = Tpat_or(q1,q2,_)}::qs -> + | {pat_desc = Tpat_or(q1,q2,_)}::qs -> satisfiable pss (q1::qs) || satisfiable pss (q2::qs) | {pat_desc = Tpat_alias(q,_)}::qs -> satisfiable pss (q::qs) @@ -930,7 +930,7 @@ let rec satisfiable pss qs = match pss with This function should be called for exhaustiveness check only. *) -type 'a result = +type 'a result = | Rnone (* No matching value *) | Rsome of 'a (* This matching value *) @@ -954,7 +954,7 @@ let rec exhaust ext pss n = match pss with | Rsome r -> Rsome (q0::r) | r -> r end - | constrs -> + | constrs -> let try_non_omega (p,pss) = if is_absent_pat p then Rnone @@ -1008,7 +1008,7 @@ let rec pressure_variants tdefs = function let q0 = discr_pat omega pss in begin match filter_all q0 pss with [] -> pressure_variants tdefs (filter_extra pss) - | constrs -> + | constrs -> let rec try_non_omega = function (p,pss) :: rem -> let ok = pressure_variants tdefs pss in @@ -1074,8 +1074,8 @@ let pretty_matrix pss = prerr_endline "") pss ; prerr_endline "end matrix" - -(* this row type enable column processing inside the matrix + +(* this row type enable column processing inside the matrix - left -> elements not to be processed, - right -> elements to be processed *) @@ -1131,7 +1131,7 @@ let remove r = match r.active with | [] -> assert false let remove_column rs = List.map remove rs - + (* Current column has been processed *) let push_no_or r = match r.active with | p::rem -> { r with no_ors = p::r.no_ors ; active=rem} @@ -1148,7 +1148,7 @@ and push_no_or_column rs = List.map push_no_or rs work on the current column, instead of the first column *) -let discr_pat q rs = +let discr_pat q rs = discr_pat q (List.map (fun r -> r.active) rs) let filter_one q rs = @@ -1257,7 +1257,7 @@ let rec every_satisfiables pss qs = match qs.active with then (* syntactically generated or-pats should not be expanded *) every_satisfiables (push_no_or_column pss) (push_no_or qs) - else + else (* this is a real or-pattern *) every_satisfiables (push_or_column pss) (push_or qs) | Tpat_variant (l,_,r) when is_absent l r -> (* Ah Jacques... *) @@ -1303,7 +1303,7 @@ and every_both pss qs q1 q2 = | Upartial u2 -> Upartial (u1 @ u2) end - + (* le_pat p q means, forall V, V matches q implies V matches p *) @@ -1329,7 +1329,7 @@ let rec le_pat p q = List.length ps = List.length qs && le_pats ps qs (* In all other cases, enumeration is performed *) | _,_ -> not (satisfiable [[p]] [q]) - + and le_pats ps qs = match ps,qs with p::ps, q::qs -> le_pat p q && le_pats ps qs @@ -1384,7 +1384,7 @@ let rec lub p q = match p.pat_desc,q.pat_desc with raise Empty and orlub p1 p2 q = - try + try let r1 = lub p1 q in try {q with pat_desc=(Tpat_or (r1,lub p2 q,None))} @@ -1406,12 +1406,12 @@ and record_lubs l1 l2 = else (lbl1,lub p1 p2)::lub_rec rem1 rem2 in lub_rec l1 l2 - + and lubs ps qs = match ps,qs with | p::ps, q::qs -> lub p q :: lubs ps qs | _,_ -> [] - - + + (******************************) (* Exported variant closing *) (******************************) @@ -1475,7 +1475,7 @@ let rec do_filter_var = function let do_filter_one q pss = let rec filter_rec = function - | ({pat_desc = Tpat_alias(p,_)}::ps,loc)::pss -> + | ({pat_desc = Tpat_alias(p,_)}::ps,loc)::pss -> filter_rec ((p::ps,loc)::pss) | ({pat_desc = Tpat_or(p1,p2,_)}::ps,loc)::pss -> filter_rec ((p1::ps,loc)::(p2::ps,loc)::pss) @@ -1504,7 +1504,7 @@ let rec do_match pss qs = match qs with let q0 = normalize_pat q in do_match (do_filter_one q0 pss) (simple_match_args q0 q @ qs) - + let check_partial_all v casel = try let pss = initial_all true casel in @@ -1531,7 +1531,7 @@ let do_check_partial loc casel pss = match pss with | _ -> Location.prerr_warning loc Warnings.All_clauses_guarded end ; Partial -| ps::_ -> +| ps::_ -> begin match exhaust None pss (List.length ps) with | Rnone -> Total | Rsome [v] -> @@ -1546,13 +1546,13 @@ let do_check_partial loc casel pss = match pss with (* This is 'Some loc', where loc is the location of a possibly matching clause. Forget about loc, because printing two locations - is a pain in the top-level *) + is a pain in the top-level *) Buffer.add_string buf "\n(However, some guarded clause may match this value.)" end ; Buffer.contents buf with _ -> - "" in + "" in Location.prerr_warning loc (Warnings.Partial_match errmsg) ; Partial | _ -> @@ -1598,7 +1598,7 @@ let rec collect_paths_from_pat r p = match p.pat_desc with collect_paths_from_pat (collect_paths_from_pat r p1) p2 | Tpat_lazy p -> collect_paths_from_pat r p - + (* Actual fragile check @@ -1679,7 +1679,7 @@ let check_unused tdefs casel = | Used -> () with e -> assert false end ; - + if has_guard act then do_rec pref rem else diff --git a/typing/parmatch.mli b/typing/parmatch.mli index 3080749f..7ef6a830 100644 --- a/typing/parmatch.mli +++ b/typing/parmatch.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parmatch.mli 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) (* Detection of partial matches and unused match cases. *) open Types diff --git a/typing/path.ml b/typing/path.ml index aaadb873..00955026 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: path.ml 5640 2003-07-01 13:05:43Z xleroy $ *) +(* $Id$ *) type t = Pident of Ident.t @@ -46,4 +46,3 @@ let rec head = function Pident id -> id | Pdot(p, s, pos) -> head p | Papply(p1, p2) -> assert false - diff --git a/typing/path.mli b/typing/path.mli index e4d06324..96f3e983 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: path.mli 5640 2003-07-01 13:05:43Z xleroy $ *) +(* $Id$ *) (* Access paths *) diff --git a/typing/predef.ml b/typing/predef.ml index 240f0734..048e2d99 100644 --- a/typing/predef.ml +++ b/typing/predef.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: predef.ml 8418 2007-10-09 10:29:37Z weis $ *) +(* $Id$ *) (* Predefined type constructors (with special typing rules in typecore) *) @@ -100,7 +100,7 @@ let build_initial_env add_type add_exception empty_env = type_manifest = None; type_variance = []} and decl_unit = - {type_params = []; + {type_params = []; type_arity = 0; type_kind = Type_variant(["()", []]); type_private = Public; diff --git a/typing/predef.mli b/typing/predef.mli index 3cf8b25d..b7bbb6f4 100644 --- a/typing/predef.mli +++ b/typing/predef.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: predef.mli 7702 2006-10-24 20:54:58Z weis $ *) +(* $Id$ *) (* Predefined type constructors (with special typing rules in typecore) *) diff --git a/typing/primitive.ml b/typing/primitive.ml index c7ff9528..3d7ab5f7 100644 --- a/typing/primitive.ml +++ b/typing/primitive.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: primitive.ml 8930 2008-07-24 05:35:22Z frisch $ *) +(* $Id$ *) (* Description of primitive functions *) diff --git a/typing/primitive.mli b/typing/primitive.mli index 70050229..8446037f 100644 --- a/typing/primitive.mli +++ b/typing/primitive.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: primitive.mli 8930 2008-07-24 05:35:22Z frisch $ *) +(* $Id$ *) (* Description of primitive functions *) diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 571241d3..2134afb5 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printtyp.ml 8922 2008-07-19 02:13:09Z garrigue $ *) +(* $Id$ *) (* Printing functions *) @@ -153,6 +153,9 @@ and raw_type_desc ppf = function match row.row_name with None -> fprintf ppf "None" | Some(p,tl) -> fprintf ppf "Some(@,%a,@,%a)" path p raw_type_list tl) + | Tpackage (p, _, tl) -> + fprintf ppf "@[Tpackage(@,%a@,%a)@]" path p + raw_type_list tl and raw_field ppf = function Rpresent None -> fprintf ppf "Rpresent None" @@ -234,7 +237,7 @@ let rec mark_loops_rec visited ty = | Tarrow(_, ty1, ty2, _) -> mark_loops_rec visited ty1; mark_loops_rec visited ty2 | Ttuple tyl -> List.iter (mark_loops_rec visited) tyl - | Tconstr(_, tyl, _) -> + | Tconstr(_, tyl, _) | Tpackage (_, _, tyl) -> List.iter (mark_loops_rec visited) tyl | Tvariant row -> if List.memq px !visited_objects then add_alias px else @@ -383,6 +386,8 @@ let rec tree_of_typexp sch ty = end | Tunivar -> Otyp_var (false, name_of_type ty) + | Tpackage (p, n, tyl) -> + Otyp_module (Path.name p, n, tree_of_typlist sch tyl) in if List.memq px !delayed then delayed := List.filter ((!=) px) !delayed; if is_aliased px && aliasable ty then begin diff --git a/typing/printtyp.mli b/typing/printtyp.mli index 6f56d164..5e3402ff 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printtyp.mli 7382 2006-04-16 23:28:22Z doligez $ *) +(* $Id$ *) (* Printing functions *) diff --git a/typing/stypes.ml b/typing/stypes.ml index 64028e10..4d1166fe 100644 --- a/typing/stypes.ml +++ b/typing/stypes.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: stypes.ml 8958 2008-07-29 15:42:44Z doligez $ *) +(* $Id$ *) (* Recording and dumping (partial) type information *) diff --git a/typing/stypes.mli b/typing/stypes.mli index 06aea2c1..32f92c1d 100644 --- a/typing/stypes.mli +++ b/typing/stypes.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: stypes.mli 8958 2008-07-29 15:42:44Z doligez $ *) +(* $Id$ *) (* Recording and dumping (partial) type information *) diff --git a/typing/subst.ml b/typing/subst.ml index cff3c64f..971d8b29 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: subst.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* Substitutions *) @@ -19,7 +19,7 @@ open Path open Types open Btype -type t = +type t = { types: (Ident.t, Path.t) Tbl.t; modules: (Ident.t, Path.t) Tbl.t; modtypes: (Ident.t, module_type) Tbl.t; @@ -45,6 +45,18 @@ let rec module_path s = function | Papply(p1, p2) -> Papply(module_path s p1, module_path s p2) +let rec modtype_path s = function + Pident id as p -> + begin try + match Tbl.find id s.modtypes with + | Tmty_ident p -> p + | _ -> fatal_error "Subst.modtype_path" + with Not_found -> p end + | Pdot(p, n, pos) -> + Pdot(module_path s p, n, pos) + | Papply(p1, p2) -> + fatal_error "Subst.modtype_path" + let type_path s = function Pident id as p -> begin try Tbl.find id s.types with Not_found -> p end @@ -88,6 +100,8 @@ let rec typexp s ty = begin match desc with | Tconstr(p, tl, abbrev) -> Tconstr(type_path s p, List.map (typexp s) tl, ref Mnil) + | Tpackage(p, n, tl) -> + Tpackage(modtype_path s p, n, List.map (typexp s) tl) | Tobject (t1, name) -> Tobject (typexp s t1, ref (match !name with @@ -244,7 +258,7 @@ let rec rename_bound_idents s idents = function let id' = Ident.rename id in rename_bound_idents (add_modtype id (Tmty_ident(Pident id')) s) (id' :: idents) sg - | (Tsig_value(id, _) | Tsig_exception(id, _) | + | (Tsig_value(id, _) | Tsig_exception(id, _) | Tsig_class(id, _, _) | Tsig_cltype(id, _, _)) :: sg -> let id' = Ident.rename id in rename_bound_idents s (id' :: idents) sg @@ -295,7 +309,7 @@ and modtype_declaration s = function Tmodtype_abstract -> Tmodtype_abstract | Tmodtype_manifest mty -> Tmodtype_manifest(modtype s mty) -(* Composition of substitutions: +(* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) let compose s1 s2 = diff --git a/typing/subst.mli b/typing/subst.mli index e0e91cf0..c861a57b 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: subst.mli 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* Substitutions *) @@ -53,6 +53,6 @@ val modtype: t -> module_type -> module_type val signature: t -> signature -> signature val modtype_declaration: t -> modtype_declaration -> modtype_declaration -(* Composition of substitutions: +(* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) val compose: t -> t -> t diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 53bd1548..013275ca 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typeclass.ml 9236 2009-04-19 08:42:43Z xleroy $ *) +(* $Id$ *) open Misc open Parsetree @@ -50,6 +50,7 @@ type error = 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 + | No_overriding of string * string exception Error of Location.t * error @@ -223,7 +224,12 @@ let enter_val cl_num vars inh lab mut virt ty val_env met_env par_env loc = vars := Vars.add lab (id, mut, virt, ty) !vars; result -let inheritance self_type env concr_meths warn_meths loc parent = +let concr_vals vars = + Vars.fold + (fun id (_, vf, _) s -> if vf = Virtual then s else Concr.add id s) + vars Concr.empty + +let inheritance self_type env ovf concr_meths warn_vals loc parent = match scrape_class_type parent with Tcty_signature cl_sig -> @@ -238,22 +244,34 @@ let inheritance self_type env concr_meths warn_meths loc parent = assert false end; - let overridings = Concr.inter cl_sig.cty_concr warn_meths in - if not (Concr.is_empty overridings) then begin - let cname = - match parent with - Tcty_constr (p, _, _) -> Path.name p - | _ -> "inherited" - in - Location.prerr_warning loc - (Warnings.Method_override (cname :: Concr.elements overridings)) + (* Overriding *) + let over_meths = Concr.inter cl_sig.cty_concr concr_meths in + let concr_vals = concr_vals cl_sig.cty_vars in + let over_vals = Concr.inter concr_vals warn_vals in + begin match ovf with + Some Fresh -> + let cname = + match parent with + Tcty_constr (p, _, _) -> Path.name p + | _ -> "inherited" + in + if not (Concr.is_empty over_meths) then + Location.prerr_warning loc + (Warnings.Method_override (cname :: Concr.elements over_meths)); + if not (Concr.is_empty over_vals) then + Location.prerr_warning loc + (Warnings.Instance_variable_override + (cname :: Concr.elements over_vals)); + | Some Override + when Concr.is_empty over_meths && Concr.is_empty over_vals -> + raise (Error(loc, No_overriding ("",""))) + | _ -> () end; - let concr_meths = Concr.union cl_sig.cty_concr concr_meths in - (* No need to warn about overriding of inherited methods! *) - (* let warn_meths = Concr.union cl_sig.cty_concr warn_meths in *) + let concr_meths = Concr.union cl_sig.cty_concr concr_meths + and warn_vals = Concr.union concr_vals warn_vals in - (cl_sig, concr_meths, warn_meths) + (cl_sig, concr_meths, warn_vals) | _ -> raise(Error(loc, Structure_expected parent)) @@ -319,7 +337,7 @@ let rec class_type_field env self_type meths (val_sig, concr_meths, inher) = | _ -> inher in let (cl_sig, concr_meths, _) = - inheritance self_type env concr_meths Concr.empty sparent.pcty_loc + inheritance self_type env None concr_meths Concr.empty sparent.pcty_loc parent in let val_sig = @@ -410,41 +428,31 @@ let class_type env scty = (*******************************) -module StringSet = Set.Make(struct type t = string let compare = compare end) - let rec class_field cl_num self_type meths vars - (val_env, met_env, par_env, fields, concr_meths, warn_meths, - warn_vals, inher) = + (val_env, met_env, par_env, fields, concr_meths, warn_vals, inher) = function - Pcf_inher (sparent, super) -> + Pcf_inher (ovf, sparent, super) -> let parent = class_expr cl_num val_env par_env sparent in let inher = match parent.cl_type with Tcty_constr (p, tl, _) -> (p, tl) :: inher | _ -> inher in - let (cl_sig, concr_meths, warn_meths) = - inheritance self_type val_env concr_meths warn_meths sparent.pcl_loc - parent.cl_type + let (cl_sig, concr_meths, warn_vals) = + inheritance self_type val_env (Some ovf) concr_meths warn_vals + sparent.pcl_loc parent.cl_type in (* Variables *) - let (val_env, met_env, par_env, inh_vars, warn_vals) = + let (val_env, met_env, par_env, inh_vars) = Vars.fold - (fun lab info (val_env, met_env, par_env, inh_vars, warn_vals) -> + (fun lab info (val_env, met_env, par_env, inh_vars) -> let mut, vr, ty = info in let (id, 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 - 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) + (val_env, met_env, par_env, (lab, id) :: inh_vars)) + cl_sig.cty_vars (val_env, met_env, par_env, []) in (* Inherited concrete methods *) let inh_meths = @@ -465,7 +473,7 @@ let rec class_field cl_num self_type meths vars in (val_env, met_env, par_env, lazy(Cf_inher (parent, inh_vars, inh_meths))::fields, - concr_meths, warn_meths, warn_vals, inher) + concr_meths, warn_vals, inher) | Pcf_valvirt (lab, mut, styp, loc) -> if !Clflags.principal then Ctype.begin_def (); @@ -480,11 +488,16 @@ let rec class_field cl_num self_type meths vars 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 warn_vals then - Location.prerr_warning loc (Warnings.Instance_variable_override lab); + concr_meths, warn_vals, inher) + + | Pcf_val (lab, mut, ovf, sexp, loc) -> + if Concr.mem lab warn_vals then begin + if ovf = Fresh then + Location.prerr_warning loc (Warnings.Instance_variable_override[lab]) + end else begin + if ovf = Override then + raise(Error(loc, No_overriding ("instance variable", lab))) + end; if !Clflags.principal then Ctype.begin_def (); let exp = try type_exp val_env sexp with Ctype.Unify [(ty, _)] -> @@ -500,17 +513,19 @@ let rec class_field cl_num self_type meths vars 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) + concr_meths, Concr.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, - warn_vals, inher) - - | Pcf_meth (lab, priv, expr, loc) -> - if Concr.mem lab warn_meths then - Location.prerr_warning loc (Warnings.Method_override [lab]); + (val_env, met_env, par_env, fields, concr_meths, warn_vals, inher) + + | Pcf_meth (lab, priv, ovf, expr, loc) -> + if Concr.mem lab concr_meths then begin + if ovf = Fresh then + Location.prerr_warning loc (Warnings.Method_override [lab]) + end else begin + if ovf = Override then raise(Error(loc, No_overriding("method", lab))) + end; let (_, ty) = Ctype.filter_self_method val_env lab priv meths self_type in @@ -551,12 +566,11 @@ let rec class_field cl_num self_type meths vars Cf_meth (lab, texp) end in (val_env, met_env, par_env, field::fields, - Concr.add lab concr_meths, Concr.add lab warn_meths, warn_vals, inher) + Concr.add lab concr_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, - warn_vals, inher) + (val_env, met_env, par_env, fields, concr_meths, warn_vals, inher) | Pcf_let (rec_flag, sdefs, loc) -> let (defs, val_env) = @@ -586,7 +600,7 @@ let rec class_field cl_num self_type meths vars ([], met_env, par_env) in (val_env, met_env, par_env, lazy(Cf_let(rec_flag, defs, vals))::fields, - concr_meths, warn_meths, warn_vals, inher) + concr_meths, warn_vals, inher) | Pcf_init expr -> let expr = make_method cl_num expr in @@ -602,8 +616,7 @@ let rec class_field cl_num self_type meths vars Ctype.end_def (); Cf_init texp end in - (val_env, met_env, par_env, field::fields, - concr_meths, warn_meths, warn_vals, inher) + (val_env, met_env, par_env, field::fields, concr_meths, warn_vals, inher) and class_structure cl_num final val_env met_env loc (spat, str) = (* Environment for substructures *) @@ -648,10 +661,9 @@ and class_structure cl_num final val_env met_env loc (spat, str) = end; (* Typing of class fields *) - let (_, _, _, fields, concr_meths, _, _, inher) = + let (_, _, _, fields, concr_meths, _, inher) = List.fold_left (class_field cl_num self_type meths vars) - (val_env, meth_env, par_env, [], Concr.empty, Concr.empty, - StringSet.empty, []) + (val_env, meth_env, par_env, [], Concr.empty, Concr.empty, []) str in Ctype.unify val_env self_type (Ctype.newvar ()); @@ -1597,3 +1609,8 @@ let report_error ppf = function fprintf ppf "@[The instance variable is %s;@ it cannot be redefined as %s@]" mut1 mut2 + | No_overriding (_, "") -> + fprintf ppf "@[This inheritance does not override any method@ %s@]" + "instance variable" + | No_overriding (kind, name) -> + fprintf ppf "@[The %s `%s'@ has no previous definition@]" kind name diff --git a/typing/typeclass.mli b/typing/typeclass.mli index 67acf896..17ec6985 100644 --- a/typing/typeclass.mli +++ b/typing/typeclass.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typeclass.mli 7372 2006-04-05 02:28:13Z garrigue $ *) +(* $Id$ *) open Asttypes open Types @@ -75,6 +75,7 @@ type error = 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 + | No_overriding of string * string exception Error of Location.t * error diff --git a/typing/typecore.ml b/typing/typecore.ml index 488a7b6d..fb915226 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typecore.ml 9412 2009-11-09 11:42:39Z weis $ *) +(* $Id$ *) (* Typechecking for the core language *) @@ -26,6 +26,8 @@ type error = Unbound_value of Longident.t | Unbound_constructor of Longident.t | Unbound_label of Longident.t + | Unbound_module of Longident.t + | Unbound_functor of Longident.t | Polymorphic_label of Longident.t | Constructor_arity_mismatch of Longident.t * int * int | Label_mismatch of Longident.t * (type_expr * type_expr) list @@ -69,6 +71,12 @@ let type_module = ref ((fun env md -> assert false) : Env.t -> Parsetree.module_expr -> Typedtree.module_expr) +(* Forward declaration, to be filled in by Typemod.type_open *) + +let type_open = + ref (fun _ -> assert false) + + (* Forward declaration, to be filled in by Typeclass.class_structure *) let type_object = ref (fun env s -> assert false : @@ -362,45 +370,94 @@ let type_label_a_list type_lid_a lid_a_list = | lid_a -> type_lid_a lid_a) lid_a_list +(* Checks over the labels mentioned in a record pattern: + no duplicate definitions (error); properly closed (warning) *) + +let check_recordpat_labels loc lbl_pat_list closed = + match lbl_pat_list with + | [] -> () (* should not happen *) + | (label1, _) :: _ -> + let all = label1.lbl_all in + let defined = Array.make (Array.length all) false in + let check_defined (label, _) = + if defined.(label.lbl_pos) + then raise(Error(loc, Label_multiply_defined + (Longident.Lident label.lbl_name))) + else defined.(label.lbl_pos) <- true in + List.iter check_defined lbl_pat_list; + if closed = Closed + && Warnings.is_active (Warnings.Non_closed_record_pattern "") + then begin + let undefined = ref [] in + for i = 0 to Array.length all - 1 do + if not defined.(i) then undefined := all.(i).lbl_name :: !undefined + done; + if !undefined <> [] then begin + let u = String.concat ", " (List.rev !undefined) in + Location.prerr_warning loc (Warnings.Non_closed_record_pattern u) + end + end + +(* Typing of patterns *) + let rec type_pat env sp = + let loc = sp.ppat_loc in match sp.ppat_desc with Ppat_any -> rp { pat_desc = Tpat_any; - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = newvar(); pat_env = env } | Ppat_var name -> let ty = newvar() in - let id = enter_variable sp.ppat_loc name ty in + let id = enter_variable loc name ty in rp { pat_desc = Tpat_var id; - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = ty; pat_env = env } + | Ppat_constraint({ppat_desc=Ppat_var name; ppat_loc=loc}, + ({ptyp_desc=Ptyp_poly _} as sty)) -> + (* explicitly polymorphic type *) + let ty, force = Typetexp.transl_simple_type_delayed env sty in + pattern_force := force :: !pattern_force; + begin match ty.desc with + | Tpoly (body, tyl) -> + begin_def (); + let _, ty' = instance_poly false tyl body in + end_def (); + generalize ty'; + let id = enter_variable loc name ty' in + rp { pat_desc = Tpat_var id; + pat_loc = loc; + pat_type = ty; + pat_env = env } + | _ -> assert false + end | Ppat_alias(sq, name) -> let q = type_pat env sq in begin_def (); let ty_var = build_as_type env q in end_def (); generalize ty_var; - let id = enter_variable sp.ppat_loc name ty_var in + let id = enter_variable loc name ty_var in rp { pat_desc = Tpat_alias(q, id); - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = q.pat_type; pat_env = env } | Ppat_constant cst -> rp { pat_desc = Tpat_constant cst; - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = type_constant cst; pat_env = env } | Ppat_tuple spl -> let pl = List.map (type_pat env) spl in rp { pat_desc = Tpat_tuple pl; - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = newty (Ttuple(List.map (fun p -> p.pat_type) pl)); pat_env = env } | Ppat_construct(lid, sarg, explicit_arity) -> @@ -408,24 +465,27 @@ let rec type_pat env sp = try Env.lookup_constructor lid env with Not_found -> - raise(Error(sp.ppat_loc, Unbound_constructor lid)) in + raise(Error(loc, Unbound_constructor lid)) in let sargs = match sarg with None -> [] | Some {ppat_desc = Ppat_tuple spl} when explicit_arity -> spl | Some {ppat_desc = Ppat_tuple spl} when constr.cstr_arity > 1 -> spl | Some({ppat_desc = Ppat_any} as sp) when constr.cstr_arity <> 1 -> + if constr.cstr_arity = 0 then + Location.prerr_warning sp.ppat_loc + Warnings.Wildcard_arg_to_constant_constr; replicate_list sp constr.cstr_arity | Some sp -> [sp] in if List.length sargs <> constr.cstr_arity then - raise(Error(sp.ppat_loc, Constructor_arity_mismatch(lid, + raise(Error(loc, Constructor_arity_mismatch(lid, constr.cstr_arity, List.length sargs))); let args = List.map (type_pat env) sargs in let (ty_args, ty_res) = instance_constructor constr in List.iter2 (unify_pat env) args ty_args; rp { pat_desc = Tpat_construct(constr, args); - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = ty_res; pat_env = env } | Ppat_variant(l, sarg) -> @@ -440,31 +500,24 @@ let rec type_pat env sp = row_name = None } in rp { pat_desc = Tpat_variant(l, arg, ref {row with row_more = newvar()}); - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = newty (Tvariant row); pat_env = env } - | Ppat_record lid_sp_list -> - let rec check_duplicates = function - [] -> () - | (lid, sarg) :: remainder -> - if List.mem_assoc lid remainder - then raise(Error(sp.ppat_loc, Label_multiply_defined lid)) - else check_duplicates remainder in - check_duplicates lid_sp_list; + | Ppat_record(lid_sp_list, closed) -> let ty = newvar() in let type_label_pat (lid, sarg) = let label = try Env.lookup_label lid env with Not_found -> - raise(Error(sp.ppat_loc, Unbound_label lid)) in + raise(Error(loc, Unbound_label lid)) in begin_def (); let (vars, ty_arg, ty_res) = instance_label false label in if vars = [] then end_def (); begin try unify env ty_res ty with Unify trace -> - raise(Error(sp.ppat_loc, Label_mismatch(lid, trace))) + raise(Error(loc, Label_mismatch(lid, trace))) end; let arg = type_pat env sarg in unify_pat env arg ty_arg; @@ -476,13 +529,15 @@ let rec type_pat env sp = let tv = expand_head env tv in tv.desc <> Tvar || tv.level <> generic_level in if List.exists instantiated vars then - raise (Error(sp.ppat_loc, Polymorphic_label lid)) + raise (Error(loc, Polymorphic_label lid)) end; (label, arg) in + let lbl_pat_list = type_label_a_list type_label_pat lid_sp_list in + check_recordpat_labels loc lbl_pat_list closed; rp { - pat_desc = Tpat_record(type_label_a_list type_label_pat lid_sp_list); - pat_loc = sp.ppat_loc; + pat_desc = Tpat_record lbl_pat_list; + pat_loc = loc; pat_type = ty; pat_env = env } | Ppat_array spl -> @@ -491,7 +546,7 @@ let rec type_pat env sp = List.iter (fun p -> unify_pat env p ty_elt) pl; rp { pat_desc = Tpat_array pl; - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = instance (Predef.type_array ty_elt); pat_env = env } | Ppat_or(sp1, sp2) -> @@ -503,18 +558,18 @@ let rec type_pat env sp = let p2_variables = !pattern_variables in unify_pat env p2 p1.pat_type; let alpha_env = - enter_orpat_variables sp.ppat_loc env p1_variables p2_variables in + enter_orpat_variables loc env p1_variables p2_variables in pattern_variables := p1_variables ; rp { pat_desc = Tpat_or(p1, alpha_pat alpha_env p2, None); - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = p1.pat_type; pat_env = env } | Ppat_lazy sp1 -> let p1 = type_pat env sp1 in rp { pat_desc = Tpat_lazy p1; - pat_loc = sp.ppat_loc; + pat_loc = loc; pat_type = instance (Predef.type_lazy_t p1.pat_type); pat_env = env } | Ppat_constraint(sp, sty) -> @@ -524,7 +579,7 @@ let rec type_pat env sp = pattern_force := force :: !pattern_force; p | Ppat_type lid -> - build_or_pat env sp.ppat_loc lid + build_or_pat env loc lid let get_ref r = let v = !r in r := []; v @@ -561,7 +616,7 @@ let type_class_arg_pattern cl_num val_env met_env l spat = if is_optional l then unify_pat val_env pat (type_option (newvar ())); let (pv, met_env) = List.fold_right - (fun (id, ty, loc) (pv, env) -> + (fun (id, ty, _loc) (pv, env) -> let id' = Ident.create (Ident.name id) in ((id', id, ty)::pv, Env.add_value id' {val_type = ty; @@ -588,7 +643,7 @@ let type_self_pattern cl_num privty val_env met_env par_env spat = pattern_variables := []; let (val_env, met_env, par_env) = List.fold_right - (fun (id, ty, loc) (val_env, met_env, par_env) -> + (fun (id, ty, _loc) (val_env, met_env, par_env) -> (Env.add_value id {val_type = ty; val_kind = Val_unbound} val_env, Env.add_value id {val_type = ty; val_kind = Val_self (meths, vars, cl_num, privty)} @@ -749,6 +804,16 @@ let type_format loc fmt = ty_uresult, if skip then ty_result else ty_arrow ty_arg ty_result + and conversion_a j ty_e ty_arg = + let ty_uresult, ty_result = conversion j ty_arg in + let ty_a = ty_arrow ty_input (ty_arrow ty_e ty_aresult) in + ty_uresult, ty_arrow ty_a ty_result + + and conversion_r j ty_e ty_arg = + let ty_uresult, ty_result = conversion j ty_arg in + let ty_r = ty_arrow ty_input ty_e in + ty_arrow ty_r ty_uresult, ty_result + and scan_conversion i j = if j >= len then incomplete_format fmt else match fmt.[j] with @@ -762,16 +827,26 @@ let type_format loc fmt = conversion j Predef.type_int | 'f' | 'e' | 'E' | 'g' | 'G' | 'F' -> conversion j Predef.type_float | 'B' | 'b' -> conversion j Predef.type_bool - | 'a' -> - let ty_arg = newvar () in - let ty_a = ty_arrow ty_input (ty_arrow ty_arg ty_aresult) in - let ty_uresult, ty_result = conversion j ty_arg in - ty_uresult, ty_arrow ty_a ty_result - | 'r' -> - let ty_arg = newvar () in - let ty_r = ty_arrow ty_input ty_arg in - let ty_uresult, ty_result = conversion j ty_arg in - ty_arrow ty_r ty_uresult, ty_result + | 'a' | 'r' as conv -> + let conversion = + if conv = 'a' then conversion_a else conversion_r in + let ty_e = newvar () in + let j = j + 1 in + if j >= len then conversion (j - 1) ty_e ty_e else begin + match fmt.[j] with +(* | 'a' | 'A' -> conversion j ty_e (Predef.type_array ty_e) + | 'l' | 'L' -> conversion j ty_e (Predef.type_list ty_e) + | 'o' | 'O' -> conversion j ty_e (Predef.type_option ty_e)*) + | _ -> conversion (j - 1) ty_e ty_e end +(* | 'r' -> + let ty_e = newvar () in + let j = j + 1 in + if j >= len then conversion_r (j - 1) ty_e ty_e else begin + match fmt.[j] with + | 'a' | 'A' -> conversion_r j ty_e (Pref.type_array ty_e) + | 'l' | 'L' -> conversion_r j ty_e (Pref.type_list ty_e) + | 'o' | 'O' -> conversion_r j ty_e (Pref.type_option ty_e) + | _ -> conversion_r (j - 1) ty_e ty_e end *) | 't' -> conversion j (ty_arrow ty_input ty_aresult) | 'l' | 'n' | 'L' as c -> let j = j + 1 in @@ -829,6 +904,8 @@ let rec approx_type env sty = newconstr path tyl with Not_found -> newvar () end + | Ptyp_poly (_, sty) -> + approx_type env sty | _ -> newvar () let rec type_approx env sexp = @@ -871,7 +948,9 @@ let rec list_labels_aux env visited ls ty_fun = let list_labels env ty = list_labels_aux env [] [] ty (* Check that all univars are safe in a type *) -let check_univars env kind exp ty_expected vars = +let check_univars env expans kind exp ty_expected vars = + if expans && not (is_nonexpansive exp) then + generalize_expansive env exp.exp_type; (* need to expand twice? cf. Ctype.unify2 *) let vars = List.map (expand_head env) vars in let vars = List.map (expand_head env) vars in @@ -892,6 +971,7 @@ let check_univars env kind exp ty_expected vars = (* Check that a type is not a function *) let check_application_result env statement exp = + let loc = exp.exp_loc in match (expand_head env exp.exp_type).desc with | Tarrow _ -> Location.prerr_warning exp.exp_loc Warnings.Partial_application @@ -899,7 +979,7 @@ let check_application_result env statement exp = | Tconstr (p, _, _) when Path.same p Predef.path_unit -> () | _ -> if statement then - Location.prerr_warning exp.exp_loc Warnings.Statement_type + Location.prerr_warning loc Warnings.Statement_type (* Check that a type is generalizable at some level *) let generalizable level ty = @@ -915,6 +995,13 @@ let generalizable level ty = (* Hack to allow coercion of self. Will clean-up later. *) let self_coercion = ref ([] : (Path.t * Location.t list ref) list) +(* Helpers for packaged modules. *) +let create_package_type loc env (p, l) = + let s = !Typetexp.transl_modtype_longident loc env p in + newty (Tpackage (s, + List.map fst l, + List.map (Typetexp.transl_simple_type env false) (List.map snd l))) + (* Typing of expressions *) let unify_exp env exp expected_ty = @@ -928,14 +1015,46 @@ let unify_exp env exp expected_ty = | Tags(l1,l2) -> raise(Typetexp.Error(exp.exp_loc, Typetexp.Variant_tags (l1, l2))) +let rec narrow_unbound_lid_error env make_error lid = + let module_is_bound mlid = + ignore (Env.lookup_module mlid env) in + match lid with + | Longident.Lident _ -> make_error lid + | Longident.Ldot (mlid, _) -> + begin + try + module_is_bound mlid; + make_error lid with + | Not_found -> Unbound_module mlid + end + | Longident.Lapply (flid, mlid) -> + begin + try + module_is_bound flid; + begin + try + module_is_bound mlid; + make_error lid with + | Not_found -> Unbound_module mlid + end with + | Not_found -> Unbound_functor flid + end +;; + +let unbound_ident_error loc env make_error lid = + let err = narrow_unbound_lid_error env make_error lid in + raise (Error (loc, err)) +;; + let rec type_exp env sexp = + let loc = sexp.pexp_loc in match sexp.pexp_desc with - Pexp_ident lid -> + | Pexp_ident lid -> begin try if !Clflags.annotations then begin try let (path, annot) = Env.lookup_annot lid env in - Stypes.record (Stypes.An_ident (sexp.pexp_loc, Path.name path, - annot)); + Stypes.record + (Stypes.An_ident (loc, Path.name path, annot)) with _ -> () end; let (path, desc) = Env.lookup_value lid env in @@ -953,26 +1072,26 @@ let rec type_exp env sexp = in Texp_ident(path, desc) | Val_unbound -> - raise(Error(sexp.pexp_loc, Masked_instance_variable lid)) + raise(Error(loc, Masked_instance_variable lid)) | _ -> Texp_ident(path, desc) end; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance desc.val_type; exp_env = env } with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_value lid)) + unbound_ident_error loc env (fun lid -> Unbound_value lid) lid end | Pexp_constant cst -> re { exp_desc = Texp_constant cst; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = type_constant cst; exp_env = env } | Pexp_let(rec_flag, spat_sexp_list, sbody) -> let scp = match rec_flag with - | Recursive -> Some (Annot.Idef sexp.pexp_loc) + | Recursive -> Some (Annot.Idef loc) | Nonrecursive -> Some (Annot.Idef sbody.pexp_loc) | Default -> None in @@ -980,7 +1099,7 @@ let rec type_exp env sexp = let body = type_exp new_env sbody in re { exp_desc = Texp_let(rec_flag, pat_exp_list, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = body.exp_type; exp_env = env } | Pexp_function _ -> (* defined in type_expect *) @@ -1011,45 +1130,45 @@ let rec type_exp env sexp = unify_var env (newvar()) funct.exp_type; re { exp_desc = Texp_apply(funct, args); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = ty_res; exp_env = env } | Pexp_match(sarg, caselist) -> 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 loc) caselist in re { exp_desc = Texp_match(arg, cases, partial); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = ty_res; exp_env = env } | Pexp_try(sbody, caselist) -> let body = type_exp env sbody in let cases, _ = - type_cases env (instance Predef.type_exn) body.exp_type None - caselist in + type_cases + env (instance Predef.type_exn) body.exp_type None caselist in re { exp_desc = Texp_try(body, cases); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = body.exp_type; exp_env = env } | Pexp_tuple sexpl -> let expl = List.map (type_exp env) sexpl in re { exp_desc = Texp_tuple expl; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = newty (Ttuple(List.map (fun exp -> exp.exp_type) expl)); exp_env = env } | Pexp_construct(lid, sarg, explicit_arity) -> - type_construct env sexp.pexp_loc lid sarg explicit_arity (newvar ()) + type_construct env loc lid sarg explicit_arity (newvar ()) | Pexp_variant(l, sarg) -> let arg = may_map (type_exp env) sarg in let arg_type = may_map (fun arg -> arg.exp_type) arg in re { exp_desc = Texp_variant(l, arg); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type= newty (Tvariant{row_fields = [l, Rpresent arg_type]; row_more = newvar (); row_bound = (); @@ -1065,7 +1184,7 @@ let rec type_exp env sexp = try Env.lookup_label lid env with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_label lid)) in + raise(Error(loc, Unbound_label lid)) in begin_def (); if !Clflags.principal then begin_def (); let (vars, ty_arg, ty_res) = instance_label true label in @@ -1077,23 +1196,21 @@ let rec type_exp env sexp = begin try unify env (instance ty_res) ty with Unify trace -> - raise(Error(sexp.pexp_loc, Label_mismatch(lid, trace))) + raise(Error(loc, Label_mismatch(lid, trace))) end; let arg = type_argument env sarg ty_arg in end_def (); - if vars <> [] && not (is_nonexpansive arg) then - generalize_expansive env arg.exp_type; - check_univars env "field value" arg label.lbl_arg vars; + check_univars env (vars <> []) "field value" arg label.lbl_arg vars; num_fields := Array.length label.lbl_all; if label.lbl_private = Private then - raise(Error(sexp.pexp_loc, Private_type ty)); + raise(Error(loc, Private_type ty)); (label, {arg with exp_type = instance arg.exp_type}) in let lbl_exp_list = type_label_a_list type_label_exp lid_sexp_list in let rec check_duplicates seen_pos lid_sexp lbl_exp = match (lid_sexp, lbl_exp) with ((lid, _) :: rem1, (lbl, _) :: rem2) -> if List.mem lbl.lbl_pos seen_pos - then raise(Error(sexp.pexp_loc, Label_multiply_defined lid)) + then raise(Error(loc, Label_multiply_defined lid)) else check_duplicates (lbl.lbl_pos :: seen_pos) rem1 rem2 | (_, _) -> () in check_duplicates [] lid_sexp_list lbl_exp_list; @@ -1127,13 +1244,13 @@ let rec type_exp env sexp = else lbl :: missing_labels (n + 1) rem in let missing = missing_labels 0 label_names in - raise(Error(sexp.pexp_loc, Label_missing missing)) + raise(Error(loc, Label_missing missing)) end else if opt_sexp <> None && List.length lid_sexp_list = !num_fields then - Location.prerr_warning sexp.pexp_loc Warnings.Useless_record_with; + Location.prerr_warning loc Warnings.Useless_record_with; re { exp_desc = Texp_record(lbl_exp_list, opt_exp); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = ty; exp_env = env } | Pexp_field(sarg, lid) -> @@ -1142,12 +1259,12 @@ let rec type_exp env sexp = try Env.lookup_label lid env with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_label lid)) in + raise(Error(loc, Unbound_label lid)) in let (_, ty_arg, ty_res) = instance_label false label in unify_exp env arg ty_res; re { exp_desc = Texp_field(arg, label); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = ty_arg; exp_env = env } | Pexp_setfield(srecord, lid, snewval) -> @@ -1156,22 +1273,20 @@ let rec type_exp env sexp = try Env.lookup_label lid env with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_label lid)) in + raise(Error(loc, Unbound_label lid)) in if label.lbl_mut = Immutable then - raise(Error(sexp.pexp_loc, Label_not_mutable lid)); + raise(Error(loc, Label_not_mutable lid)); begin_def (); let (vars, ty_arg, ty_res) = instance_label true label in unify_exp env record ty_res; let newval = type_expect env snewval ty_arg in end_def (); - if vars <> [] && not (is_nonexpansive newval) then - generalize_expansive env newval.exp_type; - check_univars env "field value" newval label.lbl_arg vars; + check_univars env (vars <> []) "field value" newval label.lbl_arg vars; if label.lbl_private = Private then - raise(Error(sexp.pexp_loc, Private_label(lid, ty_res))); + raise(Error(loc, Private_label(lid, ty_res))); re { exp_desc = Texp_setfield(record, label, newval); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance Predef.type_unit; exp_env = env } | Pexp_array(sargl) -> @@ -1179,7 +1294,7 @@ let rec type_exp env sexp = let argl = List.map (fun sarg -> type_expect env sarg ty) sargl in re { exp_desc = Texp_array argl; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance (Predef.type_array ty); exp_env = env } | Pexp_ifthenelse(scond, sifso, sifnot) -> @@ -1189,7 +1304,7 @@ let rec type_exp env sexp = let ifso = type_expect env sifso (instance Predef.type_unit) in re { exp_desc = Texp_ifthenelse(cond, ifso, None); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance Predef.type_unit; exp_env = env } | Some sifnot -> @@ -1197,7 +1312,7 @@ let rec type_exp env sexp = let ifnot = type_expect env sifnot ifso.exp_type in re { exp_desc = Texp_ifthenelse(cond, ifso, Some ifnot); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = ifso.exp_type; exp_env = env } end @@ -1206,7 +1321,7 @@ let rec type_exp env sexp = let exp2 = type_exp env sexp2 in re { exp_desc = Texp_sequence(exp1, exp2); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = exp2.exp_type; exp_env = env } | Pexp_while(scond, sbody) -> @@ -1214,7 +1329,7 @@ let rec type_exp env sexp = let body = type_statement env sbody in re { exp_desc = Texp_while(cond, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance Predef.type_unit; exp_env = env } | Pexp_for(param, slow, shigh, dir, sbody) -> @@ -1226,7 +1341,7 @@ let rec type_exp env sexp = let body = type_statement new_env sbody in re { exp_desc = Texp_for(id, low, high, dir, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance Predef.type_unit; exp_env = env } | Pexp_constraint(sarg, sty, sty') -> @@ -1264,7 +1379,7 @@ let rec type_exp env sexp = Texp_ident(_, {val_kind=Val_self _}), (path,r) :: _, Tconstr(path',_,_) when Path.same path path' -> (* prerr_endline "self coercion"; *) - r := sexp.pexp_loc :: !r; + r := loc :: !r; force () | _ when free_variables ~env arg.exp_type = [] && free_variables ~env ty' = [] -> @@ -1280,11 +1395,11 @@ let rec type_exp env sexp = let force' = subtype env arg.exp_type ty' in force (); force' (); if not gen then - Location.prerr_warning sexp.pexp_loc + Location.prerr_warning loc (Warnings.Not_principal "this ground coercion"); with Subtype (tr1, tr2) -> (* prerr_endline "coercion failed"; *) - raise(Error(sexp.pexp_loc, Not_subtype(tr1, tr2))) + raise(Error(loc, Not_subtype(tr1, tr2))) end; | _ -> let ty, b = enlarge_type env ty' in @@ -1305,7 +1420,7 @@ let rec type_exp env sexp = let force'' = subtype env ty ty' in force (); force' (); force'' () with Subtype (tr1, tr2) -> - raise(Error(sexp.pexp_loc, Not_subtype(tr1, tr2))) + raise(Error(loc, Not_subtype(tr1, tr2))) end; (type_expect env sarg ty, ty') in @@ -1319,7 +1434,7 @@ let rec type_exp env sexp = let body = type_exp env sbody in re { exp_desc = Texp_when(cond, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = body.exp_type; exp_env = env } | Pexp_send (e, met) -> @@ -1333,7 +1448,7 @@ let rec type_exp env sexp = filter_self_method env met Private meths privty in if (repr typ).desc = Tvar then - Location.prerr_warning sexp.pexp_loc + Location.prerr_warning loc (Warnings.Undeclared_virtual_method met); (Texp_send(obj, Tmeth_val id), typ) | Texp_ident(path, {val_kind = Val_anc (methods, cl_num)}) -> @@ -1358,7 +1473,7 @@ let rec type_exp env sexp = (Texp_apply({ exp_desc = Texp_ident(Path.Pident method_id, {val_type = method_type; val_kind = Val_reg}); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = method_type; exp_env = env }, [Some {exp_desc = Texp_ident(path, desc); @@ -1384,7 +1499,7 @@ let rec type_exp env sexp = instance ty | {desc = Tpoly (ty, tl); level = l} -> if !Clflags.principal && l <> generic_level then - Location.prerr_warning sexp.pexp_loc + Location.prerr_warning loc (Warnings.Not_principal "this use of a polymorphic method"); snd (instance_poly false tl ty) | {desc = Tvar} as ty -> @@ -1398,7 +1513,7 @@ let rec type_exp env sexp = in re { exp_desc = exp; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = typ; exp_env = env } with Unify _ -> @@ -1407,15 +1522,15 @@ let rec type_exp env sexp = | Pexp_new cl -> let (cl_path, cl_decl) = try Env.lookup_class cl env with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_class cl)) + raise(Error(loc, Unbound_class cl)) in begin match cl_decl.cty_new with None -> - raise(Error(sexp.pexp_loc, Virtual_class cl)) + raise(Error(loc, Virtual_class cl)) | Some ty -> re { exp_desc = Texp_new (cl_path, cl_decl); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance ty; exp_env = env } end @@ -1430,23 +1545,23 @@ let rec type_exp env sexp = in re { exp_desc = Texp_setinstvar(path_self, path, newval); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance Predef.type_unit; exp_env = env } | Val_ivar _ -> - raise(Error(sexp.pexp_loc, Instance_variable_not_mutable lab)) + raise(Error(loc, Instance_variable_not_mutable lab)) | _ -> - raise(Error(sexp.pexp_loc, Unbound_instance_variable lab)) + raise(Error(loc, Unbound_instance_variable lab)) with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_instance_variable lab)) + raise(Error(loc, Unbound_instance_variable lab)) end | Pexp_override lst -> let _ = List.fold_right (fun (lab, _) l -> if List.exists ((=) lab) l then - raise(Error(sexp.pexp_loc, + raise(Error(loc, Value_multiply_overridden lab)); lab::l) lst @@ -1456,7 +1571,7 @@ let rec type_exp env sexp = Env.lookup_value (Longident.Lident "selfpat-*") env, Env.lookup_value (Longident.Lident "self-*") env with Not_found -> - raise(Error(sexp.pexp_loc, Outside_class)) + raise(Error(loc, Outside_class)) with (_, {val_type = self_ty; val_kind = Val_self (_, vars, _, _)}), (path_self, _) -> @@ -1466,13 +1581,13 @@ let rec type_exp env sexp = (Path.Pident id, type_expect env snewval (instance ty)) with Not_found -> - raise(Error(sexp.pexp_loc, Unbound_instance_variable lab)) + raise(Error(loc, Unbound_instance_variable lab)) end in let modifs = List.map type_override lst in re { exp_desc = Texp_override(path_self, modifs); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = self_ty; exp_env = env } | _ -> @@ -1495,25 +1610,25 @@ let rec type_exp env sexp = begin try Ctype.unify new_env body.exp_type ty with Unify _ -> - raise(Error(sexp.pexp_loc, Scoping_let_module(name, body.exp_type))) + raise(Error(loc, Scoping_let_module(name, body.exp_type))) end; re { exp_desc = Texp_letmodule(id, modl, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = ty; exp_env = env } | Pexp_assert (e) -> let cond = type_expect env e (instance Predef.type_bool) in re { exp_desc = Texp_assert (cond); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance Predef.type_unit; exp_env = env; } | Pexp_assertfalse -> re { exp_desc = Texp_assertfalse; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = newvar (); exp_env = env; } @@ -1521,20 +1636,69 @@ let rec type_exp env sexp = let arg = type_exp env e in re { exp_desc = Texp_lazy arg; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = instance (Predef.type_lazy_t arg.exp_type); exp_env = env; } | Pexp_object s -> - let desc, sign, meths = !type_object env sexp.pexp_loc s in + let desc, sign, meths = !type_object env loc s in re { exp_desc = Texp_object (desc, sign, meths); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = sign.cty_self; exp_env = env; } | Pexp_poly _ -> assert false + | Pexp_newtype(name, sbody) -> + (* Create a fake abstract type declaration for name. *) + let decl = { + type_params = []; + type_arity = 0; + type_kind = Type_abstract; + type_private = Public; + type_manifest = None; + type_variance = []; + } + in + + let ty = newvar () in + Ident.set_current_time ty.level; + let (id, new_env) = Env.enter_type name decl env in + Ctype.init_def(Ident.current_time()); + + let body = type_exp new_env sbody in + (* Replace every instance of this type constructor in the resulting type. *) + let seen = Hashtbl.create 8 in + let rec replace t = + if Hashtbl.mem seen t.id then () + else begin + Hashtbl.add seen t.id (); + match t.desc with + | Tconstr (Path.Pident id', _, _) when id == id' -> link_type t ty + | _ -> Btype.iter_type_expr replace t + end + in + let ety = Subst.type_expr Subst.identity body.exp_type in + replace ety; + + (* non-expansive if the body is non-expansive, so we don't introduce + any new extra node in the typed AST. *) + re { body with exp_loc = sexp.pexp_loc; exp_type = ety } + | Pexp_pack (m, (p, l)) -> + let loc = sexp.pexp_loc in + let l, mty = Typetexp.create_package_mty loc env (p, l) in + let m = {pmod_desc = Pmod_constraint (m, mty); pmod_loc = loc} in + let context = Typetexp.narrow () in + let modl = !type_module env m in + Typetexp.widen context; + re { + exp_desc = Texp_pack modl; + exp_loc = loc; + exp_type = create_package_type loc env (p, l); + exp_env = env } + | Pexp_open (lid, e) -> + type_exp (!type_open env sexp.pexp_loc lid) e and type_argument env sarg ty_expected' = (* ty_expected' may be generic *) @@ -1815,30 +1979,31 @@ and type_construct env loc lid sarg explicit_arity ty_expected = Some constructs are treated specially to provide better error messages. *) and type_expect ?in_function env sexp ty_expected = + let loc = sexp.pexp_loc in match sexp.pexp_desc with Pexp_constant(Const_string s as cst) -> let exp = re { exp_desc = Texp_constant cst; - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = (* Terrible hack for format strings *) begin match (repr (expand_head env ty_expected)).desc with Tconstr(path, _, _) when Path.same path Predef.path_format6 -> - type_format sexp.pexp_loc s + type_format loc s | _ -> instance Predef.type_string end; exp_env = env } in unify_exp env exp ty_expected; exp | Pexp_construct(lid, sarg, explicit_arity) -> - type_construct env sexp.pexp_loc lid sarg explicit_arity ty_expected + type_construct env loc lid sarg explicit_arity ty_expected | Pexp_let(rec_flag, spat_sexp_list, sbody) -> let (pat_exp_list, new_env) = type_let env rec_flag spat_sexp_list None in let body = type_expect new_env sbody ty_expected in re { exp_desc = Texp_let(rec_flag, pat_exp_list, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = body.exp_type; exp_env = env } | Pexp_sequence(sexp1, sexp2) -> @@ -1846,45 +2011,64 @@ and type_expect ?in_function env sexp ty_expected = let exp2 = type_expect env sexp2 ty_expected in re { exp_desc = Texp_sequence(exp1, exp2); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = exp2.exp_type; exp_env = env } | Pexp_function (l, Some default, [spat, sbody]) -> - let loc = default.pexp_loc in - let scases = - [{ppat_loc = loc; ppat_desc = - Ppat_construct(Longident.Lident"Some", - Some{ppat_loc = loc; ppat_desc = Ppat_var"*sth*"}, - false)}, - {pexp_loc = loc; pexp_desc = Pexp_ident(Longident.Lident"*sth*")}; - {ppat_loc = loc; ppat_desc = - Ppat_construct(Longident.Lident"None", None, false)}, - default] in - let smatch = - {pexp_loc = loc; pexp_desc = - Pexp_match({pexp_loc = loc; pexp_desc = - Pexp_ident(Longident.Lident"*opt*")}, - scases)} in - let sfun = - {pexp_loc = sexp.pexp_loc; pexp_desc = - Pexp_function(l, None,[{ppat_loc = loc; ppat_desc = Ppat_var"*opt*"}, - {pexp_loc = sexp.pexp_loc; pexp_desc = - Pexp_let(Default, [spat, smatch], sbody)}])} - in + let default_loc = default.pexp_loc in + let scases = [ + {ppat_loc = default_loc; + ppat_desc = + Ppat_construct + (Longident.Lident "Some", + Some {ppat_loc = default_loc; ppat_desc = Ppat_var "*sth*"}, + false)}, + {pexp_loc = default_loc; + pexp_desc = Pexp_ident(Longident.Lident "*sth*")}; + {ppat_loc = default_loc; + ppat_desc = Ppat_construct(Longident.Lident "None", None, false)}, + default; + ] in + let smatch = { + pexp_loc = loc; + pexp_desc = + Pexp_match ({ + pexp_loc = loc; + pexp_desc = + Pexp_ident(Longident.Lident "*opt*") + }, + scases + ) + } in + let sfun = { + pexp_loc = loc; + pexp_desc = + Pexp_function ( + l, + None, + [ {ppat_loc = loc; + ppat_desc = Ppat_var "*opt*"}, + {pexp_loc = loc; + pexp_desc = + Pexp_let(Default, [spat, smatch], sbody); + } + ] + ) + } in type_expect ?in_function env sfun ty_expected | Pexp_function (l, _, caselist) -> - let (loc, ty_fun) = + let (loc_fun, ty_fun) = match in_function with Some p -> p - | None -> (sexp.pexp_loc, ty_expected) + | None -> (loc, ty_expected) in let (ty_arg, ty_res) = try filter_arrow env ty_expected l with Unify _ -> match expand_head env ty_expected with {desc = Tarrow _} as ty -> - raise(Error(sexp.pexp_loc, Abstract_wrong_label(l, ty))) + raise(Error(loc, Abstract_wrong_label(l, ty))) | _ -> - raise(Error(loc, + raise(Error(loc_fun, Too_many_arguments (in_function <> None, ty_fun))) in let ty_arg = @@ -1898,8 +2082,8 @@ and type_expect ?in_function env sexp ty_expected = else ty_arg in let cases, partial = - type_cases ~in_function:(loc,ty_fun) env ty_arg ty_res - (Some sexp.pexp_loc) caselist in + type_cases ~in_function:(loc_fun,ty_fun) env ty_arg ty_res + (Some loc) caselist in let not_function ty = let ls, tvar = list_labels env ty in ls = [] && not tvar @@ -1909,7 +2093,7 @@ and type_expect ?in_function env sexp ty_expected = Warnings.Unerasable_optional_argument; re { exp_desc = Texp_function(cases, partial); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = newty (Tarrow(l, ty_arg, ty_res, Cok)); exp_env = env } | Pexp_when(scond, sbody) -> @@ -1917,7 +2101,7 @@ and type_expect ?in_function env sexp ty_expected = let body = type_expect env sbody ty_expected in re { exp_desc = Texp_when(cond, body); - exp_loc = sexp.pexp_loc; + exp_loc = loc; exp_type = body.exp_type; exp_env = env } | Pexp_poly(sbody, sty) -> @@ -1929,7 +2113,8 @@ and type_expect ?in_function env sexp ty_expected = in let set_type ty = unify_exp env - { exp_desc = Texp_tuple []; exp_loc = sexp.pexp_loc; + { exp_desc = Texp_tuple []; + exp_loc = loc; exp_type = ty; exp_env = env } ty_expected in begin match ty.desc with @@ -1944,7 +2129,7 @@ and type_expect ?in_function env sexp ty_expected = let vars, ty'' = instance_poly true tl ty' in let exp = type_expect env sbody ty'' in end_def (); - check_univars env "method" exp ty_expected vars; + check_univars env false "method" exp ty_expected vars; re { exp with exp_type = ty } | _ -> assert false end @@ -1956,20 +2141,25 @@ and type_expect ?in_function env sexp ty_expected = (* Typing of statements (expressions whose values are discarded) *) and type_statement env sexp = + let loc = sexp.pexp_loc in begin_def(); let exp = type_exp env sexp in end_def(); + if !Clflags.strict_sequence then + let expected_ty = instance Predef.type_unit in + unify_exp env exp expected_ty; + exp else let ty = expand_head env exp.exp_type and tv = newvar() in begin match ty.desc with | Tarrow _ -> - Location.prerr_warning sexp.pexp_loc Warnings.Partial_application + Location.prerr_warning loc Warnings.Partial_application | Tconstr (p, _, _) when Path.same p Predef.path_unit -> () | Tvar when ty.level > tv.level -> - Location.prerr_warning sexp.pexp_loc Warnings.Nonreturning_statement + Location.prerr_warning loc Warnings.Nonreturning_statement | Tvar -> add_delayed_check (fun () -> check_application_result env true exp) | _ -> - Location.prerr_warning sexp.pexp_loc Warnings.Statement_type + Location.prerr_warning loc Warnings.Statement_type end; unify_var env tv ty; exp @@ -1982,8 +2172,9 @@ and type_cases ?in_function env ty_arg ty_res partial_loc caselist = let pat_env_list = List.map (fun (spat, sexp) -> + let loc = sexp.pexp_loc in if !Clflags.principal then begin_def (); - let scope = Some (Annot.Idef sexp.pexp_loc) in + let scope = Some (Annot.Idef loc) in let (pat, ext_env, force) = type_pattern env spat scope in pattern_force := force @ !pattern_force; let pat = @@ -2016,8 +2207,9 @@ and type_cases ?in_function env ty_arg ty_res partial_loc caselist = pat_env_list caselist in let partial = - match partial_loc with None -> Partial - | Some loc -> Parmatch.check_partial loc cases + match partial_loc with + | None -> Partial + | Some partial_loc -> Parmatch.check_partial partial_loc cases in add_delayed_check (fun () -> Parmatch.check_unused env cases); cases, partial @@ -2031,7 +2223,13 @@ and type_let env rec_flag spat_sexp_list scope = let (pat_list, new_env, force) = type_pattern_list env spatl scope in if rec_flag = Recursive then List.iter2 - (fun pat (_, sexp) -> unify_pat env pat (type_approx env sexp)) + (fun pat (_, sexp) -> + let pat = + match pat.pat_type.desc with + | Tpoly (ty, tl) -> + {pat with pat_type = snd (instance_poly false tl ty)} + | _ -> pat + in unify_pat env pat (type_approx env sexp)) pat_list spat_sexp_list; let pat_list = if !Clflags.principal then begin @@ -2056,7 +2254,16 @@ and type_let env rec_flag spat_sexp_list scope = match rec_flag with Nonrecursive | Default -> env | Recursive -> new_env in let exp_list = List.map2 - (fun (spat, sexp) pat -> type_expect exp_env sexp pat.pat_type) + (fun (spat, sexp) pat -> + match pat.pat_type.desc with + | Tpoly (ty, tl) -> + begin_def (); + let vars, ty' = instance_poly true tl ty in + 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 exp.exp_type} + | _ -> type_expect exp_env sexp pat.pat_type) spat_sexp_list pat_list in List.iter2 (fun pat exp -> ignore(Parmatch.check_partial pat.pat_loc [pat, exp])) @@ -2097,6 +2304,10 @@ open Printtyp let report_error ppf = function | Unbound_value lid -> fprintf ppf "Unbound value %a" longident lid + | Unbound_module lid -> + fprintf ppf "Unbound module %a" longident lid + | Unbound_functor lid -> + fprintf ppf "Unbound functor %a" longident lid | Unbound_constructor lid -> fprintf ppf "Unbound constructor %a" longident lid | Unbound_label lid -> diff --git a/typing/typecore.mli b/typing/typecore.mli index b7a6ebc0..a1a9ecd9 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typecore.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Type inference for the core language *) @@ -22,7 +22,7 @@ val is_nonexpansive: Typedtree.expression -> bool val type_binding: Env.t -> rec_flag -> - (Parsetree.pattern * Parsetree.expression) list -> + (Parsetree.pattern * Parsetree.expression) list -> Annot.ident option -> (Typedtree.pattern * Typedtree.expression) list * Env.t val type_let: @@ -66,6 +66,8 @@ type error = Unbound_value of Longident.t | Unbound_constructor of Longident.t | Unbound_label of Longident.t + | Unbound_module of Longident.t + | Unbound_functor of Longident.t | Polymorphic_label of Longident.t | Constructor_arity_mismatch of Longident.t * int * int | Label_mismatch of Longident.t * (type_expr * type_expr) list @@ -107,7 +109,11 @@ val report_error: formatter -> error -> unit (* Forward declaration, to be filled in by Typemod.type_module *) val type_module: (Env.t -> Parsetree.module_expr -> Typedtree.module_expr) ref +(* Forward declaration, to be filled in by Typemod.type_open *) +val type_open: (Env.t -> Location.t -> Longident.t -> Env.t) ref (* Forward declaration, to be filled in by Typeclass.class_structure *) val type_object: (Env.t -> Location.t -> Parsetree.class_structure -> Typedtree.class_structure * class_signature * string list) ref + +val create_package_type: Location.t -> Env.t -> Parsetree.package_type -> type_expr diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 7b4c92dd..6ee97aa6 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedecl.ml 9509 2010-01-06 11:32:57Z garrigue $ *) +(* $Id$ *) (**** Typing of type definitions ****) @@ -459,6 +459,8 @@ let compute_variance env tvl nega posi cntr ty = | Tpoly (ty, _) -> compute_same ty | Tvar | Tnil | Tlink _ | Tunivar -> () + | Tpackage (_, _, tyl) -> + List.iter (compute_variance_rec true true true) tyl end in compute_variance_rec nega posi cntr ty; diff --git a/typing/typedecl.mli b/typing/typedecl.mli index d6d6bb36..c44f467d 100644 --- a/typing/typedecl.mli +++ b/typing/typedecl.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedecl.mli 9292 2009-06-08 04:08:14Z garrigue $ *) +(* $Id$ *) (* Typing of type definitions and primitive definitions *) @@ -50,7 +50,7 @@ val compute_variance_decls: cltype_declaration * ((bool * bool) list * Location.t)) list -> (type_declaration * type_declaration * class_declaration * cltype_declaration) list - + type error = Repeated_parameter | Duplicate_constructor of string diff --git a/typing/typedtree.ml b/typing/typedtree.ml index c6f6eed1..e2b7e285 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedtree.ml 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) (* Abstract syntax tree after typing *) @@ -79,6 +79,7 @@ and expression_desc = | Texp_assertfalse | Texp_lazy of expression | Texp_object of class_structure * class_signature * string list + | Texp_pack of module_expr and meth = Tmeth_name of string @@ -127,6 +128,7 @@ and module_expr_desc = | Tmod_functor of Ident.t * module_type * module_expr | Tmod_apply of module_expr * module_expr * module_coercion | Tmod_constraint of module_expr * module_type * module_coercion + | Tmod_unpack of expression * module_type and structure = structure_item list diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 9780b34c..eb64937c 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedtree.mli 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) (* Abstract syntax tree after typing *) @@ -78,6 +78,7 @@ and expression_desc = | Texp_assertfalse | Texp_lazy of expression | Texp_object of class_structure * class_signature * string list + | Texp_pack of module_expr and meth = Tmeth_name of string @@ -129,6 +130,7 @@ and module_expr_desc = | Tmod_functor of Ident.t * module_type * module_expr | Tmod_apply of module_expr * module_expr * module_coercion | Tmod_constraint of module_expr * module_type * module_coercion + | Tmod_unpack of expression * module_type and structure = structure_item list @@ -164,4 +166,3 @@ val rev_let_bound_idents: (pattern * expression) list -> Ident.t list (* Alpha conversion of patterns *) val alpha_pat : (Ident.t * Ident.t) list -> pattern -> pattern - diff --git a/typing/typemod.ml b/typing/typemod.ml index be810851..000131ed 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typemod.ml 9079 2008-10-08 13:09:39Z doligez $ *) +(* $Id$ *) (* Type-checking of the module language *) @@ -39,6 +39,8 @@ type error = | Non_generalizable_module of module_type | Implementation_is_required of string | Interface_not_compiled of string + | Not_allowed_in_functor_body + | With_need_typeconstr exception Error of Location.t * error @@ -62,11 +64,23 @@ let type_module_path env loc lid = with Not_found -> raise(Error(loc, Unbound_module lid)) +(* Compute the environment after opening a module *) + +let type_open env loc lid = + let (path, mty) = type_module_path env loc lid in + let sg = extract_sig_open env loc mty in + Env.open_signature path sg env + (* Record a module type *) let rm node = Stypes.record (Stypes.Ti_mod node); node +(* Forward declaration, to be filled in by type_module_type_of *) +let type_module_type_of_fwd + : (Env.t -> Parsetree.module_expr -> module_type) ref + = ref (fun env m -> assert false) + (* Merge one "with" constraint in a signature *) let rec add_rec_types env = function @@ -81,7 +95,14 @@ let check_type_decl env id row_id newdecl decl rs rem = let env = if rs = Trec_not then env else add_rec_types env rem in Includemod.type_declarations env id newdecl decl +let rec make_params n = function + [] -> [] + | _ :: l -> ("a" ^ string_of_int n) :: make_params (n+1) l + +let wrap_param s = {ptyp_desc=Ptyp_var s; ptyp_loc=Location.none} + let merge_constraint initial_env loc sg lid constr = + let real_id = ref None in let rec merge env sg namelist row_id = match (sg, namelist, constr) with ([], _, _) -> @@ -113,15 +134,30 @@ let merge_constraint initial_env loc sg lid constr = Typedecl.transl_with_constraint initial_env id None sdecl in check_type_decl env id row_id newdecl decl rs rem; Tsig_type(id, newdecl, rs) :: rem - | (Tsig_type(id, decl, rs) :: rem, [s], Pwith_type sdecl) + | (Tsig_type(id, decl, rs) :: rem, [s], (Pwith_type _ | Pwith_typesubst _)) when Ident.name id = s ^ "#row" -> merge env rem namelist (Some id) + | (Tsig_type(id, decl, rs) :: rem, [s], Pwith_typesubst sdecl) + when Ident.name id = s -> + (* Check as for a normal with constraint, but discard definition *) + let newdecl = + Typedecl.transl_with_constraint initial_env id None sdecl in + check_type_decl env id row_id newdecl decl rs rem; + real_id := Some id; + rem | (Tsig_module(id, mty, rs) :: rem, [s], Pwith_module lid) when Ident.name id = s -> let (path, mty') = type_module_path initial_env loc lid in let newmty = Mtype.strengthen env mty' path in ignore(Includemod.modtypes env newmty mty); Tsig_module(id, newmty, rs) :: rem + | (Tsig_module(id, mty, rs) :: rem, [s], Pwith_modsubst lid) + when Ident.name id = s -> + let (path, mty') = type_module_path initial_env loc lid in + let newmty = Mtype.strengthen env mty' path in + ignore(Includemod.modtypes env newmty mty); + real_id := Some id; + 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 @@ -129,7 +165,37 @@ let merge_constraint initial_env loc sg lid constr = | (item :: rem, _, _) -> item :: merge (Env.add_item item env) rem namelist row_id in try - merge initial_env sg (Longident.flatten lid) None + let names = Longident.flatten lid in + let sg = merge initial_env sg names None in + match names, constr with + [s], Pwith_typesubst sdecl -> + let id = + match !real_id with None -> assert false | Some id -> id in + let lid = + try match sdecl.ptype_manifest with + | Some {ptyp_desc = Ptyp_constr (lid, stl)} -> + let params = + List.map + (function {ptyp_desc=Ptyp_var s} -> s | _ -> raise Exit) + stl in + if params <> sdecl.ptype_params then raise Exit; + lid + | _ -> raise Exit + with Exit -> raise (Error (sdecl.ptype_loc, With_need_typeconstr)) + in + let (path, _) = + try Env.lookup_type lid initial_env with Not_found -> assert false + in + let sub = Subst.add_type id path Subst.identity in + Subst.signature sub sg + | [s], Pwith_modsubst lid -> + let id = + match !real_id with None -> assert false | Some id -> id in + let (path, _) = type_module_path initial_env loc lid in + let sub = Subst.add_module id path Subst.identity in + Subst.signature sub sg + | _ -> + sg with Includemod.Error explanation -> raise(Error(loc, With_mismatch(lid, explanation))) @@ -171,6 +237,8 @@ let rec approx_modtype env smty = Tmty_functor(id, arg, res) | Pmty_with(sbody, constraints) -> approx_modtype env sbody + | Pmty_typeof smod -> + !type_module_type_of_fwd env smod and approx_sig env ssg = match ssg with @@ -201,10 +269,7 @@ and approx_sig env ssg = let (id, newenv) = Env.enter_modtype name info env in Tsig_modtype(id, info) :: approx_sig newenv srem | Psig_open lid -> - let (path, mty) = type_module_path env item.psig_loc lid in - let sg = extract_sig_open env item.psig_loc mty in - let newenv = Env.open_signature path sg env in - approx_sig newenv srem + approx_sig (type_open env item.psig_loc lid) srem | Psig_include smty -> let mty = approx_modtype env smty in let sg = Subst.signature Subst.identity @@ -263,17 +328,29 @@ let check_sig_item type_names module_names modtype_names loc = function check "module type" loc modtype_names (Ident.name id) | _ -> () +let rec remove_values ids = function + [] -> [] + | Tsig_value (id, _) :: rem when List.exists (Ident.equal id) ids -> rem + | f :: rem -> f :: remove_values ids rem + +let rec get_values = function + [] -> [] + | Tsig_value (id, _) :: rem -> id :: get_values rem + | f :: rem -> get_values rem + (* Check and translate a module type expression *) +let transl_modtype_longident loc env lid = + try + let (path, info) = Env.lookup_modtype lid env in + path + with Not_found -> + raise(Error(loc, Unbound_modtype lid)) + let rec transl_modtype env smty = match smty.pmty_desc with Pmty_ident lid -> - begin try - let (path, info) = Env.lookup_modtype lid env in - Tmty_ident path - with Not_found -> - raise(Error(smty.pmty_loc, Unbound_modtype lid)) - end + Tmty_ident (transl_modtype_longident smty.pmty_loc env lid) | Pmty_signature ssg -> Tmty_signature(transl_signature env ssg) | Pmty_functor(param, sarg, sres) -> @@ -290,6 +367,8 @@ let rec transl_modtype env smty = merge_constraint env smty.pmty_loc sg lid sdecl) init_sg constraints in Mtype.freshen (Tmty_signature final_sg) + | Pmty_typeof smod -> + !type_module_type_of_fwd env smod and transl_signature env sg = let type_names = ref StringSet.empty @@ -305,7 +384,8 @@ and transl_signature env sg = let desc = Typedecl.transl_value_decl env sdesc in let (id, newenv) = Env.enter_value name desc env in let rem = transl_sig newenv srem in - Tsig_value(id, desc) :: rem + if List.exists (Ident.equal id) (get_values rem) then rem + else Tsig_value(id, desc) :: rem | Psig_type sdecls -> List.iter (fun (name, decl) -> check "type" item.psig_loc type_names name) @@ -340,10 +420,7 @@ and transl_signature env sg = let rem = transl_sig newenv srem in Tsig_modtype(id, info) :: rem | Psig_open lid -> - let (path, mty) = type_module_path env item.psig_loc lid in - let sg = extract_sig_open env item.psig_loc mty in - let newenv = Env.open_signature path sg env in - transl_sig newenv srem + transl_sig (type_open env item.psig_loc lid) srem | Psig_include smty -> let mty = transl_modtype env smty in let sg = Subst.signature Subst.identity @@ -354,7 +431,7 @@ and transl_signature env sg = sg; let newenv = Env.add_signature sg env in let rem = transl_sig newenv srem in - sg @ rem + remove_values (get_values rem) sg @ rem | Psig_class cl -> List.iter (fun {pci_name = name} -> @@ -429,7 +506,7 @@ exception Not_a_path let rec path_of_module mexp = match mexp.mod_desc with Tmod_ident p -> p - | Tmod_apply(funct, arg, coercion) -> + | Tmod_apply(funct, arg, coercion) when !Clflags.applicative_functors -> Papply(path_of_module funct, path_of_module arg) | _ -> raise Not_a_path @@ -503,7 +580,7 @@ let check_recmodule_inclusion env bindings = module rec X : DECL = MOD where MOD has inferred type ACTUAL The "natural" typing condition E, X: ACTUAL |- ACTUAL <: DECL - leads to circularities through manifest types. + leads to circularities through manifest types. Instead, we "unroll away" the potential circularities a finite number of times. The (weaker) condition we implement is: E, X: DECL, @@ -573,7 +650,7 @@ let check_recmodule_inclusion env bindings = (* Type a module value expression *) -let rec type_module anchor env smod = +let rec type_module funct_body anchor env smod = match smod.pmod_desc with Pmod_ident lid -> let (path, mty) = type_module_path env smod.pmod_loc lid in @@ -582,7 +659,7 @@ let rec type_module anchor env smod = mod_env = env; mod_loc = smod.pmod_loc } | Pmod_structure sstr -> - let (str, sg, finalenv) = type_structure anchor env sstr smod.pmod_loc in + let (str, sg, finalenv) = type_structure funct_body anchor env sstr smod.pmod_loc in rm { mod_desc = Tmod_structure str; mod_type = Tmty_signature sg; mod_env = env; @@ -590,14 +667,14 @@ let rec type_module anchor env smod = | Pmod_functor(name, smty, sbody) -> let mty = transl_modtype env smty in let (id, newenv) = Env.enter_module name mty env in - let body = type_module None newenv sbody in + let body = type_module true None newenv sbody in rm { mod_desc = Tmod_functor(id, mty, body); mod_type = Tmty_functor(id, mty, body.mod_type); mod_env = env; mod_loc = smod.pmod_loc } | Pmod_apply(sfunct, sarg) -> - let funct = type_module None env sfunct in - let arg = type_module None env sarg in + let funct = type_module funct_body None env sfunct in + let arg = type_module funct_body None env sarg in begin match Mtype.scrape env funct.mod_type with Tmty_functor(param, mty_param, mty_res) as mty_functor -> let coercion = @@ -625,7 +702,7 @@ let rec type_module anchor env smod = raise(Error(sfunct.pmod_loc, Cannot_apply funct.mod_type)) end | Pmod_constraint(sarg, smty) -> - let arg = type_module anchor env sarg in + let arg = type_module funct_body anchor env sarg in let mty = transl_modtype env smty in let coercion = try @@ -637,7 +714,17 @@ let rec type_module anchor env smod = mod_env = env; mod_loc = smod.pmod_loc } -and type_structure anchor env sstr scope = + | Pmod_unpack (sexp, (p, l)) -> + if funct_body then raise (Error (smod.pmod_loc, Not_allowed_in_functor_body)); + let l, mty = Typetexp.create_package_mty smod.pmod_loc env (p, l) in + let mty = transl_modtype env mty in + let exp = Typecore.type_expect env sexp (Typecore.create_package_type smod.pmod_loc env (p, l)) in + rm { mod_desc = Tmod_unpack(exp, mty); + mod_type = mty; + mod_env = env; + mod_loc = smod.pmod_loc } + +and type_structure funct_body anchor env sstr scope = let type_names = ref StringSet.empty and module_names = ref StringSet.empty and modtype_names = ref StringSet.empty in @@ -705,7 +792,7 @@ and type_structure anchor env sstr scope = final_env) | {pstr_desc = Pstr_module(name, smodl); pstr_loc = loc} :: srem -> check "module" loc module_names name; - let modl = type_module (anchor_submodule name anchor) env smodl in + let modl = type_module funct_body (anchor_submodule name anchor) env smodl in let mty = enrich_module_type anchor name modl.mod_type env in let (id, newenv) = Env.enter_module name mty env in let (str_rem, sig_rem, final_env) = type_struct newenv srem in @@ -723,7 +810,7 @@ and type_structure anchor env sstr scope = List.map2 (fun (id, mty) (name, smty, smodl) -> let modl = - type_module (anchor_recmodule id anchor) newenv smodl in + type_module funct_body (anchor_recmodule id anchor) newenv smodl in let mty' = enrich_module_type anchor (Ident.name id) modl.mod_type newenv in (id, mty, modl, mty')) @@ -744,9 +831,7 @@ and type_structure anchor env sstr scope = Tsig_modtype(id, Tmodtype_manifest mty) :: sig_rem, final_env) | {pstr_desc = Pstr_open lid; pstr_loc = loc} :: srem -> - let (path, mty) = type_module_path env loc lid in - let sg = extract_sig_open env loc mty in - type_struct (Env.open_signature path sg env) srem + type_struct (type_open env loc lid) srem | {pstr_desc = Pstr_class cl; pstr_loc = loc} :: srem -> List.iter (fun {pci_name = name} -> check "type" loc type_names name) @@ -795,7 +880,7 @@ and type_structure anchor env sstr scope = classes [sig_rem]), final_env) | {pstr_desc = Pstr_include smodl; pstr_loc = loc} :: srem -> - let modl = type_module None env smodl in + let modl = type_module funct_body None env smodl in (* Rename all identifiers bound by this signature to avoid clashes *) let sg = Subst.signature Subst.identity (extract_sig_open env smodl.pmod_loc modl.mod_type) in @@ -811,12 +896,23 @@ and type_structure anchor env sstr scope = then List.iter (function {pstr_loc = l} -> Stypes.record_phrase l) sstr; type_struct env sstr -let type_module = type_module None -let type_structure = type_structure None +let type_module = type_module false None +let type_structure = type_structure false None -(* Fill in the forward declaration *) -let _ = - Typecore.type_module := type_module +let type_module_type_of env smod = + match smod.pmod_desc with + | Pmod_ident lid -> (* turn off strengthening in this case *) + let (path, mty) = type_module_path env smod.pmod_loc lid in mty + | _ -> + (type_module env smod).mod_type + +(* Fill in the forward declarations *) +let () = + Typecore.type_module := type_module; + Typetexp.transl_modtype_longident := transl_modtype_longident; + Typetexp.transl_modtype := transl_modtype; + Typecore.type_open := type_open; + type_module_type_of_fwd := type_module_type_of (* Normalize types in a signature *) @@ -1005,3 +1101,9 @@ let report_error ppf = function | Interface_not_compiled intf_name -> fprintf ppf "@[Could not find the .cmi file for interface@ %s.@]" intf_name + | Not_allowed_in_functor_body -> + fprintf ppf + "This kind of expression is not allowed within the body of a functor." + | With_need_typeconstr -> + fprintf ppf + "Only type constructors with identical parameters can be substituted." diff --git a/typing/typemod.mli b/typing/typemod.mli index 5f96f308..2dcbd2d6 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typemod.mli 8232 2007-05-16 08:21:41Z doligez $ *) +(* $Id$ *) (* Type-checking of the module language *) @@ -51,6 +51,8 @@ type error = | Non_generalizable_module of module_type | Implementation_is_required of string | Interface_not_compiled of string + | Not_allowed_in_functor_body + | With_need_typeconstr exception Error of Location.t * error diff --git a/typing/types.ml b/typing/types.ml index 7a02a500..5996719d 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: types.ml 8922 2008-07-19 02:13:09Z garrigue $ *) +(* $Id$ *) (* Representation of types and declarations *) @@ -37,6 +37,7 @@ and type_desc = | Tvariant of row_desc | Tunivar | Tpoly of type_expr * type_expr list + | Tpackage of Path.t * string list * type_expr list and row_desc = { row_fields: (label * row_field) list; @@ -120,7 +121,8 @@ and constructor_tag = (* Record label descriptions *) type label_description = - { lbl_res: type_expr; (* Type of the result *) + { lbl_name: string; (* Short name *) + lbl_res: type_expr; (* Type of the result *) lbl_arg: type_expr; (* Type of the argument *) lbl_mut: mutable_flag; (* Is this a mutable field? *) lbl_pos: int; (* Position in block *) diff --git a/typing/types.mli b/typing/types.mli index 3941bc98..a4c64084 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: types.mli 8922 2008-07-19 02:13:09Z garrigue $ *) +(* $Id$ *) (* Representation of types and declarations *) @@ -36,6 +36,7 @@ and type_desc = | Tvariant of row_desc | Tunivar | Tpoly of type_expr * type_expr list + | Tpackage of Path.t * string list * type_expr list and row_desc = { row_fields: (label * row_field) list; @@ -91,8 +92,7 @@ and value_kind = | Val_prim of Primitive.description (* Primitive *) | Val_ivar of mutable_flag * string (* Instance variable (mutable ?) *) | Val_self of (Ident.t * type_expr) Meths.t ref * - (Ident.t * Asttypes.mutable_flag * - Asttypes.virtual_flag * type_expr) Vars.t ref * + (Ident.t * mutable_flag * virtual_flag * type_expr) Vars.t ref * string * type_expr (* Self *) | Val_anc of (string * Ident.t) list * string @@ -118,7 +118,8 @@ and constructor_tag = (* Record label descriptions *) type label_description = - { lbl_res: type_expr; (* Type of the result *) + { lbl_name: string; (* Short name *) + lbl_res: type_expr; (* Type of the result *) lbl_arg: type_expr; (* Type of the argument *) lbl_mut: mutable_flag; (* Is this a mutable field? *) lbl_pos: int; (* Position in block *) @@ -160,8 +161,7 @@ type class_type = and class_signature = { cty_self: type_expr; - cty_vars: - (Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) Vars.t; + cty_vars: (mutable_flag * virtual_flag * type_expr) Vars.t; cty_concr: Concr.t; cty_inher: (Path.t * type_expr list) list } diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 52046b66..e4c782d7 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -39,12 +39,41 @@ type error = | Variant_tags of string * string | Invalid_variable_name of string | Cannot_quantify of string * type_expr + | Multiple_constraints_on_type of string | Repeated_method_label of string exception Error of Location.t * error type variable_context = int * (string, type_expr) Tbl.t +(* Support for first-class modules. *) + +let transl_modtype_longident = ref (fun _ -> assert false) +let transl_modtype = ref (fun _ -> assert false) + +let create_package_mty fake loc env (p, l) = + let l = + List.sort + (fun (s1, t1) (s2, t2) -> + if s1 = s2 then raise (Error (loc, Multiple_constraints_on_type s1)); + compare s1 s2) + l + in + l, + List.fold_left + (fun mty (s, t) -> + let d = {ptype_params = []; + ptype_cstrs = []; + ptype_kind = Ptype_abstract; + ptype_private = Asttypes.Public; + ptype_manifest = if fake then None else Some t; + ptype_variance = []; + ptype_loc = loc} in + {pmty_desc=Pmty_with (mty, [ Longident.Lident s, Pwith_type d ]); pmty_loc=loc} + ) + {pmty_desc=Pmty_ident p; pmty_loc=loc} + l + (* Translation of type expressions *) let type_variables = ref (Tbl.empty : (string, type_expr) Tbl.t) @@ -123,12 +152,12 @@ let rec transl_type env policy styp = newty (Ttuple(List.map (transl_type env policy) stl)) | Ptyp_constr(lid, stl) -> let (path, decl) = - let lid, env = - match lid with - | Longident.Ldot (Longident.Lident "*predef*", lid) -> - Longident.Lident lid, Env.initial - | _ -> lid, env - in + let lid, env = + match lid with + | Longident.Ldot (Longident.Lident "*predef*", lid) -> + Longident.Lident lid, Env.initial + | _ -> lid, env + in try Env.lookup_type lid env with Not_found -> @@ -320,7 +349,7 @@ let rec transl_type env policy styp = let row = Btype.row_repr row in row.row_fields | {desc=Tvar}, Some(p, _) -> - raise(Error(sty.ptyp_loc, Unbound_type_constructor_2 p)) + raise(Error(sty.ptyp_loc, Unbound_type_constructor_2 p)) | _ -> raise(Error(sty.ptyp_loc, Not_a_variant ty)) in @@ -384,6 +413,14 @@ let rec transl_type env policy styp = let ty' = Btype.newgenty (Tpoly(ty, List.rev ty_list)) in unify_var env (newvar()) ty'; ty' + | Ptyp_package (p, l) -> + let l, mty = create_package_mty true styp.ptyp_loc env (p, l) in + let z = narrow () in + ignore (!transl_modtype env mty); + widen z; + newty (Tpackage (!transl_modtype_longident styp.ptyp_loc env p, + List.map fst l, + List.map (transl_type env policy) (List.map snd l))) and transl_fields env policy seen = function @@ -423,6 +460,8 @@ let make_fixed_univars ty = make_fixed_univars ty; Btype.unmark_type ty +let create_package_mty = create_package_mty false + let globalize_used_variables env fixed = let r = ref [] in Tbl.iter @@ -483,6 +522,7 @@ let transl_simple_type_univars env styp = let transl_simple_type_delayed env styp = univars := []; used_variables := Tbl.empty; let typ = transl_type env Extensible styp in + make_fixed_univars typ; (typ, globalize_used_variables env false) let transl_type_scheme env styp = @@ -559,6 +599,8 @@ let report_error ppf = function (if v.desc = Tvar then "it escapes this scope" else if v.desc = Tunivar 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 | Repeated_method_label s -> fprintf ppf "@[This is the second method `%s' of this object type.@ %s@]" s "Multiple occurences are not allowed." diff --git a/typing/typetexp.mli b/typing/typetexp.mli index 52a32e9f..5687b955 100644 --- a/typing/typetexp.mli +++ b/typing/typetexp.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typetexp.mli 9297 2009-06-12 12:40:55Z garrigue $ *) +(* $Id$ *) (* Typechecking of type expressions for the core language *) @@ -54,8 +54,14 @@ type error = | Variant_tags of string * string | Invalid_variable_name of string | Cannot_quantify of string * Types.type_expr + | Multiple_constraints_on_type of string | Repeated_method_label of string exception Error of Location.t * error val report_error: formatter -> error -> unit + +(* Support for first-class modules. *) +val transl_modtype_longident: (Location.t -> Env.t -> Longident.t -> Path.t) ref (* from Typemod *) +val transl_modtype: (Env.t -> Parsetree.module_type -> Types.module_type) ref (* from Typemod *) +val create_package_mty: Location.t -> Env.t -> Parsetree.package_type -> (string * Parsetree.core_type) list * Parsetree.module_type diff --git a/typing/unused_var.ml b/typing/unused_var.ml index d0c63a33..4339d9b0 100644 --- a/typing/unused_var.ml +++ b/typing/unused_var.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: unused_var.ml 8906 2008-07-09 13:03:38Z mauny $ *) +(* $Id$ *) open Parsetree @@ -69,7 +69,7 @@ let rec get_vars ((vacc, asacc) as acc) p = | Ppat_tuple pl -> List.fold_left get_vars acc pl | Ppat_construct (_, po, _) -> get_vars_option acc po | Ppat_variant (_, po) -> get_vars_option acc po - | Ppat_record ipl -> + | Ppat_record (ipl, cls) -> List.fold_left (fun a (_, p) -> get_vars a p) acc ipl | Ppat_array pl -> List.fold_left get_vars acc pl | Ppat_or (p1, _p2) -> get_vars acc p1 @@ -173,6 +173,9 @@ and expression ppf tbl e = | Pexp_lazy e -> expression ppf tbl e; | Pexp_poly (e, _) -> expression ppf tbl e; | Pexp_object cs -> class_structure ppf tbl cs; + | Pexp_newtype (_, e) -> expression ppf tbl e + | Pexp_pack (me, _) -> module_expr ppf tbl me + | Pexp_open (_, e) -> expression ppf tbl e and expression_option ppf tbl eo = match eo with @@ -221,6 +224,7 @@ and module_expr ppf tbl me = module_expr ppf tbl me1; module_expr ppf tbl me2; | Pmod_constraint (me, _) -> module_expr ppf tbl me + | Pmod_unpack (e, _) -> expression ppf tbl e and class_declaration ppf tbl cd = class_expr ppf tbl cd.pci_expr @@ -244,10 +248,10 @@ and class_structure ppf tbl (p, cfl) = and class_field ppf tbl cf = match cf with - | Pcf_inher (ce, _) -> class_expr ppf tbl ce; - | Pcf_val (_, _, e, _) -> expression ppf tbl e; + | Pcf_inher (_, ce, _) -> class_expr ppf tbl ce; + | Pcf_val (_, _, _, e, _) -> expression ppf tbl e; | Pcf_virt _ | Pcf_valvirt _ -> () - | Pcf_meth (_, _, e, _) -> expression ppf tbl e; + | Pcf_meth (_, _, _, e, _) -> expression ppf tbl e; | Pcf_cstr _ -> () | Pcf_let (recflag, pel, _) -> let_pel ppf tbl recflag pel None; | Pcf_init e -> expression ppf tbl e; diff --git a/typing/unused_var.mli b/typing/unused_var.mli index 6d408686..be36fcca 100644 --- a/typing/unused_var.mli +++ b/typing/unused_var.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: unused_var.mli 7307 2006-01-04 16:55:50Z doligez $ *) +(* $Id$ *) val warn : Format.formatter -> Parsetree.structure -> Parsetree.structure;; (* Warn on unused variables; return the second argument. *) diff --git a/utils/ccomp.ml b/utils/ccomp.ml index 58e4947e..fbbbdf10 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ccomp.ml 9093 2008-10-16 15:57:00Z doligez $ *) +(* $Id$ *) (* Compiling C files and building C libraries *) @@ -24,7 +24,7 @@ let command cmdline = let run_command cmdline = ignore(command cmdline) -(* Build @responsefile to work around Windows limitations on +(* Build @responsefile to work around Windows limitations on command-line length *) let build_diversion lst = let (responsefile, oc) = Filename.open_temp_file "camlresp" "" in diff --git a/utils/ccomp.mli b/utils/ccomp.mli index 47f15059..72ae7131 100644 --- a/utils/ccomp.mli +++ b/utils/ccomp.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ccomp.mli 8768 2008-01-11 16:13:18Z doligez $ *) +(* $Id$ *) (* Compiling C files and building C libraries *) diff --git a/utils/clflags.ml b/utils/clflags.ml index a4c58c43..1074d362 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: clflags.ml 9084 2008-10-15 08:48:51Z xleroy $ *) +(* $Id$ *) (* Command-line parameters *) @@ -44,6 +44,8 @@ and use_prims = ref "" (* -use-prims ... *) and use_runtime = ref "" (* -use-runtime ... *) and principal = ref false (* -principal *) and recursive_types = ref false (* -rectypes *) +and strict_sequence = ref false (* -strict-sequence *) +and applicative_functors = ref true (* -no-app-funct *) and make_runtime = ref false (* -make_runtime *) and gprofile = ref false (* -p *) and c_compiler = ref (None: string option) (* -cc *) @@ -90,4 +92,3 @@ let std_include_dir () = let shared = ref false (* -shared *) let dlcode = ref true (* not -nodynlink *) - diff --git a/utils/clflags.mli b/utils/clflags.mli index 6914904f..d5357ef3 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: clflags.mli 9084 2008-10-15 08:48:51Z xleroy $ *) +(* $Id$ *) val objfiles : string list ref val ccobjs : string list ref @@ -41,6 +41,8 @@ val use_prims : string ref val use_runtime : string ref val principal : bool ref val recursive_types : bool ref +val strict_sequence : bool ref +val applicative_functors : bool ref val make_runtime : bool ref val gprofile : bool ref val c_compiler : string option ref diff --git a/utils/config.mlbuild b/utils/config.mlbuild index d49ff623..c12d834b 100644 --- a/utils/config.mlbuild +++ b/utils/config.mlbuild @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: config.mlbuild 9266 2009-05-19 14:41:21Z doligez $ *) +(* $Id$ *) (***********************************************************************) (** **) @@ -61,13 +61,13 @@ let mkexe = C.mkexe let mkmaindll = C.mkmaindll let exec_magic_number = "Caml1999X008" -and cmi_magic_number = "Caml1999I011" +and cmi_magic_number = "Caml1999I012" and cmo_magic_number = "Caml1999O007" and cma_magic_number = "Caml1999A008" and cmx_magic_number = "Caml1999Y011" and cmxa_magic_number = "Caml1999Z010" -and ast_impl_magic_number = "Caml1999M012" -and ast_intf_magic_number = "Caml1999N011" +and ast_impl_magic_number = "Caml1999M013" +and ast_intf_magic_number = "Caml1999N012" let load_path = ref ([] : string list) diff --git a/utils/config.mli b/utils/config.mli index 92894b65..91e10a04 100644 --- a/utils/config.mli +++ b/utils/config.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: config.mli 8868 2008-04-16 06:50:31Z frisch $ *) +(* $Id$ *) (* System configuration *) @@ -27,12 +27,12 @@ val ccomp_type: string "msvc" (Microsoft Visual C++) "mrc" (Macintosh MPW) *) val bytecomp_c_compiler: string - (* The C compiler to use for compiling C files + (* The C compiler to use for compiling C files with the bytecode compiler *) val bytecomp_c_libraries: string (* The C libraries to link with custom runtimes *) val native_c_compiler: string - (* The C compiler to use for compiling C files + (* The C compiler to use for compiling C files with the native-code compiler *) val native_c_libraries: string (* The C libraries to link with native-code programs *) diff --git a/utils/config.mlp b/utils/config.mlp index 3f6d14ec..ae117612 100644 --- a/utils/config.mlp +++ b/utils/config.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: config.mlp 9260 2009-05-18 09:38:16Z doligez $ *) +(* $Id$ *) (***********************************************************************) (** **) @@ -50,13 +50,13 @@ let mkexe = "%%MKEXE%%" let mkmaindll = "%%MKMAINDLL%%" let exec_magic_number = "Caml1999X008" -and cmi_magic_number = "Caml1999I011" +and cmi_magic_number = "Caml1999I012" and cmo_magic_number = "Caml1999O007" and cma_magic_number = "Caml1999A008" and cmx_magic_number = "Caml1999Y011" and cmxa_magic_number = "Caml1999Z010" -and ast_impl_magic_number = "Caml1999M012" -and ast_intf_magic_number = "Caml1999N011" +and ast_impl_magic_number = "Caml1999M013" +and ast_intf_magic_number = "Caml1999N012" let load_path = ref ([] : string list) diff --git a/utils/consistbl.ml b/utils/consistbl.ml index c9ffaf25..d01d7c87 100644 --- a/utils/consistbl.ml +++ b/utils/consistbl.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: consistbl.ml 5275 2002-11-18 10:41:26Z xleroy $ *) +(* $Id$ *) (* Consistency tables: for checking consistency of module CRCs *) diff --git a/utils/consistbl.mli b/utils/consistbl.mli index 0e58dd57..edaac12f 100644 --- a/utils/consistbl.mli +++ b/utils/consistbl.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: consistbl.mli 5275 2002-11-18 10:41:26Z xleroy $ *) +(* $Id$ *) (* Consistency tables: for checking consistency of module CRCs *) diff --git a/utils/misc.ml b/utils/misc.ml index 04a07125..68ca8e3d 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: misc.ml 7909 2007-02-23 13:44:51Z ertai $ *) +(* $Id$ *) (* Errors *) diff --git a/utils/misc.mli b/utils/misc.mli index 73af6fa9..87f74e25 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: misc.mli 7909 2007-02-23 13:44:51Z ertai $ *) +(* $Id$ *) (* Miscellaneous useful types and functions *) @@ -67,7 +67,7 @@ val copy_file_chunk: in_channel -> out_channel -> int -> unit EOF on [ic]. *) val log2: int -> int - (* [log2 n] returns [s] such that [n = 1 lsl s] + (* [log2 n] returns [s] such that [n = 1 lsl s] if [n] is a power of 2*) val align: int -> int -> int (* [align n a] rounds [n] upwards to a multiple of [a] diff --git a/utils/tbl.ml b/utils/tbl.ml index c6391279..d6689f08 100644 --- a/utils/tbl.ml +++ b/utils/tbl.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: tbl.ml 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) type ('a, 'b) t = Empty diff --git a/utils/tbl.mli b/utils/tbl.mli index e869f26e..21c89b04 100644 --- a/utils/tbl.mli +++ b/utils/tbl.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: tbl.mli 9221 2009-04-02 09:06:33Z xclerc $ *) +(* $Id$ *) (* Association tables from any ordered type to any type. We use the generic ordering to compare keys. *) @@ -22,7 +22,7 @@ val add: 'a -> 'b -> ('a, 'b) t -> ('a, 'b) t val find: 'a -> ('a, 'b) t -> 'b val mem: 'a -> ('a, 'b) t -> bool val remove: 'a -> ('a, 'b) t -> ('a, 'b) t -val iter: ('a -> 'b -> 'c) -> ('a, 'b) t -> unit +val iter: ('a -> 'b -> unit) -> ('a, 'b) t -> unit val map: ('a -> 'b -> 'c) -> ('a, 'b) t -> ('a, 'c) t open Format diff --git a/utils/terminfo.ml b/utils/terminfo.ml index 8f1d5af8..cc179910 100644 --- a/utils/terminfo.ml +++ b/utils/terminfo.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: terminfo.ml 6045 2004-01-01 16:42:43Z doligez $ *) +(* $Id$ *) (* Basic interface to the terminfo database *) diff --git a/utils/terminfo.mli b/utils/terminfo.mli index 9198c13b..ef26b61a 100644 --- a/utils/terminfo.mli +++ b/utils/terminfo.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: terminfo.mli 6045 2004-01-01 16:42:43Z doligez $ *) +(* $Id$ *) (* Basic interface to the terminfo database *) diff --git a/utils/warnings.ml b/utils/warnings.ml index 37851593..8f84369d 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -10,137 +10,221 @@ (* *) (***********************************************************************) -(* $Id: warnings.ml 9074 2008-10-06 13:53:54Z doligez $ *) - -(* Please keep them in alphabetical order *) - -type t = (* A is all *) - | Comment_start (* C *) - | Comment_not_end - | Deprecated (* D *) - | Fragile_match of string (* E *) - | Partial_application (* F *) - | Labels_omitted (* L *) - | Method_override of string list (* M *) - | Partial_match of string (* P *) - | Statement_type (* S *) - | Unused_match (* U *) - | Unused_pat - | Instance_variable_override of string (* V *) - | Illegal_backslash (* X *) - | Implicit_public_methods of string list - | Unerasable_optional_argument - | Undeclared_virtual_method of string - | Not_principal of string - | Without_principality of string - | Unused_argument - | Nonreturning_statement - | Camlp4 of string - | All_clauses_guarded - | Useless_record_with - | Bad_module_name of string - | Unused_var of string (* Y *) - | Unused_var_strict of string (* Z *) -;; +(* $Id$ *) + +(* When you change this, you need to update the documentation: + - man/ocamlc.m in ocaml + - man/ocamlopt.m in ocaml + - manual/cmds/comp.etex in the doc sources + - manual/cmds/native.etex in the doc sources +*) -let letter = function (* 'a' is all *) - | Comment_start - | Comment_not_end -> 'c' - | Deprecated -> 'd' - | Fragile_match _ -> 'e' - | Partial_application -> 'f' - | Labels_omitted -> 'l' - | Method_override _ -> 'm' - | Partial_match _ -> 'p' - | Statement_type -> 's' - | Unused_match - | Unused_pat -> 'u' - | Instance_variable_override _ -> 'v' - | Illegal_backslash - | Implicit_public_methods _ - | Unerasable_optional_argument - | Undeclared_virtual_method _ - | Not_principal _ - | Without_principality _ - | Unused_argument - | Nonreturning_statement - | Camlp4 _ - | Useless_record_with - | Bad_module_name _ - | All_clauses_guarded -> 'x' - | Unused_var _ -> 'y' - | Unused_var_strict _ -> 'z' +type t = + | Comment_start (* 1 *) + | Comment_not_end (* 2 *) + | Deprecated (* 3 *) + | Fragile_match of string (* 4 *) + | Partial_application (* 5 *) + | Labels_omitted (* 6 *) + | Method_override of string list (* 7 *) + | Partial_match of string (* 8 *) + | Non_closed_record_pattern of string (* 9 *) + | Statement_type (* 10 *) + | Unused_match (* 11 *) + | Unused_pat (* 12 *) + | Instance_variable_override of string list (* 13 *) + | Illegal_backslash (* 14 *) + | Implicit_public_methods of string list (* 15 *) + | Unerasable_optional_argument (* 16 *) + | Undeclared_virtual_method of string (* 17 *) + | Not_principal of string (* 18 *) + | Without_principality of string (* 19 *) + | Unused_argument (* 20 *) + | Nonreturning_statement (* 21 *) + | Camlp4 of string (* 22 *) + | Useless_record_with (* 23 *) + | Bad_module_name of string (* 24 *) + | All_clauses_guarded (* 25 *) + | Unused_var of string (* 26 *) + | Unused_var_strict of string (* 27 *) + | Wildcard_arg_to_constant_constr (* 28 *) + | Eol_in_string (* 29 *) ;; -let active = Array.create 27 true;; -let error = Array.create 27 false;; +(* If you remove a warning, leave a hole in the numbering. NEVER change + the numbers of existing warnings. + If you add a new warning, add it at the end with a new number; + do NOT reuse one of the holes. +*) -let translate c = - if c >= 'A' && c <= 'Z' then - (Char.code c - Char.code 'A', true) - else if c >= 'a' && c <= 'z' then - (Char.code c - Char.code 'a', false) - else - (26, false) +let number = function + | Comment_start -> 1 + | Comment_not_end -> 2 + | Deprecated -> 3 + | Fragile_match _ -> 4 + | Partial_application -> 5 + | Labels_omitted -> 6 + | Method_override _ -> 7 + | Partial_match _ -> 8 + | Non_closed_record_pattern _ -> 9 + | Statement_type -> 10 + | Unused_match -> 11 + | Unused_pat -> 12 + | Instance_variable_override _ -> 13 + | Illegal_backslash -> 14 + | Implicit_public_methods _ -> 15 + | Unerasable_optional_argument -> 16 + | Undeclared_virtual_method _ -> 17 + | Not_principal _ -> 18 + | Without_principality _ -> 19 + | Unused_argument -> 20 + | Nonreturning_statement -> 21 + | Camlp4 _ -> 22 + | Useless_record_with -> 23 + | Bad_module_name _ -> 24 + | All_clauses_guarded -> 25 + | Unused_var _ -> 26 + | Unused_var_strict _ -> 27 + | Wildcard_arg_to_constant_constr -> 28 + | Eol_in_string -> 29 ;; -let is_active x = - let (n, _) = translate (letter x) in - active.(n) -;; +let last_warning_number = 29;; +(* Must be the max number returned by the [number] function. *) -let is_error x = - let (n, _) = translate (letter x) in - error.(n) +let letter = function + | 'a' -> + let rec loop i = if i = 0 then [] else i :: loop (i - 1) in + loop last_warning_number + | 'b' -> [] + | 'c' -> [1; 2] + | 'd' -> [3] + | 'e' -> [4] + | 'f' -> [5] + | 'g' -> [] + | 'h' -> [] + | 'i' -> [] + | 'j' -> [] + | 'k' -> [] + | 'l' -> [6] + | 'm' -> [7] + | 'n' -> [] + | 'o' -> [] + | 'p' -> [8] + | 'q' -> [] + | 'r' -> [9] + | 's' -> [10] + | 't' -> [] + | 'u' -> [11; 12] + | 'v' -> [13] + | 'w' -> [] + | 'x' -> [14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25] + | 'y' -> [26] + | 'z' -> [27] + | _ -> assert false ;; -let parse_options iserr s = - let flags = if iserr then error else active in - for i = 0 to String.length s - 1 do - if s.[i] = 'A' then Array.fill flags 0 (Array.length flags) true - else if s.[i] = 'a' then Array.fill flags 0 (Array.length flags) false - else begin - let (n, fl) = translate s.[i] in - flags.(n) <- fl; - end; - done +let active = Array.create (last_warning_number + 1) true;; +let error = Array.create (last_warning_number + 1) false;; + +let is_active x = active.(number x);; +let is_error x = error.(number x);; + +let parse_opt flags s = + let check i = + if i < 1 then raise (Arg.Bad "Bad warning number 0"); + if i > last_warning_number then + raise (Arg.Bad "Bad warning number (too large)"); + in + let set i = flags.(i) <- true in + let clear i = flags.(i) <- false in + let set_all i = active.(i) <- true; error.(i) <- true in + let error () = raise (Arg.Bad "Ill-formed list of warnings") in + let rec loop i = + if i >= String.length s then () else + match s.[i] with + | 'A' .. 'Z' -> + List.iter set (letter (Char.lowercase s.[i])); + loop (i+1) + | 'a' .. 'z' -> + List.iter clear (letter s.[i]); + loop (i+1) + | '+' -> loop_letter_num set (i+1) + | '-' -> loop_letter_num clear (i+1) + | '@' -> loop_letter_num set_all (i+1) + | c -> error () + and loop_letter_num myset i = + if i >= String.length s then error () else + match s.[i] with + | '0' .. '9' -> loop_num myset i 0 + | 'A' .. 'Z' -> + List.iter myset (letter (Char.lowercase s.[i])); + loop (i+1) + | 'a' .. 'z' -> + List.iter myset (letter s.[i]); + loop (i+1) + | _ -> error () + and loop_num myset i n = + if i >= String.length s then myset n else + match s.[i] with + | '0' .. '9' -> + let nn = 10 * n + Char.code s.[i] - Char.code '0' in + check nn; + loop_num myset (i+1) nn + | _ -> myset n; loop i + in + loop 0 ;; -let () = parse_options false "elz";; +let parse_options errflag s = parse_opt (if errflag then error else active) s;; + +let defaults_w = "+a-4-6-9-27-28-29";; +let defaults_warn_error = "-a";; + +let () = parse_options false defaults_w;; +let () = parse_options true defaults_warn_error;; let message = function - | Partial_match "" -> "this pattern-matching is not exhaustive." - | Partial_match s -> - "this pattern-matching is not exhaustive.\n\ - Here is an example of a value that is not matched:\n" ^ s - | Unused_match -> "this match case is unused." - | Unused_pat -> "this sub-pattern is unused." + | Comment_start -> "this is the start of a comment." + | Comment_not_end -> "this is not the end of a comment." + | Deprecated -> "this syntax is deprecated." | Fragile_match "" -> "this pattern-matching is fragile." | Fragile_match s -> "this pattern-matching is fragile.\n\ It will remain exhaustive when constructors are added to type " ^ s ^ "." + | Partial_application -> + "this function application is partial,\n\ + maybe some arguments are missing." | Labels_omitted -> "labels were omitted in the application of this function." | Method_override [lab] -> - "the method " ^ lab ^ " is overriden in the same class." + "the method " ^ lab ^ " is overridden." | Method_override (cname :: slist) -> String.concat " " ("the following methods are overriden by the class" :: cname :: ":\n " :: slist) | Method_override [] -> assert false - | Instance_variable_override lab -> - "the instance variable " ^ lab ^ " is overriden.\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." + | Partial_match "" -> "this pattern-matching is not exhaustive." + | Partial_match s -> + "this pattern-matching is not exhaustive.\n\ + Here is an example of a value that is not matched:\n" ^ s + | Non_closed_record_pattern s -> + "the following labels are not bound in this record pattern:\n" ^ s ^ + "\nEither bind these labels explicitly or add `; _' to the pattern." | Statement_type -> "this expression should have type unit." - | Comment_start -> "this is the start of a comment." - | Comment_not_end -> "this is not the end of a comment." - | Deprecated -> "this syntax is deprecated." - | Unused_var v | Unused_var_strict v -> "unused variable " ^ v ^ "." + | Unused_match -> "this match case is unused." + | Unused_pat -> "this sub-pattern is unused." + | Instance_variable_override [lab] -> + "the instance variable " ^ lab ^ " is overridden.\n" ^ + "The behaviour changed in ocaml 3.10 (previous behaviour was hiding.)" + | Instance_variable_override (cname :: slist) -> + String.concat " " + ("the following instance variables are overriden by the class" + :: cname :: ":\n " :: slist) ^ + "\nThe behaviour changed in ocaml 3.10 (previous behaviour was hiding.)" + | Instance_variable_override [] -> assert false | Illegal_backslash -> "illegal backslash escape in string." | Implicit_public_methods l -> "the following private methods were made public implicitly:\n " @@ -153,20 +237,25 @@ let message = function | Nonreturning_statement -> "this statement never returns (or has an unsound type.)" | Camlp4 s -> s - | All_clauses_guarded -> - "bad style, all clauses in this pattern-matching are guarded." | Useless_record_with -> "this record is defined by a `with' expression,\n\ but no fields are borrowed from the original." | Bad_module_name (modname) -> "bad source file name: \"" ^ modname ^ "\" is not a valid module name." + | All_clauses_guarded -> + "bad style, all clauses in this pattern-matching are guarded." + | Unused_var v | Unused_var_strict v -> "unused variable " ^ v ^ "." + | Wildcard_arg_to_constant_constr -> + "wildcard pattern given as argument to a constant constructor" + | Eol_in_string -> + "unescaped end-of-line in a string constant (non-portable code)" ;; let nerrors = ref 0;; let print ppf w = let msg = message w in - let flag = Char.uppercase (letter 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; @@ -176,11 +265,10 @@ let print ppf w = in let countnewline x = incr newlines; newline x in Format.pp_set_all_formatter_output_functions ppf out flush countnewline space; - Format.fprintf ppf "%c: %s" flag msg; + Format.fprintf ppf "%d: %s" num msg; Format.pp_print_flush ppf (); Format.pp_set_all_formatter_output_functions ppf out flush newline space; - let (n, _) = translate (letter w) in - if error.(n) then incr nerrors; + if error.(num) then incr nerrors; !newlines ;; diff --git a/utils/warnings.mli b/utils/warnings.mli index 3e7a61e9..0664788e 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -10,37 +10,40 @@ (* *) (***********************************************************************) -(* $Id: warnings.mli 9074 2008-10-06 13:53:54Z doligez $ *) +(* $Id$ *) open Format -type t = (* A is all *) - | Comment_start (* C *) - | Comment_not_end - | Deprecated (* D *) - | Fragile_match of string (* E *) - | Partial_application (* F *) - | Labels_omitted (* L *) - | Method_override of string list (* M *) - | Partial_match of string (* P *) - | Statement_type (* S *) - | Unused_match (* U *) - | Unused_pat - | Instance_variable_override of string (* V *) - | Illegal_backslash (* X *) - | Implicit_public_methods of string list - | Unerasable_optional_argument - | Undeclared_virtual_method of string - | Not_principal of string - | Without_principality of string - | Unused_argument - | Nonreturning_statement - | Camlp4 of string - | All_clauses_guarded - | Useless_record_with - | Bad_module_name of string - | Unused_var of string (* Y *) - | Unused_var_strict of string (* Z *) +type t = + | Comment_start (* 1 *) + | Comment_not_end (* 2 *) + | Deprecated (* 3 *) + | Fragile_match of string (* 4 *) + | Partial_application (* 5 *) + | Labels_omitted (* 6 *) + | Method_override of string list (* 7 *) + | Partial_match of string (* 8 *) + | Non_closed_record_pattern of string (* 9 *) + | Statement_type (* 10 *) + | Unused_match (* 11 *) + | Unused_pat (* 12 *) + | Instance_variable_override of string list (* 13 *) + | Illegal_backslash (* 14 *) + | Implicit_public_methods of string list (* 15 *) + | Unerasable_optional_argument (* 16 *) + | Undeclared_virtual_method of string (* 17 *) + | Not_principal of string (* 18 *) + | Without_principality of string (* 19 *) + | Unused_argument (* 20 *) + | Nonreturning_statement (* 21 *) + | Camlp4 of string (* 22 *) + | Useless_record_with (* 23 *) + | Bad_module_name of string (* 24 *) + | All_clauses_guarded (* 25 *) + | Unused_var of string (* 26 *) + | Unused_var_strict of string (* 27 *) + | Wildcard_arg_to_constant_constr (* 28 *) + | Eol_in_string (* 29 *) ;; val parse_options : bool -> string -> unit;; @@ -48,6 +51,9 @@ val parse_options : bool -> string -> unit;; val is_active : t -> bool;; 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 *) diff --git a/win32caml/Makefile b/win32caml/Makefile index 518ce9e7..a73b7315 100644 --- a/win32caml/Makefile +++ b/win32caml/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 8521 2007-11-15 13:21:15Z frisch $ +# $Id$ include ../config/Makefile diff --git a/win32caml/inria.h b/win32caml/inria.h index 7f8e6efb..095cbcc7 100644 --- a/win32caml/inria.h +++ b/win32caml/inria.h @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: inria.h 9079 2008-10-08 13:09:39Z doligez $ */ +/* $Id$ */ /*------------------------------------------------------------------------ Module: D:\lcc\inria\inria.h diff --git a/win32caml/libgraph.h b/win32caml/libgraph.h index f36c0752..3bfaff30 100644 --- a/win32caml/libgraph.h +++ b/win32caml/libgraph.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: libgraph.h 5029 2002-07-23 14:12:03Z doligez $ */ +/* $Id$ */ #include #include diff --git a/win32caml/menu.c b/win32caml/menu.c index ba7af01e..9ab0f5f3 100644 --- a/win32caml/menu.c +++ b/win32caml/menu.c @@ -15,7 +15,7 @@ /* Began 14 Sept 2003 - watford@uiuc.edu */ /***********************************************************************/ -/* $Id: menu.c 7411 2006-05-09 16:03:48Z xleroy $ */ +/* $Id$ */ #include #include diff --git a/win32caml/ocaml.c b/win32caml/ocaml.c index cd50cb9d..2a2e04a5 100644 --- a/win32caml/ocaml.c +++ b/win32caml/ocaml.c @@ -14,7 +14,7 @@ /* Began 14 Sept 2003 - watford@uiuc.edu */ /***********************************************************************/ -/* $Id: ocaml.c 7411 2006-05-09 16:03:48Z xleroy $ */ +/* $Id$ */ /*@@ Wedit generated application. Written Sat Jun 02 18:22:38 2001 @@header: D:\lcc\inria\inriares.h diff --git a/win32caml/startocaml.c b/win32caml/startocaml.c index 8b0ae8c5..f1a3562d 100644 --- a/win32caml/startocaml.c +++ b/win32caml/startocaml.c @@ -15,7 +15,7 @@ /* Began 14 Sept 2003 - watford@uiuc.edu */ /***********************************************************************/ -/* $Id: startocaml.c 6824 2005-03-24 17:20:54Z doligez $ */ +/* $Id$ */ #include #include diff --git a/yacc/Makefile b/yacc/Makefile index c51d0fc2..322c540f 100644 --- a/yacc/Makefile +++ b/yacc/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile 7833 2007-02-07 14:49:42Z doligez $ +# $Id$ # Makefile for the parser generator. diff --git a/yacc/Makefile.nt b/yacc/Makefile.nt index c90e17da..ec1cbfb4 100644 --- a/yacc/Makefile.nt +++ b/yacc/Makefile.nt @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt 8521 2007-11-15 13:21:15Z frisch $ +# $Id$ # Makefile for the parser generator. diff --git a/yacc/closure.c b/yacc/closure.c index dfb32be1..1b7926a0 100644 --- a/yacc/closure.c +++ b/yacc/closure.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: closure.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include "defs.h" diff --git a/yacc/defs.h b/yacc/defs.h index 522c54c4..1be27d1a 100644 --- a/yacc/defs.h +++ b/yacc/defs.h @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: defs.h 6244 2004-04-21 23:26:06Z doligez $ */ +/* $Id$ */ #include #include @@ -356,4 +356,3 @@ extern void unterminated_union (int u_lineno, char *u_line, char *u_cptr); extern void used_reserved (char *s); extern void verbose (void); extern void write_section (char **section); - diff --git a/yacc/error.c b/yacc/error.c index bae9c194..ae0b77ac 100644 --- a/yacc/error.c +++ b/yacc/error.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: error.c 6654 2004-11-02 10:48:14Z doligez $ */ +/* $Id$ */ /* routines for printing error messages */ diff --git a/yacc/lalr.c b/yacc/lalr.c index 196fa37d..f87afb1d 100644 --- a/yacc/lalr.c +++ b/yacc/lalr.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: lalr.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include "defs.h" @@ -336,7 +336,7 @@ void initialize_F(void) if (nullable[symbol]) edge[nedges++] = map_goto(stateno, symbol); } - + if (nedges) { reads[i] = rp = NEW2(nedges + 1, short); diff --git a/yacc/lr0.c b/yacc/lr0.c index 58bf42ef..e05fcb07 100644 --- a/yacc/lr0.c +++ b/yacc/lr0.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: lr0.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include "defs.h" diff --git a/yacc/main.c b/yacc/main.c index 818be35e..fe7ad889 100644 --- a/yacc/main.c +++ b/yacc/main.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: main.c 7382 2006-04-16 23:28:22Z doligez $ */ +/* $Id$ */ #include #include @@ -55,6 +55,14 @@ char *text_file_name; char *union_file_name; char *verbose_file_name; +#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) || (__APPLE__) +#define HAVE_MKSTEMP +#endif + +#ifdef HAVE_MKSTEMP +int action_fd = -1, entry_fd = -1, text_fd = -1, union_fd = -1; +#endif + FILE *action_file; /* a temp file, used to save actions associated */ /* with rules until the parser is written */ FILE *entry_file; @@ -93,16 +101,29 @@ char *rassoc; short **derives; char *nullable; +#if !defined(HAVE_MKSTEMP) extern char *mktemp(char *); +#endif extern char *getenv(const char *); void done(int k) { +#ifdef HAVE_MKSTEMP + if (action_fd != -1) + unlink(action_file_name); + if (entry_fd != -1) + unlink(entry_file_name); + if (text_fd != -1) + unlink(text_file_name); + if (union_fd != -1) + unlink(union_file_name); +#else if (action_file) { fclose(action_file); unlink(action_file_name); } if (entry_file) { fclose(entry_file); unlink(entry_file_name); } if (text_file) { fclose(text_file); unlink(text_file_name); } if (union_file) { fclose(union_file); unlink(union_file_name); } +#endif if (output_file && k > 0) { fclose(output_file); unlink(output_file_name); } @@ -302,10 +323,25 @@ void create_file_names(void) union_file_name[len + 5] = 'u'; #ifndef NO_UNIX +#ifdef HAVE_MKSTEMP + action_fd = mkstemp(action_file_name); + if (action_fd == -1) + open_error(action_file_name); + entry_fd = mkstemp(entry_file_name); + if (entry_fd == -1) + open_error(entry_file_name); + text_fd = mkstemp(text_file_name); + if (text_fd == -1) + open_error(text_file_name); + union_fd = mkstemp(union_file_name); + if (union_fd == -1) + open_error(union_file_name); +#else mktemp(action_file_name); mktemp(entry_file_name); mktemp(text_file_name); mktemp(union_file_name); +#endif #endif len = strlen(file_prefix); @@ -347,15 +383,27 @@ void open_files(void) open_error(input_file_name); } +#ifdef HAVE_MKSTEMP + action_file = fdopen(action_fd, "w"); +#else action_file = fopen(action_file_name, "w"); +#endif if (action_file == 0) open_error(action_file_name); +#ifdef HAVE_MKSTEMP + entry_file = fdopen(entry_fd, "w"); +#else entry_file = fopen(entry_file_name, "w"); +#endif if (entry_file == 0) open_error(entry_file_name); +#ifdef HAVE_MKSTEMP + text_file = fdopen(text_fd, "w"); +#else text_file = fopen(text_file_name, "w"); +#endif if (text_file == 0) open_error(text_file_name); @@ -371,7 +419,11 @@ void open_files(void) defines_file = fopen(defines_file_name, "w"); if (defines_file == 0) open_error(defines_file_name); +#ifdef HAVE_MKSTEMP + union_file = fdopen(union_fd, "w"); +#else union_file = fopen(union_file_name, "w"); +#endif if (union_file == 0) open_error(union_file_name); } diff --git a/yacc/mkpar.c b/yacc/mkpar.c index 1086a632..1f9759e1 100644 --- a/yacc/mkpar.c +++ b/yacc/mkpar.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: mkpar.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include "defs.h" @@ -312,7 +312,7 @@ sole_reduction(int stateno) register action *p; count = 0; - ruleno = 0; + ruleno = 0; for (p = parser[stateno]; p; p = p->next) { if (p->action_code == SHIFT && p->suppressed == 0) @@ -341,7 +341,7 @@ void defreds(void) for (i = 0; i < nstates; i++) defred[i] = sole_reduction(i); } - + void free_action_row(register action *p) { register action *q; @@ -363,4 +363,3 @@ void free_parser(void) FREE(parser); } - diff --git a/yacc/output.c b/yacc/output.c index b293ae74..00d61ac9 100644 --- a/yacc/output.c +++ b/yacc/output.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: output.c 5232 2002-11-02 22:36:46Z doligez $ */ +/* $Id$ */ #include "defs.h" @@ -114,7 +114,7 @@ void output_rule_data(void) register int i; register int j; - + fprintf(output_file, "let yylhs = \""); output_short(symbol_value[start_symbol]); diff --git a/yacc/reader.c b/yacc/reader.c index b4990585..d3c27557 100644 --- a/yacc/reader.c +++ b/yacc/reader.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: reader.c 9271 2009-05-20 11:58:43Z doligez $ */ +/* $Id$ */ #include #include "defs.h" diff --git a/yacc/skeleton.c b/yacc/skeleton.c index 7b12a633..86e152ac 100644 --- a/yacc/skeleton.c +++ b/yacc/skeleton.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: skeleton.c 7019 2005-08-13 20:59:37Z doligez $ */ +/* $Id$ */ #include "defs.h" diff --git a/yacc/symtab.c b/yacc/symtab.c index 92ad7d39..87e280a0 100644 --- a/yacc/symtab.c +++ b/yacc/symtab.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: symtab.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include #include "defs.h" diff --git a/yacc/verbose.c b/yacc/verbose.c index a1219793..0a1850ff 100644 --- a/yacc/verbose.c +++ b/yacc/verbose.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: verbose.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include "defs.h" @@ -347,4 +347,3 @@ void print_gotos(int stateno) fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k); } } - diff --git a/yacc/warshall.c b/yacc/warshall.c index f1caabb6..5b8f10c8 100644 --- a/yacc/warshall.c +++ b/yacc/warshall.c @@ -12,7 +12,7 @@ /* Based on public-domain code from Berkeley Yacc */ -/* $Id: warshall.c 3573 2001-07-12 12:54:24Z doligez $ */ +/* $Id$ */ #include "defs.h" -- 2.30.2

kBJ=Po|KeA9K9I*%9O+5D{Y_Tid9<2#m57^xj+!oN~ymQX)4|*TSt_EcA&~6XrcE!GLZ0n02oasCmoF9;*Q=`+EZLzy7 zsQ;H|EDnv;S~hWZezYmh^s$K(oBS37>nnk_%>LG_Ti#=1d+x6LvoUaY zjJ-ei2DogU`Ww>oNj&&e|1w;}u=d4C6W6ZEhi31_z*#n$_qo2&AH1~cqvNKaI_769 zCl=za@e`Nsxj(+2o*t+hHpD}1?+9?y8W(!TxO6VA?+)0ikMxQWJ@n(bA<*cs*0}iI zpy5SldE!Ub_n9pLd3jQ^^6}(p{<8G7!R8nXGW5wI(8tf_)md}Res$AfZl7KJ*`N&ty8*+mny_ z+_Ue?nq1Md-r2RdRA+q_^OMQ4^;qrmpMO2a4{LIFPasa#)ZZW0r?vR21G(q(vfMYe z>S5$(er?bgeObm@>q0+&kKUWVgCZZ5k)y4FR(YR6>fx+uO>E2?Bl5Qew*>CW6#?$8 z!SQp6Epi(I&1Xd4qW1RrE$&^Tmp*ym--Cf>jF&z6!O7ZK%kH#V;Ctgm&RooTj*iwi zd#iyw(EnKTz)pF!PWZ!b+{9-~ARhRU$B}=!s5BOz`AAQ@%+IMc` zLFQ%CI=%R7WSxcT8+p;+xZx;n=5(3Q<0{A9=VyJ$a1kH+)IM7pTh_#mKJ(gho)67~ zTGH-6-Yxt#d@$e-pI3wWhnu|k%-b2970mbfy(8EV><;z>&H+B+g9pFO`EA~P=jmp9 ze*SRQ@F#O|fMaFkNo(8>WnBH@LBE_e-_GJ7zV^G$rxyhEVe7Q-EUxZeYr@z%pQ^8N ze45LRaVzh6Y`hz_Ew+uBTv?}ce)e@)`$QlTvvoSqSA2Ld|Ot)G3g{ed+-ew9&gHwGI2#y44f?B5Wuxhr6U&hfi^ zrYH2VDL2|^lWpfu59a5`c(aM$N}$ya|ErG;GMY7e z`;Ick<=3KfoZmOi`RHDh?`x-ZakjT{+S`!+!kLaQ%3K`D`5k6;{L}npv~i73KRvDa znY4c1pS3YI@0`t#%;v9~&0m?hIF9jNnaS*$&Ckjlx8}QkZk>4X^HbA*JB*w->;3$t z-!k>v)APf-^aIm>SIiq<-@b9u(fR$e`P*mnLz%Nx`CBq?jfmfY%{6X%FX^l^{_j~yVF!VK#&i>13ZRGLG(^~Hjx&L!o6GJ*08@2tt)1JDu zw|>n)j&@wt9Fd+~I3clzr6)6<^!lHNVT-f!hEI9e;8aqr{P ze`BpN`RkLcxiilm^n5gXW9>dTo4;o^f75J!a5ld=b2hG;Y>4aCS!#a8~Og!Z2lK#^Y_o@_sr(6%bbmJxPG>O$!z|#+5Erd4;4o~ zzdf7(X6Af{-toTW`?DrizKiJn%%(pW;N#8uNX{Qkzd6uXHMO@X#GpnG2+*6_Re zOM%X7Z=US4-On6v!;RB={eEudXJ@_hXHIq%IC~!ov@L=8|Iglefaz6L>px^tCL$;$ zA=J!dl8{CV?Gk~UFi8L-AWDK1gF1ms3Qa|&2SE_U-W4qOD%Y#rt6s5p#f}Jey%tpL zh+exQ=Kub_*>6}`o-;GwWWf9UANTXT*?Xu+5X704@-hR`>`zW&<_p|JnmOPk2WJ9``4_#ev8D36I*dAG;J@ zw2wSyIi7j&D#2@ccg{RMM`RwK|Kahz=CykkUbN45Xw2obA{TjGg%@LBy^+WHVBZ+$ zo*Eu^eU_V9!{c*8mh;`sxv&ksvtvHyl(msJw}!_VWREB}zwlz-xW|!;ynPFAy?WcS zU*Vk{c>5RLQv&aR!h3SyEhxOF2Ht^%7uOz?c*Np*f%AoZktP?MG5p*{xIX=RpU+M7 zrJ^~1mS3Odj}aa3;6uthv3W*Wr)zA?tiZn)e_^pdjP{n|pWFa6o2Z_4L6 zW&V=VUsn2!rGIAWuPXherN6v^{`bQFkJ7)j^#57cski+vEBsfKp0h_>UfjYYOdi@Z3VbsPy*N zeA9W}@#rh-&MbY-^SZ)!-<0qEBIo*W?>aE;eVvC~A5H!}ujqe4>HoF#Z!GN1lAlTP!lH!`%U=! zpBb(cf2zQJutebA;5qV;LT_8>?bS10C2;;(H%?&PY(c79KkH@P!-WOHEMbyxu)sX; zB(&3nDFXT~6RZm!y3k4EornEy6R6uRVWL3ed?Uv`+*#bEw7CB9qHh(j3BTqGtU>lp z{e0vU_1g(+gf0QU{zX_WbPCf2?z3*;Q~}-GqlXCiRy)uQYr?54Q9R zy9?~KP{6hx0exT(0a?$phFFdl<_L3zZ3<$}SbMU7SNJttEG@F=Lzo=Vmptg{;4H|CV3q5&1>Vf+@^RW>`JE-5BLu|qia*2<<0{e_4m*fi_#Mrq* zm-BUw#?A$Cq)w?VpDW8X$=G)EbAGsIrU}S*3eq__)$o;=U?cl<2sHS63F8Ig1?@ZUVvSb{ zM+v(KagH_QlzS6hT*Ue$$U~$K%q2kWI-9>JrdfST)(caGmdq-0KB<3~t#s2HOQct7N)3p^i(^Xwo#-9o;@v6pu( zbTj4|OnuOQqV%_@C!bw{Wj?8~pZmOzVhcL(b*N|YSjq5S&?V4_C-H-auG59##3TE& ztJd+1<$1#Is{M|0vFH^7|7KjDdOx?3$JRvxHs$vQ=6Q$3C+tHH@n*~%J#)llmCzyJ z13m92pAv}4$pTWy%@dXh+`-!j_)e@pEg*{?KbNovJ)aTs962X%yyLSUaYN5%1#IdR z$j|ixG3gT6AN!#D${4>H$M=UNqOonMkUvAx18;Cc1VKcVO z5gZ5W&OUu!GEMsMDcU}H82WB)Lm#%ePOt%=Z433)Baovn2-v+!*g;q!kOSs!6XF~- zL_X2$JYB0Xdvyz(wMw9!CN#oyAbO8#FdaNe;Q{ltzKVjDXB+3^~U zS+iE?6WA9yVtbXakMJbn6oGa4jh)mf_Mm^dz`0{z;y|rpC%V}CLcuX(FYX1J?@rcX z7md6)miWfL+*#Cz<3R5?p#wXZr*7s8?7{w5>bp1av7=kCUfViTJmQ$`#6Q{+0iUrK z`|vsH!ES89zN~|FH0!8aTjw)&Zxrys_OcH#CKkk>m^%j8V}GV-+>SrQF#A(y6EWN< zM4KFsUhyv$IG6m}dVT6=3-~`rm@BYujnGv8#2a9Hk3jP|VJ$XNQ(r86?%uJ&ECJiR z4?KYE?E*UEU5#$^aemNA&e)SNatj4&&U%SAGQ=C5JU@^p7x)QI703^KWXNBx1#*up z^IsC!-)8{cmxaXwt!n)_ptGZl>&^sw;5+NTB5bW)UzLt**Vn`wu3hBY@#b7j7Kjt) zlh~T)*m8e=UBK>2py8);xsAqPses-k0=jwyd>?rBxA(KtsYS=wqJ!9dL*O}!jnow} zogt8OY5^PAlf9vNM#q}?rfBqhtMvb)9-q1dbg+*3Zws7R&Trm}J<*wcM-Q^Zjv6AK z$VDFUWFN1kX242;^^BJYoOS%5C!PSEQ5X7&#XJGOzoYZa{6Ycw9wExJH~x^z?+BcG zY=Qo+5NrHFzQq3Zr<%RB2 z&$*x`*#Gh}-dR2QgnyBMJ=AHRdVFJ!Hd|nfU&PCPp$ogQ$8*?<{n+jLUZioCfNeDE zo1^huf&Jrpat^$HKaFPytmm0P^Bm`?TOhtNy_I`nbF+Y5mRqJVay0fQ|K8s*xQ0nJ zY7?Gm@(ztYe7{vVS8yJ=A36oj>JJ6)sbMR>*v)$6!5P9k1>2$FX1)CyXBpx%4u^quXCC+D5@D7= zjHd|jjuxmv>K$=vj9C6uVBUNUH{T=Hw^TgqW4?|b_rZs#&+^znZPw{xju5ZE6c zjhdq#oAx9pPY~E^FJY~K9^3R3jV;4DW9<5YK24yGunU^^zC(l`3FL*dajJkl%wsP- zcaMFE{K-WI`SAkzvroj9hEL27=F`9!FIlS}})#Hn0?R%7uzMm&q zVudco*y=c(qcL&#vEaM$OpP6f^%}Eooe<+-evAWah^6B&Nn;vuz~AMD@v4#9+yU~BK zVB4@8-X((VuUqqynl&$OScCsR74Q{%d2Uj-odR<|6Y`zU`HOL#B|4uw*8W^*()$a| zjYKc|K1<-PAZDgD+-&pR8V^_Z8p$3i5M%Ck-#wfcc#jm2nI>!yb`|gmS@Pa15I17- zbb)hZUC71x3q+%X{j7uirV8wrq~nF42HxO%VyAJz-_Ks;^}o+jWg=b5wb`y z=kT>#Kqs=~jX9qy&P|?kT-*(b)> zitX4+EU6XfF2Q#b=N5mw2YF#%))Q~?fS<&%5@@pp_IK^&ztj1RRGTM?Ccfl>HSDoN z;X$K|zgx*X_FLu;`fN*{z0ZfrXW#kau?Dm`wEe{VGos5Y+ zwCy05(Dq?+p{Ysa$uaZPAM`GT=Kg{v_sazGi%uGR>+?RgXQ-O8oc*CkH}=!8A02!~ z{guGkxJ1VAUV@F(9JWz|)MJl8&Q1}KVQz!4QAy#QfHCVTfwo?#7^tlkDh6tt)tSOv z0iD=Y3A9s%*}_WSRnDtMi1irRGyk&Cj(c-^@g6U(aw8nuXjzZ0^5wh#yv%D-iJM| zgrVkG*k;$nbj>-&_z2%NaGuB$=Z87s5$9OjB(JH>_gS~b*s`Sbu}BVhzGwe7tB=x zZMLvYYcy~cey?#==s0(cc&7>6D>U|go%Y85>jXa+;{AyKk?s^tqm~v6#HLU1KC8oc zp2oEAYmZou_;iUtJg|lJ`0n$BtmDOg=#29lL@yM0Ua&8s;(|@A?-s@i2MFlGUTFJY^(?P zwu?PIzD#4z6EzuS*xxd7%rgO+{gw;FqeqB5&L(!*H{{HtmTnh_Kl>3kbkO2`cftT` zvklb6r2;W$uY-j@2=M!b{LH~7_PRsBzefl(`&6gzkD4E@zP(%8?$@_obhhtL;=vz| zeZ+%i`|9-lS@XluM@)$=&HC1AZ2LMjrhc{+h!O818-)D?>Y8{>6KL(M=Nx%G&t#g{ z$9S{9&t=?yq4=zi_FpZUHbEfg^os-<&mD>g*4z_dO(4rpBp^nXv?@m9IOgsl( zN347==5rO}_z=lCmfXG6EAuq?#K?T^JQ{p_hmXyi=e&pGh%S#W(-?n!mL3}BI1iSK zW6p2WS>ar=f8BY^^&a!dzU1aF!f?;eaO(YD>02-K3r#k2zGI&4b366!^*jqW1H{<( z+a!&7KGo#}xmdrfbqm=2z>5jj1K4g zRE@EpnmD9Z6CGIS-=)->J%K`b2Vlk_{1pN8tubw zbPi@8F+z@>hJDt-y1xpJH+7o*if5j&eZ&5Ep7900nx4tjIs4$xwE{j*7y1P1-1h-K zLtiRz#%BneZT8|>=eoE`V{{^qU9Mwv!$UWIV^>}qWo-vCtaEPggZ#n2NWhlwmiGhV z$J`pB$uCW9_7xr6an#5>f%Z1(Vn5UT+kBBeMl|`kPoV!>={Kp5atqSBnTgInOTJSd zZsK}=ZVXMG5)1AdoTeV{5;zCMk=SEL-8sN7)@`G8$Trp5Sj|({LpIZoEB$!&F@7g0 ze(XmcH8o~&itq3B^V>Loz3909oI=O=PmrRK#DAjJHN`*fxlgj;qV)6LLkmr898>4P zvD~5fOzwA(yyw}6b(UjHY&fI$mVbY6H1mdj?tl8-1oFtY6+Fc!6_DOtw`l z$RBsB-|NrTm^1y*nz@B#Zo8T};=#J@HHU8EQVBGkJ=~kbi5ejOjOm>N;^rKn%Q={+ zv2#E^$N}@LCs#2ir^`)51--eJFy2e#8Tqu(~Ow{6Bw+l-yI89TArHnGMwq02V0FE*hY z%oC``ccgz~^o63?hk0Upspx+7oSR<>=s{<98DpPy?Jrs8$$#AA;o{>f{3!oEeb*Nr z`?)6$$Usj{y>%l~H*b03(KJu3vmcF|>?#~4JWS3~`+rg4&rv^DAU?!krNA0!_Qrqu z1wv056I*!1r4nef1*vPT^Vqu48+9{A2XR72-e-E5tJKq6Pw2%i>t$@cQ_39n<0o^r z(>;2br&gG^Z|?DNZ-JV#56E#xj1yJ|eqR{d9&7>65@@Wk9D11Z`!Bw;A2uyB0oL*5kU8kP4+?_s0oPA;zX>vxpQoyDxpJ|^V_CY`E!GVI$5c%;uz7daE0=gUn zWVp*519UhB_Jy_FljjP|^Zv&jy}<`^>Ws zzlp_QejlKDV$0n{n=cRpa&xBY;6|ZO<9>m?a~_b3d0>C%A=e^j&-p?QP~Vov2F^46 zB7w#^W{;SYxOR8VIae2I%o*quSmT&+u3SUdgg@{+ALn9yp#!=30%PLxi4qU$3Ok4g z_R^>=o{^lfZh^JtQTOoZPZ9PL)(HCw zPyst=mL*2F3-ONNJfnwZIqRgRu*3KKsT$7~;2$F3Gye4ojyths9y#Zp{NXQt!?S+& z#b)cpT=cTOPA~K5B?dI~($)&-oGEY?o*`T!;3s>m7Cev5%%dL}^r3f-Ft?1Mndj_~ z-wR4_9k$zZPt|TQ$d zSQGgoYu`JNpC)jRP^S#2dHX<~s1JPS`Qkf3FMnPzDl4Gf6h1jMFNdHvJZ0T zv_8(Y_u{N{39O^xC;8#rvLEXlbK-A%xof^4pqq06<_q}78ouL#PGW){?86pl>##k; z@ef^nf@9u}U#zS12U~5+Q2yLe?k4*)UTbMf1bDrI{Ww8mVzsw`-Hspo(TF`Vv~Gcz zqhp?c4Bw$fW}z@ipcZKOPHdw-JnSNE1(OTY3ybD^Spgx9$%LTt{d`Q_x#McaQujKx8U>Pvq4-x zqj=Nf4`;)*gq@QM9IJNxLMJ{%yYXYVc9Ual!R{3TcM|%V;>3P+x>;j?8Gly((%WC+ zo8yM>)DUvy8`*AQkw9~e)UD%giR*|de%Gy`R;lwo;b8)M^b5QTFsAWbMxSdKKapXb zWw=}MeFq7WBlhePJa1l4;Z0U=U%Ylltu>E2nJ0+#cYlY1yJwR4j;V&N|K}#s+v?}Q zk=`@WMIFFFa3hjQ@_m9^IpMzH0q!6VT@If zyvzQ#kk8(>;vFLFEE#O3=C2oM*v2{MY&NZ%Jj6OJ-Fzl~t(sy#YK$}TUD52x{!_%@ zY!Vk@32&FcEx_M1@i_V>&SYmVG-2SA@#XmSYs7}3t*TG6BN z%%BcAYkQY|PU)#}`1_Q8ztSI2`U6XkUC40`=npIXBh;f~itw*`o{omCI~U#PWH0Vq zdd>^IpKslTc0Z%gvr0eIb1lnd9}g;es1^35Hs}v8J!2T?sVL$F<|d$G4Lt=y~$!wdmm; zp1ZzVpx)tO1NS^}qBhyz=dk~uV?|)gyDG+nnpvTkI$qE#107|X#+-exZ<6^(@ki6P z2h#_h6WmdCapf$NC+;()YRrCmSA@q|F>iPAqP;N=59ZxBO*Ua0=as&v^bh1c&pt<# zeTX0Q;?nn)erf5CF8#5kUtW6dKGvO3`V&k4*wU{k{mG^0{Rny9Yv_5uqCcbbPb@um z6Z|tvzozu$2mbofpI!QMOMiappHlh@O8@lIUs(E!OMhwUFIUeUUI{eraALt7e)2X0 zKZ9fZIE{JMbJt?yw!(pe@6(}C2-$!2V)QK)Z~}?x=t8d#;ie}*mnyw z=mi4$#|t!K*-@~IdY(J1wSM+uJYz)I6~!Hq<3GPi>&*V4*|EbMR=V3CNrxMdWQK6smF8Aj90L;w@57>lf8x{%@jMn{MDB?iQq z^KiNra?ai%!O80J9~&KW>@t6MjVpnMjAIH-9A*pHf&9iYR@bUq;(^U`gt-E8U=N{N zz(4dcMz?KcOk7+~musxhw0_pgnoETh!c>8K0-eOcwY5QGd?%;WJn_JejRLZOSfQ6O zcMJ23FA~u0f194TG1n)M3-W!luwIxhun%`1F{a} z(Mt}UN94WFI*q#o?iSV{+bOUgIj5&)9xvmeiG$akqj8sj|JWbT2|k=4;6t>L>(0|$1 zCCouTRW!CN7dRi-Ld{{z1)5`hwADU5t*oey1RD1o4V#&JM$sK($9+O$ z{=yplj?qP$qyEMU*m-f$h3-0AFR9VhAz2!09A9+N>f*~C%lxI%#hrtVmuXz7r@^Zj zs4;hWn1kL}Y;c^Xix+K;@w-B@ta)Zx;~2B1DIZrR*{JWTqA%wIf1af|bUH6r7d=gO zVgt5aQ?nm2Md!1F&gi4pUOULz=QOOvAM1ba5Hb>N`4jJ`>l)VBrsp--WL^0D{Gy}I zrx(<$r(QX;a|KPeK&)2^%uNwa62=OX1)k~n$=t5O1c5vHR)KYw30~W$vHjDq^*IH3 z&eLrIxxPkNEbuI#K|fJIH|=WSVu3xdZ!aP0faXr*vvo#MB%AO7tt@ZLa!t^{m~cH$TDIZ&7-5N{gt^908SzxcOh z;%95#WynR=hpkaxo+n;$p8R14x*W4uD^taH?zvko6UaUJ@mh3xE&HJlUsegZ1~`{A z*8ra}Y2=6+phn0;))C(`b1sl~?s@OP7RS=L?-8#~Z_fQl_hEnj4Z`QDCms_8;zJDp zV!pRf7dLEm%(0R4SQqp0;xq4Dv5t7}F2q>dmg~gF7SJJ(zit5?2MPLm!X{#c-ZjGh z0=7ndyf17JsMGTV-b2qVv|}Z*^)BliY%iKKh`-b$Ie(!HCDz{;u%!}coXgb$KJjcj zLm)=xVT*abXNYT-_ng;7U7pjj*7rp(RZk5Q7i@dcAhvNIvR7X7;z8DUKj&1Ut$THz zddA;X+|g0D22YXfmEz7-5a`<+g zz&(ght;TmrT`TMx{U0lueO@YI{51WtM87=IuSoPO6aA`0zdF&cN%ZxJz9G@CP4w#$ z{rW_|A<%Mbi_e2yqI-l{!dzirfjfcREfkIvjuMs$j}(p<9wTrrPZhY&o+O+ltP{== zo-8~~xJbB6c&2c*@En12?;1KYj9G6!cii|yPe}Ab5>1W9^_;axbM7L|8H_Zahaydl zM4IPcq^b2tbN(Z}XQHXIIL{f6bZ4Tu^Wr?`KhoUyk=`NE+%IvS_mD_WNi^>dah|go zY3>=*^E9TNt+TX2J-(6;_$swAf7ac#Ry{fJvxYh$2mJ!RWIp-BCv= z7Z082iFYXT#Ph4P`CNtR^k4n-Ytg=`> z!fF9qyq5PE?s($RWDl~OMH==%bN3u7u$FU=zrPST1IG&3PcFd%VQ&E)Ifksq{wcyV z0o(BbTd?0fe%L45$vpbGSGojjivB?l*FWM&i~jYAX8p|qIqnv)f1^M?hy%TAi81h+ z!!%|c_XPf9PnN|OOIakynYw-7+GA5?%M_jFgoB^+A?{0w_nI~W?J$(L6s!8gJ zF*Z>TDZj5Yr;#2R8pZmjPFjqxqU&vk9Tr~!P&_ilmM zklR^8^jllEd}1D1^d2m{MHBG6CqA$i9~?8UWgm325Aj|quogZ&=alg>ftp-W#^ zFEPAYppiHBf2)*pcA;tbUolW4W;babp6`T}8j}NJ!rcg0C1B9FuzUFh+>z!-g|(TmRiDmr5xT^HDbKH}6Nu*U0&CF|c-*5{mb zX%3sF3P%gX%WI*TBfil_@_^2_7oFrR=6Qx_Y{FJ@@eav3pQ}W32d@-7|KFPT8H@AI zy*wdU0LiGqJu+*dSn!pMAs`TaiU4alvleIzi(O0XvY}xzKS9`tut6ifbGb z_Ne1uBtCw8QN9ve&I@a%3HF1v-U}Xn*j{S%T{6o2SfgE<8z)dt@0JW_$MeK_y1<@} zFY`IR4rNzEYrHBM?9IIo^!PQRE>@%eEgY9=1`(-xRVg?$J)c=Zzdt z8y5@I8GLNmR~St9$2CtIOy+%>&vwWCotL=(aQyl==^c)ZuacbocWshW+hm_#ARcWn zU#`}?bvZ9lmwAtt95wTvhPom*9Rhn%6TJdCpuRb?xrR79)DZr530~(~biTD+tNsQ% zC-_v__>H%Mg%eg{RY#ysQVuO#=BRQaUKG2|-^NK9> z2gm{WtPt>zIqERayXIGG4qtvLSQmL2Ojn+_F8sBwaT>>G5xQCDeB+b!@PnwHj|P94W9T4Zn^nJvLKI_V?(*$4|!OW3fO( z7Ts$Eg}U|bhkoij>W9Z3=!k3Chu9F83j|smTXvH8oHyE!v`?hJmgrj&{q{uPkm%=# z=FEOjjx1{JFc9yd#>4@e@c$-VCefxj;qRkz4|3+`7g=JyPCwh~Q1A7-l%K7ANXmGw zb%wdG>K9kU4xo#9>Y26ZdaUN7EmfiYe2nt!xu53A1AMO|55JR5rt#@3qLE==_JVgy z;o&QD^ys3V_zVmW+pU|PTA-g&`l+SoUWC6#>Gvvqcj{*pdX{=>idfQ!0r&A?!iQxX z@18dZbA-79_JWfI-hS{M|F}nJ*xf5s0?l>L8u<8)?MsA8pe+!vgSc}ae?-F6YyKW( zwBZ!ZcMF^m-fxK$VBK;7n|eym^ML)CXRql3{$eZ73*zPY(pv}lLq{dhd`F(DvHhaP zxu5V0|G2NXtI^*l;49!hyj5U7@(P;vL3f8hJ57jw;|F_H0%P03Uhv63{^37%;4_VQ z+eV*3>TDj9YCqL^#h!%%aoJnoP9z^6)kfY&p&q{6`MEXzXbkJs;Bqd&ImF zV_Ls}?bHFj&ljxcNwQ7k=JS&Ozq|h_cTZgNw6x~EqKOH);JhyuXyg<>srQd-L+X8< zkYgU}{b)YNAr<9f!w&jvcy_w!2ri6^mKEYQe*hd};6r?uq& zClsw3@uv=G_=S&41n!V-VXa^ueCHoo>n8@(HglCgWB-bQ8n#m(l|Vxu^4J;u`n+sI zC-JWY8fFrE;&7|xIX^Rnu>$SEvY+@>Y^c^`{}+n=0@x1R7 z>iqSdmF8)~v5^|caU(A9D}ja{>Z)m9+d5b*n)bnF^3@clN^`VmgZIN8j~|S^w`PwD zC)AwBszu%J*GP2N@Vs9pH8?;J#sehsLa( zA&e8a2iFMWg}O6_j=EZQ44cl9-zm5=Y%6=5)vyot)$J3{CTG&Ru)SSf8?=UX#NkVd z!@4s5a*7G>AMNUncCyFT+DWXi^D7~DU#+oowPfn@Hq<@g+W1<~|MjGw+Sr;n;6sc< z(>WN*R%&gq+F*}vp%Q55qgL3@y5qPhW+UBar1~n^N3*^ENIffM2XUnJ3e+<_xI$o_ z&rd3m);m8m`Ss5L_?*BR+7cn(Yf%=N_#Q&;$ZsW}Kh_L)(>S57#yP)rbwM6^#x~te zmF8&v43h6CYNc*J{L6OZXNO>$8E;J<@zuH*pDEPYGE}WrT9?n?*4V{e5bbI=M%<}h zPmH$4ug;*07!76%`I!{t*?Tbgy8M#&XnVWs$=`6-V=py59C_{y&P%(o#2!!yx!xX# z^Vak(&=f~%+xBVLx*s{CTjQtokpBnLNAEM7xov!_#5c6S z?}6Xcn7wBR*vk1PF5DT!KHr__7|C7Rl>2sbSr-F8Gw|JU#FwVJLI>vy8OskAH=nQ7 zl5dI$as5_^>;Kfm6?=x#Ma|d6mwiDc(9na;P4R1bk8W2_lRfaGJUOZa*WK$%)#mks)j?A%s3-d$-y!h7sb+?w3tQ|Ly4v-NHC~Udru8wG z#4oOCs;|N9=WNj&lc;kjKUf>zF$S~S=Xj#lM4OxZth+nduX8Kc5BI%dw)Uac9*8s1 zbiX#mBIaBsjry~7Bz5C@u|4FzT|G_rTf1>+`n}+CcTAiWc=)tLKtI33;`dz8jL}gEG=6_YE%JM7&Jc~7W8CCF^VHvl z`mmwhIE}=&!E7GQ_|@geaT}^$Mq*=*ExuGjhv560xVL-usH?iO=h)|ceOI!V_oar~ z&8_1X>jhpV(5#z%n&OG=b!&)8Q;hM8=N9MIdkiMOUUIyjep?H;rx<@nW7f_Pu#Y>U zDekNptnMn!6F=L6zIJtOC_1q1yTQ)yB|CZ6H^s%Z+cfVu+!^$LKj|k9P3y^3Qyg-Q zxwf^Wb$1MwAM)wgA=hr~T<4Y6a{pTwdFTr?_ZPI|G?MoaYN76|5u3W_9J16mef)k& zC7OmUBRzZQ^*N|CrlF4*j^r#`A91P#n)S6?6X>!&?5PCWXy_xa70T4CZ)^M|{uRp9 zMnfNGv_hGh^-*`kgLA^~;Hih{g6}d7Te4%-=NiSny0z=XuRD+Z;@8zEvdsDW2Jw7! zi_gB;m*2gpd1~A5A{w@AWqs3GZPzyJs@t1=oAw^;{I1u!y4YY>U2NFD?))~{#aT9p z3pt|A78qk&Q{Facj@Z@NhuwAdVRw^#*pch1&TjTwQuOzhezAJqo4GTo0e-h(WWRVe z4CYt6ImaICY_}d+GgwVD#eKADg8YocZfvfz8++S5N9{g`>goX=Ij97_N8}oCUDM|p zaBWiyb$8MR@sUAqu1V&o`vXTR{L>5iVQIlU%5AV0U@Jdy|Mq7rDl z1O7l8R_Z$hdKxm!{ZMnncBVj%rVEROv4Y=yMp9GQQJ0&Ch)+D5Y`tp`TYof6TL-(# z+r3w8FY&62%bDWW)vnJ&u3PIP_CJA`ojDM;zYi9`9$JuGxZ?KqRTlC*&R_x91O-*`dOGak2 zVq-t3e`4jik>rGU`VOfyrlF4*ZH+!`tpu9&HTl*r8Df!hhi$eGUn_w&8v5|BLYbQN zZH>RwMTIgo>udKJM;z+zBlyH7zo)|Yvn${4*z-W|&waxgse5j+f4lK)@{>L6Yxa{o zJ{W%DD|_P?ZMHC)KH^{99{<1iM_n%#XvA)7?w1NBYSz=IG518iKZq&(N}wS>Rv7Hr zyI%8kcM;Fzrn5=j^4{p^Eqw0$9-&*nrn~hX|Z}PL5ShkxJzjswyOC4C(VD}7nV_m(HTWX4)y6P2pm-(3-!0wp>drTMd zxooNd>_aCt?D|IM&xg=C)S2UK)%k#Lb!X1C%eiC!UktH7@mnphF6Yd?WInz!$Nubb z_YixK@1{NK;ud30eAK+b_=fgN@E&(*q1sR$h+;e4&*9<_CWhkX%E}ac^@Y< z<=62VNiA`978d=EQ&ni^n7v2qJ&m~fzKHvBA5fRnh4&q=@o4YseWs>;Mp|o?^h^u7 zh}B^4C{1_1<5H(@H1gUnyEy;%=#Ua;YTt3j=63f$ALoHPcBxPaw5s*zK#rGa?B`eA zo?8?1J*7L^-&7|}@y7nT=M#CzX9BrOpdP&^;|F8U32D#4VrJWhy4SLQ+;bDdKCB;U zJ^0QfX5_px=p9L&#e0~0qZ0DHIM{hxCwbpD@poB+<=;NA&i4hq<4f)b%R|$CJ}<;2 z>LV`g)>6DL_!+TnLl^NNpLNf*4dP>eosG<~zV2MC7ayCcoft>X7w@8(kA3I?*vIc} zs0IHFfX_*`8CypZPjZMKl|W;!ih-JIn%@<47aBfy;IFo+ug!LI!2Tn(;nxi|G{s>g z_ZYEpo$amhU~&GZ{(o$ITt{{1h?@Oh)eH5_nIV@v7n*8iC|$o9MP0ugMP0ueMP0ui zMO}XwMO}X!MO}XyMO}X$MO}XxMP2ufqOQM=qOSXDbgkBztb67Tb{@H-In%QQp39@5 zV~zCi9IvxwB=19hjx3f=+dETZ>}44KIfi)kLICeJ@=G`jrXee-Y)FDea+ryN(cVuJFDrv8Jm`rHNEON zzr@?$U&F3(LX%$SDDQ_}?ukmk9>*75gWda0cCrt8sMCkZ?@B$bYW;cto%`^bIo9kT zKK+jBhkNgg)Yc8!XS~3EJ83`XZfA|-`I@Ntt&PQG>8zxOR<-`TKNeGJ=CElO@#&|k ze=uXQtM+p&cGGw?V&OVNm)}iB64RKo-GiNb)Y!RNdr^yZHP0DhZi!F{`OG)1bzJt; ze!h?QN_%r3H=V<#b7MOfYAyBLEpTsh&WYJj=etQS@j@SUG%eWNm29TQx#zkIpZzo( z6+iqwG+KU44}SF2_|cTRraLg+Su>=slHatd_2)pI$pd~&7b=06Mt=r-K9XDFKXdH; zIxEpM*U&7@HR<-f+tnNEZ*Tc%e`jlq-WdXVU4L^5 zf2jIv%BAm_N;-EIqU~pi_BqQxb9|`g>h1~nm9Uo(bv5O~wZt0QY(XwHzArTSft{cd zXy_TL4yduY+N@Gf^WIIiGS7S7YN0MJO}51tYw3`-d7mab(6^-6(5oIl=E)E8K^^$J z36;h)`!!O#(La9({X@mt@6_(84esomGi}p&c8PDDeA5|g$_F~K9_$}Ud^n%Po$nX& z9K$E>KKof|OsiUd-k*D(<;Y`4K1aR->dx3Y$)i87!PmOq54iT2tAtL$&zCye`CUPs z?UTfJ&MJ**vxV_OyYaV8mDbYGGg$pF&$(-NA7aZnAA`o%*24A3WDT^_t|yLHiD z^pU5fLM70u)}I4*U>Eb)g-!S$@5^?5jWNx?o821wE7?V>T7TZ3t9G9a#H6ln$qBJ% zt`cZf>(7C`#%cWjdwz!UZ)<9Se`{`Q>WbWeN}zEjsMU6DBLC#N5@>ZgN2{jL&HcDg zpnjU}WPD-1-SbhWAO9+Wwly(AchgxQ?oGAA{;c&K9b;XIPs6UU!eE~xdA_i=?)fs( z^V@E%;Ky)$8EG9372^jxK11cSQaotR-$>(GwY1z{pF{1N-vdUvKhGxXqP9F9u03%* zbspDI&-mdxu8Ah+xu)@FB<~gRS<8CwJ=n8~HTg~=4%D#MGj8`TA|CkWm~uvWpTHLD zW!$db7<1nxkwOk^=Y`pUFUfC{nS43`C}g?w$87SJTpdW!@dnRv>S(5Kb`U| z=BepSIv>6lXKEewGL*bTHtV;%_w!k)I~(2)8OyVNq`snKmM~suvN_gA&b4i?vz2x5 zD*^q{-lo0mAAOW>@{i9-bVH2a0vj0buQ7UO z2+Z@dpmudTj?reHyV0`wfMD~22gqjb2>g#W^K;n)%YHL8*0AmP#MmDc{5ZJAkJZxe zc*dWT<=SeJTd(!x^^ma7p=lp#solHIwOMJcKfegI*H!|p zYW;bCy$qIH=d($MyLBiTa-M678fiM$O*InFB`&Zp_1f5f2?p1%8eV&CeuzOV1kgaEGDCb9}Fv zyNBkVbuykUaCeSYtjG~Mw-I>GEK~uQW{&vgc#&_v%Mv?$Uo6mAOAQTYE$iA@i!A#& zhcRxpXSjBF?{;*x8*}zR|8V!{kn9?PTBwWrNa~kbjrHm}BVOb@#*4Yp-oNSmIA7Q{ z-1v+y_EG;7RT?sTklOL(1R_ci_Jq;P=7HN*UApZVt2zM$q zWPiqM+!UM9wzV3>*2TlL^?`^j@v4iaX&f(O~YOSq1&(y(6VUj?j9##nC zkJc+t>)LkAp#rsxtnaAPG;TU0=(e2ef_g&UGc zmvuGm6Yr6_J=uS-vo?}_eZR#VH0?cD{Mg(6RT|ScYdm)yv!QA)+8^zy(=(FTH|dXY z&wG*Qrn-*$a-L&N4dx5_snsQ^R@>c^`)#RoM4N`%cd%MoFMV})0s37t(Pz#IbshKg z{T0{5`5bHNyQ#)}&L>G`H({ngJ@pB`N1{E%-}jV;oA2SKxW;@%J?!gu4(nmx(bDse zvj2hJm)Pg{6St;)XKQYoLFS!*WRT@PAITjs+}b7Qeh1O8wI^q_$$sj`XOFt3*-mOY z`WMF!WbHQPV6Zb5&u~0rBel6{uYSd(?tW>qxhd|pYb56}`r2LWsnpZByQneWHACe- z*E(z4wW(d-iQxmeZ@cz4-IeXufNP_Ye>8IJyMsA$LcS`2#yt1J*4jIqTzjvkdh|VI zyQqVqWU(E+!;wX1xU$4-xU$suaAn80Av<9hvg}I?28+|#n)my}aO~uLXqke=8J{Wm zvo<=08<)pRmj4%;HN%Y$Yj_T@X1H-;%`?lI;lyhsH8xzI+wrv>ACVo7Z$s6>aOa!u zoZ+r-s>S~+>-o%ZwCdaTKp&InV-x+zL@!VDqY`~wqK{AX35kAmqEAfpV-o$?M4uGs zq2iCfD}p@q%0!=>=*I=RNq^nh+M4Hz?{>~#)1EPhrvw}E>C{A@mgv(1-K75?;nP3& ztpE9c-8(O_@@LFgFYSK5u^!%IW(hoh{#g@$|K9LGpXYwX-S6ejr;cgk&o+>6stcZ* zw7U9edd3Z<51U3)AHKDtk9V`jYf(EfV$G_CHBB|{dzE>QiJ8Yu{3e-p<%gpu>TDYG z95_S1+ivJ5B>IVoeo~;(ORRYpjz8Nn?L26D%wWHh_(#cO7khtPg-h*r3qBYA%qDkR ztx2vtQ7d!HFJ&+dyoTqV#;3eI}+@HJp9iwP^(&h4#d^_ zvEKV}XL~>HYjWEs0X}zh6neF2&KI_g6S@V~VdHBA+7baf(M8YPc>-oI$ND&TM3_UC zz4`lz=x6U|34H>8KX;OFh;XLtsMOP{)}Qz5W&W(1d2C^BP0buXi({_8W{!UomASPw zbNt?)xpkTw?!PTVys|&*YjoS*4K;JN_w1TE+j~yUob5eVbM4w|z30{FwXNsZ%<*}b z7(KaWj-P8X_mnp5>6AS2v)-rH=*1q+0CDo)UtpgLYGfVDr`61{=IP?oKSTX+W5(x8 zpE2rwurqd{^u{xGk?5u~c9nF|>dx2`#BVxdoMq3g)Ht89bHpR2KAZS^vFxbS)2h~= z1Lv8!OKRpE$4hJGTsxQ5%(*5n*W7U9%RPX-uDgvjdTq}YHFLJ-nKg5^=gO_H=c*dL zuGeSP%=sK#-Nv3g6C8uOTEC`dAIId`HFMXI(Qj zZbJ7Ub4_d7?m( z$JqD7VvT7$r|a}EN1T|8_Cix9*!DabfxcD39l}assz6P>v02^ddh_z2D0i(<0qu+Y6;P+O|ULR<~B)U*E424Z2Hj`oZimDV{st6v-8L1DGuA zD$Ee}6Pzz<;9P;m`m=>a5Nh<~$#EL5aa>1iX{^gXm#$kIWvL}(&^eUsGm8vosY%v% z&Eb*(c{J`gq(&v2iiSIM;BGqaonpU;`-13aP zSo7_k5%PMg@a&>*XZ7rf51iNAgsX&o1ni)B&E*~qPQ=<7?xsKldHtv?5BLf6Y`=GKXieM8*|y^@K~uH!`y1#&c$%+}0HeX6I9 z)|nJrnoXpM-e=?bo`?CaE|5gG7HN(Vt56dlUVZL|>oi=O=n& zqMw}TzC@pt=qk|%B)TWjlST8h7Vb@armo-fw@sV46X5e6316Wa^9u1}Y|at$O0g9M4kv zF2OQ;N+$Yq-(Lp&u^wXbi^A(J>)?G`Jf3~8D0TY@jiFze=vRq`|LW4eru5gB{)W=O zw)C%4zd`axA2hJ;^@ab2(*JAe|4n_g`zF~F>FX1HU7{~Z^ivbPAMP7 zAD!qb(T62^L89j+dPbu6O!SmQKP=ImiQXpBfBEy4@%(L~?@siciT+}uKb+_r6aD-| zKP}N`CHm2cUYzK8iQXg86B7N$KMmA9?=qYXYW(}+#hUtjqCc4E8x#GCL|>8UCnx&! zL?4&vrHMWw(FZ4bpG0>jdfP<*^^aTn`@2Nno#?v~{q02Gp6Jgc`lE?{Z=&Cx=rk=qDulq(mQ+=))7ef1+n3dTOE{n&>f!{@ow8%->HF z{mn#wF3}%I^i7GrA<@?*`r<^dOZ19FFHQ7eiJqJ2-4p%LMBn%OE&abI(ceq-?TNlc zG|$HuggfA-!h2!hy)Lc0HqlQ>^y3qKT%r$6^xmSeG{6NA24h1VH)+ZNtEVePMe zF<{^C#lz0AMP45%$9$>G{W{3MyYLK4!j);Z*t)M<>v!_PZAHmcPVo%zsuZ1%G}g2_m(neo~FjU zu<&**a_}xFyxjut35B#yb=JnM8ju(Kjag)rr0~(N9TqpJ@C#I@q+l@Qw+*0}Joi zz?)Ne`v=~3g||HLe)FS&JsuT!-!Hsg@!0?PGDloLUgnmRxf8fZ3iwf_tfj6V@76#tK3U5W=-Fw%7e}@O&cMC7B{dD2Q{J*8} z90zPxzcU<5tDZKu` zJFxK92Hy0-i*ebh@YV;pd-cnWSeu#}^PR#Y2F&3P{kdfw`MSQyJg&^)A2R0!nbV4l z*J*0ZBMNU-k%Kq0@SYHO4=cPF%Rhd9z}6Vc?-gE*<);fT#`0~2wD`@{DJ>@`nQV{R$DYlmHlv-4gwfME~x8wzTsDiGFLMUzX^L5`A)_7bbd_MF06) zTkikWM86}^uS)b4iC&xN6BB({q8ErJ&ivg7KP%@XnLQKTQP%uNSaZ)e2lRX>@V--c ze1F8cKVNts3B0!z-bVxPWrg>#z`LOEqOD5{?-N08XYu0ubZ3pOFMQ+g{l1~_-W7DM zE4+6H-VufO$-o;cUflERU*D3xSu}Bee^_%(lG&K(^Amkaq8BH6PNH{6^q;@BrA^;Y z^!pS2PSM!>rC{@03h&OqdvW1?Bk-yTh8FePzJEUk2VC;zfHtnds*w`qD(NN%V<{eng_@iKZU@5^UHu$!z-afXux? z=I4d?*TDN~;oTQ_w-nyr0`HxLw<+*mRd{@v#rMiJg||)MJ-P742HvTK*AaL}72deO z+o$lx2i~@YHzDwT{iQ8)@U2AOlIRbKCWgNW{=7NKTwi3i3;R5`@U{=Ua|`cbfp