Change Texp_record into an inline record

master
Pierre Chambart 2016-07-11 16:36:44 +02:00
parent c2e66f0097
commit 24f947e95d
9 changed files with 38 additions and 31 deletions

View File

@ -864,8 +864,9 @@ and transl_exp0 e =
Lprim(Pmakeblock(0, Immutable, None),
[Lconst(Const_base(Const_int tag)); lam], e.exp_loc)
end
| Texp_record (fields, repr, opt_init_expr) ->
transl_record e.exp_loc e.exp_env fields repr opt_init_expr
| Texp_record {fields; representation; extended_expression} ->
transl_record e.exp_loc e.exp_env fields representation
extended_expression
| Texp_field(arg, _, lbl) ->
let access =
match lbl.lbl_repres with

View File

@ -323,10 +323,10 @@ and expression i ppf x =
| Texp_variant (l, eo) ->
line i ppf "Texp_variant \"%s\"\n" l;
option i expression ppf eo;
| Texp_record (l, _, eo) ->
| Texp_record { fields; extended_expression; _ } ->
line i ppf "Texp_record\n";
array i record_field ppf l;
option i expression ppf eo;
array i record_field ppf fields;
option i expression ppf extended_expression;
| Texp_field (e, li, _) ->
line i ppf "Texp_field\n";
expression i ppf e;

View File

@ -255,17 +255,17 @@ let expr sub x =
Texp_construct (lid, cd, List.map (sub.expr sub) args)
| Texp_variant (l, expo) ->
Texp_variant (l, opt (sub.expr sub) expo)
| Texp_record (fields, repr, expo) ->
| Texp_record { fields; representation; extended_expression } ->
let fields = Array.map (function
| label, Kept t -> label, Kept t
| label, Overridden (lid, exp) ->
label, Overridden (lid, sub.expr sub exp))
fields
in
Texp_record (
fields, repr,
opt (sub.expr sub) expo
)
Texp_record {
fields; representation;
extended_expression = opt (sub.expr sub) extended_expression;
}
| Texp_field (exp, lid, ld) ->
Texp_field (sub.expr sub exp, lid, ld)
| Texp_setfield (exp1, lid, ld, exp2) ->

View File

@ -1573,7 +1573,7 @@ let rec is_nonexpansive exp =
| Texp_construct( _, _, el) ->
List.for_all is_nonexpansive el
| Texp_variant(_, arg) -> is_nonexpansive_opt arg
| Texp_record (fields, _, opt_init_exp) ->
| Texp_record { fields; extended_expression } ->
Array.for_all
(fun (lbl, definition) ->
match definition with
@ -1581,7 +1581,7 @@ let rec is_nonexpansive exp =
lbl.lbl_mut = Immutable && is_nonexpansive exp
| Kept _ -> true)
fields
&& is_nonexpansive_opt opt_init_exp
&& is_nonexpansive_opt extended_expression
| Texp_field(exp, _, _) -> is_nonexpansive exp
| Texp_array [] -> true
| Texp_ifthenelse(_cond, ifso, ifnot) ->
@ -2335,7 +2335,7 @@ and type_expect_ ?in_function ?(recarg=Rejected) env sexp ty_expected =
| (_, lbl,_)::_ -> Array.length lbl.lbl_all in
if opt_sexp <> None && List.length lid_sexp_list = num_fields then
Location.prerr_warning loc Warnings.Useless_record_with;
let label_descriptions, record_representation =
let label_descriptions, representation =
let (_, { lbl_all; lbl_repres }, _) = List.hd lbl_exp_list in
lbl_all, lbl_repres
in
@ -2344,8 +2344,10 @@ and type_expect_ ?in_function ?(recarg=Rejected) env sexp ty_expected =
label_descriptions label_definitions
in
re {
exp_desc = Texp_record(fields,
record_representation, opt_exp);
exp_desc = Texp_record {
fields; representation;
extended_expression = opt_exp
};
exp_loc = loc; exp_extra = [];
exp_type = instance env ty_expected;
exp_attributes = sexp.pexp_attributes;

View File

@ -85,9 +85,11 @@ and expression_desc =
| Texp_construct of
Longident.t loc * constructor_description * expression list
| Texp_variant of label * expression option
| Texp_record of
( Types.label_description * record_label_definition ) array *
Types.record_representation * expression option
| Texp_record of {
fields : ( Types.label_description * record_label_definition ) array;
representation : Types.record_representation;
extended_expression : expression option;
}
| Texp_field of expression * Longident.t loc * label_description
| Texp_setfield of
expression * Longident.t loc * label_description * expression

View File

@ -186,11 +186,13 @@ and expression_desc =
C (E1, ..., En) [E1;...;En]
*)
| Texp_variant of label * expression option
| Texp_record of
( Types.label_description * record_label_definition ) array *
Types.record_representation * expression option
(** { l1=P1; ...; ln=Pn } (None)
{ E0 with l1=P1; ...; ln=Pn } (Some E0)
| Texp_record of {
fields : ( Types.label_description * record_label_definition ) array;
representation : Types.record_representation;
extended_expression : expression option;
}
(** { l1=P1; ...; ln=Pn } (extended_expression = None)
{ E0 with l1=P1; ...; ln=Pn } (extended_expression = Some E0)
Invariant: n > 0

View File

@ -295,12 +295,12 @@ module MakeIterator(Iter : IteratorArgument) : sig
None -> ()
| Some exp -> iter_expression exp
end
| Texp_record (fields, _, expo) ->
| Texp_record { fields; extended_expression; _ } ->
Array.iter (function
| _, Kept _ -> ()
| _, Overridden (_, exp) -> iter_expression exp)
fields;
begin match expo with
begin match extended_expression with
None -> ()
| Some exp -> iter_expression exp
end

View File

@ -306,7 +306,7 @@ module MakeMap(Map : MapArgument) = struct
| Some exp -> Some (map_expression exp)
in
Texp_variant (label, expo)
| Texp_record (fields, repr, expo) ->
| Texp_record { fields; representation; extended_expression } ->
let fields =
Array.map (function
| label, Kept t -> label, Kept t
@ -314,11 +314,11 @@ module MakeMap(Map : MapArgument) = struct
label, Overridden (lid, map_expression exp))
fields
in
let expo = match expo with
None -> expo
let extended_expression = match extended_expression with
None -> extended_expression
| Some exp -> Some (map_expression exp)
in
Texp_record (fields, repr, expo)
Texp_record { fields; representation; extended_expression }
| Texp_field (exp, lid, label) ->
Texp_field (map_expression exp, lid, label)
| Texp_setfield (exp1, lid, label, exp2) ->

View File

@ -410,13 +410,13 @@ let expression sub exp =
))
| Texp_variant (label, expo) ->
Pexp_variant (label, map_opt (sub.expr sub) expo)
| Texp_record (fields, _repr, expo) ->
| Texp_record { fields; extended_expression; _ } ->
let list = Array.fold_left (fun l -> function
| _, Kept _ -> l
| _, Overridden (lid, exp) -> (lid, sub.expr sub exp) :: l)
[] fields
in
Pexp_record (list, map_opt (sub.expr sub) expo)
Pexp_record (list, map_opt (sub.expr sub) extended_expression)
| Texp_field (exp, lid, _label) ->
Pexp_field (sub.expr sub exp, map_loc sub lid)
| Texp_setfield (exp1, lid, _label, exp2) ->