Skip to content

Commit d929883

Browse files
committed
shared borrowing
1 parent 1673253 commit d929883

23 files changed

+9614
-8914
lines changed

ocaml/boot/menhir/parser.ml

+8,391-8,602
Large diffs are not rendered by default.

ocaml/lambda/translcore.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1360,7 +1360,7 @@ and transl_function ~in_new_scope ~scopes e alloc_mode param arg_mode arg_sort r
13601360
(fun attrs (extra_exp, _, extra_attrs) ->
13611361
match extra_exp with
13621362
| Texp_newtype _ -> extra_attrs @ attrs
1363-
| (Texp_constraint _ | Texp_coerce _ | Texp_poly _) -> attrs)
1363+
| (Texp_constraint _ | Texp_coerce _ | Texp_poly _ | Texp_borrow _ | Texp_region) -> attrs)
13641364
e.exp_attributes e.exp_extra
13651365
in
13661366
let assume_zero_alloc = Translattribute.assume_zero_alloc attrs in

ocaml/parsing/parser.mly

+8-3
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ let mk_attr ~loc name payload =
153153
let local_ext_loc loc = mkloc "extension.local" loc
154154
let unique_ext_loc loc = mkloc "extension.unique" loc
155155
let once_ext_loc loc = mkloc "extension.once" loc
156+
let borrow_ext_loc loc = mkloc "extension.borrow" loc
156157

157158
let local_attr loc =
158159
mk_attr ~loc (local_ext_loc loc) (PStr [])
@@ -172,6 +173,9 @@ let unique_extension loc =
172173
let once_extension loc =
173174
Exp.mk (Pexp_extension(once_ext_loc loc, PStr []))
174175

176+
let borrow_extension loc =
177+
Exp.mk (Pexp_extension(borrow_ext_loc loc, PStr []))
178+
175179
let mkexp_stack ~loc ~kwd_loc exp =
176180
Exp.mk ~loc (Pexp_apply(local_extension kwd_loc, [Nolabel, exp]))
177181

@@ -1185,7 +1189,7 @@ The precedences must be listed from low to high.
11851189
%nonassoc FUNCTOR /* include functor M */
11861190
%right MINUSGREATER /* function_type (t -> t -> t) */
11871191
%right OR BARBAR /* expr (e || e || e) */
1188-
%right AMPERSAND AMPERAMPER /* expr (e && e && e) */
1192+
%right AMPERAMPER /* expr (e && e && e) */
11891193
%nonassoc below_EQUAL
11901194
%left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e) */
11911195
%right INFIXOP1 /* expr (e OP e OP e) */
@@ -1204,7 +1208,7 @@ The precedences must be listed from low to high.
12041208
%nonassoc below_DOT
12051209
%nonassoc DOT DOTOP
12061210
/* Finally, the first tokens of simple_expr are above everything else. */
1207-
%nonassoc BACKQUOTE BANG BEGIN CHAR FALSE FLOAT HASH_FLOAT INT HASH_INT OBJECT
1211+
%nonassoc AMPERSAND BACKQUOTE BANG BEGIN CHAR FALSE FLOAT HASH_FLOAT INT HASH_INT OBJECT
12081212
LBRACE LBRACELESS LBRACKET LBRACKETBAR LBRACKETCOLON LIDENT LPAREN
12091213
NEW PREFIXOP STRING TRUE UIDENT
12101214
LBRACKETPERCENT QUOTED_STRING_EXPR
@@ -3015,6 +3019,8 @@ comprehension_clause:
30153019
{ Pexp_apply($1, [Nolabel,$2]) }
30163020
| op(BANG {"!"}) simple_expr
30173021
{ Pexp_apply($1, [Nolabel,$2]) }
3022+
| AMPERSAND simple_expr
3023+
{ Pexp_apply(borrow_extension (make_loc $loc($1)), [Nolabel, $2]) }
30183024
| LBRACELESS object_expr_content GREATERRBRACE
30193025
{ Pexp_override $2 }
30203026
| LBRACELESS object_expr_content error
@@ -4427,7 +4433,6 @@ operator:
44274433
| GREATER {">"}
44284434
| OR {"or"}
44294435
| BARBAR {"||"}
4430-
| AMPERSAND {"&"}
44314436
| AMPERAMPER {"&&"}
44324437
| COLONEQUAL {":="}
44334438
;

ocaml/testsuite/tests/translprim/array_spec.heap.flat.reference

