Rewrite check_scope_escape using proper marking and unmarking
This uses the Btype.snapshot/backtrack mechanism, to ensure that we
always undo marking on types from the environment and to avoid a
`try ... with ...` construction for each recursive call.
This is a wrapper around the _exit system call. It has been implemented
in otherlibs/unix/exit.c for a long time but never exported.
This commit exports and documents it as `Unix._exit`.
The Unix implementation of `establish_server` is changed to use `_exit`
and to have gender-neutral comments.
A test was added to check that OCaml finalization actions are not performed.
type t += A = M.A [@a]
was pretty-printed as
type t += A[@a] = M.A
[obviously wrong, also not accepted by parser]
With tests for extension-constructors and exceptions.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch pr-extension-constructor-rebind-pprint-4.11
# Changes to be committed:
# modified: Changes
# modified: parsing/pprintast.ml
# modified: testsuite/tests/parsetree/source.ml
#
# Untracked files:
# Changes.orig
# parsing/pprintast.ml.orig
# testsuite/tests/parsetree/source.ml.orig
# testsuite/tests/parsetree/source.ml.rej
#
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch pr-polyvariant-pprint
# Your branch is up to date with 'my-fork/pr-polyvariant-pprint'.
#
# Changes to be committed:
# modified: Changes
#
# Untracked files:
# Changes.orig
# parsing/pprintast.ml.orig
# testsuite/tests/parsetree/source.ml.orig
# testsuite/tests/parsetree/source.ml.rej
#
a type "[ | w ]" must be printed with the "|", or it won't be
reparseable.
with tests, Changes entry.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch pr-polyvariant-pprint
# Changes to be committed:
# modified: Changes
# modified: parsing/parsetree.mli
# modified: parsing/pprintast.ml
# modified: testsuite/tests/parsetree/source.ml
#
# Untracked files:
# Changes.orig
# parsing/pprintast.ml.orig
# testsuite/tests/parsetree/source.ml.orig
# testsuite/tests/parsetree/source.ml.rej
#
`List.equal f foo bar` is nicer than
`List.length foo = List.length bar && List.for_all2 f foo bar`.
Note: with List.compare there is a risk of users having opened the
List module, and then using 'compare' from the stdlib unqualified. For
example:
List.(sort compare foo bar)
Such code will break (type error), and has to be fixed by using
Stdlib.compare. Stdlib is available since OCaml 4.07; people wishing
to support both 4.12 and older releases would have to avoid opening
List, or rebind 'compare' locally.
Extra modes were added in the version 7 CRT (.NET 2002). Update `descriptor_is_in_binary_mode` so that the original mode is correctly restored at exit, even if it is neither `O_TEXT` nor `O_BINARY`.
fixes#9148
genprintval.tree_of_extension was missing instantiation of constructor argument types.
the Ctype.apply code is factorized out from a number of other places.
```ocaml
val left : 'a -> ('a, 'b) t
val right : 'b -> ('a, 'b) t
val is_left : ('a, 'b) t -> bool
val is_right : ('a, 'b) t -> bool
val find_left : ('a, 'b) t -> 'a option
val find_right : ('a, 'b) t -> 'b option
val map_left : ('a1 -> 'a2) -> ('a1, 'b) t -> ('a2, 'b) t
val map_right : ('b1 -> 'b2) -> ('a, 'b1) t -> ('a, 'b2) t
val map : left:('a1 -> 'a2) -> right:('b1 -> 'b2) -> ('a1, 'b1) t -> ('a2, 'b2) t
val fold : left:('a -> 'c) -> right:('b -> 'c) -> ('a, 'b) t -> 'c
val equal :
left:('a -> 'a -> bool) -> right:('b -> 'b -> bool) ->
('a, 'b) t -> ('a, 'b) t -> bool
val compare :
left:('a -> 'a -> int) -> right:('b -> 'b -> int) ->
('a, 'b) t -> ('a, 'b) t -> int
```
Unlike [result], no [either] type is made available in Stdlib,
one needs to access [Either.t] explicitly:
- This type is less common in typical OCaml codebases,
which prefer domain-specific variant types whose constructors
carry more meaning.
- Adding this to Stdlib would raise warnings in existing codebases
that already use a constructor named Left or Right:
+ when opening a module that exports such a name,
warning 45 is raised
+ adding a second constructor of the same name in scope kicks
in the disambiguation mechanisms, and warning 41 may now
be raised by existing code.
If the use becomes more common in the future we can always
revisit this choice.