Skip to content

Commit

Permalink
[hl] don't optimize vars used inside nested try/catch
Browse files Browse the repository at this point in the history
  • Loading branch information
kLabz committed Nov 17, 2023
1 parent dbd1551 commit 05fb0d2
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 8 deletions.
29 changes: 21 additions & 8 deletions src/generators/genhl.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3084,27 +3084,40 @@ and gen_assign_op ctx acc e1 f =
and build_capture_vars ctx f =
let ignored_vars = ref PMap.empty in
let used_vars = ref PMap.empty in
let depth = ref 0 in

(* get all captured vars in scope, ignore vars that are declared *)
let decl_var v =
if has_var_flag v VCaptured then ignored_vars := PMap.add v.v_id () !ignored_vars
if has_var_flag v VCaptured then
ignored_vars := PMap.add v.v_id !depth !ignored_vars
in
let use_var v =
(* vars used in nested try/catch need to act as captured vars #9174 *)
let decl_depth = try PMap.find v.v_id !ignored_vars with Not_found -> !depth in
if decl_depth < !depth then begin
add_var_flag v VCaptured;
ignored_vars := PMap.remove v.v_id !ignored_vars;
end;

if has_var_flag v VCaptured then used_vars := PMap.add v.v_id v !used_vars
in
let rec loop e =
(match e.eexpr with
| TLocal v ->
use_var v;
| TVar (v,_) ->
decl_var v
| TTry (_,catches) ->
List.iter (fun (v,_) -> decl_var v) catches
decl_var v;
| TFunction f ->
List.iter (fun (v,_) -> decl_var v) f.tf_args;
| _ ->
()
);
Type.iter loop e
| _ -> ());

(match e.eexpr with
| TTry (_,catches) ->
incr depth;
List.iter (fun (v,_) -> decl_var v) catches;
Type.iter loop e;
decr depth
| _ -> Type.iter loop e)
in
List.iter (fun (v,_) -> decl_var v) f.tf_args;
loop f.tf_expr;
Expand Down
18 changes: 18 additions & 0 deletions tests/unit/src/unit/issues/Issue9174.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package unit.issues;

class Issue9174 extends unit.Test {
function test() {
var result = false;
try {
try {
throw '';
} catch(e:String) {
result = true;
eq(true, result);
throw e;
}
} catch(e:String) {
eq(true, result);
}
}
}

0 comments on commit 05fb0d2

Please sign in to comment.