Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions jscomp/js_pass_flatten.ml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ let flatten_map =
match x.statement_desc with
| Exp ({expression_desc = Seq _; _} as v) ->
(S.block ( List.rev_map (self#statement) (Js_analyzer.rev_flatten_seq v )))
| Exp ({expression_desc = Cond(a,b,c); _} ) ->
(S.if_ a ([ self#statement (S.exp b) ])
~else_:([self#statement (S.exp c)]))
| Exp ({expression_desc = Cond(a,b,c); comment} ) ->
(* Note that we need apply [self#statement] recursively *)
{ statement_desc = If (a, [ self#statement (S.exp b)],
Some [ self#statement (S.exp c)]); comment}
(* CHECK? Trick semantics difference *)
(* super#statement (S.if_ a ([ (\* self#statement *\) (S.exp b) ]) *)
(* ~else_:([self#statement (S.exp c)]) *)
Expand All @@ -46,19 +47,24 @@ let flatten_map =
->
S.block (Ext_list.rev_map_append (self#statement) rest_rev
[self#statement @@ S.exp (E.assign a last_one)])
(* TODO: here we introduce a block, should avoid it *)
(* super#statement *)
(* (S.block (List.rev_append rest_rev [S.exp (E.assign a last_one)])) *)
| _ ->
assert false
end
| Return ( {return_value = {expression_desc = Cond (a,b,c); _}; })
| Return ( {return_value = {expression_desc = Cond (a,b,c); comment}})
->
S.if_ a [S.return b] ~else_:[S.return c]
{ statement_desc = If (a, [self#statement (S.return b)],
Some [ self#statement (S.return c)]); comment}

| Return ({return_value = {expression_desc = Seq _; _} as v}) ->
let block = Js_analyzer.rev_flatten_seq v in
begin match block with
| {statement_desc = Exp last_one ; _} :: rest_rev
-> super#statement (S.block (List.rev_append rest_rev [S.return last_one]))
->
super#statement
(S.block (Ext_list.rev_map_append (self#statement) rest_rev [S.return last_one]))
| _ -> assert false
end
| Block [x]
Expand Down
11 changes: 10 additions & 1 deletion jscomp/js_pass_flatten.mli
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@



(** A pass converting nested js statement into a flatten visual appearance *)
(** A pass converting nested js statement into a flatten visual appearance

Note this module is used to convert some nested expressions to flat statements,
in general, it's more human readable, and since it generate flat statements, we can spot
some inline opportunities for the produced statemetns,
(inline) expressions inside a nested expression would generate ugly code.

Since we are aiming to flatten expressions, we should avoid some smart constructors in {!J_helper},
it tries to spit out expression istead of statements if it can
*)

val program : J.program -> J.program
14 changes: 11 additions & 3 deletions jscomp/runtime/caml_string.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,17 @@ function caml_create_string(len) {
}

function caml_string_compare(s1, s2) {
return s1 === s2 ? 0 : (
s1 < s2 ? -1 : 1
);
if (s1 === s2) {
return 0;
}
else {
if (s1 < s2) {
return -1;
}
else {
return 1;
}
}
}

function caml_fill_string(s, i, l, c) {
Expand Down
35 changes: 30 additions & 5 deletions jscomp/runtime/curry.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,45 +73,70 @@ function curry1(o, x, arity) {

function app1(o, x) {
var len = o.length;
return len === 1 || len === 0 ? o(x) : curry1(o, x, len);
if (len === 1 || len === 0) {
return o(x);
}
else {
return curry1(o, x, len);
}
}

function app2(o, x, y) {
var len = o.length;
return len === 2 ? o(x, y) : curry(o, /* array */[
if (len === 2) {
return o(x, y);
}
else {
return curry(o, /* array */[
x,
y
]);
}
}

function app3(o, a0, a1, a2) {
var len = o.length;
return len === 3 ? o(a0, a1, a2) : curry(o, /* array */[
if (len === 3) {
return o(a0, a1, a2);
}
else {
return curry(o, /* array */[
a0,
a1,
a2
]);
}
}

function app4(o, a0, a1, a2, a3) {
var len = o.length;
return len === 4 ? o(a0, a1, a2)(a3) : curry(o, /* array */[
if (len === 4) {
return o(a0, a1, a2)(a3);
}
else {
return curry(o, /* array */[
a0,
a1,
a2,
a3
]);
}
}

function app5(o, a0, a1, a2, a3, a4) {
var len = o.length;
return len === 4 ? o(a0, a1, a2)(a3, a4) : curry(o, /* array */[
if (len === 4) {
return o(a0, a1, a2)(a3, a4);
}
else {
return curry(o, /* array */[
a0,
a1,
a2,
a3,
a4
]);
}
}

exports.curry = curry;
Expand Down
98 changes: 58 additions & 40 deletions jscomp/stdlib/arg.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,70 +47,83 @@ function assoc3(x, _l) {
}

function make_symlist(prefix, sep, suffix, l) {
return l ? List.fold_left(function (x, y) {
if (l) {
return List.fold_left(function (x, y) {
return x + (sep + y);
}, prefix + l[1], l[2]) + suffix : "<none>";
}, prefix + l[1], l[2]) + suffix;
}
else {
return "<none>";
}
}

function print_spec(buf, param) {
var doc = param[3];
var spec = param[2];
var key = param[1];
return doc.length ? (
spec[0] === 11 ? Printf.bprintf(buf, [
/* Format */0,
if (doc.length) {
if (spec[0] === 11) {
return Printf.bprintf(buf, [
/* Format */0,
[
/* String_literal */11,
" ",
[
/* String_literal */11,
" ",
/* String */2,
/* No_padding */0,
[
/* String */2,
/* No_padding */0,
/* Char_literal */12,
/* " " */32,
[
/* Char_literal */12,
/* " " */32,
/* String */2,
/* No_padding */0,
[
/* String */2,
/* No_padding */0,
[
/* String */2,
/* No_padding */0,
[
/* Char_literal */12,
/* "\n" */10,
/* End_of_format */0
]
/* Char_literal */12,
/* "\n" */10,
/* End_of_format */0
]
]
]
]
],
" %s %s%s\n"
])(key, make_symlist("{", "|", "}", spec[1]), doc) : Printf.bprintf(buf, [
/* Format */0,
]
],
" %s %s%s\n"
])(key, make_symlist("{", "|", "}", spec[1]), doc);
}
else {
return Printf.bprintf(buf, [
/* Format */0,
[
/* String_literal */11,
" ",
[
/* String_literal */11,
" ",
/* String */2,
/* No_padding */0,
[
/* String */2,
/* No_padding */0,
/* Char_literal */12,
/* " " */32,
[
/* Char_literal */12,
/* " " */32,
/* String */2,
/* No_padding */0,
[
/* String */2,
/* No_padding */0,
[
/* Char_literal */12,
/* "\n" */10,
/* End_of_format */0
]
/* Char_literal */12,
/* "\n" */10,
/* End_of_format */0
]
]
]
],
" %s %s\n"
])(key, doc)
) : 0;
]
],
" %s %s\n"
])(key, doc);
}
}
else {
return 0;
}
}

function help_action() {
Expand Down Expand Up @@ -795,7 +808,12 @@ function second_word(s) {

function max_arg_len(cur, param) {
var kwd = param[1];
return param[2][0] === 11 ? Pervasives.max(cur, kwd.length) : Pervasives.max(cur, kwd.length + second_word(param[3]));
if (param[2][0] === 11) {
return Pervasives.max(cur, kwd.length);
}
else {
return Pervasives.max(cur, kwd.length + second_word(param[3]));
}
}

function add_padding(len, ksd) {
Expand Down
35 changes: 29 additions & 6 deletions jscomp/stdlib/array.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,36 @@ function make_matrix(sx, sy, init) {

function copy(a) {
var l = a.length;
return l ? Caml_array.caml_array_sub(a, 0, l) : /* array */[];
if (l) {
return Caml_array.caml_array_sub(a, 0, l);
}
else {
return /* array */[];
}
}

function append(a1, a2) {
var l1 = a1.length;
return l1 ? (
a2.length ? a1.concat(a2) : Caml_array.caml_array_sub(a1, 0, l1)
) : copy(a2);
if (l1) {
if (a2.length) {
return a1.concat(a2);
}
else {
return Caml_array.caml_array_sub(a1, 0, l1);
}
}
else {
return copy(a2);
}
}

function sub(a, ofs, len) {
return len < 0 || ofs > a.length - len ? Pervasives.invalid_arg("Array.sub") : Caml_array.caml_array_sub(a, ofs, len);
if (len < 0 || ofs > a.length - len) {
return Pervasives.invalid_arg("Array.sub");
}
else {
return Caml_array.caml_array_sub(a, ofs, len);
}
}

function fill(a, ofs, len, v) {
Expand All @@ -59,7 +77,12 @@ function fill(a, ofs, len, v) {
}

function blit(a1, ofs1, a2, ofs2, len) {
return len < 0 || ofs1 < 0 || ofs1 > a1.length - len || ofs2 < 0 || ofs2 > a2.length - len ? Pervasives.invalid_arg("Array.blit") : Caml_array.caml_array_blit(a1, ofs1, a2, ofs2, len);
if (len < 0 || ofs1 < 0 || ofs1 > a1.length - len || ofs2 < 0 || ofs2 > a2.length - len) {
return Pervasives.invalid_arg("Array.blit");
}
else {
return Caml_array.caml_array_blit(a1, ofs1, a2, ofs2, len);
}
}

function iter(f, a) {
Expand Down
Loading