+36-25
Original file line numberDiff line numberDiff line change
@@ -22,64 +22,75 @@
2222
(array.unsafe_set[gen] a 0 x))
2323
(let
2424
(eta_gen_len =
25-
(function {nlocal = 0} prim[genarray] stub : int
26-
(array.length[gen] prim))
25+
(function {nlocal = 0} prim[genarray] stub
26+
ignore assert all zero_alloc : int (array.length[gen] prim))
2727
eta_gen_safe_get =
2828
(function {nlocal = 0} prim[genarray] prim[int] stub
29-
(array.get[gen] prim prim))
29+
ignore assert all zero_alloc (array.get[gen] prim prim))
3030
eta_gen_unsafe_get =
3131
(function {nlocal = 0} prim[genarray] prim[int] stub
32-
(array.unsafe_get[gen] prim prim))
32+
ignore assert all zero_alloc (array.unsafe_get[gen] prim prim))
3333
eta_gen_safe_set =
34-
(function {nlocal = 0} prim[genarray] prim[int] prim stub : int
34+
(function {nlocal = 0} prim[genarray] prim[int] prim stub
35+
ignore assert all zero_alloc : int
3536
(array.set[gen] prim prim prim))
3637
eta_gen_unsafe_set =
37-
(function {nlocal = 0} prim[genarray] prim[int] prim stub : int
38+
(function {nlocal = 0} prim[genarray] prim[int] prim stub
39+
ignore assert all zero_alloc : int
3840
(array.unsafe_set[gen] prim prim prim))
3941
eta_int_len =
40-
(function {nlocal = 0} prim[intarray] stub : int
41-
(array.length[int] prim))
42+
(function {nlocal = 0} prim[intarray] stub
43+
ignore assert all zero_alloc : int (array.length[int] prim))
4244
eta_int_safe_get =
43-
(function {nlocal = 0} prim[intarray] prim[int] stub : int
44-
(array.get[int] prim prim))
45+
(function {nlocal = 0} prim[intarray] prim[int] stub
46+
ignore assert all zero_alloc : int (array.get[int] prim prim))
4547
eta_int_unsafe_get =
46-
(function {nlocal = 0} prim[intarray] prim[int] stub : int
48+
(function {nlocal = 0} prim[intarray] prim[int] stub
49+
ignore assert all zero_alloc : int
4750
(array.unsafe_get[int] prim prim))
4851
eta_int_safe_set =
4952
(function {nlocal = 0} prim[intarray] prim[int] prim[int] stub
50-
: int (array.set[int] prim prim prim))
53+
ignore assert all zero_alloc : int
54+
(array.set[int] prim prim prim))
5155
eta_int_unsafe_set =
5256
(function {nlocal = 0} prim[intarray] prim[int] prim[int] stub
53-
: int (array.unsafe_set[int] prim prim prim))
57+
ignore assert all zero_alloc : int
58+
(array.unsafe_set[int] prim prim prim))
5459
eta_float_len =
55-
(function {nlocal = 0} prim[floatarray] stub : int
56-
(array.length[float] prim))
60+
(function {nlocal = 0} prim[floatarray] stub
61+
ignore assert all zero_alloc : int (array.length[float] prim))
5762
eta_float_safe_get =
58-
(function {nlocal = 0} prim[floatarray] prim[int] stub : float
63+
(function {nlocal = 0} prim[floatarray] prim[int] stub
64+
ignore assert all zero_alloc : float
5965
(array.get[float] prim prim))
6066
eta_float_unsafe_get =
61-
(function {nlocal = 0} prim[floatarray] prim[int] stub : float
67+
(function {nlocal = 0} prim[floatarray] prim[int] stub
68+
ignore assert all zero_alloc : float
6269
(array.unsafe_get[float] prim prim))
6370
eta_float_safe_set =
6471
(function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub
65-
: int (array.set[float] prim prim prim))
72+
ignore assert all zero_alloc : int
73+
(array.set[float] prim prim prim))
6674
eta_float_unsafe_set =
6775
(function {nlocal = 0} prim[floatarray] prim[int] prim[float] stub
68-
: int (array.unsafe_set[float] prim prim prim))
76+
ignore assert all zero_alloc : int
77+
(array.unsafe_set[float] prim prim prim))
6978
eta_addr_len =
70-
(function {nlocal = 0} prim[addrarray] stub : int
71-
(array.length[addr] prim))
79+
(function {nlocal = 0} prim[addrarray] stub
80+
ignore assert all zero_alloc : int (array.length[addr] prim))
7281
eta_addr_safe_get =
7382
(function {nlocal = 0} prim[addrarray] prim[int] stub
74-
(array.get[addr] prim prim))
83+
ignore assert all zero_alloc (array.get[addr] prim prim))
7584
eta_addr_unsafe_get =
7685
(function {nlocal = 0} prim[addrarray] prim[int] stub
77-
(array.unsafe_get[addr] prim prim))
86+
ignore assert all zero_alloc (array.unsafe_get[addr] prim prim))
7887
eta_addr_safe_set =
79-
(function {nlocal = 0} prim[addrarray] prim[int] prim stub : int
88+
(function {nlocal = 0} prim[addrarray] prim[int] prim stub
89+
ignore assert all zero_alloc : int
8090
(array.set[addr] prim prim prim))
8191
eta_addr_unsafe_set =
82-
(function {nlocal = 0} prim[addrarray] prim[int] prim stub : int
92+
(function {nlocal = 0} prim[addrarray] prim[int] prim stub
93+
ignore assert all zero_alloc : int
8394
(array.unsafe_set[addr] prim prim prim)))
8495
(makeblock 0 int_a float_a addr_a eta_gen_len eta_gen_safe_get
8596
eta_gen_unsafe_get eta_gen_safe_set eta_gen_unsafe_set eta_int_len

0 commit comments

Comments
 (0)