Skip to content

Commit f3e406f

Browse files
committed
Slightly refactor object capture check
1 parent 01f6ebd commit f3e406f

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

ocaml/typing/env.ml

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2928,43 +2928,35 @@ let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env =
29282928
let lock_mode ~errors ~loc env id vda locks =
29292929
let vmode = vda.vda_mode in
29302930
List.fold_left
2931-
(fun vmode lock ->
2931+
(fun (vmode, must_box) lock ->
29322932
match lock with
2933-
| Region_lock -> Value_mode.local_to_regional vmode
2933+
| Region_lock -> Value_mode.local_to_regional vmode, must_box
29342934
| Lock {mode; escaping_context} ->
29352935
begin
29362936
match Value_mode.submode vmode (Value_mode.of_alloc mode) with
2937-
| Ok () -> vmode
2937+
| Ok () -> vmode, must_box
29382938
| Error _ ->
29392939
may_lookup_error errors loc env
29402940
(Local_value_used_in_closure (id, escaping_context))
29412941
end
29422942
| Exclave_lock ->
29432943
begin
29442944
match Value_mode.submode vmode Value_mode.regional with
2945-
| Ok () -> Value_mode.regional_to_local vmode
2945+
| Ok () -> Value_mode.regional_to_local vmode, must_box
29462946
| Error _ ->
29472947
may_lookup_error errors loc env
29482948
(Local_value_used_in_exclave id);
29492949
end
2950-
| Unboxed_lock ->
2951-
let vd = Subst.Lazy.force_value_description vda.vda_description in
2952-
match !constrain_type_layout env vd.val_type
2953-
(Layout.(value ~why:Captured_in_object))
2954-
with
2955-
| Ok () -> vmode
2956-
| Result.Error err ->
2957-
may_lookup_error errors loc env
2958-
(Non_value_used_in_object (id, vd.val_type, err))
2950+
| Unboxed_lock -> vmode, true
29592951
)
2960-
vmode locks
2952+
(vmode, false) locks
29612953

29622954
let lookup_ident_value ~errors ~use ~loc name env =
29632955
match IdTbl.find_name_and_modes wrap_value ~mark:use name env.values with
29642956
| (path, locks, Val_bound vda) ->
2965-
let mode = lock_mode ~errors ~loc env (Lident name) vda locks in
2957+
let mode, must_box = lock_mode ~errors ~loc env (Lident name) vda locks in
29662958
use_value ~use ~loc path vda;
2967-
path, vda.vda_description, mode
2959+
path, vda.vda_description, mode, must_box
29682960
| (_, _, Val_unbound reason) ->
29692961
report_value_unbound ~errors ~loc env reason (Lident name)
29702962
| exception Not_found ->
@@ -3244,7 +3236,7 @@ let lookup_value_lazy ~errors ~use ~loc lid env =
32443236
| Ldot(l, s) ->
32453237
let path, desc = lookup_dot_value ~errors ~use ~loc l s env in
32463238
let mode = Value_mode.global in
3247-
path, desc, mode
3239+
path, desc, mode, false
32483240
| Lapply _ -> assert false
32493241

32503242
let lookup_type_full ~errors ~use ~loc lid env =
@@ -3335,7 +3327,7 @@ let find_module_by_name lid env =
33353327

33363328
let find_value_by_name lid env =
33373329
let loc = Location.(in_file !input_name) in
3338-
let path, desc, _ = lookup_value_lazy ~errors:false ~use:false ~loc lid env in
3330+
let path, desc, _, _ = lookup_value_lazy ~errors:false ~use:false ~loc lid env in
33393331
path, Subst.Lazy.force_value_description desc
33403332

33413333
let find_type_by_name lid env =
@@ -3372,8 +3364,19 @@ let lookup_module ?(use=true) ~loc lid env =
33723364

33733365
let lookup_value ?(use=true) ~loc lid env =
33743366
check_value_name (Longident.last lid) loc;
3375-
let path, desc, mode = lookup_value_lazy ~errors:true ~use ~loc lid env in
3376-
path, Subst.Lazy.force_value_description desc, mode
3367+
let path, desc, mode, must_box =
3368+
lookup_value_lazy ~errors:true ~use ~loc lid env
3369+
in
3370+
let vd = Subst.Lazy.force_value_description desc in
3371+
if must_box then begin
3372+
match !constrain_type_layout env vd.val_type
3373+
(Layout.(value ~why:Captured_in_object))
3374+
with
3375+
| Ok () -> ()
3376+
| Result.Error err ->
3377+
lookup_error loc env (Non_value_used_in_object (lid, vd.val_type, err))
3378+
end;
3379+
path, vd, mode
33773380

33783381
let lookup_type ?(use=true) ~loc lid env =
33793382
lookup_type ~errors:true ~use ~loc lid env

0 commit comments

Comments
 (0)