Skip to content

Commit f7f295e

Browse files
committed
improve generated code
1 parent 5cb3752 commit f7f295e

File tree

5 files changed

+167
-100
lines changed

5 files changed

+167
-100
lines changed

jscomp/core/js_output.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,9 @@ let output_of_block_and_expression
9090
| Assign n, ReturnFalse -> make (block @ [S.assign n exp])
9191
| EffectCall, ReturnTrue _ -> make (block @ [S.return_stmt exp]) ~finished:True
9292
| (Declare _ | Assign _), ReturnTrue _ ->
93-
make [S.unknown_lambda lam] ~finished:True
94-
| NeedValue, _ -> make block ~value:exp
93+
make [S.unknown_lambda lam] ~finished:True
94+
| NeedValue, (ReturnTrue _ | ReturnFalse) ->
95+
make block ~value:exp
9596

9697
let statement_of_opt_expr (x : J.expression option) : J.statement =
9798
match x with

jscomp/core/lam_compile.ml

Lines changed: 66 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -691,21 +691,39 @@ and
691691
st
692692
should_return lam l_block (E.and_ l_expr r_expr)
693693
| { block = r_block; value = Some r_expr} ->
694-
let v = Ext_ident.create_tmp () in
695-
Js_output.output_of_block_and_expression
696-
st
697-
should_return
698-
lam
699-
(S.define_variable ~kind:Variable v E.caml_false ::
700-
l_block @
701-
[S.if_ l_expr
702-
(r_block @ [
703-
S.assign v r_expr
704-
]
705-
)
706-
]
707-
)
708-
(E.var v)
694+
begin match cxt.st with
695+
| Assign v ->
696+
(* Refernece Js_output.output_of_block_and_expression *)
697+
Js_output.make
698+
(
699+
l_block @
700+
[S.if_ l_expr (r_block @ [ S.assign v r_expr])
701+
~else_:[S.assign v E.caml_false]
702+
]
703+
)
704+
| Declare (_kind,v) ->
705+
(* Refernece Js_output.output_of_block_and_expression *)
706+
Js_output.make
707+
(
708+
l_block @
709+
[ S.define_variable ~kind:Variable v E.caml_false ;
710+
S.if_ l_expr
711+
(r_block @ [S.assign v r_expr])])
712+
| EffectCall
713+
| NeedValue ->
714+
let v = Ext_ident.create_tmp () in
715+
Js_output.make
716+
(S.define_variable ~kind:Variable v E.caml_false ::
717+
l_block @
718+
[S.if_ l_expr
719+
(r_block @ [
720+
S.assign v r_expr
721+
]
722+
)
723+
]
724+
)
725+
~value:(E.var v)
726+
end
709727
end
710728
| Lprim {primitive = Psequor; args = [l;r]}
711729
->
@@ -726,20 +744,39 @@ and
726744
Js_output.output_of_block_and_expression
727745
st should_return lam l_block exp
728746
| {block = r_block; value = Some r_expr} ->
729-
let v = Ext_ident.create_tmp () in
730-
Js_output.output_of_block_and_expression
731-
st
732-
should_return
733-
lam
734-
(S.define_variable ~kind:Variable v E.caml_true
735-
:: l_block @
736-
[ S.if_ (E.not l_expr)
737-
(r_block @ [
738-
S.assign v r_expr
739-
])
740-
]
741-
)
742-
(E.var v)
747+
begin match cxt.st with
748+
| Assign v ->
749+
(* Reference Js_output.output_of_block_and_expression *)
750+
Js_output.make
751+
(l_block @
752+
[ S.if_ (E.not l_expr)
753+
(r_block @ [
754+
S.assign v r_expr
755+
])
756+
~else_:[S.assign v E.caml_true] ])
757+
| Declare(_kind,v) ->
758+
Js_output.make
759+
(
760+
l_block @
761+
[ S.define_variable ~kind:Variable v E.caml_true;
762+
S.if_ (E.not l_expr)
763+
(r_block @ [S.assign v r_expr])
764+
]
765+
)
766+
| EffectCall
767+
| NeedValue ->
768+
let v = Ext_ident.create_tmp () in
769+
Js_output.make
770+
( l_block @
771+
[S.define_variable ~kind:Variable v E.caml_true;
772+
S.if_ (E.not l_expr)
773+
(r_block @ [
774+
S.assign v r_expr
775+
])
776+
]
777+
)
778+
~value:(E.var v)
779+
end
743780
end
744781
| Lprim {primitive = Pdebugger ; _}
745782
->

