|
@@ -157,13 +157,7 @@ module Transformer = struct
|
|
| _ ->
|
|
| _ ->
|
|
{ ae.a_expr with eexpr = TBlock (el @ [ae.a_expr])}
|
|
{ ae.a_expr with eexpr = TBlock (el @ [ae.a_expr])}
|
|
|
|
|
|
- let lift_expr ?(is_value = false) ?(next_id = None) ?(blocks = []) e =
|
|
|
|
- let next_id = match next_id with
|
|
|
|
- | None ->
|
|
|
|
- new_counter()
|
|
|
|
- | Some f ->
|
|
|
|
- f
|
|
|
|
- in
|
|
|
|
|
|
+ let lift_expr ?(is_value = false) next_id ?(blocks = []) e =
|
|
{
|
|
{
|
|
a_expr = e;
|
|
a_expr = e;
|
|
a_blocks = blocks;
|
|
a_blocks = blocks;
|
|
@@ -172,7 +166,7 @@ module Transformer = struct
|
|
}
|
|
}
|
|
|
|
|
|
let lift_expr1 is_value next_id blocks e =
|
|
let lift_expr1 is_value next_id blocks e =
|
|
- lift_expr ~is_value:is_value ~next_id:(Some next_id) ~blocks:blocks e
|
|
|
|
|
|
+ lift_expr ~is_value:is_value next_id ~blocks:blocks e
|
|
|
|
|
|
let alloc_var = Type.alloc_var VGenerated
|
|
let alloc_var = Type.alloc_var VGenerated
|
|
|
|
|
|
@@ -331,7 +325,7 @@ module Transformer = struct
|
|
let eb = mk (TBlock (List.rev assigns)) t_dynamic p in
|
|
let eb = mk (TBlock (List.rev assigns)) t_dynamic p in
|
|
Type.concat eb tf.tf_expr
|
|
Type.concat eb tf.tf_expr
|
|
in
|
|
in
|
|
- let e1 = to_expr (transform_expr ~next_id:(Some ae.a_next_id) body) in
|
|
|
|
|
|
+ let e1 = to_expr (transform_expr ae.a_next_id body) in
|
|
let fn = mk (TFunction({
|
|
let fn = mk (TFunction({
|
|
tf_expr = e1;
|
|
tf_expr = e1;
|
|
tf_args = tf.tf_args;
|
|
tf_args = tf.tf_args;
|
|
@@ -345,7 +339,7 @@ module Transformer = struct
|
|
let def = mk (TVar(new_var,Some fn)) fn.etype p in
|
|
let def = mk (TVar(new_var,Some fn)) fn.etype p in
|
|
lift_expr1 false ae.a_next_id [def] new_local
|
|
lift_expr1 false ae.a_next_id [def] new_local
|
|
end else
|
|
end else
|
|
- lift_expr fn
|
|
|
|
|
|
+ lift_expr ae.a_next_id fn
|
|
|
|
|
|
and transform_var_expr ae eo v =
|
|
and transform_var_expr ae eo v =
|
|
KeywordHandler.check_var_declaration v;
|
|
KeywordHandler.check_var_declaration v;
|
|
@@ -358,18 +352,18 @@ module Transformer = struct
|
|
b,Some(f.a_expr)
|
|
b,Some(f.a_expr)
|
|
in
|
|
in
|
|
let e = mk (TVar(v,new_expr)) ae.a_expr.etype ae.a_expr.epos in
|
|
let e = mk (TVar(v,new_expr)) ae.a_expr.etype ae.a_expr.epos in
|
|
- lift_expr ~next_id:(Some ae.a_next_id) ~blocks:b e
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:b e
|
|
|
|
|
|
- and transform_expr ?(is_value = false) ?(next_id = None) ?(blocks = []) (e : texpr) : adjusted_expr =
|
|
|
|
- transform1 (lift_expr ~is_value ~next_id ~blocks e)
|
|
|
|
|
|
+ and transform_expr ?(is_value = false) next_id ?(blocks = []) (e : texpr) : adjusted_expr =
|
|
|
|
+ transform1 (lift_expr ~is_value next_id ~blocks e)
|
|
|
|
|
|
and transform_expr1 is_value next_id blocks e =
|
|
and transform_expr1 is_value next_id blocks e =
|
|
- transform_expr ~is_value ~next_id:(Some next_id) ~blocks e
|
|
|
|
|
|
+ transform_expr ~is_value next_id ~blocks e
|
|
|
|
|
|
and transform_exprs_to_block el tb is_value p next_id =
|
|
and transform_exprs_to_block el tb is_value p next_id =
|
|
match el with
|
|
match el with
|
|
| [e] ->
|
|
| [e] ->
|
|
- transform_expr ~is_value ~next_id:(Some next_id) e
|
|
|
|
|
|
+ transform_expr ~is_value next_id e
|
|
| _ ->
|
|
| _ ->
|
|
let size = List.length el in
|
|
let size = List.length el in
|
|
let res = DynArray.create () in
|
|
let res = DynArray.create () in
|
|
@@ -382,13 +376,13 @@ module Transformer = struct
|
|
| _ -> false
|
|
| _ -> false
|
|
in
|
|
in
|
|
if not (is_removable_statement e) then
|
|
if not (is_removable_statement e) then
|
|
- let ae = transform_expr ~is_value ~next_id:(Some next_id) e in
|
|
|
|
|
|
+ let ae = transform_expr ~is_value next_id e in
|
|
List.iter (DynArray.add res) ae.a_blocks;
|
|
List.iter (DynArray.add res) ae.a_blocks;
|
|
DynArray.add res ae.a_expr
|
|
DynArray.add res ae.a_expr
|
|
else
|
|
else
|
|
()
|
|
()
|
|
) el;
|
|
) el;
|
|
- lift_expr (mk (TBlock (DynArray.to_list res)) tb p)
|
|
|
|
|
|
+ lift_expr next_id (mk (TBlock (DynArray.to_list res)) tb p)
|
|
|
|
|
|
and transform_switch ae is_value e1 cases edef =
|
|
and transform_switch ae is_value e1 cases edef =
|
|
let case_functions = ref [] in
|
|
let case_functions = ref [] in
|
|
@@ -485,7 +479,7 @@ module Transformer = struct
|
|
forward_transform e ae
|
|
forward_transform e ae
|
|
|
|
|
|
and transform_op_assign_op ae e1 op one is_value post =
|
|
and transform_op_assign_op ae e1 op one is_value post =
|
|
- let e1_ = transform_expr e1 ~is_value:true ~next_id:(Some ae.a_next_id) in
|
|
|
|
|
|
+ let e1_ = transform_expr ae.a_next_id e1 ~is_value:true in
|
|
let handle_as_local temp_local =
|
|
let handle_as_local temp_local =
|
|
let ex = ae.a_expr in
|
|
let ex = ae.a_expr in
|
|
let res_var = alloc_var (ae.a_next_id()) ex.etype ex.epos in
|
|
let res_var = alloc_var (ae.a_next_id()) ex.etype ex.epos in
|
|
@@ -502,7 +496,7 @@ module Transformer = struct
|
|
let block = e1_.a_blocks @ blocks in
|
|
let block = e1_.a_blocks @ blocks in
|
|
if is_value then begin
|
|
if is_value then begin
|
|
let f = exprs_to_func block (ae.a_next_id()) ae in
|
|
let f = exprs_to_func block (ae.a_next_id()) ae in
|
|
- lift_expr f.a_expr ~is_value:true ~next_id:(Some ae.a_next_id) ~blocks:f.a_blocks
|
|
|
|
|
|
+ lift_expr ae.a_next_id f.a_expr ~is_value:true ~blocks:f.a_blocks
|
|
end else begin
|
|
end else begin
|
|
let block = e1_.a_blocks @ [assign_expr] in
|
|
let block = e1_.a_blocks @ [assign_expr] in
|
|
transform_exprs_to_block block ex.etype false ex.epos ae.a_next_id
|
|
transform_exprs_to_block block ex.etype false ex.epos ae.a_next_id
|
|
@@ -535,7 +529,7 @@ module Transformer = struct
|
|
let block = e1_.a_blocks @ [temp_var_l;temp_var_r;temp_var;assign_expr;if post then temp_local else temp_var_expr] in
|
|
let block = e1_.a_blocks @ [temp_var_l;temp_var_r;temp_var;assign_expr;if post then temp_local else temp_var_expr] in
|
|
if is_value then begin
|
|
if is_value then begin
|
|
let f = exprs_to_func block (ae.a_next_id()) ae in
|
|
let f = exprs_to_func block (ae.a_next_id()) ae in
|
|
- lift_expr f.a_expr ~is_value:true ~next_id:(Some ae.a_next_id) ~blocks:f.a_blocks
|
|
|
|
|
|
+ lift_expr ae.a_next_id f.a_expr ~is_value:true ~blocks:f.a_blocks
|
|
end else
|
|
end else
|
|
transform_exprs_to_block block ae.a_expr.etype false ae.a_expr.epos ae.a_next_id
|
|
transform_exprs_to_block block ae.a_expr.etype false ae.a_expr.epos ae.a_next_id
|
|
| TField(e1,fa) ->
|
|
| TField(e1,fa) ->
|
|
@@ -553,7 +547,7 @@ module Transformer = struct
|
|
let block = e1_.a_blocks @ [temp_var_l;temp_var;assign_expr;if post then temp_local else temp_var_expr] in
|
|
let block = e1_.a_blocks @ [temp_var_l;temp_var;assign_expr;if post then temp_local else temp_var_expr] in
|
|
if is_value then begin
|
|
if is_value then begin
|
|
let f = exprs_to_func block (ae.a_next_id()) ae in
|
|
let f = exprs_to_func block (ae.a_next_id()) ae in
|
|
- lift_expr f.a_expr ~is_value:true ~next_id:(Some ae.a_next_id) ~blocks:f.a_blocks
|
|
|
|
|
|
+ lift_expr ae.a_next_id f.a_expr ~is_value:true ~blocks:f.a_blocks
|
|
end else
|
|
end else
|
|
transform_exprs_to_block block ae.a_expr.etype false ae.a_expr.epos ae.a_next_id
|
|
transform_exprs_to_block block ae.a_expr.etype false ae.a_expr.epos ae.a_next_id
|
|
| _ ->
|
|
| _ ->
|
|
@@ -613,13 +607,13 @@ module Transformer = struct
|
|
let assign = { ex with eexpr = TVar(fvar, Some(f))} in
|
|
let assign = { ex with eexpr = TVar(fvar, Some(f))} in
|
|
let call_expr = (mk (TLocal fvar) fexpr.etype ex.epos ) in
|
|
let call_expr = (mk (TLocal fvar) fexpr.etype ex.epos ) in
|
|
let substitute = mk (TCall(call_expr, [])) ex.etype ex.epos in
|
|
let substitute = mk (TCall(call_expr, [])) ex.etype ex.epos in
|
|
- lift_expr ~blocks:[assign] substitute)
|
|
|
|
|
|
+ lift_expr base.a_next_id ~blocks:[assign] substitute)
|
|
in
|
|
in
|
|
match exprs with
|
|
match exprs with
|
|
| [{ eexpr = TFunction({ tf_args = []} as f) } as x] ->
|
|
| [{ eexpr = TFunction({ tf_args = []} as f) } as x] ->
|
|
let l = to_tlocal_expr name f.tf_type f.tf_expr.epos in
|
|
let l = to_tlocal_expr name f.tf_type f.tf_expr.epos in
|
|
let substitute = mk (TCall(l, [])) f.tf_type f.tf_expr.epos in
|
|
let substitute = mk (TCall(l, [])) f.tf_type f.tf_expr.epos in
|
|
- lift_expr ~blocks:[x] substitute
|
|
|
|
|
|
+ lift_expr base.a_next_id ~blocks:[x] substitute
|
|
| _ -> def
|
|
| _ -> def
|
|
|
|
|
|
and transform_call is_value e params ae =
|
|
and transform_call is_value e params ae =
|
|
@@ -629,7 +623,7 @@ module Transformer = struct
|
|
let blocks = e.a_blocks @ (List.flatten (List.map (fun (p) -> p.a_blocks) params)) in
|
|
let blocks = e.a_blocks @ (List.flatten (List.map (fun (p) -> p.a_blocks) params)) in
|
|
let params = List.map (fun (p) -> p.a_expr) params in
|
|
let params = List.map (fun (p) -> p.a_expr) params in
|
|
let e = { ae.a_expr with eexpr = TCall(e.a_expr, params) } in
|
|
let e = { ae.a_expr with eexpr = TCall(e.a_expr, params) } in
|
|
- lift_expr ~blocks:blocks e
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:blocks e
|
|
in
|
|
in
|
|
match e, params with
|
|
match e, params with
|
|
(* the foreach block should not be handled as a value *)
|
|
(* the foreach block should not be handled as a value *)
|
|
@@ -648,9 +642,9 @@ module Transformer = struct
|
|
| (is_value,TBlock [x]) ->
|
|
| (is_value,TBlock [x]) ->
|
|
trans is_value [] x
|
|
trans is_value [] x
|
|
| (false,TBlock []) ->
|
|
| (false,TBlock []) ->
|
|
- lift_expr a_expr
|
|
|
|
|
|
+ lift_expr ae.a_next_id a_expr
|
|
| (true,TBlock []) ->
|
|
| (true,TBlock []) ->
|
|
- lift_expr (mk (TConst TNull) ae.a_expr.etype ae.a_expr.epos)
|
|
|
|
|
|
+ lift_expr ae.a_next_id (mk (TConst TNull) ae.a_expr.etype ae.a_expr.epos)
|
|
| (false,TBlock el) ->
|
|
| (false,TBlock el) ->
|
|
transform_exprs_to_block el ae.a_expr.etype false ae.a_expr.epos ae.a_next_id
|
|
transform_exprs_to_block el ae.a_expr.etype false ae.a_expr.epos ae.a_next_id
|
|
| (true,TBlock el) ->
|
|
| (true,TBlock el) ->
|
|
@@ -672,7 +666,7 @@ module Transformer = struct
|
|
let fn_assign = mk (TVar (t_var,Some f)) ae.a_expr.etype ae.a_expr.epos in
|
|
let fn_assign = mk (TVar (t_var,Some f)) ae.a_expr.etype ae.a_expr.epos in
|
|
let ev = mk (TLocal t_var) ae.a_expr.etype ae.a_expr.epos in
|
|
let ev = mk (TLocal t_var) ae.a_expr.etype ae.a_expr.epos in
|
|
let substitute = mk (TCall(ev,[])) ae.a_expr.etype ae.a_expr.epos in
|
|
let substitute = mk (TCall(ev,[])) ae.a_expr.etype ae.a_expr.epos in
|
|
- lift_expr ~blocks:[fn_assign] substitute
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:[fn_assign] substitute
|
|
| (is_value,TFunction(f)) ->
|
|
| (is_value,TFunction(f)) ->
|
|
transform_function f ae is_value
|
|
transform_function f ae is_value
|
|
| (_,TVar(v,None)) ->
|
|
| (_,TVar(v,None)) ->
|
|
@@ -714,7 +708,7 @@ module Transformer = struct
|
|
|
|
|
|
let blocks = a1.a_blocks @ [var_decl] in
|
|
let blocks = a1.a_blocks @ [var_decl] in
|
|
|
|
|
|
- lift_expr ~blocks: blocks twhile
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks: blocks twhile
|
|
| (_,TReturn None) ->
|
|
| (_,TReturn None) ->
|
|
ae
|
|
ae
|
|
| (_,TReturn (Some ({eexpr = TFunction f} as ef))) ->
|
|
| (_,TReturn (Some ({eexpr = TFunction f} as ef))) ->
|
|
@@ -795,10 +789,10 @@ module Transformer = struct
|
|
| [] ->
|
|
| [] ->
|
|
let meta = Meta.Custom(":ternaryIf"), [], ae.a_expr.epos in
|
|
let meta = Meta.Custom(":ternaryIf"), [], ae.a_expr.epos in
|
|
let ternary = { ae.a_expr with eexpr = TMeta(meta, new_if) } in
|
|
let ternary = { ae.a_expr with eexpr = TMeta(meta, new_if) } in
|
|
- lift_expr ~blocks:blocks ternary
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:blocks ternary
|
|
| b ->
|
|
| b ->
|
|
let f = exprs_to_func (List.append blocks [new_if]) (ae.a_next_id ()) ae in
|
|
let f = exprs_to_func (List.append blocks [new_if]) (ae.a_next_id ()) ae in
|
|
- lift_expr ~blocks:f.a_blocks f.a_expr)
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:f.a_blocks f.a_expr)
|
|
| (false, TIf(econd, eif, eelse)) ->
|
|
| (false, TIf(econd, eif, eelse)) ->
|
|
let econd = trans true [] econd in
|
|
let econd = trans true [] econd in
|
|
let eif = to_expr (trans false [] eif) in
|
|
let eif = to_expr (trans false [] eif) in
|
|
@@ -842,20 +836,20 @@ module Transformer = struct
|
|
(* anon field access on optional params *)
|
|
(* anon field access on optional params *)
|
|
| (is_value, TField(e,FAnon cf)) when Meta.has Meta.Optional cf.cf_meta ->
|
|
| (is_value, TField(e,FAnon cf)) when Meta.has Meta.Optional cf.cf_meta ->
|
|
let e = dynamic_field_read e cf.cf_name ae.a_expr.etype in
|
|
let e = dynamic_field_read e cf.cf_name ae.a_expr.etype in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TBinop(OpAssign,{eexpr = TField(e1,FAnon cf)},e2)) when Meta.has Meta.Optional cf.cf_meta ->
|
|
| (is_value, TBinop(OpAssign,{eexpr = TField(e1,FAnon cf)},e2)) when Meta.has Meta.Optional cf.cf_meta ->
|
|
let e = dynamic_field_write e1 cf.cf_name e2 in
|
|
let e = dynamic_field_write e1 cf.cf_name e2 in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TBinop(OpAssignOp op,{eexpr = TField(e1,FAnon cf); etype = t},e2)) when Meta.has Meta.Optional cf.cf_meta ->
|
|
| (is_value, TBinop(OpAssignOp op,{eexpr = TField(e1,FAnon cf); etype = t},e2)) when Meta.has Meta.Optional cf.cf_meta ->
|
|
let e = dynamic_field_read_write ae.a_next_id e1 cf.cf_name op e2 t in
|
|
let e = dynamic_field_read_write ae.a_next_id e1 cf.cf_name op e2 t in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
|
|
|
|
| (is_value, TUnop( (Increment | Decrement) as unop, unop_flag,{eexpr = TField(e1, FAnon cf); etype = t; epos = p})) when Meta.has Meta.Optional cf.cf_meta ->
|
|
| (is_value, TUnop( (Increment | Decrement) as unop, unop_flag,{eexpr = TField(e1, FAnon cf); etype = t; epos = p})) when Meta.has Meta.Optional cf.cf_meta ->
|
|
let e = dynamic_field_inc_dec ae.a_next_id e1 cf.cf_name unop unop_flag t p in
|
|
let e = dynamic_field_inc_dec ae.a_next_id e1 cf.cf_name unop unop_flag t p in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TUnop( (Increment | Decrement) as unop, unop_flag,{eexpr = TField(e1, FDynamic field_name); etype = t; epos = p})) ->
|
|
| (is_value, TUnop( (Increment | Decrement) as unop, unop_flag,{eexpr = TField(e1, FDynamic field_name); etype = t; epos = p})) ->
|
|
let e = dynamic_field_inc_dec ae.a_next_id e1 field_name unop unop_flag t p in
|
|
let e = dynamic_field_inc_dec ae.a_next_id e1 field_name unop unop_flag t p in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
(*
|
|
(*
|
|
anon field access with non optional members like iterator, length, split must be handled too, we need to Reflect on them too when it's a runtime method
|
|
anon field access with non optional members like iterator, length, split must be handled too, we need to Reflect on them too when it's a runtime method
|
|
*)
|
|
*)
|
|
@@ -872,17 +866,17 @@ module Transformer = struct
|
|
| (_, TUnop(op, Prefix, e)) ->
|
|
| (_, TUnop(op, Prefix, e)) ->
|
|
let e1 = trans true [] e in
|
|
let e1 = trans true [] e in
|
|
let r = { a_expr with eexpr = TUnop(op, Prefix, e1.a_expr) } in
|
|
let r = { a_expr with eexpr = TUnop(op, Prefix, e1.a_expr) } in
|
|
- lift_expr ~blocks:e1.a_blocks r
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:e1.a_blocks r
|
|
|
|
|
|
| (is_value, TField(e,FDynamic s)) ->
|
|
| (is_value, TField(e,FDynamic s)) ->
|
|
let e = dynamic_field_read e s ae.a_expr.etype in
|
|
let e = dynamic_field_read e s ae.a_expr.etype in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TBinop(OpAssign,{eexpr = TField(e1,FDynamic s)},e2)) ->
|
|
| (is_value, TBinop(OpAssign,{eexpr = TField(e1,FDynamic s)},e2)) ->
|
|
let e = dynamic_field_write e1 s e2 in
|
|
let e = dynamic_field_write e1 s e2 in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TBinop(OpAssignOp op,{eexpr = TField(e1,FDynamic s); etype = t},e2)) ->
|
|
| (is_value, TBinop(OpAssignOp op,{eexpr = TField(e1,FDynamic s); etype = t},e2)) ->
|
|
let e = dynamic_field_read_write ae.a_next_id e1 s op e2 t in
|
|
let e = dynamic_field_read_write ae.a_next_id e1 s op e2 t in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TBinop(OpAssign, left, right))->
|
|
| (is_value, TBinop(OpAssign, left, right))->
|
|
(let left = trans true [] left in
|
|
(let left = trans true [] left in
|
|
let right = trans true [] right in
|
|
let right = trans true [] right in
|
|
@@ -925,7 +919,7 @@ module Transformer = struct
|
|
let e2 = trans true [] e2 in
|
|
let e2 = trans true [] e2 in
|
|
let r = { a_expr with eexpr = TArray(e1.a_expr, e2.a_expr)} in
|
|
let r = { a_expr with eexpr = TArray(e1.a_expr, e2.a_expr)} in
|
|
let blocks = List.append e1.a_blocks e2.a_blocks in
|
|
let blocks = List.append e1.a_blocks e2.a_blocks in
|
|
- lift_expr ~blocks:blocks r
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:blocks r
|
|
| (false, TTry(etry, catches)) ->
|
|
| (false, TTry(etry, catches)) ->
|
|
let etry = trans false [] etry in
|
|
let etry = trans false [] etry in
|
|
let catches = List.map (fun(v,e) -> KeywordHandler.check_var_declaration v; v, trans false [] e) catches in
|
|
let catches = List.map (fun(v,e) -> KeywordHandler.check_var_declaration v; v, trans false [] e) catches in
|
|
@@ -952,49 +946,49 @@ module Transformer = struct
|
|
let blocks = List.flatten (List.map (fun (_,ex) -> ex.a_blocks) fields) in
|
|
let blocks = List.flatten (List.map (fun (_,ex) -> ex.a_blocks) fields) in
|
|
let fields = List.map (fun (name,ex) -> name, ex.a_expr) fields in
|
|
let fields = List.map (fun (name,ex) -> name, ex.a_expr) fields in
|
|
let r = { a_expr with eexpr = (TObjectDecl(fields) )} in
|
|
let r = { a_expr with eexpr = (TObjectDecl(fields) )} in
|
|
- lift_expr ~blocks r
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks r
|
|
| (_, TArrayDecl(values)) ->
|
|
| (_, TArrayDecl(values)) ->
|
|
let values = List.map (trans true []) values in
|
|
let values = List.map (trans true []) values in
|
|
let blocks = List.flatten (List.map (fun (v) -> v.a_blocks) values) in
|
|
let blocks = List.flatten (List.map (fun (v) -> v.a_blocks) values) in
|
|
let exprs = List.map (fun (v) -> v.a_expr) values in
|
|
let exprs = List.map (fun (v) -> v.a_expr) values in
|
|
let r = { a_expr with eexpr = TArrayDecl exprs } in
|
|
let r = { a_expr with eexpr = TArrayDecl exprs } in
|
|
- lift_expr ~blocks:blocks r
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:blocks r
|
|
| (is_value, TCast(e1,Some mt)) ->
|
|
| (is_value, TCast(e1,Some mt)) ->
|
|
let e = Codegen.default_cast ~vtmp:(ae.a_next_id()) (match !como with Some com -> com | None -> assert false) e1 mt ae.a_expr.etype ae.a_expr.epos in
|
|
let e = Codegen.default_cast ~vtmp:(ae.a_next_id()) (match !como with Some com -> com | None -> assert false) e1 mt ae.a_expr.etype ae.a_expr.epos in
|
|
- transform_expr ~is_value:is_value e
|
|
|
|
|
|
+ transform_expr ae.a_next_id ~is_value:is_value e
|
|
| (is_value, TCast(e,None)) ->
|
|
| (is_value, TCast(e,None)) ->
|
|
let e = trans is_value [] e in
|
|
let e = trans is_value [] e in
|
|
let r = { a_expr with eexpr = TCast(e.a_expr, None)} in
|
|
let r = { a_expr with eexpr = TCast(e.a_expr, None)} in
|
|
- lift_expr ~blocks:e.a_blocks r
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:e.a_blocks r
|
|
| (_, TField(e,f)) ->
|
|
| (_, TField(e,f)) ->
|
|
let e = trans true [] e in
|
|
let e = trans true [] e in
|
|
let r = { a_expr with eexpr = TField(e.a_expr, f) } in
|
|
let r = { a_expr with eexpr = TField(e.a_expr, f) } in
|
|
- lift_expr ~blocks:e.a_blocks r
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:e.a_blocks r
|
|
| (is_value, TMeta(m, e)) ->
|
|
| (is_value, TMeta(m, e)) ->
|
|
let e = trans is_value [] e in
|
|
let e = trans is_value [] e in
|
|
let r = { a_expr with eexpr = TMeta(m, e.a_expr); etype = e.a_expr.etype } in
|
|
let r = { a_expr with eexpr = TMeta(m, e.a_expr); etype = e.a_expr.etype } in
|
|
- lift_expr ~blocks:e.a_blocks r
|
|
|
|
- | ( _, TLocal _ ) -> lift_expr a_expr
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~blocks:e.a_blocks r
|
|
|
|
+ | ( _, TLocal _ ) -> lift_expr ae.a_next_id a_expr
|
|
|
|
|
|
- | ( _, TConst _ ) -> lift_expr a_expr
|
|
|
|
- | ( _, TTypeExpr _ ) -> lift_expr a_expr
|
|
|
|
|
|
+ | ( _, TConst _ ) -> lift_expr ae.a_next_id a_expr
|
|
|
|
+ | ( _, TTypeExpr _ ) -> lift_expr ae.a_next_id a_expr
|
|
| ( _, TUnop _ ) -> assert false
|
|
| ( _, TUnop _ ) -> assert false
|
|
| ( true, TWhile(econd, ebody, DoWhile) ) ->
|
|
| ( true, TWhile(econd, ebody, DoWhile) ) ->
|
|
let new_expr = trans false [] a_expr in
|
|
let new_expr = trans false [] a_expr in
|
|
let f = exprs_to_func (new_expr.a_blocks @ [new_expr.a_expr]) (ae.a_next_id()) ae in
|
|
let f = exprs_to_func (new_expr.a_blocks @ [new_expr.a_expr]) (ae.a_next_id()) ae in
|
|
- lift_expr ~is_value:true ~blocks:f.a_blocks f.a_expr
|
|
|
|
|
|
+ lift_expr ae.a_next_id ~is_value:true ~blocks:f.a_blocks f.a_expr
|
|
|
|
|
|
| ( _, TBreak ) | ( _, TContinue ) | ( _, TIdent _) ->
|
|
| ( _, TBreak ) | ( _, TContinue ) | ( _, TIdent _) ->
|
|
- lift_expr a_expr
|
|
|
|
|
|
+ lift_expr ae.a_next_id a_expr
|
|
|
|
|
|
and transform e =
|
|
and transform e =
|
|
- to_expr (transform1 (lift_expr e))
|
|
|
|
|
|
+ to_expr (transform1 (lift_expr (new_counter()) e))
|
|
|
|
|
|
and forward_transform e base =
|
|
and forward_transform e base =
|
|
transform1 (lift_expr1 base.a_is_value base.a_next_id base.a_blocks e)
|
|
transform1 (lift_expr1 base.a_is_value base.a_next_id base.a_blocks e)
|
|
|
|
|
|
let transform_to_value e =
|
|
let transform_to_value e =
|
|
- to_expr (transform1 (lift_expr e ~is_value:true))
|
|
|
|
|
|
+ to_expr (transform1 (lift_expr (new_counter()) e ~is_value:true))
|
|
|
|
|
|
end
|
|
end
|
|
|
|
|