jscomp/test/gpr_2608_test.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,24 @@ var oppHeroes = /* :: */[
1616
/* [] */0
1717
];
1818

19-
var tmp = /* false */0;
19+
var huntGrootCondition = /* false */0;
2020

2121
if (List.length(/* [] */0) > 0) {
2222
var x = List.filter((function () {
2323
return +(List.hd(/* [] */0) <= 1000);
2424
}))(oppHeroes);
25-
tmp = +(List.length(x) === 0);
25+
huntGrootCondition = +(List.length(x) === 0);
2626
}
2727

28-
var huntGrootCondition = tmp;
29-
30-
var tmp$1 = /* true */1;
28+
var huntGrootCondition2 = /* true */1;
3129

3230
if (List.length(/* [] */0) < 0) {
3331
var x$1 = List.filter((function () {
3432
return +(List.hd(/* [] */0) <= 1000);
3533
}))(oppHeroes);
36-
tmp$1 = +(List.length(x$1) === 0);
34+
huntGrootCondition2 = +(List.length(x$1) === 0);
3735
}
3836

39-
var huntGrootCondition2 = tmp$1;
40-
4137
eq("File \"gpr_2608_test.ml\", line 23, characters 5-12", huntGrootCondition, /* false */0);
4238

4339
eq("File \"gpr_2608_test.ml\", line 24, characters 5-12", huntGrootCondition2, /* true */1);

jscomp/test/ocaml_typedtree_test.js

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8958,22 +8958,21 @@ function typexp(s, ty) {
89588958
}
89598959
}
89608960
if (exit$2 === 4) {
8961-
var tmp$2 = /* true */1;
8961+
var dup = /* true */1;
89628962
if (!s[/* for_saving */3]) {
8963-
var tmp$3 = /* true */1;
8963+
var tmp$2 = /* true */1;
89648964
if (more[/* level */1] !== 100000000) {
8965-
var tmp$4 = /* true */1;
8965+
var tmp$3 = /* true */1;
89668966
if (!static_row(row)) {
89678967
var match$6 = more[/* desc */0];
8968-
var tmp$5;
8969-
tmp$5 = typeof match$6 === "number" || match$6.tag !== 3 ? /* false */0 : /* true */1;
8970-
tmp$4 = tmp$5;
8968+
var tmp$4;
8969+
tmp$4 = typeof match$6 === "number" || match$6.tag !== 3 ? /* false */0 : /* true */1;
8970+
tmp$3 = tmp$4;
89718971
}
8972-
tmp$3 = tmp$4;
8972+
tmp$2 = tmp$3;
89738973
}
8974-
tmp$2 = tmp$3;
8974+
dup = tmp$2;
89758975
}
8976-
var dup = tmp$2;
89778976
var match$7 = more[/* desc */0];
89788977
var more$prime;
89798978
var exit$3 = 0;
@@ -29979,10 +29978,10 @@ function unify_row(env, row1, row2) {
2997929978
var m2 = f2$2[2];
2998029979
var tl2 = f2$2[1];
2998129980
var c2 = f2$2[0];
29982-
var tmp = /* false */0;
29981+
var redo = /* false */0;
2998329982
if (m1 || m2 || fixed1$1 || fixed2$1 || rigid_variants[0] && (List.length(tl1) === 1 || List.length(tl2) === 1)) {
2998429983
var match = Pervasives.$at(tl1, tl2);
29985-
var tmp$1;
29984+
var tmp;
2998629985
if (match) {
2998729986
var t1 = match[0];
2998829987
if (c1 || c2) {
@@ -29996,13 +29995,12 @@ function unify_row(env, row1, row2) {
2999629995
return unify(env$1, t1, param);
2999729996
}
2999829997
}(t1)), match[1]);
29999-
tmp$1 = +(e1[0] !== /* None */0 || e2[0] !== /* None */0);
29998+
tmp = +(e1[0] !== /* None */0 || e2[0] !== /* None */0);
3000029999
} else {
30001-
tmp$1 = /* false */0;
30000+
tmp = /* false */0;
3000230001
}
30003-
tmp = tmp$1;
30002+
redo = tmp;
3000430003
}
30005-
var redo = tmp;
3000630004
if (redo) {
3000730005
_f2 = f2$2;
3000830006
_f1 = f1$2;
@@ -56034,18 +56032,17 @@ function build_as_type(env, _p) {
5603456032
var ty_arg = match[1];
5603556033
var newrecord = p.slice();
5603656034
unify_pat(env, (newrecord[/* pat_type */3] = ty$1, newrecord), match[2]);
56037-
var tmp = /* false */0;
56035+
var refinable = /* false */0;
5603856036
if (lbl[/* lbl_mut */3] === /* Immutable */0) {
56039-
var tmp$1 = /* false */0;
56037+
var tmp = /* false */0;
5604056038
if (List.mem_assoc(lbl[/* lbl_pos */4], ppl)) {
5604156039
var match$1 = repr(lbl[/* lbl_arg */2])[/* desc */0];
56042-
var tmp$2;
56043-
tmp$2 = typeof match$1 === "number" || match$1.tag !== 10 ? /* true */1 : /* false */0;
56044-
tmp$1 = tmp$2;
56040+
var tmp$1;
56041+
tmp$1 = typeof match$1 === "number" || match$1.tag !== 10 ? /* true */1 : /* false */0;
56042+
tmp = tmp$1;
5604556043
}
56046-
tmp = tmp$1;
56044+
refinable = tmp;
5604756045
}
56048-
var refinable = tmp;
5604956046
if (refinable) {
5605056047
var arg = List.assoc(lbl[/* lbl_pos */4], ppl);
5605156048
var newrecord$1 = arg.slice();
@@ -62355,23 +62352,22 @@ function type_application(env, funct, sargs) {
6235562352
}
6235662353
};
6235762354
var ignored = [/* [] */0];
62358-
var tmp = /* true */1;
62355+
var ignore_labels = /* true */1;
6235962356
if (!classic[0]) {
6236062357
var match = list_labels(env, funct[/* exp_type */3]);
62361-
var tmp$1 = /* false */0;
62358+
var tmp = /* false */0;
6236262359
if (!match[1]) {
6236362360
var labels = List.filter((function (l) {
6236462361
return 1 - is_optional(l);
6236562362
}))(match[0]);
62366-
tmp$1 = +(List.length(labels) === List.length(sargs)) && List.for_all((function (param) {
62363+
tmp = +(List.length(labels) === List.length(sargs)) && List.for_all((function (param) {
6236762364
return +(param[0] === "");
6236862365
}), sargs) && List.exists((function (l) {
6236962366
return +(l !== "");
6237062367
}), labels) && (prerr_warning(funct[/* exp_loc */1], /* Labels_omitted */3), /* true */1);
6237162368
}
62372-
tmp = tmp$1;
62369+
ignore_labels = tmp;
6237362370
}
62374-
var ignore_labels = tmp;
6237562371
var warned = [/* false */0];
6237662372
var type_args = function (_args, _omitted, _ty_fun, _ty_fun0, _ty_old, _sargs, _more_sargs) {
6237762373
while(true) {
@@ -70735,16 +70731,15 @@ function class_expr(cl_num, val_env, met_env, _scl) {
7073570731
}
7073670732
};
7073770733
};
70738-
var tmp = /* true */1;
70734+
var ignore_labels = /* true */1;
7073970735
if (!classic[0]) {
7074070736
var labels = nonopt_labels(/* [] */0, cl$2[/* cl_type */2]);
70741-
tmp = +(List.length(labels) === List.length(sargs)) && List.for_all((function (param) {
70737+
ignore_labels = +(List.length(labels) === List.length(sargs)) && List.for_all((function (param) {
7074270738
return +(param[0] === "");
7074370739
}), sargs) && List.exists((function (l) {
7074470740
return +(l !== "");
7074570741
}), labels) && (prerr_warning(cl$2[/* cl_loc */1], /* Labels_omitted */3), /* true */1);
7074670742
}
70747-
var ignore_labels = tmp;
7074870743
var type_args = (function(cl$2,ignore_labels){
7074970744
return function type_args(_args, _omitted, _ty_fun, _ty_fun0, _sargs, _more_sargs) {
7075070745
while(true) {

0 commit comments

Comments
 (0)