From 0c733dd5d33c9f8f7dd9b95f93a8335b7489b728 Mon Sep 17 00:00:00 2001 From: Hongbo Zhang Date: Fri, 29 Jan 2016 11:23:49 -0500 Subject: [PATCH] add a smart optimizer, todo: some beta-reduction can be optimized for compilation performance, add hint for constants --- jscomp/compiler.mllib | 3 + jscomp/ext_hashtbl.ml | 33 + jscomp/ext_hashtbl.mli | 26 + jscomp/ext_ident.ml | 1 + jscomp/ext_log.ml | 8 + jscomp/ext_log.mli | 1 + jscomp/j.ml | 9 + jscomp/js_fold.ml | 9 + jscomp/js_helper.ml | 63 +- jscomp/js_helper.mli | 3 + jscomp/js_map.ml | 9 + jscomp/lam_analysis.ml | 30 +- jscomp/lam_analysis.mli | 10 + jscomp/lam_beta_reduce.ml | 299 ++++----- jscomp/lam_beta_reduce.mli | 5 + jscomp/lam_compile.ml | 12 + jscomp/lam_compile_group.ml | 56 +- jscomp/lam_current_unit.ml | 32 + jscomp/lam_current_unit.mli | 28 + jscomp/lam_mk.ml | 34 + jscomp/lam_mk.mli | 24 + jscomp/lam_pass_alpha_conversion.ml | 4 +- jscomp/lam_pass_collect.ml | 60 +- jscomp/lam_pass_collect.mli | 4 +- jscomp/lam_pass_exits.ml | 23 +- jscomp/lam_pass_remove_alias.ml | 88 ++- jscomp/lam_stats.ml | 10 +- jscomp/lam_stats.mli | 10 +- jscomp/lam_stats_util.ml | 2 +- jscomp/lam_stats_util.mli | 2 + jscomp/lam_util.ml | 19 +- jscomp/lam_util.mli | 6 + jscomp/stdlib/arg.js | 84 ++- jscomp/stdlib/camlinternalFormat.js | 724 +++++++++++---------- jscomp/stdlib/camlinternalOO.js | 202 +++--- jscomp/stdlib/digest.js | 23 +- jscomp/stdlib/format.d.ts | 47 +- jscomp/stdlib/format.js | 522 +++++++-------- jscomp/stdlib/genlex.js | 215 +++---- jscomp/stdlib/hashtbl.js | 5 +- jscomp/stdlib/list.js | 6 +- jscomp/stdlib/pervasives.js | 48 +- jscomp/stdlib/queue.js | 6 +- jscomp/stdlib/random.js | 2 +- jscomp/stdlib/scanf.js | 823 +++++++++++++----------- jscomp/stdlib/stream.js | 21 +- jscomp/stdlib/sys.js | 16 +- jscomp/stdlib/weak.js | 36 +- jscomp/test/.depend | 5 + jscomp/test/a.js | 7 +- jscomp/test/a_scope_bug.js | 13 +- jscomp/test/ari_regress_test.d.ts | 1 + jscomp/test/ari_regress_test.js | 78 +++ jscomp/test/ari_regress_test.ml | 21 + jscomp/test/ari_regress_test.mli | 1 + jscomp/test/arith_lexer.js | 3 +- jscomp/test/bdd.js | 8 +- jscomp/test/const_block_test.js | 8 +- jscomp/test/demo.js | 61 +- jscomp/test/demo_page.d.ts | 2 +- jscomp/test/demo_page.js | 2 +- jscomp/test/ext_filename.js | 11 +- jscomp/test/ext_list.js | 19 +- jscomp/test/inline_edge_cases.js | 6 +- jscomp/test/inline_regression_test.d.ts | 2 +- jscomp/test/int_map.js | 28 +- jscomp/test/lexer_test.d.ts | 2 +- jscomp/test/map_test.js | 14 +- jscomp/test/mt.js | 2 +- jscomp/test/number_lexer.js | 27 +- jscomp/test/obj_test.js | 36 +- jscomp/test/qcc.js | 21 +- jscomp/test/rec_value_test.js | 12 +- jscomp/test/simple_lexer_test.js | 7 +- jscomp/test/small_inline_test.d.ts | 2 +- jscomp/test/small_inline_test.js | 24 +- jscomp/test/test.mllib | 1 + jscomp/test/test_ari.d.ts | 4 +- jscomp/test/test_ari.js | 6 +- jscomp/test/test_ari.ml | 15 +- jscomp/test/test_demo.js | 4 +- jscomp/test/test_demo.ml | 2 + jscomp/test/test_fastdt.js | 64 +- jscomp/test/test_for_map.js | 28 +- jscomp/test/test_functor_dead_code.js | 13 +- jscomp/test/test_google_closure.js | 15 +- jscomp/test/test_google_closure.ml | 17 +- jscomp/test/test_inline_map.js | 8 +- jscomp/test/test_inline_map2.js | 16 +- jscomp/test/test_int_map_find.js | 6 +- jscomp/test/test_internalOO.js | 200 +++--- jscomp/test/test_js_ffi.js | 58 +- jscomp/test/test_list.js | 10 +- jscomp/test/test_map_find.js | 18 +- jscomp/test/test_non_export.js | 19 +- jscomp/test/test_order_tailcall.js | 7 +- jscomp/test/test_per.js | 50 +- jscomp/test/test_simple_obj.js | 24 +- jscomp/test/test_simple_ref.js | 8 +- jscomp/test/test_string_map.js | 9 +- jscomp/test/ticker.js | 62 +- 101 files changed, 2703 insertions(+), 2087 deletions(-) create mode 100644 jscomp/ext_hashtbl.ml create mode 100644 jscomp/ext_hashtbl.mli create mode 100644 jscomp/lam_current_unit.ml create mode 100644 jscomp/lam_current_unit.mli create mode 100644 jscomp/lam_mk.ml create mode 100644 jscomp/lam_mk.mli create mode 100644 jscomp/test/ari_regress_test.d.ts create mode 100644 jscomp/test/ari_regress_test.js create mode 100644 jscomp/test/ari_regress_test.ml create mode 100644 jscomp/test/ari_regress_test.mli diff --git a/jscomp/compiler.mllib b/jscomp/compiler.mllib index 65017b8197..78eab44ded 100644 --- a/jscomp/compiler.mllib +++ b/jscomp/compiler.mllib @@ -25,7 +25,9 @@ ext_pp_scope ext_array ext_bytes ext_map +ext_hashtbl +lam_mk lam_compile_env lam_dispatch_primitive lam_stats @@ -56,6 +58,7 @@ lam_fold lam_register lam_analysis lam_group +lam_current_unit j js_program_loader diff --git a/jscomp/ext_hashtbl.ml b/jscomp/ext_hashtbl.ml new file mode 100644 index 0000000000..7a4f74d4bf --- /dev/null +++ b/jscomp/ext_hashtbl.ml @@ -0,0 +1,33 @@ +(* OCamlScript compiler + * Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, with linking exception; + * either version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *) + +(* Author: Hongbo Zhang *) + +let of_list kvs = + let map = Hashtbl.create 51 in + List.iter (fun (k, v) -> Hashtbl.add map k v) kvs ; + map + + +let of_list2 ks vs = + let map = Hashtbl.create 51 in + List.iter2 (fun k v -> Hashtbl.add map k v) ks vs ; + map + +let add_list map kvs = + List.iter (fun (k, v) -> Hashtbl.add map k v) kvs diff --git a/jscomp/ext_hashtbl.mli b/jscomp/ext_hashtbl.mli new file mode 100644 index 0000000000..3a0ac0d64d --- /dev/null +++ b/jscomp/ext_hashtbl.mli @@ -0,0 +1,26 @@ +(* OCamlScript compiler + * Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, with linking exception; + * either version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *) + +(* Author: Hongbo Zhang *) + + +val of_list : ('a * 'b) list -> ('a, 'b) Hashtbl.t + +val of_list2 : 'a list -> 'b list -> ('a, 'b) Hashtbl.t + +val add_list : ('a, 'b) Hashtbl.t -> ('a * 'b) list -> unit diff --git a/jscomp/ext_ident.ml b/jscomp/ext_ident.ml index 747c61748e..cb05d62c4e 100644 --- a/jscomp/ext_ident.ml +++ b/jscomp/ext_ident.ml @@ -216,6 +216,7 @@ let convert (name : string) = | '@' -> Buffer.add_string buffer "$at" | '^' -> Buffer.add_string buffer "$caret" | '/' -> Buffer.add_string buffer "$slash" + | '|' -> Buffer.add_string buffer "$pipe" | '.' -> Buffer.add_string buffer "$dot" | 'a'..'z' | 'A'..'Z'| '_'|'$' |'0'..'9'-> Buffer.add_char buffer c | _ -> Buffer.add_string buffer "$unknown" diff --git a/jscomp/ext_log.ml b/jscomp/ext_log.ml index fd46d94cae..13e07ade56 100644 --- a/jscomp/ext_log.ml +++ b/jscomp/ext_log.ml @@ -36,12 +36,20 @@ let ierr b str f v = let warn str f v = Format.fprintf Format.err_formatter ("WARN: %s " ^^ f) str v + + let iwarn b str f v = if b then Format.fprintf Format.err_formatter ("WARN: %s " ^^ f) str v else Format.ifprintf Format.err_formatter ("WARN: %s " ^^ f) str v +let dwarn str f v = + if Lam_current_unit.is_same_file () then + Format.fprintf Format.err_formatter ("WARN: %s " ^^ f) str v + else + Format.ifprintf Format.err_formatter ("WARN: %s " ^^ f) str v + let info str f v = Format.fprintf Format.err_formatter ("INFO: %s " ^^ f) str v diff --git a/jscomp/ext_log.mli b/jscomp/ext_log.mli index 63bc9ac4f3..55b4dce766 100644 --- a/jscomp/ext_log.mli +++ b/jscomp/ext_log.mli @@ -35,5 +35,6 @@ val err : string -> ('a,'b) logging val ierr : bool -> string -> ('a,'b) logging val warn : string -> ('a,'b) logging val iwarn : bool -> string -> ('a,'b) logging +val dwarn : string -> ('a,'b) logging val info : string -> ('a,'b) logging val iinfo : bool -> string -> ('a,'b) logging diff --git a/jscomp/j.ml b/jscomp/j.ml index b1a0246bfc..a9245c1034 100644 --- a/jscomp/j.ml +++ b/jscomp/j.ml @@ -65,6 +65,15 @@ and vident = just print `A.length` - it's guarateed to be unique when the third one is None, it means the whole module + + TODO: + invariant, when [kind] is [Runtime], then we can ignore [ident], + since all [runtime] functions are unique, when do the + pattern match we can ignore the first one for simplicity + for example + {[ + Qualified (_, Runtime, Some "caml_int_compare") + ]} *) and exception_ident = ident diff --git a/jscomp/js_fold.ml b/jscomp/js_fold.ml index 548b72afda..a6e7803946 100644 --- a/jscomp/js_fold.ml +++ b/jscomp/js_fold.ml @@ -108,6 +108,15 @@ class virtual fold = just print `A.length` - it's guarateed to be unique when the third one is None, it means the whole module + + TODO: + invariant, when [kind] is [Runtime], then we can ignore [ident], + since all [runtime] functions are unique, when do the + pattern match we can ignore the first one for simplicity + for example + {[ + Qualified (_, Runtime, Some "caml_int_compare") + ]} *) (* used in [js_create_array] primitive, note having uninitilized array is not as bad as in ocaml, diff --git a/jscomp/js_helper.ml b/jscomp/js_helper.ml index 0bf443f3f7..5bd7088782 100644 --- a/jscomp/js_helper.ml +++ b/jscomp/js_helper.ml @@ -412,6 +412,7 @@ module Exp = struct true_ | _ -> to_ocaml_boolean {expression_desc = Bin(EqEqEq, e0,e1); comment} + let int_equal = float_equal let rec string_equal ?comment (e0 : t) (e1 : t) : t = match e0.expression_desc, e1.expression_desc with | Str (_, a0), Str(_, b0) @@ -514,27 +515,44 @@ module Exp = struct bit different from Javascript, so that we can change it in the future *) let rec and_ ?comment (e1 : t) (e2 : t) = - match e1, e2 with - | {expression_desc = Int_of_boolean e1;_} , - {expression_desc = Int_of_boolean e2;_} -> + match e1.expression_desc, e2.expression_desc with + | Int_of_boolean e1 , Int_of_boolean e2 -> and_ ?comment e1 e2 - | {expression_desc = Int_of_boolean e1; _} , - e2 -> and_ ?comment e1 e2 - | e1, {expression_desc = Int_of_boolean e2;_} + | Int_of_boolean e1 , _ -> and_ ?comment e1 e2 + | _, Int_of_boolean e2 -> and_ ?comment e1 e2 - | e1, e2 -> + (* optimization if [e1 = e2], then and_ e1 e2 -> e2 + be careful for side effect + *) + | Var i, Var j when Js_op_util.same_vident i j + -> + to_ocaml_boolean e1 + | Var i, + (Bin (And, {expression_desc = Var j ; _}, _) + | Bin (And , _, {expression_desc = Var j ; _})) + when Js_op_util.same_vident i j + -> + to_ocaml_boolean e2 + | _, _ -> to_ocaml_boolean @@ bin ?comment And e1 e2 let rec or_ ?comment (e1 : t) (e2 : t) = - match e1, e2 with - | {expression_desc = Int_of_boolean e1;_} , - {expression_desc = Int_of_boolean e2;_} -> + match e1.expression_desc, e2.expression_desc with + | Int_of_boolean e1 , Int_of_boolean e2 + -> or_ ?comment e1 e2 - | {expression_desc = Int_of_boolean e1;_} , - e2 -> or_ ?comment e1 e2 - | e1, {expression_desc = Int_of_boolean e2;_} + | Int_of_boolean e1 , _ -> or_ ?comment e1 e2 + | _, Int_of_boolean e2 -> or_ ?comment e1 e2 - | e1, e2 -> + | Var i, Var j when Js_op_util.same_vident i j + -> + to_ocaml_boolean e1 + | Var i, + (Bin (Or, {expression_desc = Var j ; _}, _) + | Bin (Or , _, {expression_desc = Var j ; _})) + when Js_op_util.same_vident i j + -> to_ocaml_boolean e2 + | _, _ -> to_ocaml_boolean @@ bin ?comment Or e1 e2 let string_of_small_int_array ?comment xs : t = @@ -594,8 +612,21 @@ module Exp = struct let string_comp cmp ?comment e0 e1 = to_ocaml_boolean @@ bin ?comment cmp e0 e1 - let int_comp cmp ?comment e0 e1 = - to_ocaml_boolean @@ bin ?comment (Lam_compile_util.jsop_of_comp cmp) e0 e1 + + + let rec int_comp (cmp : Lambda.comparison) ?comment (e0 : t) (e1 : t) = + match cmp, e0.expression_desc, e1.expression_desc with + | _, Call ({ + expression_desc = + Var (Qualified + (_, Runtime, + Some ("caml_int_compare" | "caml_int32_compare"))); _}, + [l;r], _), + Number (Int {i = 0}) + -> int_comp cmp l r (* = 0 > 0 < 0 *) + | _ -> + to_ocaml_boolean @@ bin ?comment (Lam_compile_util.jsop_of_comp cmp) e0 e1 + let float_comp cmp ?comment e0 e1 = to_ocaml_boolean @@ bin ?comment (Lam_compile_util.jsop_of_comp cmp) e0 e1 diff --git a/jscomp/js_helper.mli b/jscomp/js_helper.mli index fd2f434a9e..d75e22fe8e 100644 --- a/jscomp/js_helper.mli +++ b/jscomp/js_helper.mli @@ -145,7 +145,10 @@ module Exp : sig val assign : binary_op val triple_equal : binary_op + (* TODO: reduce [triple_equal] use *) + val float_equal : binary_op + val int_equal : binary_op val string_equal : binary_op val is_type_number : unary_op val typeof : unary_op diff --git a/jscomp/js_map.ml b/jscomp/js_map.ml index 249d1c3955..bfa2a1bbe2 100644 --- a/jscomp/js_map.ml +++ b/jscomp/js_map.ml @@ -121,6 +121,15 @@ class virtual map = just print `A.length` - it's guarateed to be unique when the third one is None, it means the whole module + + TODO: + invariant, when [kind] is [Runtime], then we can ignore [ident], + since all [runtime] functions are unique, when do the + pattern match we can ignore the first one for simplicity + for example + {[ + Qualified (_, Runtime, Some "caml_int_compare") + ]} *) (* used in [js_create_array] primitive, note having uninitilized array is not as bad as in ocaml, diff --git a/jscomp/lam_analysis.ml b/jscomp/lam_analysis.ml index a54d3b4ea7..812970e0f3 100644 --- a/jscomp/lam_analysis.ml +++ b/jscomp/lam_analysis.ml @@ -215,9 +215,13 @@ let rec size (lam : Lambda.lambda) = try match lam with | Lvar _ -> 1 - | Lconst _ -> 1 (* Modify *) + | Lconst c -> size_constant c | Llet(_, _, l1, l2) -> 1 + size l1 + size l2 | Lletrec _ -> really_big () + | Lprim(Pfield _, [Lprim(Pgetglobal _, [ ])]) + -> 1 + | Lprim (Praise _, [l ]) + -> size l | Lprim(_, ll) -> size_lams 1 ll (** complicated @@ -230,7 +234,8 @@ let rec size (lam : Lambda.lambda) = *) | Lapply(f, args, _) -> size_lams (size f) args - | Lfunction(_, params, l) -> really_big () + (* | Lfunction(_, params, l) -> really_big () *) + | Lfunction(_,_params,body) -> size body | Lswitch(_, _) -> really_big () | Lstringswitch(_,_,_) -> really_big () | Lstaticraise (i,ls) -> @@ -246,11 +251,21 @@ let rec size (lam : Lambda.lambda) = | Levent(l, _) -> size l | Lifused(v, l) -> size l with Too_big_to_inline -> 1000 +and size_constant x = + match x with + | Const_base _ + | Const_immstring _ + | Const_pointer _ + -> 1 + | Const_block (_, _, str) + -> List.fold_left (fun acc x -> acc + size_constant x ) 0 str + | Const_float_array xs -> List.length xs and size_lams acc (lams : Lambda.lambda list) = List.fold_left (fun acc l -> acc + size l ) acc lams - +let exit_inline_size = 7 +let small_inline_size = 5 (* compared two lambdas in case analysis, note that we only compare some small lambdas Actually this patten is quite common in GADT, people have to write duplicated code due to the type system restriction @@ -289,3 +304,12 @@ and eq_primitive (p : Lambda.primitive) (p1 : Lambda.primitive) = | _ , _ -> (* FIXME: relies on structure equality *) try p = p1 with _ -> false + + +let is_closed_by map lam = + Lambda.IdentSet.for_all Ident.global + (Lambda.IdentSet.diff (Lambda.free_variables lam) map ) + + +let is_closed lam = + Lambda.IdentSet.for_all Ident.global (Lambda.free_variables lam) diff --git a/jscomp/lam_analysis.mli b/jscomp/lam_analysis.mli index be4d68656f..0f28739a00 100644 --- a/jscomp/lam_analysis.mli +++ b/jscomp/lam_analysis.mli @@ -30,3 +30,13 @@ val eq_lambda : Lambda.lambda -> Lambda.lambda -> bool for looking for similar cases in switch *) +(** [is_closed_by map lam] + return [true] if all unbound variables + belongs to the given [map] *) +val is_closed_by : Lambda.IdentSet.t -> Lambda.lambda -> bool + +val is_closed : Lambda.lambda -> bool + + +val small_inline_size : int +val exit_inline_size : int diff --git a/jscomp/lam_beta_reduce.ml b/jscomp/lam_beta_reduce.ml index d83d05870e..6af05bea52 100644 --- a/jscomp/lam_beta_reduce.ml +++ b/jscomp/lam_beta_reduce.ml @@ -21,41 +21,100 @@ (* - [map] - and + Given an [map], rewrite all let bound variables into new variables, + note that the [map] is changed + example + {[ + let a/112 = 3 in a/112 + ]} + would be converted into + {[ + let a/113 = 3 in a/113 + ]} + ATTENTION: [let] bound idents have to be renamed, - note we rely on an invariant that parameter could not be rebound + Note we rely on an invariant that parameter could not be rebound *) -let rename - (map : (Ident.t, Ident.t) Hashtbl.t) + +(* + Small function inline heuristics: + Even if a function is small, it does not mean it is good for inlining, + for example, in list.ml + {[ + let rec length_aux len = function + [] -> len + | a::l -> length_aux (len + 1) l + + let length l = length_aux 0 l + ]} + if we inline [length], it will expose [length_aux] to the user, first, it make + the code not very friendly, also since [length_aux] is used everywhere now, it + may affect that we will not do the inlining of [length_aux] in [length] + + Criteior for sure to inline + 1. small size, does not introduce extra symbols, non-exported and non-recursive + non-recursive is required if we re-apply the strategy + + Other Factors: + 2. number of invoked times + 3. arguments are const or not +*) +let rewrite (map : (Ident.t, _) Hashtbl.t) (lam : Lambda.lambda) : Lambda.lambda = let rebind i = let i' = Ident.rename i in - Hashtbl.add map i i'; + Hashtbl.add map i (Lambda.Lvar i'); i' in - - let rec aux (lam : Lambda.lambda) : Lambda.lambda = + (* order matters, especially for let bindings *) + let rec + option_map op = + match op with + | None -> None + | Some x -> Some (aux x) + and aux (lam : Lambda.lambda) : Lambda.lambda = match lam with | Lvar v -> - (try Lvar (Hashtbl.find map v) with Not_found -> lam) - | Lconst _ -> lam + begin + try (* Lvar *) (Hashtbl.find map v) + with Not_found -> lam + end | Llet(str, v, l1, l2) -> let v = rebind v in - Llet(str, v, aux l1, aux l2 ) + let l1 = aux l1 in + let l2 = aux l2 in + Llet(str, v, l1, l2 ) | Lletrec(bindings, body) -> let bindings = - List.map (fun (k,l) -> - let k = rebind k in (* order matters *) + bindings |> List.map (fun (k,l) -> + let k = rebind k in (k, aux l) - ) bindings in - Lletrec(bindings, aux body) - | Lprim(prim, ll) -> Lprim(prim, List.map aux ll) - | Lapply(l1, ll, info) -> - Lapply(aux l1, List.map aux ll,info) - | Lfunction(kind, params, l) -> + ) in + let body = aux body in + Lletrec(bindings, body) + | Lfunction(kind, params, body) -> let params = List.map rebind params in - Lfunction (kind, params, aux l) + let body = aux body in + Lfunction (kind, params, body) + | Lstaticcatch(l1, (i,xs), l2) -> + let l1 = aux l1 in + let xs = List.map rebind xs in + let l2 = aux l2 in + Lstaticcatch(l1, (i,xs), l2) + | Lfor(ident, l1, l2, dir, l3) -> + let ident = rebind ident in + let l1 = aux l1 in + let l2 = aux l2 in + let l3 = aux l3 in + Lfor(ident,aux l1, l2, dir, l3) + | Lconst _ -> lam + | Lprim(prim, ll) -> + (* here it makes sure that global vars are not rebound *) + Lprim(prim, List.map aux ll) + | Lapply(fn, args, info) -> + let fn = aux fn in + let args = List.map aux args in + Lapply(fn, args, info) | Lswitch(l, {sw_failaction; sw_consts; sw_blocks; @@ -69,27 +128,14 @@ let rename sw_blocks = List.map (fun (v, l) -> v, aux l) sw_blocks; sw_numconsts = sw_numconsts; sw_numblocks = sw_numblocks; - sw_failaction = - begin - match sw_failaction with - | None -> None - | Some x -> Some (aux x) - end}) + sw_failaction = option_map sw_failaction + }) | Lstringswitch(l, sw, d) -> let l = aux l in Lstringswitch( l , List.map (fun (i, l) -> i,aux l) sw, - begin - match d with - | Some d -> Some (aux d ) - | None -> None - end) + option_map d) | Lstaticraise (i,ls) -> Lstaticraise(i, List.map aux ls) - | Lstaticcatch(l1, (i,xs), l2) -> - let l1 = aux l1 in - let xs = List.map rebind xs in - let l2 = aux l2 in - Lstaticcatch(l1, (i,xs), l2) | Ltrywith(l1, v, l2) -> let l1 = aux l1 in let v = rebind v in @@ -108,16 +154,7 @@ let rename let l1 = aux l1 in let l2 = aux l2 in Lwhile( l1, l2) - | Lfor(ident, l1, l2, dir, l3) -> - let ident = rebind ident in - let l1 = aux l1 in - let l2 = aux l2 in - let l3 = aux l3 in - Lfor(ident,aux l1, l2, dir, l3) - | Lassign(v, l) -> - (* Lalias-bound variables are never assigned, so don't increase - v's refsimpl *) - Lassign(v,aux l) + | Lassign(v, l) -> Lassign(v,aux l) | Lsend(u, m, o, ll, v) -> let m = aux m in let o = aux o in @@ -131,81 +168,7 @@ let rename Lifused(v, l) in aux lam -let rec bounded_idents tbl lam = - let rebind i = Hashtbl.add tbl i (Ident.rename i) in - let rec collect_introduced_idents (lam : Lambda.lambda) = - match lam with - | Lvar _ - | Lconst _ -> () - | Lapply ( f , ls, _) -> - collect_introduced_idents f ; - List.iter collect_introduced_idents ls - | Lfunction (_, args, lam) -> - List.iter (fun a -> rebind a) args; - collect_introduced_idents lam - | Llet (_, id,arg,body) -> - rebind id; - collect_introduced_idents arg ; - collect_introduced_idents body ; - | Lletrec (bindings, body) -> - List.iter (fun (i,arg) -> - rebind i; - collect_introduced_idents arg) bindings; - collect_introduced_idents body - | Lprim (_, lams) -> - List.iter collect_introduced_idents lams - | Lswitch (lam ,switch) -> - collect_introduced_idents lam ; - assert false - (* switch on strings, clauses are sorted by string order, - strings are pairwise distinct *) - | Lstringswitch _ -> assert false - | Lstaticraise (_,ls) -> List.iter collect_introduced_idents ls - | Lstaticcatch (lam, (_i, is), body) -> - (** Note that [staticcatch] does not introduce idents? - double check? - *) - List.iter rebind is; - collect_introduced_idents lam; - collect_introduced_idents body - | Ltrywith (a,i,b) -> - rebind i; - collect_introduced_idents a; - collect_introduced_idents b - | Lifthenelse (a,b,c) -> - collect_introduced_idents a ; - collect_introduced_idents b ; - collect_introduced_idents c - | Lsequence (a,b) -> - collect_introduced_idents a; - collect_introduced_idents b ; - | Lwhile (a,b) -> - collect_introduced_idents a; - collect_introduced_idents b ; - | Lfor (i, a,b,_direction,l) -> - rebind i; - collect_introduced_idents a ; - collect_introduced_idents b ; - collect_introduced_idents l ; - | Lassign (_v, a) -> collect_introduced_idents a - | Lsend (_, a,b,ls, _location) -> - collect_introduced_idents a ; - collect_introduced_idents b ; - List.iter collect_introduced_idents ls - | Levent (a,_event) -> - collect_introduced_idents a - | Lifused (_id,a ) -> - collect_introduced_idents a - in - collect_introduced_idents lam - -let refresh_lambda (lam : Lambda.lambda ) : Lambda.lambda = - let map = Hashtbl.create 57 in - begin - bounded_idents map lam ; - rename map lam - end - +let refresh lam = rewrite (Hashtbl.create 17 ) lam (* A naive beta reduce would break the invariants of the optmization. @@ -221,63 +184,51 @@ let refresh_lambda (lam : Lambda.lambda ) : Lambda.lambda = if it's enclosed environment should be good enough so far, we only inline enclosed lambdas TODO: rename + + Optimizations: + {[ + (fun x y -> ... ) 100 3 + ]} + we can bound [x] to [100] in a single step *) let propogate_beta_reduce (meta : Lam_stats.meta) params body args = - let new_params = - List.map Ident.rename params in - let map = Hashtbl.create 51 in - let () = - begin - List.iter2 (fun k v -> - Hashtbl.add map k v ) - params new_params ; - end - in + let rest_bindings, rev_new_params = + List.fold_left2 + (fun (rest_bindings, acc) old_param (arg : Lambda.lambda) -> + match arg with + | Lconst _ + | Lvar _ -> rest_bindings , arg :: acc + | _ -> + let p = Ident.rename old_param in + (p,arg) :: rest_bindings , (Lambda.Lvar p) :: acc + ) ([],[]) params args in + let new_body = rewrite (Ext_hashtbl.of_list2 (List.rev params) (rev_new_params)) body in + List.fold_right + (fun (param, (arg : Lambda.lambda)) l -> + let arg = + match arg with + | Lvar v -> + begin + match Hashtbl.find meta.ident_tbl v with + | exception Not_found -> () + | ident_info -> + Hashtbl.add meta.ident_tbl param ident_info + end; + arg + | Lprim (Pgetglobal ident, []) -> + (* It's not completeness, its to make it sound.. *) + Lam_compile_global.query_lambda ident meta.env + (* alias meta param ident (Module (Global ident)) Strict *) + | Lprim (Pmakeblock (_, _, Immutable ) , ls) -> + Hashtbl.replace meta.ident_tbl param + (Lam_util.kind_of_lambda_block ls ); (** *) + arg + | _ -> arg in + Lam_util.refine_let param arg l) + rest_bindings new_body + - let new_body = rename map body in - let lam = List.fold_left2 - (fun l param (arg : Lambda.lambda) -> - begin - let arg = - ( - match arg with - | Lvar v -> - begin - match Hashtbl.find meta.ident_tbl v with - | exception Not_found -> - (* Ext_log.err "@[%a ++ @]@." Ident.print param; *) - () - | ident_info -> - Hashtbl.add meta.ident_tbl param ident_info - end; - arg - | Lprim (Pgetglobal ident, []) -> - (* It's not completeness, its to make it sound.. *) - Lam_compile_global.query_lambda ident meta.env - (* alias meta param ident (Module (Global ident)) Strict *) - | Lprim (Pmakeblock (_, _, Immutable ) , ls) -> - Hashtbl.replace meta.ident_tbl param - (Lam_util.kind_of_lambda_block ls ); (** *) - arg - | _ -> - begin - (* Ext_log.err "@[%a -- %a @]@." *) - (* Ident.print param *) - (* Printlambda.lambda arg *) - arg - end - ) in - (** TODO: refactor mklet - and to be improved later - *) - Lam_util.refine_let param arg l - end - ) - new_body new_params args in - (* let lam = Lam_util.deep_flatten lam in *) - (* Lam_pass_collect.collect_helper meta lam; *) - lam let beta_reduce params body args = diff --git a/jscomp/lam_beta_reduce.mli b/jscomp/lam_beta_reduce.mli index a8e85bb665..94aaac7a00 100644 --- a/jscomp/lam_beta_reduce.mli +++ b/jscomp/lam_beta_reduce.mli @@ -44,3 +44,8 @@ val propogate_beta_reduce : Lambda.lambda -> Lambda.lambda list -> Lambda.lambda + + +val refresh : + Lambda.lambda -> + Lambda.lambda diff --git a/jscomp/lam_compile.ml b/jscomp/lam_compile.ml index de1f9c7ecf..535db02162 100644 --- a/jscomp/lam_compile.ml +++ b/jscomp/lam_compile.ml @@ -271,6 +271,18 @@ and { cxt with st = EffectCall; should_return = True None; (* Refine*) jmp_table = Lam_compile_defs.empty_handler_map} body))) + + + | Lapply( + Lapply(an, args', ({apply_status = NA} as _info1)), + args, + ({apply_status = NA} as _info2)) + -> + (* After inlining we can generate such code, + see {!Ari_regress_test} + *) + compile_lambda cxt + (Lapply (an, (args' @ args), (Lam_util.mk_apply_info NA))) (* External function calll *) | Lapply(Lprim(Pfield n, [ Lprim(Pgetglobal id,[])]), args_lambda,_info) -> let [@warning "-8" (* non-exhaustive pattern*)] (args_code,args) = diff --git a/jscomp/lam_compile_group.ml b/jscomp/lam_compile_group.ml index 254e1300cf..c2bb344ea3 100644 --- a/jscomp/lam_compile_group.ml +++ b/jscomp/lam_compile_group.ml @@ -47,7 +47,8 @@ let compile_group ({filename = file_name; env;} as meta : Lam_stats.meta) to make those parts pure (not a function call), then it can be removed if unused *) - | Single(_, ({name="infinity";_} as id),_ ), "pervasives.ml" -> (* TODO: check relative path to compiler*) + | Single(_, ({name="infinity";_} as id),_ ), "pervasives.ml" + -> (* TODO: check relative path to compiler*) Js_output.of_stmt @@ S.const_variable id ~exp:(E.js_global "Infinity") | Single(_, ({name="neg_infinity";_} as id),_ ), "pervasives.ml" -> Js_output.of_stmt @@ S.const_variable id ~exp:(E.js_global "-Infinity") @@ -143,31 +144,43 @@ let compile_group ({filename = file_name; env;} as meta : Lam_stats.meta) *) let compile ~filename env sigs lam : J.program = - let exports = Translmod.get_export_identifiers() in + let export_idents = Translmod.get_export_identifiers() in let () = Translmod.reset () in (* To make toplevel happy - reentrant for js-demo *) let () = Lam_compile_env.reset () in let lam = Lam_group.deep_flatten lam in let _d = Lam_util.dump env filename in - let meta = Lam_pass_collect.count_alias_globals env filename exports lam in - (* TODO: remove [export_idents] from meta *) - + let meta = + Lam_pass_collect.count_alias_globals env filename export_idents lam in let lam = let lam = lam |> Lam_pass_exits.simplify_exits |> Lam_pass_remove_alias.simplify_alias meta in (* Inling happens*) + (* TODO: research how to combine those passes efficiently *) let lam = Lam_group.deep_flatten lam in let () = Lam_pass_collect.collect_helper meta lam in let lam = Lam_pass_remove_alias.simplify_alias meta lam in let lam = Lam_group.deep_flatten lam in let () = Lam_pass_collect.collect_helper meta lam in + let lam = + lam + |> Lam_pass_alpha_conversion.alpha_conversion meta + |> Lam_pass_exits.simplify_exits in + let () = Lam_pass_collect.collect_helper meta lam + in lam - |> Lam_pass_alpha_conversion.alpha_conversion meta - |> Lam_pass_exits.simplify_exits (* we should investigate a better way to put different passes : )*) - |> Lam_pass_lets_dce.simplify_lets (* |> (fun lam -> Lam_pass_collect.collect_helper meta lam ; Lam_pass_remove_alias.simplify_alias meta lam) *) + |> Lam_pass_remove_alias.simplify_alias meta + |> Lam_pass_alpha_conversion.alpha_conversion meta + (* we should investigate a better way to put different passes : )*) + |> Lam_pass_lets_dce.simplify_lets + (* |> (fun lam -> Lam_pass_collect.collect_helper meta lam + ; Lam_pass_remove_alias.simplify_alias meta lam) *) |> Lam_pass_exits.simplify_exits + + + in (* Debug identifier table *) @@ -205,8 +218,12 @@ let compile ~filename env sigs lam : J.program = *) (Lam_group.Single(Strict ,eid, lam) :: coercions, eid :: new_exports)) - meta.export_idents lambda_exports ([],[])in - let () = meta.export_idents <- new_exports in + meta.exports lambda_exports ([],[])in + + let meta = { meta with + export_idents = Lam_util.ident_set_of_list new_exports; + exports = new_exports + } in let rest = List.rev_append rest coercion_groups in let () = if not @@ Ext_string.is_empty filename @@ -224,7 +241,7 @@ let compile ~filename env sigs lam : J.program = lambda_exports are pure compile each binding with a return value *) - let rest = Lam_dce.remove meta.export_idents rest + let rest = Lam_dce.remove meta.exports rest in let module E = struct exception Not_pure of string end in (** Also need analyze its depenency is pure or not *) @@ -276,7 +293,7 @@ let compile ~filename env sigs lam : J.program = Js_cmj_format.to_file (Ext_filename.chop_extension ~loc:__LOC__ filename ^ ".cmj") v); let js = - Js_program_loader.make_program filename v.pure meta.export_idents + Js_program_loader.make_program filename v.pure meta.exports external_module_ids body in (* The file is not big at all compared with [cmo] *) @@ -295,19 +312,20 @@ let compile ~filename env sigs lam : J.program = | _ -> raise Not_a_module end ;; -let current_file_name : string option ref = ref None;; + let lambda_as_module env (sigs : Types.signature) (filename : string) (lam : Lambda.lambda) = - - let () = current_file_name := Some filename in - Ext_pervasives.with_file_as_chan - (Ext_filename.chop_extension ~loc:__LOC__ filename ^ ".js") - (fun chan -> Js_dump.dump_program (compile ~filename env sigs lam) chan) - + begin + Lam_current_unit.set_file filename ; + Lam_current_unit.set_debug_file "ari_regress_test.ml"; + Ext_pervasives.with_file_as_chan + (Ext_filename.chop_extension ~loc:__LOC__ filename ^ ".js") + (fun chan -> Js_dump.dump_program (compile ~filename env sigs lam) chan) + end (* We can use {!Env.current_unit = "Pervasives"} to tell if it is some specific module, We need handle some definitions in standard libraries in a special way, most are io specific, includes {!Pervasives.stdin, Pervasives.stdout, Pervasives.stderr} diff --git a/jscomp/lam_current_unit.ml b/jscomp/lam_current_unit.ml new file mode 100644 index 0000000000..d2147dce35 --- /dev/null +++ b/jscomp/lam_current_unit.ml @@ -0,0 +1,32 @@ +(* OCamlScript compiler + * Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, with linking exception; + * either version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *) + +(* Author: Hongbo Zhang *) + + +let file = ref "" +let debug_file = ref "" + +let set_file f = file := f +let get_file () = !file + +let iset_debug_file _ = () +let set_debug_file f = debug_file := f +let get_debug_file () = !debug_file + +let is_same_file () = !debug_file = !file diff --git a/jscomp/lam_current_unit.mli b/jscomp/lam_current_unit.mli new file mode 100644 index 0000000000..c1786f530c --- /dev/null +++ b/jscomp/lam_current_unit.mli @@ -0,0 +1,28 @@ +(* OCamlScript compiler + * Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, with linking exception; + * either version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *) + +(* Author: Hongbo Zhang *) + +val set_file : string -> unit +val get_file : unit -> string + +val iset_debug_file : string -> unit +val set_debug_file : string -> unit +val get_debug_file : unit -> string + +val is_same_file : unit -> bool diff --git a/jscomp/lam_mk.ml b/jscomp/lam_mk.ml new file mode 100644 index 0000000000..f52fdd0237 --- /dev/null +++ b/jscomp/lam_mk.ml @@ -0,0 +1,34 @@ +(* OCamlScript compiler + * Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, with linking exception; + * either version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *) + +(* Author: Hongbo Zhang *) + + +(* Note this function could change the arity of an lambda, + we need update its meta data as well +*) + +let lfunction kind params (body : Lambda.lambda) = + if params = [] then body else + match body with + | Lfunction (kind', params', body') when kind = kind' -> + Lfunction (kind', params @ params', body') + | _ -> + Lfunction (kind, params, body) + + diff --git a/jscomp/lam_mk.mli b/jscomp/lam_mk.mli new file mode 100644 index 0000000000..6e6f5d3220 --- /dev/null +++ b/jscomp/lam_mk.mli @@ -0,0 +1,24 @@ +(* OCamlScript compiler + * Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, with linking exception; + * either version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *) + +(* Author: Hongbo Zhang *) + +(** A module prepared for smart constructors of {!Lambda.lambda}*) + +val lfunction : + Lambda.function_kind -> Ident.t list -> Lambda.lambda -> Lambda.lambda diff --git a/jscomp/lam_pass_alpha_conversion.ml b/jscomp/lam_pass_alpha_conversion.ml index 9ab74f0670..defca707ee 100644 --- a/jscomp/lam_pass_alpha_conversion.ml +++ b/jscomp/lam_pass_alpha_conversion.ml @@ -69,7 +69,9 @@ let alpha_conversion (meta : Lam_stats.meta) (lam : Lambda.lambda) : Lambda.lamb let bindings = List.map (fun (k,l) -> (k, simpl l)) bindings in Lletrec (bindings, simpl body) | Lprim (prim, ll) -> Lprim(prim, List.map simpl ll) - | Lfunction (kind, params, l) -> Lfunction (kind, params , simpl l) + | Lfunction (kind, params, l) -> + (* Lam_mk.lfunction kind params (simpl l) *) + Lfunction (kind, params , simpl l) | Lswitch (l, {sw_failaction; sw_consts; sw_blocks; diff --git a/jscomp/lam_pass_collect.ml b/jscomp/lam_pass_collect.ml index 115b56d83d..e8e2c4d4c5 100644 --- a/jscomp/lam_pass_collect.ml +++ b/jscomp/lam_pass_collect.ml @@ -21,10 +21,13 @@ -let annotate (meta : Lam_stats.meta) (k:Ident.t) (v : Lam_stats.function_arities) lambda = +let annotate (meta : Lam_stats.meta) + rec_flag + (k:Ident.t) (v : Lam_stats.function_arities) lambda = + (* Ext_log.dwarn __LOC__ "%s/%d@." k.name k.stamp; *) match Hashtbl.find meta.ident_tbl k with | exception Not_found -> - Hashtbl.add meta.ident_tbl k (Function {kind = NA; arity = v; lambda}) + Hashtbl.add meta.ident_tbl k (Function {kind = NA; arity = v; lambda; rec_flag}) | Function old -> (** Check, it is shared across ident_tbl, Only [Lassign] will break such invariant, @@ -46,28 +49,29 @@ let annotate (meta : Lam_stats.meta) (k:Ident.t) (v : Lam_stats.function_arities alias propgation - and toplevel identifiers, this needs to be exported *) let collect_helper (meta : Lam_stats.meta) (lam : Lambda.lambda) = - let rec collect_bind + let rec collect_bind rec_flag (kind : Lambda.let_kind) (ident : Ident.t) (lam : Lambda.lambda) = match lam with | Lconst v - -> - Hashtbl.replace meta.ident_tbl ident (Constant v); (** *) + -> + Hashtbl.replace meta.ident_tbl ident (Constant v); (** *) | Lprim (Pmakeblock (_, _, Immutable ) , ls) - -> - Hashtbl.replace meta.ident_tbl ident - (Lam_util.kind_of_lambda_block ls); + -> + Hashtbl.replace meta.ident_tbl ident + (Lam_util.kind_of_lambda_block ls); + List.iter collect ls | Lprim (Pgetglobal v,[]) -> - begin - Lam_util.alias meta ident v (Module v) kind; - begin match kind with + begin + Lam_util.alias meta ident v (Module v) kind; + begin match kind with | Alias -> () | Strict | StrictOpt | Variable -> - Lam_util.add_required_module v meta - end; - end + Lam_util.add_required_module v meta + end; + end | Lvar v -> ( @@ -83,15 +87,21 @@ let collect_helper (meta : Lam_stats.meta) (lam : Lambda.lambda) = -- since collect would iter everywhere, so -- it would still iterate internally *) - List.iter (fun p -> Hashtbl.add meta.ident_tbl p Parameter ) params; - annotate meta ident (Lam_stats_util.get_arity meta lam) lam; - collect l + + List.iter (fun p -> Hashtbl.add meta.ident_tbl p Parameter ) params; + let arity = Lam_stats_util.get_arity meta lam in + (* Ext_log.dwarn __LOC__ "%s/%d : %a : %a function collected@." *) + (* ident.name ident.stamp *) + (* Printlambda.lambda lam *) + (* Lam_stats_util.pp_arities arity *) + (* ; *) + annotate meta rec_flag ident arity lam; + collect l | x -> collect x ; - if List.mem ident meta.export_idents then - begin - annotate meta ident (Lam_stats_util.get_arity meta x ) lam - end + if Lambda.IdentSet.mem ident meta.export_idents then + annotate meta rec_flag ident (Lam_stats_util.get_arity meta x ) lam + and collect (lam : Lambda.lambda) = match lam with @@ -113,9 +123,9 @@ let collect_helper (meta : Lam_stats.meta) (lam : Lambda.lambda) = List.iter (fun p -> Hashtbl.add meta.ident_tbl p Parameter ) params; collect l | Llet (kind,ident,arg,body) -> - collect_bind kind ident arg ; collect body + collect_bind Non_rec kind ident arg ; collect body | Lletrec (bindings, body) -> - List.iter (fun (ident,arg) -> collect_bind Strict ident arg ) bindings; + List.iter (fun (ident,arg) -> collect_bind Rec Strict ident arg ) bindings; collect body | Lprim(_p, ll) -> List.iter collect ll | Lswitch(l, {sw_failaction; sw_consts; sw_blocks}) -> @@ -161,11 +171,11 @@ let count_alias_globals {alias_tbl = Hashtbl.create 31 ; ident_tbl = Hashtbl.create 31; exit_codes = Hash_set.create 31 ; - exports = export_idents; + exports = export_idents; required_modules = [] ; filename; env; - export_idents + export_idents = Lam_util.ident_set_of_list export_idents; } in collect_helper meta lam ; meta diff --git a/jscomp/lam_pass_collect.mli b/jscomp/lam_pass_collect.mli index 4a56a64a17..b26c8b8199 100644 --- a/jscomp/lam_pass_collect.mli +++ b/jscomp/lam_pass_collect.mli @@ -67,8 +67,10 @@ - *) - +(** Modify existing [meta] *) val collect_helper : Lam_stats.meta -> Lambda.lambda -> unit + +(** return a new [meta] *) val count_alias_globals : Env.t -> string -> Ident.t list -> Lambda.lambda -> Lam_stats.meta diff --git a/jscomp/lam_pass_exits.ml b/jscomp/lam_pass_exits.ml index 3c998d2f75..5e1fe95b90 100644 --- a/jscomp/lam_pass_exits.ml +++ b/jscomp/lam_pass_exits.ml @@ -193,10 +193,10 @@ let subst_helper (subst : subst_tbl) query lam = {[ var exit ; - exit = 11 - exit = 11 + exit = 11; + exit = 11; - switch(exit){ + switch(exit){ case exit = 11 : body ; break } @@ -204,11 +204,8 @@ let subst_helper (subst : subst_tbl) query lam = the inline cost is {[ - the inline cost is - - body; body; - + body; ]} when [i] is negative, we can not inline in general, @@ -231,11 +228,19 @@ let subst_helper (subst : subst_tbl) query lam = FIXME: when inlining, need refresh local bound identifiers *) - let ok_to_inline = Lam_analysis.size l2 < 5 && i >=0 && j <=2 in + let lam_size = Lam_analysis.size l2 in + let ok_to_inline = + i >=0 && + ( (j <= 2 && lam_size < Lam_analysis.exit_inline_size ) + || lam_size < 5) + (*TODO: when we do the case merging on the js side, + the j is not very indicative + *) + in if ok_to_inline (* && false *) then begin - Hashtbl.add subst i (xs,simplif l2) ; + Hashtbl.add subst i (xs, Lam_beta_reduce.refresh @@ simplif l2) ; simplif l1 (** l1 will inline *) end else Lstaticcatch (simplif l1, (i,xs), simplif l2) diff --git a/jscomp/lam_pass_remove_alias.ml b/jscomp/lam_pass_remove_alias.ml index 6d8e22d7ee..6011393762 100644 --- a/jscomp/lam_pass_remove_alias.ml +++ b/jscomp/lam_pass_remove_alias.ml @@ -39,7 +39,7 @@ let simplify_alias since we aliased k, so it's safe to remove it? *) let v = simpl l in - if List.mem k meta.export_idents + if Lambda.IdentSet.mem k meta.export_idents then Llet(kind, k, g, v) (* in this case it is preserved, but will still be simplified @@ -100,37 +100,87 @@ let simplify_alias - code bloat *) | Lapply((Lvar v as l1), args, info) -> (* Check info for always inlining *) + + (* Ext_log.dwarn __LOC__ "%s/%d@." v.name v.stamp; *) + begin match Hashtbl.find meta.ident_tbl v with - | Function {lambda = Lfunction(Curried, params, body); - arity = Determin(_, (n,_) ::_, _); _ } - when List.length args = n && Lam_inline_util.maybe_functor v.name -> - - (* && not (List.mem v meta.export_idents) *) - (* TODO: check l1 if it is exported, - if so, maybe not since in that case, - we are going to have two copy? - *) - (* && false (\* Disable it yet *\) *) - (***) - simpl @@ Lam_beta_reduce.propogate_beta_reduce - meta params body args - | exception Not_found -> Lapply ( simpl l1, List.map simpl args, info) - | _ -> Lapply ( simpl l1, List.map simpl args, info) + | Function {lambda = (Lfunction(_, params, body) as _m); + rec_flag; + _ } + -> + let lam_size = Lam_analysis.size body in + if Ext_list.same_length args params + then + if Lam_inline_util.maybe_functor v.name then + (* && not (List.mem v meta.export_idents) *) + (* TODO: check l1 if it is exported, + if so, maybe not since in that case, + we are going to have two copy? + *) + + (* Check: recursive applying may result in non-termination *) + begin + (* Ext_log.dwarn __LOC__ "beta .. %s/%d@." v.name v.stamp ; *) + simpl (Lam_beta_reduce.propogate_beta_reduce meta params body args) + end + else + if lam_size < Lam_analysis.small_inline_size && + (Lam_analysis.is_closed_by meta.export_idents _m + || not (Lambda.IdentSet.mem v meta.export_idents)) + + then + if rec_flag = Rec then + begin + (* Ext_log.dwarn __LOC__ "beta rec.. %s/%d@." v.name v.stamp ; *) + Lam_beta_reduce.propogate_beta_reduce meta params body args + end + else + begin + (* Ext_log.dwarn __LOC__ "beta nonrec..[%d] [%a] %s/%d@." *) + (* (List.length args) *) + (* Printlambda.lambda body *) + (* v.name v.stamp ; *) + simpl (Lam_beta_reduce.propogate_beta_reduce meta params body args) + + end + else + begin + (* Ext_log.dwarn __LOC__ "%s/%d: %d @." *) + (* v.name v.stamp lam_size *) + (* ; *) + Lapply ( simpl l1, List.map simpl args, info) + end + else + begin + (* Ext_log.dwarn __LOC__ "%d vs %d @." (List.length args) (List.length params); *) + Lapply ( simpl l1, List.map simpl args, info) + end + + | _ -> + begin + (* Ext_log.dwarn __LOC__ "%s/%d -- no source @." v.name v.stamp; *) + Lapply ( simpl l1, List.map simpl args, info) + end + | exception Not_found -> + (* Ext_log.dwarn __LOC__ "%s/%d -- not found @." v.name v.stamp; *) + Lapply ( simpl l1, List.map simpl args, info) end + | Lapply(Lfunction(Curried, params, body), args, _) - when List.length params = List.length args -> + when Ext_list.same_length params args -> simpl (Lam_beta_reduce.propogate_beta_reduce meta params body args) | Lapply(Lfunction(Tupled, params, body), [Lprim(Pmakeblock _, args)], _) (** TODO: keep track of this parameter in ocaml trunk, can we switch to the tupled backend? *) - when List.length params = List.length args -> + when Ext_list.same_length params args -> simpl (Lam_beta_reduce.propogate_beta_reduce meta params body args) | Lapply (l1, ll, info) -> Lapply (simpl l1, List.map simpl ll,info) - | Lfunction (kind, params, l) -> Lfunction (kind, params , simpl l) + | Lfunction (kind, params, l) + -> Lfunction (kind, params , simpl l) | Lswitch (l, {sw_failaction; sw_consts; sw_blocks; diff --git a/jscomp/lam_stats.ml b/jscomp/lam_stats.ml index 93629ba956..5299b4461a 100644 --- a/jscomp/lam_stats.ml +++ b/jscomp/lam_stats.ml @@ -45,10 +45,15 @@ type function_kind = | Function | NA +type rec_flag = + | Rec + | Non_rec + type function_id = { kind : function_kind ; mutable arity : function_arities ; lambda : Lambda.lambda ; + rec_flag : rec_flag } type element = @@ -83,7 +88,9 @@ type ident_info = { type meta = { env : Env.t; filename : string ; - mutable export_idents : Ident.t list; + export_idents : Lambda.IdentSet.t ; + exports : Ident.t list ; + alias_tbl : alias_tbl; exit_codes : int Hash_set.hashset; @@ -91,7 +98,6 @@ type meta = { (** we don't need count arities for all identifiers, for identifiers for sure it's not a function, there is no need to count them *) - exports : Ident.t list ; (** required modules completed by [alias_pass] *) mutable required_modules : Lam_module_ident.t list ; } diff --git a/jscomp/lam_stats.mli b/jscomp/lam_stats.mli index 9d3b6d3cbf..336be674ec 100644 --- a/jscomp/lam_stats.mli +++ b/jscomp/lam_stats.mli @@ -46,6 +46,10 @@ type function_kind = | Function | NA +type rec_flag = + | Rec + | Non_rec + type function_id = { kind : function_kind ; mutable arity : function_arities; @@ -53,6 +57,7 @@ type function_id = { (* TODO: This may contain some closure environment, check how it will interact with dead code elimination *) + rec_flag : rec_flag } type element = @@ -85,7 +90,8 @@ type ident_info = { type meta = { env : Env.t; filename : string ; - mutable export_idents : Ident.t list; + export_idents : Lambda.IdentSet.t ; + exports : Ident.t list ; alias_tbl : alias_tbl; exit_codes : int Hash_set.hashset; @@ -93,6 +99,6 @@ type meta = { (** we don't need count arities for all identifiers, for identifiers for sure it's not a function, there is no need to count them *) - exports : Ident.t list ; + mutable required_modules : Lam_module_ident.t list ; } diff --git a/jscomp/lam_stats_util.ml b/jscomp/lam_stats_util.ml index a689d6d657..4aaf57e587 100644 --- a/jscomp/lam_stats_util.ml +++ b/jscomp/lam_stats_util.ml @@ -252,7 +252,7 @@ let export_to_cmj let closed_lambda = if Lam_inline_util.maybe_functor x.name then - if Lambda.IdentSet.is_empty @@ Lambda.free_variables lambda + if Lam_analysis.is_closed lambda then Some lambda else None else None in diff --git a/jscomp/lam_stats_util.mli b/jscomp/lam_stats_util.mli index 5bb103ec0b..a8aebf27b4 100644 --- a/jscomp/lam_stats_util.mli +++ b/jscomp/lam_stats_util.mli @@ -24,6 +24,8 @@ val pp_alias_tbl : Format.formatter -> Lam_stats.alias_tbl -> unit +val pp_arities : Format.formatter -> Lam_stats.function_arities -> unit + val get_arity : Lam_stats.meta -> Lambda.lambda -> Lam_stats.function_arities (* val dump_exports_arities : Lam_stats.meta -> unit *) diff --git a/jscomp/lam_util.ml b/jscomp/lam_util.ml index f840b6fe90..c594e589d4 100644 --- a/jscomp/lam_util.ml +++ b/jscomp/lam_util.ml @@ -208,7 +208,7 @@ let alias (meta : Lam_stats.meta) (k:Ident.t) (v:Ident.t) *) begin match let_kind with | Alias -> - if not @@ List.mem k meta.export_idents + if not @@ Lambda.IdentSet.mem k meta.export_idents then Hashtbl.add meta.alias_tbl k v (** For [export_idents], we don't want to do such simplification @@ -285,3 +285,20 @@ let dump env filename pred lam = (Printf.sprintf ".%02d.lam" !log_counter) ) lam; lam + + + +let ident_set_of_list ls = + List.fold_left + (fun acc k -> Lambda.IdentSet.add k acc ) + Lambda.IdentSet.empty ls + +let print_ident_set fmt s = + Format.fprintf fmt "@[{%a}@]@." + (fun fmt s -> + Lambda.IdentSet.iter (fun e -> Format.fprintf fmt "@[%a@],@ " Ident.print e) s + ) + s + +let mk_apply_info ?(loc = Location.none) apply_status : Lambda.apply_info = + { apply_loc = loc; apply_status } diff --git a/jscomp/lam_util.mli b/jscomp/lam_util.mli index 35735922ea..fd0d4f9ca0 100644 --- a/jscomp/lam_util.mli +++ b/jscomp/lam_util.mli @@ -50,3 +50,9 @@ val sort_dag_args : J.expression Ident_map.t -> Ident.t list option *) val dump : Env.t -> string -> bool -> Lambda.lambda -> Lambda.lambda + +val ident_set_of_list : Ident.t list -> Lambda.IdentSet.t + +val print_ident_set : Format.formatter -> Lambda.IdentSet.t -> unit + +val mk_apply_info : ?loc:Location.t -> Lambda.apply_status -> Lambda.apply_info diff --git a/jscomp/stdlib/arg.js b/jscomp/stdlib/arg.js index 576a988f6f..a6fd969b41 100644 --- a/jscomp/stdlib/arg.js +++ b/jscomp/stdlib/arg.js @@ -401,7 +401,6 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { try { var treat_action = (function(s){ return function (param) { - var exit = 0; switch (param[0]) { case 0 : return param[1](/* () */0); @@ -436,7 +435,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 2 : @@ -451,7 +457,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 5 : @@ -460,7 +473,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 6 : @@ -494,7 +514,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 7 : @@ -528,7 +555,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 8 : @@ -562,7 +596,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 9 : @@ -596,7 +637,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return ++ current$1[1]; } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 10 : @@ -623,7 +671,14 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { } } else { - exit = 1; + throw [ + 0, + Stop, + [ + /* Missing */2, + s + ] + ]; } break; case 12 : @@ -635,17 +690,6 @@ function parse_argv_dynamic($staropt$star, argv, speclist, anonfun, errmsg) { return /* () */0; } - if (exit === 1) { - throw [ - 0, - Stop, - [ - /* Missing */2, - s - ] - ]; - } - } }(s)); treat_action(action); diff --git a/jscomp/stdlib/camlinternalFormat.js b/jscomp/stdlib/camlinternalFormat.js index 672190ad23..a31e9ad426 100644 --- a/jscomp/stdlib/camlinternalFormat.js +++ b/jscomp/stdlib/camlinternalFormat.js @@ -30,7 +30,7 @@ function freeze_char_set(char_set) { } function rev_char_set(char_set) { - var char_set$prime = create_char_set(/* () */0); + var char_set$prime = Bytes.make(32, /* "\000" */0); for(var i = 0; i<= 31; ++i){ char_set$prime[i] = Pervasives.char_of_int(char_set.charCodeAt(i) ^ 255); } @@ -235,14 +235,6 @@ function param_format_of_ignored_format(ign, fmt) { var default_float_precision = 6; -function buffer_create(init_size) { - return [ - /* record */0, - 0, - Caml_string.caml_create_string(init_size) - ]; -} - function buffer_check_size(buf, overhead) { var len = buf[2].length; var min_len = buf[1] + overhead; @@ -368,26 +360,21 @@ function bprint_char_set(buf, char_set) { var set$1 = set; var i$1 = i; var match = Pervasives.char_of_int(i$1); - var exit = 0; var switcher = match - 45; if (switcher > 48 || switcher < 0) { if (switcher >= 210) { return print_char(buf, 255); } else { - exit = 1; + return print_second(set$1, i$1 + 1); } } else if (switcher > 47 || switcher < 1) { return print_out(set$1, i$1 + 1); } else { - exit = 1; - } - if (exit === 1) { return print_second(set$1, i$1 + 1); } - } else { _i = i + 1; @@ -398,6 +385,68 @@ function bprint_char_set(buf, char_set) { } }; }; + var print_second = function (set, i) { + if (is_in_char_set(set, Pervasives.char_of_int(i))) { + var match = Pervasives.char_of_int(i); + var exit = 0; + var switcher = match - 45; + if (switcher > 48 || switcher < 0) { + if (switcher >= 210) { + print_char(buf, 254); + return print_char(buf, 255); + } + else { + exit = 1; + } + } + else if (switcher > 47 || switcher < 1) { + if (is_in_char_set(set, Pervasives.char_of_int(i + 1))) { + exit = 1; + } + else { + print_char(buf, i - 1); + return print_out(set, i + 1); + } + } + else { + exit = 1; + } + if (exit === 1) { + if (is_in_char_set(set, Pervasives.char_of_int(i + 1))) { + var set$1 = set; + var i$1 = i - 1; + var _j = i + 2; + while(true) { + var j = _j; + if (j === 256 || !is_in_char_set(set$1, Pervasives.char_of_int(j))) { + print_char(buf, i$1); + print_char(buf, /* "-" */45); + print_char(buf, j - 1); + if (j < 256) { + return print_out(set$1, j + 1); + } + else { + return 0; + } + } + else { + _j = j + 1; + } + }; + } + else { + print_char(buf, i - 1); + print_char(buf, i); + return print_out(set, i + 2); + } + } + + } + else { + print_char(buf, i - 1); + return print_out(set, i + 1); + } + }; var print_char = function (buf, i) { var c = Pervasives.char_of_int(i); if (c !== 37) { @@ -480,7 +529,6 @@ function bprint_precision(buf, prec) { } function bprint_iconv_flag(buf, iconv) { - var exit = 0; switch (iconv) { case 1 : case 4 : @@ -491,8 +539,7 @@ function bprint_iconv_flag(buf, iconv) { case 7 : case 9 : case 11 : - exit = 1; - break; + return buffer_add_char(buf, /* "#" */35); case 0 : case 3 : case 6 : @@ -502,10 +549,6 @@ function bprint_iconv_flag(buf, iconv) { return /* () */0; } - if (exit === 1) { - return buffer_add_char(buf, /* "#" */35); - } - } function bprint_int_fmt(buf, ign_flag, iconv, pad, prec) { @@ -528,22 +571,19 @@ function bprint_altint_fmt(buf, ign_flag, iconv, pad, prec, c) { } function bprint_fconv_flag(buf, fconv) { - var exit = 0; switch (fconv) { case 1 : case 4 : case 7 : case 10 : case 13 : - exit = 1; - break; + return buffer_add_char(buf, /* "+" */43); case 2 : case 5 : case 8 : case 11 : case 14 : - exit = 2; - break; + return buffer_add_char(buf, /* " " */32); case 0 : case 3 : case 6 : @@ -553,13 +593,6 @@ function bprint_fconv_flag(buf, fconv) { return /* () */0; } - switch (exit) { - case 1 : - return buffer_add_char(buf, /* "+" */43); - case 2 : - return buffer_add_char(buf, /* " " */32); - - } } function bprint_float_fmt(buf, ign_flag, fconv, pad, prec) { @@ -890,7 +923,11 @@ function bprint_fmt(buf, fmt) { } function string_of_fmt(fmt) { - var buf = buffer_create(16); + var buf = [ + /* record */0, + 0, + new Array(16) + ]; bprint_fmt(buf, fmt); return buffer_contents(buf); } @@ -2347,7 +2384,6 @@ function type_format(fmt, fmtty) { } function type_format_gen(fmt, fmtty) { - var exit = 0; if (typeof fmt === "number") { return [ /* Fmt_fmtty_EBB */0, @@ -2359,10 +2395,10 @@ function type_format_gen(fmt, fmtty) { switch (fmt[0]) { case 0 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0]) { - exit = 1; + throw Type_mismatch; } else { var match = type_format_gen(fmt[1], fmtty[1]); @@ -2378,10 +2414,10 @@ function type_format_gen(fmt, fmtty) { break; case 1 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0]) { - exit = 1; + throw Type_mismatch; } else { var match$1 = type_format_gen(fmt[1], fmtty[1]); @@ -2561,7 +2597,7 @@ function type_format_gen(fmt, fmtty) { break; case 9 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 7) { var match$23 = type_format_gen(fmt[1], fmtty[1]); @@ -2575,7 +2611,7 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 10 : @@ -2612,7 +2648,7 @@ function type_format_gen(fmt, fmtty) { ]; case 13 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 8) { var sub_fmtty$prime = fmtty[1]; @@ -2638,12 +2674,12 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 14 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 9) { var sub_fmtty1 = fmtty[1]; @@ -2669,12 +2705,12 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 15 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 10) { var match$29 = type_format_gen(fmt[1], fmtty[1]); @@ -2688,12 +2724,12 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 16 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 11) { var match$30 = type_format_gen(fmt[1], fmtty[1]); @@ -2707,7 +2743,7 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 17 : @@ -2769,7 +2805,7 @@ function type_format_gen(fmt, fmtty) { } case 19 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 13) { var match$38 = type_format_gen(fmt[1], fmtty[1]); @@ -2783,12 +2819,12 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 20 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 1) { var match$39 = type_format_gen(fmt[3], fmtty[1]); @@ -2804,12 +2840,12 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 21 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 2) { var match$40 = type_format_gen(fmt[2], fmtty[1]); @@ -2824,7 +2860,7 @@ function type_format_gen(fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 23 : @@ -2900,15 +2936,10 @@ function type_format_gen(fmt, fmtty) { } case 22 : case 24 : - exit = 1; - break; + throw Type_mismatch; } } - if (exit === 1) { - throw Type_mismatch; - } - } function type_ignored_param_one(ign, fmt, fmtty) { @@ -2925,7 +2956,6 @@ function type_ignored_param_one(ign, fmt, fmtty) { } function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { - var exit = 0; if (typeof sub_fmtty === "number") { return [ /* Fmtty_fmt_EBB */0, @@ -2937,10 +2967,10 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { switch (sub_fmtty[0]) { case 0 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0]) { - exit = 1; + throw Type_mismatch; } else { var match = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -2956,7 +2986,7 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { break; case 1 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 1) { var match$1 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -2970,12 +3000,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 2 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 2) { var match$2 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -2989,12 +3019,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 3 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 3) { var match$3 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3008,12 +3038,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 4 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 4) { var match$4 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3027,12 +3057,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 5 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 5) { var match$5 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3046,12 +3076,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 6 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 6) { var match$6 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3065,12 +3095,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 7 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 7) { var match$7 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3084,12 +3114,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 8 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 8) { var sub2_fmtty$prime = fmtty[1]; @@ -3114,12 +3144,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 9 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 9) { var sub2_fmtty$prime$1 = fmtty[2]; @@ -3159,12 +3189,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 10 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 10) { var match$11 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3178,12 +3208,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 11 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 11) { var match$12 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3197,15 +3227,14 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 12 : - exit = 1; - break; + throw Type_mismatch; case 13 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 13) { var match$13 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3219,12 +3248,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; case 14 : if (typeof fmtty === "number") { - exit = 1; + throw Type_mismatch; } else if (fmtty[0] === 14) { var match$14 = type_ignored_format_substitution(sub_fmtty[1], fmt, fmtty[1]); @@ -3238,16 +3267,12 @@ function type_ignored_format_substitution(sub_fmtty, fmt, fmtty) { ]; } else { - exit = 1; + throw Type_mismatch; } break; } } - if (exit === 1) { - throw Type_mismatch; - } - } function recast(fmt, fmtty) { @@ -3583,7 +3608,11 @@ function format_of_fconv(fconv, prec) { else { var prec$1 = Pervasives.abs(prec); var symb = char_of_fconv(fconv); - var buf = buffer_create(16); + var buf = [ + /* record */0, + 0, + new Array(16) + ]; buffer_add_char(buf, /* "%" */37); bprint_fconv_flag(buf, fconv); buffer_add_char(buf, /* "." */46); @@ -3677,7 +3706,11 @@ function format_caml_char(c) { } function string_of_fmtty(fmtty) { - var buf = buffer_create(16); + var buf = [ + /* record */0, + 0, + new Array(16) + ]; bprint_fmtty(buf, fmtty); return buffer_contents(buf); } @@ -4621,25 +4654,20 @@ function open_box_of_string(str) { } else { var match = str.charCodeAt(j); - var exit = 0; if (match >= 48) { if (match >= 58) { return j; } else { - exit = 1; + _j = j + 1; } } else if (match !== 45) { return j; } else { - exit = 1; - } - if (exit === 1) { _j = j + 1; } - } }; }; @@ -4830,12 +4858,6 @@ function fmt_ebb_of_string(legacy_behavior, str) { "invalid format %S: at character number %d, %s" ])(str, str_ind, msg); }; - var unexpected_end_of_format = function (end_ind) { - return invalid_format_message(end_ind, "unexpected end of format"); - }; - var invalid_nonnull_char_width = function (str_ind) { - return invalid_format_message(str_ind, "non-zero widths are unsupported for %c conversions"); - }; var invalid_format_without = function (str_ind, c, s) { return failwith_message([ /* Format */0, @@ -4916,13 +4938,10 @@ function fmt_ebb_of_string(legacy_behavior, str) { "invalid format %S: at character number %d, %s expected, read %C" ])(str, str_ind, expected, read); }; - var parse = function (beg_ind, end_ind) { - var lit_start = beg_ind; - var _str_ind = beg_ind; - var end_ind$1 = end_ind; + var parse_literal = function (lit_start, _str_ind, end_ind) { while(true) { var str_ind = _str_ind; - if (str_ind === end_ind$1) { + if (str_ind === end_ind) { return add_literal(lit_start, str_ind, /* End_of_format */0); } else { @@ -4932,12 +4951,12 @@ function fmt_ebb_of_string(legacy_behavior, str) { _str_ind = str_ind + 1; } else { - var match$1 = parse_after_at(str_ind + 1, end_ind$1); + var match$1 = parse_after_at(str_ind + 1, end_ind); return add_literal(lit_start, str_ind, match$1[1]); } } else { - var match$2 = parse_format(str_ind, end_ind$1); + var match$2 = parse_format(str_ind, end_ind); return add_literal(lit_start, str_ind, match$2[1]); } } @@ -4948,7 +4967,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { var str_ind = pct_ind + 1; var end_ind$1 = end_ind; if (str_ind === end_ind$1) { - unexpected_end_of_format(end_ind$1); + invalid_format_message(end_ind$1, "unexpected end of format"); } var match = str.charCodeAt(str_ind); if (match !== 95) { @@ -5019,7 +5038,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { while(true) { var str_ind$1 = _str_ind; if (str_ind$1 === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var match = str.charCodeAt(str_ind$1); var exit = 0; @@ -5077,7 +5096,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { var space$1 = space[1]; var ign$1 = ign; if (str_ind$2 === end_ind$1) { - unexpected_end_of_format(end_ind$1); + invalid_format_message(end_ind$1, "unexpected end of format"); } var padty = zero$1 !== 0 ? ( minus$1 !== 0 ? ( @@ -5135,7 +5154,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { }; var parse_after_padding = function (pct_ind, str_ind, end_ind, minus, plus, sharp, space, ign, pad) { if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var symb = str.charCodeAt(str_ind); if (symb !== 46) { @@ -5152,7 +5171,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { var ign$1 = ign; var pad$1 = pad; if (str_ind$1 === end_ind$1) { - unexpected_end_of_format(end_ind$1); + invalid_format_message(end_ind$1, "unexpected end of format"); } var parse_literal = function (minus, str_ind) { var match = parse_positive(str_ind, end_ind$1, 0); @@ -5215,7 +5234,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { }; var parse_after_precision = function (pct_ind, str_ind, end_ind, minus, plus, sharp, space, ign, pad, prec) { if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var parse_conv = function (padprec) { return parse_conversion(pct_ind, str_ind + 1, end_ind, plus, sharp, space, ign, pad, prec, padprec, str.charCodeAt(str_ind)); @@ -5270,58 +5289,18 @@ function fmt_ebb_of_string(legacy_behavior, str) { } }; var parse_conversion = function (pct_ind, str_ind, end_ind, plus, sharp, space, ign, pad, prec, padprec, symb) { - var plus_used = [ - 0, - /* false */0 - ]; - var sharp_used = [ - 0, - /* false */0 - ]; - var space_used = [ - 0, - /* false */0 - ]; + var plus_used = /* false */0; + var sharp_used = /* false */0; + var space_used = /* false */0; var ign_used = [ 0, /* false */0 ]; - var pad_used = [ - 0, - /* false */0 - ]; + var pad_used = /* false */0; var prec_used = [ 0, /* false */0 ]; - var get_plus = function () { - plus_used[1] = /* true */1; - return plus; - }; - var get_sharp = function () { - sharp_used[1] = /* true */1; - return sharp; - }; - var get_space = function () { - space_used[1] = /* true */1; - return space; - }; - var get_ign = function () { - ign_used[1] = /* true */1; - return ign; - }; - var get_pad = function () { - pad_used[1] = /* true */1; - return pad; - }; - var get_prec = function () { - prec_used[1] = /* true */1; - return prec; - }; - var get_padprec = function () { - pad_used[1] = /* true */1; - return padprec; - }; var check_no_0 = function (symb, pad) { if (typeof pad === "number") { return pad; @@ -5396,16 +5375,10 @@ function fmt_ebb_of_string(legacy_behavior, str) { } } }; - var get_pad_opt = function (c) { - return opt_of_pad(c, get_pad(/* () */0)); - }; - var get_padprec_opt = function (c) { - return opt_of_pad(c, get_padprec(/* () */0)); - }; var get_prec_opt = function () { - var match = get_prec(/* () */0); - if (typeof match === "number") { - if (match !== 0) { + prec_used[1] = /* true */1; + if (typeof prec === "number") { + if (prec !== 0) { return incompatible_flag(pct_ind, str_ind, /* "_" */95, "'*'"); } else { @@ -5415,7 +5388,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { else { return [ /* Some */0, - match[1] + prec[1] ]; } }; @@ -5427,7 +5400,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { else { switch (symb) { case 33 : - var match = parse(str_ind, end_ind); + var match = parse_literal(str_ind, str_ind, end_ind); fmt_result = [ /* Fmt_EBB */0, [ @@ -5438,12 +5411,14 @@ function fmt_ebb_of_string(legacy_behavior, str) { break; case 40 : var sub_end = search_subformat_end(str_ind, end_ind, /* ")" */41); - var match$1 = parse(sub_end + 2, end_ind); + var beg_ind = sub_end + 2; + var match$1 = parse_literal(beg_ind, beg_ind, end_ind); var fmt_rest = match$1[1]; - var match$2 = parse(str_ind, sub_end); + var match$2 = parse_literal(str_ind, str_ind, sub_end); var sub_fmtty = fmtty_of_fmt(match$2[1]); - if (get_ign(/* () */0)) { - var ignored_001 = get_pad_opt(/* "_" */95); + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_001 = opt_of_pad(/* "_" */95, pad); var ignored = [ /* Ignored_format_subst */8, ignored_001, @@ -5459,11 +5434,12 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { + pad_used = /* true */1; fmt_result = [ /* Fmt_EBB */0, [ /* Format_subst */14, - get_pad_opt(/* "(" */40), + opt_of_pad(/* "(" */40, pad), sub_fmtty, fmt_rest ] @@ -5471,16 +5447,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { } break; case 44 : - fmt_result = parse(str_ind, end_ind); + fmt_result = parse_literal(str_ind, str_ind, end_ind); break; case 37 : case 64 : exit = 5; break; case 67 : - var match$3 = parse(str_ind, end_ind); + var match$3 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$1 = match$3[1]; - fmt_result = get_ign(/* () */0) ? [ + fmt_result = (ign_used[1] = /* true */1, ign) ? [ /* Fmt_EBB */0, [ /* Ignored_param */23, @@ -5496,10 +5472,10 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; break; case 78 : - var match$4 = parse(str_ind, end_ind); + var match$4 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$2 = match$4[1]; var counter = /* Token_counter */2; - if (get_ign(/* () */0)) { + if (ign_used[1] = /* true */1, ign) { var ignored$1 = [ /* Ignored_scan_get_counter */10, counter @@ -5525,11 +5501,13 @@ function fmt_ebb_of_string(legacy_behavior, str) { } break; case 83 : - var pad$1 = check_no_0(symb, get_padprec(/* () */0)); - var match$5 = parse(str_ind, end_ind); + pad_used = /* true */1; + var pad$1 = check_no_0(symb, padprec); + var match$5 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$3 = match$5[1]; - if (get_ign(/* () */0)) { - var ignored_001$1 = get_padprec_opt(/* "_" */95); + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_001$1 = opt_of_pad(/* "_" */95, padprec); var ignored$2 = [ /* Ignored_caml_string */1, ignored_001$1 @@ -5558,10 +5536,12 @@ function fmt_ebb_of_string(legacy_behavior, str) { case 91 : var match$7 = parse_char_set(str_ind, end_ind); var char_set = match$7[2]; - var match$8 = parse(match$7[1], end_ind); + var next_ind = match$7[1]; + var match$8 = parse_literal(next_ind, next_ind, end_ind); var fmt_rest$4 = match$8[1]; - if (get_ign(/* () */0)) { - var ignored_001$2 = get_pad_opt(/* "_" */95); + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_001$2 = opt_of_pad(/* "_" */95, pad); var ignored$3 = [ /* Ignored_scan_char_set */9, ignored_001$2, @@ -5577,11 +5557,12 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { + pad_used = /* true */1; fmt_result = [ /* Fmt_EBB */0, [ /* Scan_char_set */20, - get_pad_opt(/* "[" */91), + opt_of_pad(/* "[" */91, pad), char_set, fmt_rest$4 ] @@ -5596,7 +5577,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 6; break; case 97 : - var match$9 = parse(str_ind, end_ind); + var match$9 = parse_literal(str_ind, str_ind, end_ind); fmt_result = [ /* Fmt_EBB */0, [ @@ -5611,7 +5592,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { break; case 99 : var char_format = function (fmt_rest) { - if (get_ign(/* () */0)) { + if (ign_used[1] = /* true */1, ign) { return [ /* Fmt_EBB */0, [ @@ -5632,7 +5613,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } }; var scan_format = function (fmt_rest) { - if (get_ign(/* () */0)) { + if (ign_used[1] = /* true */1, ign) { return [ /* Fmt_EBB */0, [ @@ -5652,12 +5633,13 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } }; - var match$10 = parse(str_ind, end_ind); + var match$10 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$5 = match$10[1]; - var match$11 = get_pad_opt(/* "c" */99); + pad_used = /* true */1; + var match$11 = opt_of_pad(/* "c" */99, pad); fmt_result = match$11 ? ( match$11[1] !== 0 ? ( - legacy_behavior$1 ? char_format(fmt_rest$5) : invalid_nonnull_char_width(str_ind) + legacy_behavior$1 ? char_format(fmt_rest$5) : invalid_format_message(str_ind, "non-zero widths are unsupported for %c conversions") ) : scan_format(fmt_rest$5) ) : char_format(fmt_rest$5); break; @@ -5675,9 +5657,9 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 2; break; case 114 : - var match$12 = parse(str_ind, end_ind); + var match$12 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$6 = match$12[1]; - fmt_result = get_ign(/* () */0) ? [ + fmt_result = (ign_used[1] = /* true */1, ign) ? [ /* Fmt_EBB */0, [ /* Ignored_param */23, @@ -5693,11 +5675,13 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; break; case 115 : - var pad$2 = check_no_0(symb, get_padprec(/* () */0)); - var match$13 = parse(str_ind, end_ind); + pad_used = /* true */1; + var pad$2 = check_no_0(symb, padprec); + var match$13 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$7 = match$13[1]; - if (get_ign(/* () */0)) { - var ignored_001$3 = get_padprec_opt(/* "_" */95); + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_001$3 = opt_of_pad(/* "_" */95, padprec); var ignored$4 = [ /* Ignored_string */0, ignored_001$3 @@ -5724,7 +5708,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } break; case 116 : - var match$15 = parse(str_ind, end_ind); + var match$15 = parse_literal(str_ind, str_ind, end_ind); fmt_result = [ /* Fmt_EBB */0, [ @@ -5832,12 +5816,14 @@ function fmt_ebb_of_string(legacy_behavior, str) { break; case 123 : var sub_end$1 = search_subformat_end(str_ind, end_ind, /* "}" */125); - var match$16 = parse(str_ind, sub_end$1); - var match$17 = parse(sub_end$1 + 2, end_ind); + var match$16 = parse_literal(str_ind, str_ind, sub_end$1); + var beg_ind$1 = sub_end$1 + 2; + var match$17 = parse_literal(beg_ind$1, beg_ind$1, end_ind); var fmt_rest$8 = match$17[1]; var sub_fmtty$1 = fmtty_of_fmt(match$16[1]); - if (get_ign(/* () */0)) { - var ignored_001$4 = get_pad_opt(/* "_" */95); + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_001$4 = opt_of_pad(/* "_" */95, pad); var ignored$5 = [ /* Ignored_format_arg */7, ignored_001$4, @@ -5853,11 +5839,12 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { + pad_used = /* true */1; fmt_result = [ /* Fmt_EBB */0, [ /* Format_arg */13, - get_pad_opt(/* "{" */123), + opt_of_pad(/* "{" */123, pad), sub_fmtty$1, fmt_rest$8 ] @@ -5869,11 +5856,15 @@ function fmt_ebb_of_string(legacy_behavior, str) { } switch (exit) { case 1 : - var iconv = compute_int_conv(pct_ind, str_ind, get_plus(/* () */0), get_sharp(/* () */0), get_space(/* () */0), symb); - var match$18 = parse(str_ind, end_ind); + plus_used = /* true */1; + sharp_used = /* true */1; + space_used = /* true */1; + var iconv = compute_int_conv(pct_ind, str_ind, plus, sharp, space, symb); + var match$18 = parse_literal(str_ind, str_ind, end_ind); var fmt_rest$9 = match$18[1]; - if (get_ign(/* () */0)) { - var ignored_002 = get_pad_opt(/* "_" */95); + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_002 = opt_of_pad(/* "_" */95, pad); var ignored$6 = [ /* Ignored_int */2, iconv, @@ -5889,60 +5880,60 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$19 = get_pad(/* () */0); - var match$20 = get_prec(/* () */0); + pad_used = /* true */1; + prec_used[1] = /* true */1; var pad$3; var exit$1 = 0; - if (typeof match$20 === "number") { - if (match$20 !== 0) { + if (typeof prec === "number") { + if (prec !== 0) { exit$1 = 9; } else { - pad$3 = match$19; + pad$3 = pad; } } else { exit$1 = 9; } if (exit$1 === 9) { - pad$3 = typeof match$19 === "number" ? /* No_padding */0 : ( - match$19[0] ? ( - match$19[1] >= 2 ? ( + pad$3 = typeof pad === "number" ? /* No_padding */0 : ( + pad[0] ? ( + pad[1] >= 2 ? ( legacy_behavior$1 ? [ /* Arg_padding */1, /* Right */1 ] : incompatible_flag(pct_ind, str_ind, /* "0" */48, "precision") - ) : match$19 + ) : pad ) : ( - match$19[1] >= 2 ? ( + pad[1] >= 2 ? ( legacy_behavior$1 ? [ /* Lit_padding */0, /* Right */1, - match$19[2] + pad[2] ] : incompatible_flag(pct_ind, str_ind, /* "0" */48, "precision") - ) : match$19 + ) : pad ) ); } - var match$21 = make_padprec_fmt_ebb(pad$3, get_prec(/* () */0), fmt_rest$9); + var match$19 = make_padprec_fmt_ebb(pad$3, (prec_used[1] = /* true */1, prec), fmt_rest$9); fmt_result = [ /* Fmt_EBB */0, [ /* Int */4, iconv, - match$21[1], - match$21[2], - match$21[3] + match$19[1], + match$19[2], + match$19[3] ] ]; } break; case 2 : if (str_ind === end_ind || !is_int_base(str.charCodeAt(str_ind))) { - var match$22 = parse(str_ind, end_ind); - var fmt_rest$10 = match$22[1]; + var match$20 = parse_literal(str_ind, str_ind, end_ind); + var fmt_rest$10 = match$20[1]; var counter$1 = counter_of_char(symb); - if (get_ign(/* () */0)) { + if (ign_used[1] = /* true */1, ign) { var ignored$7 = [ /* Ignored_scan_get_counter */10, counter$1 @@ -5972,11 +5963,14 @@ function fmt_ebb_of_string(legacy_behavior, str) { } break; case 3 : - var fconv = compute_float_conv(pct_ind, str_ind, get_plus(/* () */0), get_space(/* () */0), symb); - var match$23 = parse(str_ind, end_ind); - var fmt_rest$11 = match$23[1]; - if (get_ign(/* () */0)) { - var ignored_001$5 = get_pad_opt(/* "_" */95); + plus_used = /* true */1; + space_used = /* true */1; + var fconv = compute_float_conv(pct_ind, str_ind, plus, space, symb); + var match$21 = parse_literal(str_ind, str_ind, end_ind); + var fmt_rest$11 = match$21[1]; + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_001$5 = opt_of_pad(/* "_" */95, pad); var ignored_002$1 = get_prec_opt(/* () */0); var ignored$8 = [ /* Ignored_float */6, @@ -5993,23 +5987,24 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$24 = make_padprec_fmt_ebb(get_pad(/* () */0), get_prec(/* () */0), fmt_rest$11); + pad_used = /* true */1; + var match$22 = make_padprec_fmt_ebb(pad, (prec_used[1] = /* true */1, prec), fmt_rest$11); fmt_result = [ /* Fmt_EBB */0, [ /* Float */8, fconv, - match$24[1], - match$24[2], - match$24[3] + match$22[1], + match$22[2], + match$22[3] ] ]; } break; case 4 : - var match$25 = parse(str_ind, end_ind); - var fmt_rest$12 = match$25[1]; - fmt_result = get_ign(/* () */0) ? [ + var match$23 = parse_literal(str_ind, str_ind, end_ind); + var fmt_rest$12 = match$23[1]; + fmt_result = (ign_used[1] = /* true */1, ign) ? [ /* Fmt_EBB */0, [ /* Ignored_param */23, @@ -6025,13 +6020,13 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; break; case 5 : - var match$26 = parse(str_ind, end_ind); + var match$24 = parse_literal(str_ind, str_ind, end_ind); fmt_result = [ /* Fmt_EBB */0, [ /* Char_literal */12, symb, - match$26[1] + match$24[1] ] ]; break; @@ -6087,11 +6082,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { else { switch (symb - 108) { case 0 : - var iconv$1 = compute_int_conv(pct_ind, str_ind + 1, get_plus(/* () */0), get_sharp(/* () */0), get_space(/* () */0), str.charCodeAt(str_ind)); - var match$27 = parse(str_ind + 1, end_ind); - var fmt_rest$13 = match$27[1]; - if (get_ign(/* () */0)) { - var ignored_002$2 = get_pad_opt(/* "_" */95); + plus_used = /* true */1; + sharp_used = /* true */1; + space_used = /* true */1; + var iconv$1 = compute_int_conv(pct_ind, str_ind + 1, plus, sharp, space, str.charCodeAt(str_ind)); + var beg_ind$2 = str_ind + 1; + var match$25 = parse_literal(beg_ind$2, beg_ind$2, end_ind); + var fmt_rest$13 = match$25[1]; + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_002$2 = opt_of_pad(/* "_" */95, pad); var ignored$9 = [ /* Ignored_int32 */3, iconv$1, @@ -6107,15 +6107,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$28 = make_padprec_fmt_ebb(get_pad(/* () */0), get_prec(/* () */0), fmt_rest$13); + pad_used = /* true */1; + var match$26 = make_padprec_fmt_ebb(pad, (prec_used[1] = /* true */1, prec), fmt_rest$13); fmt_result = [ /* Fmt_EBB */0, [ /* Int32 */5, iconv$1, - match$28[1], - match$28[2], - match$28[3] + match$26[1], + match$26[2], + match$26[3] ] ]; } @@ -6124,11 +6125,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 8; break; case 2 : - var iconv$2 = compute_int_conv(pct_ind, str_ind + 1, get_plus(/* () */0), get_sharp(/* () */0), get_space(/* () */0), str.charCodeAt(str_ind)); - var match$29 = parse(str_ind + 1, end_ind); - var fmt_rest$14 = match$29[1]; - if (get_ign(/* () */0)) { - var ignored_002$3 = get_pad_opt(/* "_" */95); + plus_used = /* true */1; + sharp_used = /* true */1; + space_used = /* true */1; + var iconv$2 = compute_int_conv(pct_ind, str_ind + 1, plus, sharp, space, str.charCodeAt(str_ind)); + var beg_ind$3 = str_ind + 1; + var match$27 = parse_literal(beg_ind$3, beg_ind$3, end_ind); + var fmt_rest$14 = match$27[1]; + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_002$3 = opt_of_pad(/* "_" */95, pad); var ignored$10 = [ /* Ignored_nativeint */4, iconv$2, @@ -6144,15 +6150,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$30 = make_padprec_fmt_ebb(get_pad(/* () */0), get_prec(/* () */0), fmt_rest$14); + pad_used = /* true */1; + var match$28 = make_padprec_fmt_ebb(pad, (prec_used[1] = /* true */1, prec), fmt_rest$14); fmt_result = [ /* Fmt_EBB */0, [ /* Nativeint */6, iconv$2, - match$30[1], - match$30[2], - match$30[3] + match$28[1], + match$28[2], + match$28[3] ] ]; } @@ -6165,11 +6172,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 8; } else { - var iconv$3 = compute_int_conv(pct_ind, str_ind + 1, get_plus(/* () */0), get_sharp(/* () */0), get_space(/* () */0), str.charCodeAt(str_ind)); - var match$31 = parse(str_ind + 1, end_ind); - var fmt_rest$15 = match$31[1]; - if (get_ign(/* () */0)) { - var ignored_002$4 = get_pad_opt(/* "_" */95); + plus_used = /* true */1; + sharp_used = /* true */1; + space_used = /* true */1; + var iconv$3 = compute_int_conv(pct_ind, str_ind + 1, plus, sharp, space, str.charCodeAt(str_ind)); + var beg_ind$4 = str_ind + 1; + var match$29 = parse_literal(beg_ind$4, beg_ind$4, end_ind); + var fmt_rest$15 = match$29[1]; + if (ign_used[1] = /* true */1, ign) { + pad_used = /* true */1; + var ignored_002$4 = opt_of_pad(/* "_" */95, pad); var ignored$11 = [ /* Ignored_int64 */5, iconv$3, @@ -6185,15 +6197,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$32 = make_padprec_fmt_ebb(get_pad(/* () */0), get_prec(/* () */0), fmt_rest$15); + pad_used = /* true */1; + var match$30 = make_padprec_fmt_ebb(pad, (prec_used[1] = /* true */1, prec), fmt_rest$15); fmt_result = [ /* Fmt_EBB */0, [ /* Int64 */7, iconv$3, - match$32[1], - match$32[2], - match$32[3] + match$30[1], + match$30[2], + match$30[3] ] ]; } @@ -6242,16 +6255,16 @@ function fmt_ebb_of_string(legacy_behavior, str) { } if (!legacy_behavior$1) { - if (!plus_used[1] && plus) { + if (!plus_used && plus) { incompatible_flag(pct_ind, str_ind, symb, "'+'"); } - if (!sharp_used[1] && sharp) { + if (!sharp_used && sharp) { incompatible_flag(pct_ind, str_ind, symb, "'#'"); } - if (!space_used[1] && space) { + if (!space_used && space) { incompatible_flag(pct_ind, str_ind, symb, "' '"); } - if (!pad_used[1] && Caml_primitive.caml_notequal([ + if (!pad_used && Caml_primitive.caml_notequal([ /* Padding_EBB */0, pad ], [ @@ -6276,26 +6289,39 @@ function fmt_ebb_of_string(legacy_behavior, str) { } if (!ign_used[1] && ign) { var exit$2 = 0; - exit$2 = symb >= 38 ? ( - symb !== 44 ? ( - symb !== 64 ? 2 : 1 - ) : 1 - ) : ( - symb !== 33 ? ( - symb >= 37 ? 1 : 2 - ) : 1 - ); - switch (exit$2) { - case 1 : - if (!legacy_behavior$1) { - exit$2 = 2; - } - break; - case 2 : - incompatible_flag(pct_ind, str_ind, symb, "'_'"); - break; + if (symb >= 38) { + if (symb !== 44) { + if (symb !== 64) { + exit$2 = 1; + } + else if (!legacy_behavior$1) { + exit$2 = 1; + } + + } + else if (!legacy_behavior$1) { + exit$2 = 1; + } } + else if (symb !== 33) { + if (symb >= 37) { + if (!legacy_behavior$1) { + exit$2 = 1; + } + + } + else { + exit$2 = 1; + } + } + else if (!legacy_behavior$1) { + exit$2 = 1; + } + if (exit$2 === 1) { + incompatible_flag(pct_ind, str_ind, symb, "'_'"); + } + } return fmt_result; }; @@ -6327,7 +6353,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 1; break; case 2 : - var match = parse(str_ind + 1, end_ind); + var beg_ind = str_ind + 1; + var match = parse_literal(beg_ind, beg_ind, end_ind); return [ /* Fmt_EBB */0, [ @@ -6348,7 +6375,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 1; break; case 2 : - var match$1 = parse(str_ind + 1, end_ind); + var beg_ind$1 = str_ind + 1; + var match$1 = parse_literal(beg_ind$1, beg_ind$1, end_ind); return [ /* Fmt_EBB */0, [ @@ -6368,7 +6396,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { if (c >= 32) { switch (c - 32) { case 0 : - var match$2 = parse(str_ind + 1, end_ind); + var beg_ind$2 = str_ind + 1; + var match$2 = parse_literal(beg_ind$2, beg_ind$2, end_ind); return [ /* Fmt_EBB */0, [ @@ -6384,7 +6413,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; case 5 : if (str_ind + 1 < end_ind && str[str_ind + 1] === "%") { - var match$3 = parse(str_ind + 2, end_ind); + var beg_ind$3 = str_ind + 2; + var match$3 = parse_literal(beg_ind$3, beg_ind$3, end_ind); return [ /* Fmt_EBB */0, [ @@ -6395,7 +6425,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$4 = parse(str_ind, end_ind); + var match$4 = parse_literal(str_ind, str_ind, end_ind); return [ /* Fmt_EBB */0, [ @@ -6407,7 +6437,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { } break; case 12 : - var match$5 = parse(str_ind + 1, end_ind); + var beg_ind$4 = str_ind + 1; + var match$5 = parse_literal(beg_ind$4, beg_ind$4, end_ind); return [ /* Fmt_EBB */0, [ @@ -6422,7 +6453,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { ] ]; case 14 : - var match$6 = parse(str_ind + 1, end_ind); + var beg_ind$5 = str_ind + 1; + var match$6 = parse_literal(beg_ind$5, beg_ind$5, end_ind); return [ /* Fmt_EBB */0, [ @@ -6533,7 +6565,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { throw exn; } } - var match$12 = parse(match$7[1], end_ind$1); + var next_ind = match$7[1]; + var match$12 = parse_literal(next_ind, next_ind, end_ind$1); return [ /* Fmt_EBB */0, [ @@ -6599,7 +6632,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { } if (match$13) { var match$16 = match$13[1]; - var match$17 = parse(match$16[1], end_ind$2); + var next_ind$1 = match$16[1]; + var match$17 = parse_literal(next_ind$1, next_ind$1, end_ind$2); return [ /* Fmt_EBB */0, [ @@ -6610,7 +6644,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } else { - var match$18 = parse(str_ind$2, end_ind$2); + var match$18 = parse_literal(str_ind$2, str_ind$2, end_ind$2); return [ /* Fmt_EBB */0, [ @@ -6651,7 +6685,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 1; break; case 31 : - var match$19 = parse(str_ind + 1, end_ind); + var beg_ind$6 = str_ind + 1; + var match$19 = parse_literal(beg_ind$6, beg_ind$6, end_ind); return [ /* Fmt_EBB */0, [ @@ -6661,7 +6696,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { ] ]; case 32 : - var match$20 = parse(str_ind + 1, end_ind); + var beg_ind$7 = str_ind + 1; + var match$20 = parse_literal(beg_ind$7, beg_ind$7, end_ind); return [ /* Fmt_EBB */0, [ @@ -6678,7 +6714,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { } } else { - var match$21 = parse(str_ind + 1, end_ind); + var beg_ind$8 = str_ind + 1; + var match$21 = parse_literal(beg_ind$8, beg_ind$8, end_ind); return [ /* Fmt_EBB */0, [ @@ -6689,7 +6726,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { ]; } if (exit === 1) { - var match$22 = parse(str_ind + 1, end_ind); + var beg_ind$9 = str_ind + 1; + var match$22 = parse_literal(beg_ind$9, beg_ind$9, end_ind); return [ /* Fmt_EBB */0, [ @@ -6746,8 +6784,10 @@ function fmt_ebb_of_string(legacy_behavior, str) { throw Caml_exceptions.Not_found; } var sub_str = $$String.sub(str, str_ind, ind - str_ind + 1); - var match$1 = parse(ind + 1, end_ind); - var match$2 = parse(str_ind, ind + 1); + var beg_ind = ind + 1; + var match$1 = parse_literal(beg_ind, beg_ind, end_ind); + var end_ind$1 = ind + 1; + var match$2 = parse_literal(str_ind, str_ind, end_ind$1); var sub_fmt = match$2[1]; var sub_format = [ /* Format */0, @@ -6773,7 +6813,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } catch (exn){ if (exn === Caml_exceptions.Not_found) { - var match$3 = parse(str_ind, end_ind); + var match$3 = parse_literal(str_ind, str_ind, end_ind); var sub_format$1 = [ /* Format */0, /* End_of_format */0, @@ -6802,12 +6842,9 @@ function fmt_ebb_of_string(legacy_behavior, str) { }; var parse_char_set = function (str_ind, end_ind) { if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } - var char_set = create_char_set(/* () */0); - var add_char = function (c) { - return add_in_char_set(char_set, c); - }; + var char_set = Bytes.make(32, /* "\000" */0); var add_range = function (c, c$prime) { for(var i = c; i<= c$prime; ++i){ add_in_char_set(char_set, Pervasives.char_of_int(i)); @@ -6865,7 +6902,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { }; var parse_char_set_start = function (str_ind, end_ind) { if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var c = str.charCodeAt(str_ind); return parse_char_set_after_char(str_ind + 1, end_ind, c); @@ -6874,7 +6911,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { while(true) { var str_ind = _str_ind; if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var c = str.charCodeAt(str_ind); if (c !== 45) { @@ -6886,7 +6923,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } } else { - add_char(/* "-" */45); + add_in_char_set(char_set, /* "-" */45); _str_ind = str_ind + 1; } }; @@ -6896,7 +6933,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { var c = _c; var str_ind = _str_ind; if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var c$prime = str.charCodeAt(str_ind); var exit = 0; @@ -6906,7 +6943,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { exit = 2; } else { - add_char(c); + add_in_char_set(char_set, c); return str_ind + 1; } } @@ -6920,7 +6957,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { var end_ind$1 = end_ind; var c$1 = c; if (str_ind$1 === end_ind$1) { - unexpected_end_of_format(end_ind$1); + invalid_format_message(end_ind$1, "unexpected end of format"); } var c$prime$1 = str.charCodeAt(str_ind$1); if (c$prime$1 !== 37) { @@ -6929,14 +6966,14 @@ function fmt_ebb_of_string(legacy_behavior, str) { return parse_char_set_content(str_ind$1 + 1, end_ind$1); } else { - add_char(c$1); - add_char(/* "-" */45); + add_in_char_set(char_set, c$1); + add_in_char_set(char_set, /* "-" */45); return str_ind$1 + 1; } } else { if (str_ind$1 + 1 === end_ind$1) { - unexpected_end_of_format(end_ind$1); + invalid_format_message(end_ind$1, "unexpected end of format"); } var c$prime$2 = str.charCodeAt(str_ind$1 + 1); var exit$1 = 0; @@ -6968,7 +7005,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { switch (exit) { case 1 : if (c === /* "%" */37) { - add_char(c$prime); + add_in_char_set(char_set, c$prime); return parse_char_set_content(str_ind + 1, end_ind); } else { @@ -6979,7 +7016,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { if (c === /* "%" */37) { fail_single_percent(str_ind); } - add_char(c); + add_in_char_set(char_set, c); _c = c$prime; _str_ind = str_ind + 1; break; @@ -6988,7 +7025,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { }; }; if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var match = str.charCodeAt(str_ind); var match$1 = match !== 94 ? [ @@ -7001,7 +7038,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { /* true */1 ]; var next_ind = parse_char_set_start(match$1[1], end_ind); - var char_set$1 = freeze_char_set(char_set); + var char_set$1 = Bytes.to_string(char_set); return [ /* tuple */0, next_ind, @@ -7012,7 +7049,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { while(true) { var str_ind = _str_ind; if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } if (str[str_ind] === " ") { _str_ind = str_ind + 1; @@ -7027,7 +7064,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { var acc = _acc; var str_ind = _str_ind; if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var c = str.charCodeAt(str_ind); if (c > 57 || c < 48) { @@ -7083,7 +7120,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { }; var parse_integer = function (str_ind, end_ind) { if (str_ind === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var match = str.charCodeAt(str_ind); if (match >= 48) { @@ -7117,7 +7154,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } else { if (str_ind + 1 === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var c = str.charCodeAt(str_ind + 1); if (c > 57 || c < 48) { @@ -7209,7 +7246,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } else { if (str_ind + 1 === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } if (str.charCodeAt(str_ind + 1) === c) { return str_ind; @@ -7242,7 +7279,7 @@ function fmt_ebb_of_string(legacy_behavior, str) { } else { if (str_ind + 2 === end_ind) { - unexpected_end_of_format(end_ind); + invalid_format_message(end_ind, "unexpected end of format"); } var match$2 = str.charCodeAt(str_ind + 2); if (match$2 !== 40) { @@ -7799,7 +7836,8 @@ function fmt_ebb_of_string(legacy_behavior, str) { "invalid format %S: at character number %d, %s is incompatible with '%c' in sub-format %S" ])(str, pct_ind, option, symb, subfmt); }; - return parse(0, str.length); + var end_ind = str.length; + return parse_literal(0, 0, end_ind); } function format_of_string_fmtty(str, fmtty) { diff --git a/jscomp/stdlib/camlinternalOO.js b/jscomp/stdlib/camlinternalOO.js index 5aa891d2df..9c1c76f2ec 100644 --- a/jscomp/stdlib/camlinternalOO.js +++ b/jscomp/stdlib/camlinternalOO.js @@ -40,10 +40,6 @@ function public_method_label(s) { } } -function compare(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -127,7 +123,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -163,7 +159,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -191,10 +188,6 @@ function fold(f, _m, _accu) { }; } -function compare$1(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height$1(param) { if (param) { return param[5]; @@ -278,7 +271,7 @@ function add$1(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$1(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal$1(add$1(x, data, l), v, d, r); @@ -310,10 +303,6 @@ function add$1(x, data, param) { } } -function compare$2(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height$2(param) { if (param) { return param[5]; @@ -397,7 +386,7 @@ function add$2(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$2(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal$2(add$2(x, data, l), v, d, r); @@ -433,7 +422,8 @@ function find$1(x, _param) { while(true) { var param = _param; if (param) { - var c = compare$2(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -533,7 +523,8 @@ function get_method_label(table, name) { while(true) { var param = _param; if (param) { - var c = compare$1(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -1054,182 +1045,175 @@ function method_impl(table, i, arr) { case 5 : var f = next(/* () */0); var x$1 = next(/* () */0); - var f$1 = f; - var x$2 = x$1; return function () { - return f$1(x$2); + return f(x$1); }; case 6 : - var f$2 = next(/* () */0); + var f$1 = next(/* () */0); var n$5 = next(/* () */0); - var f$3 = f$2; - var n$6 = n$5; return function (obj) { - return f$3(obj[n$6]); + return f$1(obj[n$5]); }; case 7 : - var f$4 = next(/* () */0); + var f$2 = next(/* () */0); var e$2 = next(/* () */0); - var n$7 = next(/* () */0); - var f$5 = f$4; + var n$6 = next(/* () */0); + var f$3 = f$2; var e$3 = e$2; - var n$8 = n$7; + var n$7 = n$6; return function (obj) { - return f$5(obj[e$3][n$8]); + return f$3(obj[e$3][n$7]); }; case 8 : - var f$6 = next(/* () */0); - var n$9 = next(/* () */0); - var f$7 = f$6; - var n$10 = n$9; + var f$4 = next(/* () */0); + var n$8 = next(/* () */0); + var f$5 = f$4; + var n$9 = n$8; return function (obj) { - return f$7(obj[1][n$10](obj)); + return f$5(obj[1][n$9](obj)); }; case 9 : - var f$8 = next(/* () */0); - var x$3 = next(/* () */0); + var f$6 = next(/* () */0); + var x$2 = next(/* () */0); var y = next(/* () */0); - var f$9 = f$8; - var x$4 = x$3; - var y$1 = y; return function () { - return f$9(x$4, y$1); + return f$6(x$2, y); }; case 10 : - var f$10 = next(/* () */0); - var x$5 = next(/* () */0); - var n$11 = next(/* () */0); - var f$11 = f$10; - var x$6 = x$5; - var n$12 = n$11; + var f$7 = next(/* () */0); + var x$3 = next(/* () */0); + var n$10 = next(/* () */0); + var f$8 = f$7; + var x$4 = x$3; + var n$11 = n$10; return function (obj) { - return f$11(x$6, obj[n$12]); + return f$8(x$4, obj[n$11]); }; case 11 : - var f$12 = next(/* () */0); - var x$7 = next(/* () */0); + var f$9 = next(/* () */0); + var x$5 = next(/* () */0); var e$4 = next(/* () */0); - var n$13 = next(/* () */0); - var f$13 = f$12; - var x$8 = x$7; + var n$12 = next(/* () */0); + var f$10 = f$9; + var x$6 = x$5; var e$5 = e$4; - var n$14 = n$13; + var n$13 = n$12; return function (obj) { - return f$13(x$8, obj[e$5][n$14]); + return f$10(x$6, obj[e$5][n$13]); }; case 12 : - var f$14 = next(/* () */0); - var x$9 = next(/* () */0); - var n$15 = next(/* () */0); - var f$15 = f$14; - var x$10 = x$9; - var n$16 = n$15; + var f$11 = next(/* () */0); + var x$7 = next(/* () */0); + var n$14 = next(/* () */0); + var f$12 = f$11; + var x$8 = x$7; + var n$15 = n$14; return function (obj) { - return f$15(x$10, obj[1][n$16](obj)); + return f$12(x$8, obj[1][n$15](obj)); }; case 13 : - var f$16 = next(/* () */0); - var n$17 = next(/* () */0); - var x$11 = next(/* () */0); - var f$17 = f$16; - var n$18 = n$17; - var x$12 = x$11; + var f$13 = next(/* () */0); + var n$16 = next(/* () */0); + var x$9 = next(/* () */0); + var f$14 = f$13; + var n$17 = n$16; + var x$10 = x$9; return function (obj) { - return f$17(obj[n$18], x$12); + return f$14(obj[n$17], x$10); }; case 14 : - var f$18 = next(/* () */0); + var f$15 = next(/* () */0); var e$6 = next(/* () */0); - var n$19 = next(/* () */0); - var x$13 = next(/* () */0); - var f$19 = f$18; + var n$18 = next(/* () */0); + var x$11 = next(/* () */0); + var f$16 = f$15; var e$7 = e$6; - var n$20 = n$19; - var x$14 = x$13; + var n$19 = n$18; + var x$12 = x$11; return function (obj) { - return f$19(obj[e$7][n$20], x$14); + return f$16(obj[e$7][n$19], x$12); }; case 15 : - var f$20 = next(/* () */0); - var n$21 = next(/* () */0); - var x$15 = next(/* () */0); - var f$21 = f$20; - var n$22 = n$21; - var x$16 = x$15; + var f$17 = next(/* () */0); + var n$20 = next(/* () */0); + var x$13 = next(/* () */0); + var f$18 = f$17; + var n$21 = n$20; + var x$14 = x$13; return function (obj) { - return f$21(obj[1][n$22](obj), x$16); + return f$18(obj[1][n$21](obj), x$14); }; case 16 : - var n$23 = next(/* () */0); - var x$17 = next(/* () */0); - var n$24 = n$23; - var x$18 = x$17; + var n$22 = next(/* () */0); + var x$15 = next(/* () */0); + var n$23 = n$22; + var x$16 = x$15; return function (obj) { - return obj[1][n$24](obj, x$18); + return obj[1][n$23](obj, x$16); }; case 17 : - var n$25 = next(/* () */0); + var n$24 = next(/* () */0); var m = next(/* () */0); - var n$26 = n$25; + var n$25 = n$24; var m$1 = m; return function (obj) { - return obj[1][n$26](obj, obj[m$1]); + return obj[1][n$25](obj, obj[m$1]); }; case 18 : - var n$27 = next(/* () */0); + var n$26 = next(/* () */0); var e$8 = next(/* () */0); var m$2 = next(/* () */0); - var n$28 = n$27; + var n$27 = n$26; var e$9 = e$8; var m$3 = m$2; return function (obj) { - return obj[1][n$28](obj, obj[e$9][m$3]); + return obj[1][n$27](obj, obj[e$9][m$3]); }; case 19 : - var n$29 = next(/* () */0); + var n$28 = next(/* () */0); var m$4 = next(/* () */0); - var n$30 = n$29; + var n$29 = n$28; var m$5 = m$4; return function (obj) { - return obj[1][n$30](obj, obj[1][m$5](obj)); + return obj[1][n$29](obj, obj[1][m$5](obj)); }; case 20 : var m$6 = next(/* () */0); - var x$19 = next(/* () */0); + var x$17 = next(/* () */0); var m$7 = m$6; - var x$20 = x$19; + var x$18 = x$17; new_cache(table); return function () { - return Caml_oo.caml_get_public_method(x$20, m$7, 1)(x$20); + return Caml_oo.caml_get_public_method(x$18, m$7, 1)(x$18); }; case 21 : var m$8 = next(/* () */0); - var n$31 = next(/* () */0); + var n$30 = next(/* () */0); var m$9 = m$8; - var n$32 = n$31; + var n$31 = n$30; new_cache(table); return function (obj) { - return Caml_oo.caml_get_public_method(obj[n$32], m$9, 2)(obj[n$32]); + return Caml_oo.caml_get_public_method(obj[n$31], m$9, 2)(obj[n$31]); }; case 22 : var m$10 = next(/* () */0); var e$10 = next(/* () */0); - var n$33 = next(/* () */0); + var n$32 = next(/* () */0); var m$11 = m$10; var e$11 = e$10; - var n$34 = n$33; + var n$33 = n$32; new_cache(table); return function (obj) { - return Caml_oo.caml_get_public_method(obj[e$11][n$34], m$11, 3)(obj[e$11][n$34]); + return Caml_oo.caml_get_public_method(obj[e$11][n$33], m$11, 3)(obj[e$11][n$33]); }; case 23 : var m$12 = next(/* () */0); - var n$35 = next(/* () */0); + var n$34 = next(/* () */0); var m$13 = m$12; - var n$36 = n$35; + var n$35 = n$34; new_cache(table); return function (obj) { - return Caml_oo.caml_get_public_method(obj[1][n$36](obj), m$13, 4)(obj[1][n$36](obj)); + return Caml_oo.caml_get_public_method(obj[1][n$35](obj), m$13, 4)(obj[1][n$35](obj)); }; } diff --git a/jscomp/stdlib/digest.js b/jscomp/stdlib/digest.js index d2af381907..8006fa92b6 100644 --- a/jscomp/stdlib/digest.js +++ b/jscomp/stdlib/digest.js @@ -81,37 +81,40 @@ function from_hex(s) { ]; } var digit = function (c) { - var exit = 0; if (c >= 65) { if (c >= 97) { if (c >= 103) { - exit = 1; + throw [ + 0, + Caml_exceptions.Invalid_argument, + "Digest.from_hex" + ]; } else { return c - /* "a" */97 + 10; } } else if (c >= 71) { - exit = 1; + throw [ + 0, + Caml_exceptions.Invalid_argument, + "Digest.from_hex" + ]; } else { return c - /* "A" */65 + 10; } } else if (c > 57 || c < 48) { - exit = 1; - } - else { - return c - /* "0" */48; - } - if (exit === 1) { throw [ 0, Caml_exceptions.Invalid_argument, "Digest.from_hex" ]; } - + else { + return c - /* "0" */48; + } }; var $$byte = function (i) { return (digit(s.charCodeAt(i)) << 4) + digit(s.charCodeAt(i + 1)); diff --git a/jscomp/stdlib/format.d.ts b/jscomp/stdlib/format.d.ts index 10f2f7b867..3348b422d1 100644 --- a/jscomp/stdlib/format.d.ts +++ b/jscomp/stdlib/format.d.ts @@ -1,45 +1,46 @@ -export var open_box: (indent : any) => any ; +export var open_box: (param : any) => any ; export var close_box: (param : any) => any ; -export var print_string: (s : any) => any ; -export var print_as: (isize : any, s : any) => any ; -export var print_int: (i : any) => any ; -export var print_float: (f : any) => any ; -export var print_char: (c : any) => any ; -export var print_bool: (b : any) => any ; +export var print_string: (param : any) => any ; +export var print_as: (param : any, param : any) => any ; +export var print_int: (param : any) => any ; +export var print_float: (param : any) => any ; +export var print_char: (param : any) => any ; +export var print_bool: (param : any) => any ; export var print_space: (param : any) => any ; export var print_cut: (param : any) => any ; -export var print_break: (width : any, offset : any) => any ; +export var print_break: (param : any, param : any) => any ; export var print_flush: (param : any) => any ; export var print_newline: (param : any) => any ; export var force_newline: (param : any) => any ; export var print_if_newline: (param : any) => any ; -export var set_margin: (n : any) => any ; +export var set_margin: (param : any) => any ; export var get_margin: (param : any) => any ; -export var set_max_indent: (n : any) => any ; +export var set_max_indent: (param : any) => any ; export var get_max_indent: (param : any) => any ; -export var set_max_boxes: (n : any) => any ; +export var set_max_boxes: (param : any) => any ; export var get_max_boxes: (param : any) => any ; export var over_max_boxes: (param : any) => any ; export var open_hbox: (param : any) => any ; -export var open_vbox: (indent : any) => any ; -export var open_hvbox: (indent : any) => any ; -export var open_hovbox: (indent : any) => any ; +export var open_vbox: (param : any) => any ; +export var open_hvbox: (param : any) => any ; +export var open_hovbox: (param : any) => any ; export var open_tbox: (param : any) => any ; export var close_tbox: (param : any) => any ; -export var print_tbreak: (width : any, offset : any) => any ; +export var print_tbreak: (param : any, param : any) => any ; export var set_tab: (param : any) => any ; export var print_tab: (param : any) => any ; -export var set_ellipsis_text: (s : any) => any ; +export var set_ellipsis_text: (param : any) => any ; export var get_ellipsis_text: (param : any) => any ; -export var open_tag: (tag_name : any) => any ; +export var open_tag: (param : any) => any ; export var close_tag: (param : any) => any ; -export var set_tags: (b : any) => any ; -export var set_print_tags: (b : any) => any ; -export var set_mark_tags: (b : any) => any ; +export var set_tags: (param : any) => any ; +export var set_print_tags: (param : any) => any ; +export var set_mark_tags: (param : any) => any ; export var get_print_tags: (param : any) => any ; export var get_mark_tags: (param : any) => any ; -export var set_formatter_out_channel: (os : any) => any ; -export var set_formatter_output_functions: (f : any, g : any) => any ; +export var set_formatter_out_channel: (param : any) => any ; +export var set_formatter_output_functions: (param : any, param : any) => any + ; export var get_formatter_output_functions: (param : any) => any ; export var set_formatter_out_functions: (param : any) => any ; export var get_formatter_out_functions: (param : any) => any ; @@ -121,7 +122,7 @@ export var ksprintf: (k : any, param : any) => any ; export var bprintf: (b : any, param : any) => any ; export var kprintf: (k : any, param : any) => any ; export var set_all_formatter_output_functions: - (f : any, g : any, h : any, i : any) => any ; + (param : any, param : any, param : any, param : any) => any ; export var get_all_formatter_output_functions: (param : any) => any ; export var pp_set_all_formatter_output_functions: (state : any, f : any, g : any, h : any, i : any) => any ; diff --git a/jscomp/stdlib/format.js b/jscomp/stdlib/format.js index 8c32fa4286..635bfcc934 100644 --- a/jscomp/stdlib/format.js +++ b/jscomp/stdlib/format.js @@ -8,14 +8,6 @@ var Buffer = require("./buffer"); var $$String = require("./string"); var CamlinternalFormat = require("./camlinternalFormat"); -function make_queue() { - return [ - /* record */0, - /* Nil */0, - /* Nil */0 - ]; -} - function add_queue(x, q) { var c_001 = [ /* record */0, @@ -92,31 +84,19 @@ function pp_output_string(state, s) { return state[17](s, 0, s.length); } -function pp_output_newline(state) { - return state[19](/* () */0); -} - -function pp_output_spaces(state, n) { - return state[20](n); -} - function break_new_line(state, offset, width) { - pp_output_newline(state); + state[19](/* () */0); state[11] = /* true */1; var indent = state[6] - width + offset; var real_indent = Pervasives.min(state[8], indent); state[10] = real_indent; state[9] = state[6] - state[10]; - return pp_output_spaces(state, state[10]); -} - -function break_line(state, width) { - return break_new_line(state, 0, width); + return state[20](state[10]); } function break_same_line(state, width) { state[9] -= width; - return pp_output_spaces(state, width); + return state[20](width); } function pp_force_break_line(state) { @@ -131,7 +111,7 @@ function pp_force_break_line(state) { return /* () */0; } else { - return break_line(state, width); + return break_new_line(state, 0, width); } } else { @@ -143,7 +123,7 @@ function pp_force_break_line(state) { } } else { - return pp_output_newline(state); + return state[19](/* () */0); } } @@ -208,10 +188,10 @@ function format_pp_token(state, size, param) { case 3 : var match$3 = state[2]; if (match$3) { - return break_line(state, match$3[1][2]); + return break_new_line(state, 0, match$3[1][2]); } else { - return pp_output_newline(state); + return state[19](/* () */0); } case 4 : if (state[10] !== state[6] - state[9]) { @@ -413,26 +393,28 @@ function enqueue_advance(state, tok) { return advance_left(state); } -function make_queue_elem(size, tok, len) { - return [ - /* record */0, - size, - tok, - len - ]; -} - function enqueue_string_as(state, size, s) { - return enqueue_advance(state, make_queue_elem(size, [ - /* Pp_text */0, - s - ], size)); + var tok = [ + /* Pp_text */0, + s + ]; + return enqueue_advance(state, [ + /* record */0, + size, + tok, + size + ]); } -var q_elem = make_queue_elem(-1, [ - /* Pp_text */0, - "" - ], 0); +var q_elem = [ + /* record */0, + -1, + [ + /* Pp_text */0, + "" + ], + 0 +]; var scan_stack_bottom_001 = [ /* Scan_elem */0, @@ -446,11 +428,6 @@ var scan_stack_bottom = [ /* [] */0 ]; -function clear_scan_stack(state) { - state[1] = scan_stack_bottom; - return /* () */0; -} - function set_size(state, ty) { var match = state[1]; if (match) { @@ -459,7 +436,8 @@ function set_size(state, ty) { var size = queue_elem[1]; var t = match[2]; if (match$1[1] < state[12]) { - return clear_scan_stack(state); + state[1] = scan_stack_bottom; + return /* () */0; } else { var exit = 0; @@ -524,11 +502,18 @@ function scan_push(state, b, tok) { function pp_open_box_gen(state, indent, br_ty) { ++ state[14]; if (state[14] < state[15]) { - var elem = make_queue_elem(-state[13], [ - /* Pp_begin */3, - indent, - br_ty - ], 0); + var tok = [ + /* Pp_begin */3, + indent, + br_ty + ]; + var size = -state[13]; + var elem = [ + /* record */0, + size, + tok, + 0 + ]; return scan_push(state, /* false */0, elem); } else if (state[14] === state[15]) { @@ -631,8 +616,9 @@ function pp_get_mark_tags(state, _) { } function pp_set_tags(state, b) { - pp_set_print_tags(state, b); - return pp_set_mark_tags(state, b); + state[21] = b; + state[22] = b; + return /* () */0; } function pp_get_formatter_tag_functions(state, _) { @@ -655,7 +641,7 @@ function pp_set_formatter_tag_functions(state, param) { function pp_rinit(state) { pp_clear_queue(state); - clear_scan_stack(state); + state[1] = scan_stack_bottom; state[2] = /* [] */0; state[3] = /* [] */0; state[4] = /* [] */0; @@ -663,8 +649,7 @@ function pp_rinit(state) { state[10] = 0; state[14] = 0; state[9] = state[6]; - var state$1 = state; - return pp_open_box_gen(state$1, 0, /* Pp_hovbox */3); + return pp_open_box_gen(state, 0, /* Pp_hovbox */3); } function pp_flush_queue(state, b) { @@ -674,7 +659,7 @@ function pp_flush_queue(state, b) { state[13] = pp_infinity; advance_left(state); if (b) { - pp_output_newline(state); + state[19](/* () */0); } return pp_rinit(state); } @@ -744,7 +729,12 @@ function pp_print_flush(state, _) { function pp_force_newline(state, _) { if (state[14] < state[15]) { - return enqueue_advance(state, make_queue_elem(0, /* Pp_newline */3, 0)); + return enqueue_advance(state, [ + /* record */0, + 0, + /* Pp_newline */3, + 0 + ]); } else { return 0; @@ -753,7 +743,12 @@ function pp_force_newline(state, _) { function pp_print_if_newline(state, _) { if (state[14] < state[15]) { - return enqueue_advance(state, make_queue_elem(0, /* Pp_if_newline */4, 0)); + return enqueue_advance(state, [ + /* record */0, + 0, + /* Pp_if_newline */4, + 0 + ]); } else { return 0; @@ -762,11 +757,18 @@ function pp_print_if_newline(state, _) { function pp_print_break(state, width, offset) { if (state[14] < state[15]) { - var elem = make_queue_elem(-state[13], [ - /* Pp_break */1, - width, - offset - ], width); + var tok = [ + /* Pp_break */1, + width, + offset + ]; + var size = -state[13]; + var elem = [ + /* record */0, + size, + tok, + width + ]; return scan_push(state, /* true */1, elem); } else { @@ -785,16 +787,23 @@ function pp_print_cut(state, _) { function pp_open_tbox(state, _) { ++ state[14]; if (state[14] < state[15]) { - var elem = make_queue_elem(0, [ - /* Pp_tbegin */4, - [ - /* Pp_tbox */0, - [ - 0, - /* [] */0 - ] - ] - ], 0); + var tok_001 = [ + /* Pp_tbox */0, + [ + 0, + /* [] */0 + ] + ]; + var tok = [ + /* Pp_tbegin */4, + tok_001 + ]; + var elem = [ + /* record */0, + 0, + tok, + 0 + ]; return enqueue_advance(state, elem); } else { @@ -805,7 +814,12 @@ function pp_open_tbox(state, _) { function pp_close_tbox(state, _) { if (state[14] > 1) { if (state[14] < state[15]) { - var elem = make_queue_elem(0, /* Pp_tend */2, 0); + var elem = [ + /* record */0, + 0, + /* Pp_tend */2, + 0 + ]; enqueue_advance(state, elem); -- state[14]; return /* () */0; @@ -821,11 +835,18 @@ function pp_close_tbox(state, _) { function pp_print_tbreak(state, width, offset) { if (state[14] < state[15]) { - var elem = make_queue_elem(-state[13], [ - /* Pp_tbreak */2, - width, - offset - ], width); + var tok = [ + /* Pp_tbreak */2, + width, + offset + ]; + var size = -state[13]; + var elem = [ + /* record */0, + size, + tok, + width + ]; return scan_push(state, /* true */1, elem); } else { @@ -839,7 +860,12 @@ function pp_print_tab(state, _) { function pp_set_tab(state, _) { if (state[14] < state[15]) { - var elem = make_queue_elem(0, /* Pp_stab */0, 0); + var elem = [ + /* record */0, + 0, + /* Pp_stab */0, + 0 + ]; return enqueue_advance(state, elem); } else { @@ -898,7 +924,7 @@ function pp_print_text(ppf, s) { } else { flush(/* () */0); - pp_print_space(ppf, /* () */0); + pp_print_break(ppf, 1, 0); } } else { @@ -1090,12 +1116,21 @@ function default_pp_print_close_tag(prim) { } function pp_make_formatter(f, g, h, i) { - var pp_q = make_queue(/* () */0); - var sys_tok = make_queue_elem(-1, [ - /* Pp_begin */3, - 0, - /* Pp_hovbox */3 - ], 0); + var pp_q = [ + /* record */0, + /* Nil */0, + /* Nil */0 + ]; + var sys_tok = [ + /* record */0, + -1, + [ + /* Pp_begin */3, + 0, + /* Pp_hovbox */3 + ], + 0 + ]; add_queue(sys_tok, pp_q); var sys_scan_stack_001 = [ /* Scan_elem */0, @@ -1233,11 +1268,11 @@ function print_string(param) { } function print_int(param) { - return pp_print_int(std_formatter, param); + return pp_print_string(std_formatter, Pervasives.string_of_int(param)); } function print_float(param) { - return pp_print_float(std_formatter, param); + return pp_print_string(std_formatter, Pervasives.string_of_float(param)); } function print_char(param) { @@ -1245,19 +1280,19 @@ function print_char(param) { } function print_bool(param) { - return pp_print_bool(std_formatter, param); + return pp_print_string(std_formatter, Pervasives.string_of_bool(param)); } function print_break(param, param$1) { return pp_print_break(std_formatter, param, param$1); } -function print_cut(param) { - return pp_print_cut(std_formatter, param); +function print_cut() { + return pp_print_break(std_formatter, 0, 0); } -function print_space(param) { - return pp_print_space(std_formatter, param); +function print_space() { + return pp_print_break(std_formatter, 1, 0); } function force_newline(param) { @@ -1292,32 +1327,32 @@ function set_tab(param) { return pp_set_tab(std_formatter, param); } -function print_tab(param) { - return pp_print_tab(std_formatter, param); +function print_tab() { + return pp_print_tbreak(std_formatter, 0, 0); } function set_margin(param) { return pp_set_margin(std_formatter, param); } -function get_margin(param) { - return pp_get_margin(std_formatter, param); +function get_margin() { + return std_formatter[6]; } function set_max_indent(param) { return pp_set_max_indent(std_formatter, param); } -function get_max_indent(param) { - return pp_get_max_indent(std_formatter, param); +function get_max_indent() { + return std_formatter[8]; } function set_max_boxes(param) { return pp_set_max_boxes(std_formatter, param); } -function get_max_boxes(param) { - return pp_get_max_boxes(std_formatter, param); +function get_max_boxes() { + return std_formatter[15]; } function over_max_boxes(param) { @@ -1325,11 +1360,12 @@ function over_max_boxes(param) { } function set_ellipsis_text(param) { - return pp_set_ellipsis_text(std_formatter, param); + std_formatter[16] = param; + return /* () */0; } -function get_ellipsis_text(param) { - return pp_get_ellipsis_text(std_formatter, param); +function get_ellipsis_text() { + return std_formatter[16]; } function set_formatter_out_channel(param) { @@ -1369,19 +1405,21 @@ function get_formatter_tag_functions(param) { } function set_print_tags(param) { - return pp_set_print_tags(std_formatter, param); + std_formatter[21] = param; + return /* () */0; } -function get_print_tags(param) { - return pp_get_print_tags(std_formatter, param); +function get_print_tags() { + return std_formatter[21]; } function set_mark_tags(param) { - return pp_set_mark_tags(std_formatter, param); + std_formatter[22] = param; + return /* () */0; } -function get_mark_tags(param) { - return pp_get_mark_tags(std_formatter, param); +function get_mark_tags() { + return std_formatter[22]; } function set_tags(param) { @@ -1444,10 +1482,6 @@ function output_acc(ppf, acc) { var p$1; var size$1; var c; - var p$2; - var s$1; - var p$3; - var c$1; if (typeof acc === "number") { return /* () */0; } @@ -1458,8 +1492,8 @@ function output_acc(ppf, acc) { return output_formatting_lit(ppf, acc[2]); case 1 : var match = acc[2]; - var p$4 = acc[1]; - output_acc(ppf, p$4); + var p$2 = acc[1]; + output_acc(ppf, p$2); if (match[0]) { var match$1 = CamlinternalFormat.open_box_of_string(compute_tag(output_acc, match[1])); return pp_open_box_gen(ppf, match$1[1], match$1[2]); @@ -1469,123 +1503,119 @@ function output_acc(ppf, acc) { } break; case 2 : - var p$5 = acc[1]; + var p$3 = acc[1]; var exit$1 = 0; - if (typeof p$5 === "number") { - exit$1 = 5; + if (typeof p$3 === "number") { + exit$1 = 3; } - else if (p$5[0]) { - exit$1 = 5; + else if (p$3[0]) { + exit$1 = 3; } else { - var match$2 = p$5[2]; + var match$2 = p$3[2]; if (typeof match$2 === "number") { - exit$1 = 5; + exit$1 = 3; } else if (match$2[0] === 1) { - p = p$5[1]; + p = p$3[1]; size = match$2[2]; s = acc[2]; exit = 1; } else { - exit$1 = 5; + exit$1 = 3; } } - if (exit$1 === 5) { - p$2 = p$5; - s$1 = acc[2]; - exit = 3; + if (exit$1 === 3) { + output_acc(ppf, p$3); + return pp_print_string(ppf, acc[2]); } break; case 3 : - var p$6 = acc[1]; + var p$4 = acc[1]; var exit$2 = 0; - if (typeof p$6 === "number") { - exit$2 = 5; + if (typeof p$4 === "number") { + exit$2 = 3; } - else if (p$6[0]) { - exit$2 = 5; + else if (p$4[0]) { + exit$2 = 3; } else { - var match$3 = p$6[2]; + var match$3 = p$4[2]; if (typeof match$3 === "number") { - exit$2 = 5; + exit$2 = 3; } else if (match$3[0] === 1) { - p$1 = p$6[1]; + p$1 = p$4[1]; size$1 = match$3[2]; c = acc[2]; exit = 2; } else { - exit$2 = 5; + exit$2 = 3; } } - if (exit$2 === 5) { - p$3 = p$6; - c$1 = acc[2]; - exit = 4; + if (exit$2 === 3) { + output_acc(ppf, p$4); + return pp_print_char(ppf, acc[2]); } break; case 4 : - var p$7 = acc[1]; + var p$5 = acc[1]; var exit$3 = 0; - if (typeof p$7 === "number") { - exit$3 = 5; + if (typeof p$5 === "number") { + exit$3 = 3; } - else if (p$7[0]) { - exit$3 = 5; + else if (p$5[0]) { + exit$3 = 3; } else { - var match$4 = p$7[2]; + var match$4 = p$5[2]; if (typeof match$4 === "number") { - exit$3 = 5; + exit$3 = 3; } else if (match$4[0] === 1) { - p = p$7[1]; + p = p$5[1]; size = match$4[2]; s = acc[2]; exit = 1; } else { - exit$3 = 5; + exit$3 = 3; } } - if (exit$3 === 5) { - p$2 = p$7; - s$1 = acc[2]; - exit = 3; + if (exit$3 === 3) { + output_acc(ppf, p$5); + return pp_print_string(ppf, acc[2]); } break; case 5 : - var p$8 = acc[1]; + var p$6 = acc[1]; var exit$4 = 0; - if (typeof p$8 === "number") { - exit$4 = 5; + if (typeof p$6 === "number") { + exit$4 = 3; } - else if (p$8[0]) { - exit$4 = 5; + else if (p$6[0]) { + exit$4 = 3; } else { - var match$5 = p$8[2]; + var match$5 = p$6[2]; if (typeof match$5 === "number") { - exit$4 = 5; + exit$4 = 3; } else if (match$5[0] === 1) { - p$1 = p$8[1]; + p$1 = p$6[1]; size$1 = match$5[2]; c = acc[2]; exit = 2; } else { - exit$4 = 5; + exit$4 = 3; } } - if (exit$4 === 5) { - p$3 = p$8; - c$1 = acc[2]; - exit = 4; + if (exit$4 === 3) { + output_acc(ppf, p$6); + return pp_print_char(ppf, acc[2]); } break; case 6 : @@ -1607,12 +1637,6 @@ function output_acc(ppf, acc) { case 2 : output_acc(ppf, p$1); return pp_print_as_size(ppf, size$1, $$String.make(1, c)); - case 3 : - output_acc(ppf, p$2); - return pp_print_string(ppf, s$1); - case 4 : - output_acc(ppf, p$3); - return pp_print_char(ppf, c$1); } } @@ -1625,10 +1649,6 @@ function strput_acc(ppf, acc) { var p$1; var size$1; var c; - var p$2; - var s$1; - var p$3; - var c$1; if (typeof acc === "number") { return /* () */0; } @@ -1639,8 +1659,8 @@ function strput_acc(ppf, acc) { return output_formatting_lit(ppf, acc[2]); case 1 : var match = acc[2]; - var p$4 = acc[1]; - strput_acc(ppf, p$4); + var p$2 = acc[1]; + strput_acc(ppf, p$2); if (match[0]) { var match$1 = CamlinternalFormat.open_box_of_string(compute_tag(strput_acc, match[1])); return pp_open_box_gen(ppf, match$1[1], match$1[2]); @@ -1650,149 +1670,145 @@ function strput_acc(ppf, acc) { } break; case 2 : - var p$5 = acc[1]; + var p$3 = acc[1]; var exit$1 = 0; - if (typeof p$5 === "number") { - exit$1 = 5; + if (typeof p$3 === "number") { + exit$1 = 3; } - else if (p$5[0]) { - exit$1 = 5; + else if (p$3[0]) { + exit$1 = 3; } else { - var match$2 = p$5[2]; + var match$2 = p$3[2]; if (typeof match$2 === "number") { - exit$1 = 5; + exit$1 = 3; } else if (match$2[0] === 1) { - p = p$5[1]; + p = p$3[1]; size = match$2[2]; s = acc[2]; exit = 1; } else { - exit$1 = 5; + exit$1 = 3; } } - if (exit$1 === 5) { - p$2 = p$5; - s$1 = acc[2]; - exit = 3; + if (exit$1 === 3) { + strput_acc(ppf, p$3); + return pp_print_string(ppf, acc[2]); } break; case 3 : - var p$6 = acc[1]; + var p$4 = acc[1]; var exit$2 = 0; - if (typeof p$6 === "number") { - exit$2 = 5; + if (typeof p$4 === "number") { + exit$2 = 3; } - else if (p$6[0]) { - exit$2 = 5; + else if (p$4[0]) { + exit$2 = 3; } else { - var match$3 = p$6[2]; + var match$3 = p$4[2]; if (typeof match$3 === "number") { - exit$2 = 5; + exit$2 = 3; } else if (match$3[0] === 1) { - p$1 = p$6[1]; + p$1 = p$4[1]; size$1 = match$3[2]; c = acc[2]; exit = 2; } else { - exit$2 = 5; + exit$2 = 3; } } - if (exit$2 === 5) { - p$3 = p$6; - c$1 = acc[2]; - exit = 4; + if (exit$2 === 3) { + strput_acc(ppf, p$4); + return pp_print_char(ppf, acc[2]); } break; case 4 : - var p$7 = acc[1]; + var p$5 = acc[1]; var exit$3 = 0; - if (typeof p$7 === "number") { - exit$3 = 5; + if (typeof p$5 === "number") { + exit$3 = 3; } - else if (p$7[0]) { - exit$3 = 5; + else if (p$5[0]) { + exit$3 = 3; } else { - var match$4 = p$7[2]; + var match$4 = p$5[2]; if (typeof match$4 === "number") { - exit$3 = 5; + exit$3 = 3; } else if (match$4[0] === 1) { - p = p$7[1]; + p = p$5[1]; size = match$4[2]; s = acc[2]; exit = 1; } else { - exit$3 = 5; + exit$3 = 3; } } - if (exit$3 === 5) { - p$2 = p$7; - s$1 = acc[2]; - exit = 3; + if (exit$3 === 3) { + strput_acc(ppf, p$5); + return pp_print_string(ppf, acc[2]); } break; case 5 : - var p$8 = acc[1]; + var p$6 = acc[1]; var exit$4 = 0; - if (typeof p$8 === "number") { - exit$4 = 5; + if (typeof p$6 === "number") { + exit$4 = 3; } - else if (p$8[0]) { - exit$4 = 5; + else if (p$6[0]) { + exit$4 = 3; } else { - var match$5 = p$8[2]; + var match$5 = p$6[2]; if (typeof match$5 === "number") { - exit$4 = 5; + exit$4 = 3; } else if (match$5[0] === 1) { - p$1 = p$8[1]; + p$1 = p$6[1]; size$1 = match$5[2]; c = acc[2]; exit = 2; } else { - exit$4 = 5; + exit$4 = 3; } } - if (exit$4 === 5) { - p$3 = p$8; - c$1 = acc[2]; - exit = 4; + if (exit$4 === 3) { + strput_acc(ppf, p$6); + return pp_print_char(ppf, acc[2]); } break; case 6 : - var p$9 = acc[1]; + var p$7 = acc[1]; var exit$5 = 0; - if (typeof p$9 === "number") { - exit$5 = 5; + if (typeof p$7 === "number") { + exit$5 = 3; } - else if (p$9[0]) { - exit$5 = 5; + else if (p$7[0]) { + exit$5 = 3; } else { - var match$6 = p$9[2]; + var match$6 = p$7[2]; if (typeof match$6 === "number") { - exit$5 = 5; + exit$5 = 3; } else if (match$6[0] === 1) { - strput_acc(ppf, p$9[1]); + strput_acc(ppf, p$7[1]); return pp_print_as_size(ppf, match$6[2], acc[2](/* () */0)); } else { - exit$5 = 5; + exit$5 = 3; } } - if (exit$5 === 5) { - strput_acc(ppf, p$9); + if (exit$5 === 3) { + strput_acc(ppf, p$7); return pp_print_string(ppf, acc[2](/* () */0)); } break; @@ -1812,12 +1828,6 @@ function strput_acc(ppf, acc) { case 2 : strput_acc(ppf, p$1); return pp_print_as_size(ppf, size$1, $$String.make(1, c)); - case 3 : - strput_acc(ppf, p$2); - return pp_print_string(ppf, s$1); - case 4 : - strput_acc(ppf, p$3); - return pp_print_char(ppf, c$1); } } @@ -2013,4 +2023,4 @@ exports.set_all_formatter_output_functions = set_all_formatter_output_functio exports.get_all_formatter_output_functions = get_all_formatter_output_functions; exports.pp_set_all_formatter_output_functions = pp_set_all_formatter_output_functions; exports.pp_get_all_formatter_output_functions = pp_get_all_formatter_output_functions; -/* q_elem Not a pure module */ +/* blank_line Not a pure module */ diff --git a/jscomp/stdlib/genlex.js b/jscomp/stdlib/genlex.js index dfabb2f662..8dd2c57015 100644 --- a/jscomp/stdlib/genlex.js +++ b/jscomp/stdlib/genlex.js @@ -107,7 +107,7 @@ function make_lexer(keywords) { case 13 : case 26 : case 32 : - exit = 2; + Stream.junk(strm__); break; case 34 : Stream.junk(strm__); @@ -138,10 +138,13 @@ function make_lexer(keywords) { } } var match$1 = Stream.peek(strm__); - var exit$1 = 0; if (match$1) { if (match$1[1] !== 39) { - exit$1 = 6; + throw [ + 0, + Stream.$$Error, + "" + ]; } else { Stream.junk(strm__); @@ -155,9 +158,6 @@ function make_lexer(keywords) { } } else { - exit$1 = 6; - } - if (exit$1 === 6) { throw [ 0, Stream.$$Error, @@ -192,11 +192,12 @@ function make_lexer(keywords) { Stream.junk(strm__); var strm__$2 = strm__; var match$3 = Stream.peek(strm__$2); - var exit$2 = 0; if (match$3) { var c$2 = match$3[1]; if (c$2 > 57 || c$2 < 48) { - exit$2 = 1; + reset_buffer(/* () */0); + store(/* "-" */45); + return ident2(strm__$2); } else { Stream.junk(strm__$2); @@ -207,14 +208,11 @@ function make_lexer(keywords) { } } else { - exit$2 = 1; - } - if (exit$2 === 1) { reset_buffer(/* () */0); store(/* "-" */45); return ident2(strm__$2); } - case 48 : + case 48 : case 49 : case 50 : case 51 : @@ -224,7 +222,7 @@ function make_lexer(keywords) { case 55 : case 56 : case 57 : - exit = 5; + exit = 4; break; case 0 : case 1 : @@ -273,7 +271,7 @@ function make_lexer(keywords) { case 62 : case 63 : case 64 : - exit = 4; + exit = 3; break; } @@ -282,16 +280,16 @@ function make_lexer(keywords) { else { var switcher$1 = switcher - 26; if (switcher$1 > 5 || switcher$1 < 0) { - exit = 3; + exit = 2; } else { switch (switcher$1) { case 1 : case 3 : - exit = 4; + exit = 3; break; case 4 : - exit = 3; + exit = 2; break; case 0 : case 2 : @@ -305,9 +303,9 @@ function make_lexer(keywords) { } else { exit = c >= 127 ? ( - c >= 192 ? 3 : 1 + c >= 192 ? 2 : 1 ) : ( - c !== 125 ? 4 : 1 + c !== 125 ? 3 : 1 ); } switch (exit) { @@ -318,73 +316,77 @@ function make_lexer(keywords) { keyword_or_error(c) ]; case 2 : - Stream.junk(strm__); - break; - case 3 : Stream.junk(strm__); reset_buffer(/* () */0); store(c); var strm__$3 = strm__; while(true) { var match$4 = Stream.peek(strm__$3); - var exit$3 = 0; if (match$4) { var c$3 = match$4[1]; - var exit$4 = 0; + var exit$1 = 0; if (c$3 >= 91) { var switcher$2 = c$3 - 95; if (switcher$2 > 27 || switcher$2 < 0) { if (switcher$2 >= 97) { - exit$4 = 2; + exit$1 = 1; } else { - exit$3 = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } } else if (switcher$2 !== 1) { - exit$4 = 2; + exit$1 = 1; } else { - exit$3 = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } } else if (c$3 >= 48) { if (c$3 > 64 || c$3 < 58) { - exit$4 = 2; + exit$1 = 1; } else { - exit$3 = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } } else if (c$3 !== 39) { - exit$3 = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } else { - exit$4 = 2; + exit$1 = 1; } - if (exit$4 === 2) { + if (exit$1 === 1) { Stream.junk(strm__$3); store(c$3); } } else { - exit$3 = 1; - } - if (exit$3 === 1) { return [ /* Some */0, ident_or_keyword(get_string(/* () */0)) ]; } - }; - case 4 : + case 3 : Stream.junk(strm__); reset_buffer(/* () */0); store(c); return ident2(strm__); - case 5 : + case 4 : Stream.junk(strm__); reset_buffer(/* () */0); store(c); @@ -400,33 +402,41 @@ function make_lexer(keywords) { var ident2 = function (strm__) { while(true) { var match = Stream.peek(strm__); - var exit = 0; if (match) { var c = match[1]; - var exit$1 = 0; + var exit = 0; if (c >= 94) { var switcher = c - 95; if (switcher > 30 || switcher < 0) { if (switcher >= 32) { - exit = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } else { - exit$1 = 2; + exit = 1; } } else if (switcher !== 29) { - exit = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } else { - exit$1 = 2; + exit = 1; } } else if (c >= 65) { if (c !== 92) { - exit = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } else { - exit$1 = 2; + exit = 1; } } else if (c >= 33) { @@ -448,8 +458,10 @@ function make_lexer(keywords) { case 23 : case 24 : case 26 : - exit = 1; - break; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; case 0 : case 2 : case 3 : @@ -465,30 +477,29 @@ function make_lexer(keywords) { case 29 : case 30 : case 31 : - exit$1 = 2; + exit = 1; break; } } else { - exit = 1; + return [ + /* Some */0, + ident_or_keyword(get_string(/* () */0)) + ]; } - if (exit$1 === 2) { + if (exit === 1) { Stream.junk(strm__); store(c); } } else { - exit = 1; - } - if (exit === 1) { return [ /* Some */0, ident_or_keyword(get_string(/* () */0)) ]; } - }; }; var number = function (strm__) { @@ -497,18 +508,21 @@ function make_lexer(keywords) { var exit = 0; if (match) { var c = match[1]; - var exit$1 = 0; if (c >= 58) { if (c !== 69) { if (c !== 101) { exit = 1; } else { - exit$1 = 2; + Stream.junk(strm__); + store(/* "E" */69); + return exponent_part(strm__); } } else { - exit$1 = 2; + Stream.junk(strm__); + store(/* "E" */69); + return exponent_part(strm__); } } else if (c !== 46) { @@ -526,13 +540,13 @@ function make_lexer(keywords) { var strm__$1 = strm__; while(true) { var match$1 = Stream.peek(strm__$1); - var exit$2 = 0; + var exit$1 = 0; if (match$1) { var c$1 = match$1[1]; var switcher = c$1 - 69; if (switcher > 32 || switcher < 0) { if ((switcher + 21 >>> 0) > 9) { - exit$2 = 1; + exit$1 = 1; } else { Stream.junk(strm__$1); @@ -545,13 +559,13 @@ function make_lexer(keywords) { return exponent_part(strm__$1); } else { - exit$2 = 1; + exit$1 = 1; } } else { - exit$2 = 1; + exit$1 = 1; } - if (exit$2 === 1) { + if (exit$1 === 1) { return [ /* Some */0, [ @@ -563,12 +577,6 @@ function make_lexer(keywords) { }; } - if (exit$1 === 2) { - Stream.junk(strm__); - store(/* "E" */69); - return exponent_part(strm__); - } - } else { exit = 1; @@ -589,24 +597,21 @@ function make_lexer(keywords) { var match = Stream.peek(strm__); if (match) { var c = match[1]; - var exit = 0; if (c !== 43) { if (c !== 45) { return end_exponent_part(strm__); } else { - exit = 1; + Stream.junk(strm__); + store(c); + return end_exponent_part(strm__); } } else { - exit = 1; - } - if (exit === 1) { Stream.junk(strm__); store(c); return end_exponent_part(strm__); } - } else { return end_exponent_part(strm__); @@ -615,21 +620,23 @@ function make_lexer(keywords) { var end_exponent_part = function (strm__) { while(true) { var match = Stream.peek(strm__); - var exit = 0; if (match) { var c = match[1]; if (c > 57 || c < 48) { - exit = 1; + return [ + /* Some */0, + [ + /* Float */3, + Caml_format.caml_float_of_string(get_string(/* () */0)) + ] + ]; } else { Stream.junk(strm__); - store(c); + return store(c); } } else { - exit = 1; - } - if (exit === 1) { return [ /* Some */0, [ @@ -638,7 +645,6 @@ function make_lexer(keywords) { ] ]; } - }; }; var string = function (strm__) { @@ -717,11 +723,11 @@ function make_lexer(keywords) { var match = Stream.peek(strm__); if (match) { var c1 = match[1]; - var exit = 0; if (c1 >= 58) { var switcher = c1 - 110; if (switcher > 6 || switcher < 0) { - exit = 1; + Stream.junk(strm__); + return c1; } else { switch (switcher) { @@ -735,8 +741,8 @@ function make_lexer(keywords) { case 2 : case 3 : case 5 : - exit = 1; - break; + Stream.junk(strm__); + return c1; case 6 : Stream.junk(strm__); return /* "\t" */9; @@ -747,20 +753,26 @@ function make_lexer(keywords) { else if (c1 >= 48) { Stream.junk(strm__); var match$1 = Stream.peek(strm__); - var exit$1 = 0; if (match$1) { var c2 = match$1[1]; if (c2 > 57 || c2 < 48) { - exit$1 = 2; + throw [ + 0, + Stream.$$Error, + "" + ]; } else { Stream.junk(strm__); var match$2 = Stream.peek(strm__); - var exit$2 = 0; if (match$2) { var c3 = match$2[1]; if (c3 > 57 || c3 < 48) { - exit$2 = 3; + throw [ + 0, + Stream.$$Error, + "" + ]; } else { Stream.junk(strm__); @@ -768,38 +780,26 @@ function make_lexer(keywords) { } } else { - exit$2 = 3; - } - if (exit$2 === 3) { throw [ 0, Stream.$$Error, "" ]; } - } } else { - exit$1 = 2; - } - if (exit$1 === 2) { throw [ 0, Stream.$$Error, "" ]; } - } else { - exit = 1; - } - if (exit === 1) { Stream.junk(strm__); return c1; } - } else { throw Stream.Failure; @@ -809,10 +809,9 @@ function make_lexer(keywords) { while(true) { var match = Stream.peek(strm__); if (match) { - var exit = 0; var switcher = match[1] - 40; if (switcher > 2 || switcher < 0) { - exit = 1; + Stream.junk(strm__); } else { switch (switcher) { @@ -835,7 +834,7 @@ function make_lexer(keywords) { throw Stream.Failure; } case 1 : - exit = 1; + Stream.junk(strm__); break; case 2 : Stream.junk(strm__); @@ -865,10 +864,6 @@ function make_lexer(keywords) { } } - if (exit === 1) { - Stream.junk(strm__); - } - } else { throw Stream.Failure; diff --git a/jscomp/stdlib/hashtbl.js b/jscomp/stdlib/hashtbl.js index f361c21e94..d56db87369 100644 --- a/jscomp/stdlib/hashtbl.js +++ b/jscomp/stdlib/hashtbl.js @@ -651,11 +651,8 @@ function MakeSeeded(H) { function Make(H) { var equal = H[1]; - var hash = function (_, x) { - return H[2](x); - }; var key_index = function (h, key) { - return hash(h[3], key) & h[2].length - 1; + return H[2](key) & h[2].length - 1; }; var add = function (h, key, info) { var i = key_index(h, key); diff --git a/jscomp/stdlib/list.js b/jscomp/stdlib/list.js index 215c0fb676..ad7620e688 100644 --- a/jscomp/stdlib/list.js +++ b/jscomp/stdlib/list.js @@ -524,7 +524,7 @@ function find_all(p) { } } else { - return rev(accu); + return rev_append(accu, /* [] */0); } }; }; @@ -561,8 +561,8 @@ function partition(p, l) { else { return [ /* tuple */0, - rev(yes), - rev(no) + rev_append(yes, /* [] */0), + rev_append(no, /* [] */0) ]; } }; diff --git a/jscomp/stdlib/pervasives.js b/jscomp/stdlib/pervasives.js index 6fbd710bd2..36b94e80ca 100644 --- a/jscomp/stdlib/pervasives.js +++ b/jscomp/stdlib/pervasives.js @@ -81,7 +81,11 @@ var $caret = Caml_string.add; function char_of_int(n) { if (n < 0 || n > 255) { - return invalid_arg("char_of_int"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "char_of_int" + ]; } else { return n; @@ -104,7 +108,11 @@ function bool_of_string(param) { case "true" : return /* true */1; default: - return invalid_arg("bool_of_string"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "bool_of_string" + ]; } } @@ -234,7 +242,11 @@ function output_string(oc, s) { function output(oc, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("output"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "output" + ]; } else { return Caml_io.caml_ml_output(oc, s, ofs, len); @@ -243,7 +255,11 @@ function output(oc, s, ofs, len) { function output_substring(oc, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("output_substring"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "output_substring" + ]; } else { return Caml_io.caml_ml_output(oc, s, ofs, len); @@ -304,7 +320,11 @@ function open_in_bin(name) { function input(ic, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("input"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "input" + ]; } else { return Caml_primitive.caml_ml_input(ic, s, ofs, len); @@ -333,7 +353,11 @@ function unsafe_really_input(ic, s, _ofs, _len) { function really_input(ic, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("really_input"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "really_input" + ]; } else { return unsafe_really_input(ic, s, ofs, len); @@ -429,11 +453,11 @@ function print_bytes(s) { } function print_int(i) { - return output_string(stdout, string_of_int(i)); + return output_string(stdout, Caml_format.caml_format_int("%d", i)); } function print_float(f) { - return output_string(stdout, string_of_float(f)); + return output_string(stdout, valid_float_lexem(Caml_format.caml_format_float("%.12g", f))); } var print_endline = console.log; @@ -456,11 +480,11 @@ function prerr_bytes(s) { } function prerr_int(i) { - return output_string(stderr, string_of_int(i)); + return output_string(stderr, Caml_format.caml_format_int("%d", i)); } function prerr_float(f) { - return output_string(stderr, string_of_float(f)); + return output_string(stderr, valid_float_lexem(Caml_format.caml_format_float("%.12g", f))); } var prerr_endline = console.error; @@ -476,11 +500,11 @@ function read_line() { } function read_int() { - return Caml_format.caml_int_of_string(read_line(/* () */0)); + return Caml_format.caml_int_of_string((Caml_primitive.caml_ml_flush(stdout), input_line(stdin))); } function read_float() { - return Caml_format.caml_float_of_string(read_line(/* () */0)); + return Caml_format.caml_float_of_string((Caml_primitive.caml_ml_flush(stdout), input_line(stdin))); } function string_of_format(param) { diff --git a/jscomp/stdlib/queue.js b/jscomp/stdlib/queue.js index 997ffb1628..073653f2ca 100644 --- a/jscomp/stdlib/queue.js +++ b/jscomp/stdlib/queue.js @@ -112,7 +112,11 @@ function copy(q) { ]; } else { - return create(/* () */0); + return [ + /* record */0, + 0, + /* None */0 + ]; } } diff --git a/jscomp/stdlib/random.js b/jscomp/stdlib/random.js index 8f8df25829..985dbd5422 100644 --- a/jscomp/stdlib/random.js +++ b/jscomp/stdlib/random.js @@ -235,7 +235,7 @@ function int64$1(bound) { } function $$float$1(scale) { - return $$float($$default, scale); + return rawfloat($$default) * scale; } function bool$1() { diff --git a/jscomp/stdlib/scanf.js b/jscomp/stdlib/scanf.js index d5ab0be16f..e79f170c32 100644 --- a/jscomp/stdlib/scanf.js +++ b/jscomp/stdlib/scanf.js @@ -61,10 +61,6 @@ function end_of_input(ib) { return ib[1]; } -function eof(ib) { - return ib[1]; -} - function beginning_of_input(ib) { return +(ib[4] === 0); } @@ -96,15 +92,6 @@ function char_count(ib) { } } -function reset_token(ib) { - return Buffer.reset(ib[8]); -} - -function invalidate_current_char(ib) { - ib[3] = /* false */0; - return /* () */0; -} - function token(ib) { var tokbuf = ib[8]; var tok = Buffer.contents(tokbuf); @@ -113,13 +100,10 @@ function token(ib) { return tok; } -function skip_char(width, ib) { - invalidate_current_char(ib); - return width; -} - function ignore_char(width, ib) { - return skip_char(width - 1, ib); + var width$1 = width - 1; + ib[3] = /* false */0; + return width$1; } function store_char(width, ib, c) { @@ -218,10 +202,6 @@ function from_ic(scan_close_ic, iname, ic) { return create(iname, next); } -function from_ic_close_at_end(param, param$1) { - return from_ic(scan_close_at_end, param, param$1); -} - var stdin = from_ic(scan_raise_at_end, [ /* From_file */0, "-", @@ -234,11 +214,12 @@ function open_in(fname) { } else { var ic = Pervasives.open_in(fname); - return from_ic_close_at_end([ - /* From_file */0, - fname, - ic - ], ic); + var param = [ + /* From_file */0, + fname, + ic + ]; + return from_ic(scan_close_at_end, param, ic); } } @@ -248,11 +229,12 @@ function open_in_bin(fname) { } else { var ic = Pervasives.open_in_bin(fname); - return from_ic_close_at_end([ - /* From_file */0, - fname, - ic - ], ic); + var param = [ + /* From_file */0, + fname, + ic + ]; + return from_ic(scan_close_at_end, param, ic); } } @@ -261,9 +243,7 @@ var memo = [ /* [] */0 ]; -function from_channel(param) { - var scan_close_ic = scan_raise_at_end; - var ic = param; +function memo_from_ic(scan_close_ic, ic) { try { return List.assq(ic, memo[1]); } @@ -290,6 +270,10 @@ function from_channel(param) { } } +function from_channel(param) { + return memo_from_ic(scan_raise_at_end, param); +} + function close_in(ib) { var match = ib[9]; if (typeof match === "number") { @@ -309,7 +293,19 @@ var Scan_failure = [ ++ Caml_exceptions.caml_oo_last_id ]; -function bad_input(s) { +function bad_input_escape(c) { + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "illegal escape character ", + [ + /* Caml_char */1, + /* End_of_format */0 + ] + ], + "illegal escape character %C" + ])(c); throw [ 0, Scan_failure, @@ -317,43 +313,29 @@ function bad_input(s) { ]; } -function bad_input_escape(c) { - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "illegal escape character ", - [ - /* Caml_char */1, - /* End_of_format */0 - ] - ], - "illegal escape character %C" - ])(c)); -} - function bad_token_length(message) { - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "scanning of ", - [ - /* String */2, - /* No_padding */0, - [ - /* String_literal */11, - " failed: the specified length was too short for token", - /* End_of_format */0 - ] - ] - ], - "scanning of %s failed: the specified length was too short for token" - ])(message)); -} - -function bad_float() { - return bad_input("no dot or exponent part found in float token"); + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "scanning of ", + [ + /* String */2, + /* No_padding */0, + [ + /* String_literal */11, + " failed: the specified length was too short for token", + /* End_of_format */0 + ] + ] + ], + "scanning of %s failed: the specified length was too short for token" + ])(message); + throw [ + 0, + Scan_failure, + s + ]; } function character_mismatch_err(c, ci) { @@ -378,10 +360,6 @@ function character_mismatch_err(c, ci) { ])(c, ci); } -function character_mismatch(c, ci) { - return bad_input(character_mismatch_err(c, ci)); -} - function check_char(ib, _c) { while(true) { var c = _c; @@ -389,7 +367,7 @@ function check_char(ib, _c) { var ib$1 = ib; while(true) { var c$1 = peek_char(ib$1); - if (eof(ib$1)) { + if (ib$1[1]) { return 0; } else { @@ -399,14 +377,14 @@ function check_char(ib, _c) { return /* () */0; } else { - return invalidate_current_char(ib$1); + return ib$1[3] = /* false */0; } } else if (switcher === 3 || switcher === 2) { return /* () */0; } else { - return invalidate_current_char(ib$1); + return ib$1[3] = /* false */0; } } }; @@ -414,17 +392,28 @@ function check_char(ib, _c) { else { var ci = checked_peek_char(ib); if (ci === c) { - return invalidate_current_char(ib); + ib[3] = /* false */0; + return /* () */0; } else if (ci !== 13) { - return character_mismatch(c, ci); + var s = character_mismatch_err(c, ci); + throw [ + 0, + Scan_failure, + s + ]; } else if (c === /* "\n" */10) { - invalidate_current_char(ib); + ib[3] = /* false */0; _c = /* "\n" */10; } else { - return character_mismatch(c, ci); + var s$1 = character_mismatch_err(c, ci); + throw [ + 0, + Scan_failure, + s$1 + ]; } } }; @@ -442,19 +431,24 @@ function token_bool(ib) { case "true" : return /* true */1; default: - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "invalid boolean ", - [ - /* Caml_string */3, - /* No_padding */0, - /* End_of_format */0 - ] - ], - "invalid boolean %S" - ])(s)); + var s$1 = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "invalid boolean ", + [ + /* Caml_string */3, + /* No_padding */0, + /* End_of_format */0 + ] + ], + "invalid boolean %S" + ])(s); + throw [ + 0, + Scan_failure, + s$1 + ]; } } @@ -476,7 +470,7 @@ function token_int_literal(conv, ib) { case 12 : case 17 : case 29 : - exit = 2; + tok = token(ib); break; case 1 : case 2 : @@ -508,30 +502,22 @@ function token_int_literal(conv, ib) { break; case 0 : case 32 : - exit = 3; + tok = "0x" + token(ib); break; } } - switch (exit) { - case 1 : - throw [ - 0, - Caml_exceptions.Assert_failure, - [ - 0, - "scanf.ml", - 507, - 11 - ] - ]; - case 2 : - tok = token(ib); - break; - case 3 : - tok = "0x" + token(ib); - break; - + if (exit === 1) { + throw [ + 0, + Caml_exceptions.Assert_failure, + [ + 0, + "scanf.ml", + 507, + 11 + ] + ]; } var l = tok.length; if (l === 0 || tok.charCodeAt(0) !== /* "+" */43) { @@ -551,7 +537,7 @@ function scan_decimal_digits(_width, ib) { var width = _width; if (width) { var c = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { return width; } else if (c >= 58) { @@ -581,22 +567,27 @@ function scan_decimal_digits_plus(width, ib) { if (width) { var c = checked_peek_char(ib); if (c > 57 || c < 48) { - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "character ", - [ - /* Caml_char */1, - [ - /* String_literal */11, - " is not a decimal digit", - /* End_of_format */0 - ] - ] - ], - "character %C is not a decimal digit" - ])(c)); + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "character ", + [ + /* Caml_char */1, + [ + /* String_literal */11, + " is not a decimal digit", + /* End_of_format */0 + ] + ] + ], + "character %C is not a decimal digit" + ])(c); + throw [ + 0, + Scan_failure, + s + ]; } else { var width$1 = store_char(width, ib, c); @@ -617,7 +608,7 @@ function scan_digits_plus(basis, digitp, width, ib) { var width$1 = _width; if (width$1) { var c$1 = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { return width$1; } else if (digitp(c$1)) { @@ -636,30 +627,35 @@ function scan_digits_plus(basis, digitp, width, ib) { }; } else { - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "character ", - [ - /* Caml_char */1, - [ - /* String_literal */11, - " is not a valid ", - [ - /* String */2, - /* No_padding */0, - [ - /* String_literal */11, - " digit", - /* End_of_format */0 - ] - ] - ] - ] - ], - "character %C is not a valid %s digit" - ])(c, basis)); + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "character ", + [ + /* Caml_char */1, + [ + /* String_literal */11, + " is not a valid ", + [ + /* String */2, + /* No_padding */0, + [ + /* String_literal */11, + " digit", + /* End_of_format */0 + ] + ] + ] + ] + ], + "character %C is not a valid %s digit" + ])(c, basis); + throw [ + 0, + Scan_failure, + s + ]; } } else { @@ -764,39 +760,32 @@ function scan_int_conv(conv, width, ib) { var width$4 = store_char(width$3, ib$2, c); if (width$4) { var c$1 = peek_char(ib$2); - if (eof(ib$2)) { + if (ib$2[1]) { return width$4; } - else { - var exit$1 = 0; - if (c$1 >= 99) { - if (c$1 !== 111) { - if (c$1 !== 120) { - return scan_decimal_digits(width$4, ib$2); - } - else { - exit$1 = 1; - } + else if (c$1 >= 99) { + if (c$1 !== 111) { + if (c$1 !== 120) { + return scan_decimal_digits(width$4, ib$2); } else { - return scan_octal_int(store_char(width$4, ib$2, c$1), ib$2); - } - } - else if (c$1 !== 88) { - if (c$1 >= 98) { - return scan_binary_int(store_char(width$4, ib$2, c$1), ib$2); - } - else { - return scan_decimal_digits(width$4, ib$2); + return scan_hexadecimal_int(store_char(width$4, ib$2, c$1), ib$2); } } else { - exit$1 = 1; + return scan_octal_int(store_char(width$4, ib$2, c$1), ib$2); } - if (exit$1 === 1) { - return scan_hexadecimal_int(store_char(width$4, ib$2, c$1), ib$2); + } + else if (c$1 !== 88) { + if (c$1 >= 98) { + return scan_binary_int(store_char(width$4, ib$2, c$1), ib$2); } - + else { + return scan_decimal_digits(width$4, ib$2); + } + } + else { + return scan_hexadecimal_int(store_char(width$4, ib$2, c$1), ib$2); } } else { @@ -859,7 +848,7 @@ function scan_int_conv(conv, width, ib) { function scan_frac_part(width, ib) { if (width) { var c = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { return width; } else if (c > 57 || c < 48) { @@ -877,26 +866,19 @@ function scan_frac_part(width, ib) { function scan_exp_part(width, ib) { if (width) { var c = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { return width; } - else { - var exit = 0; - if (c !== 69) { - if (c !== 101) { - return width; - } - else { - exit = 1; - } + else if (c !== 69) { + if (c !== 101) { + return width; } else { - exit = 1; - } - if (exit === 1) { return scan_optionally_signed_decimal_int(store_char(width, ib, c), ib); } - + } + else { + return scan_optionally_signed_decimal_int(store_char(width, ib, c), ib); } } else { @@ -913,7 +895,7 @@ function scan_float(width, precision, ib) { var width$1 = scan_int_part(width, ib); if (width$1) { var c = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { return [ /* tuple */0, width$1, @@ -951,14 +933,22 @@ function scan_caml_float(width, precision, ib) { var width$1 = scan_optionally_signed_decimal_int(width, ib); if (width$1) { var c = peek_char(ib); - if (eof(ib)) { - return bad_float(/* () */0); + if (ib[1]) { + throw [ + 0, + Scan_failure, + "no dot or exponent part found in float token" + ]; } else { var switcher = c - 69; if (switcher > 32 || switcher < 0) { if (switcher !== -23) { - return bad_float(/* () */0); + throw [ + 0, + Scan_failure, + "no dot or exponent part found in float token" + ]; } else { var width$2 = store_char(width$1, ib, c); @@ -971,12 +961,20 @@ function scan_caml_float(width, precision, ib) { return scan_exp_part(width$1, ib); } else { - return bad_float(/* () */0); + throw [ + 0, + Scan_failure, + "no dot or exponent part found in float token" + ]; } } } else { - return bad_float(/* () */0); + throw [ + 0, + Scan_failure, + "no dot or exponent part found in float token" + ]; } } @@ -986,38 +984,34 @@ function scan_string(stp, width, ib) { var width$1 = _width; if (width$1) { var c = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { return width$1; } else if (stp) { if (c === stp[1]) { - return skip_char(width$1, ib); + ib[3] = /* false */0; + return width$1; } else { _width = store_char(width$1, ib, c); } } else { - var exit = 0; var switcher = c - 9; if (switcher > 4 || switcher < 0) { if (switcher !== 23) { - exit = 1; + _width = store_char(width$1, ib, c); } else { return width$1; } } else if (switcher === 3 || switcher === 2) { - exit = 1; + _width = store_char(width$1, ib, c); } else { return width$1; } - if (exit === 1) { - _width = store_char(width$1, ib, c); - } - } } else { @@ -1060,31 +1054,32 @@ function char_for_backslash(c) { } } -function decimal_value_of_char(c) { - return c - /* "0" */48; -} - function char_for_decimal_code(c0, c1, c2) { - var c = 100 * decimal_value_of_char(c0) + 10 * decimal_value_of_char(c1) + decimal_value_of_char(c2); + var c = 100 * (c0 - /* "0" */48) + 10 * (c1 - /* "0" */48) + (c2 - /* "0" */48); if (c < 0 || c > 255) { - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "bad character decimal encoding \\", - [ - /* Char */0, - [ - /* Char */0, - [ - /* Char */0, - /* End_of_format */0 - ] - ] - ] - ], - "bad character decimal encoding \\%c%c%c" - ])(c0, c1, c2)); + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "bad character decimal encoding \\", + [ + /* Char */0, + [ + /* Char */0, + [ + /* Char */0, + /* End_of_format */0 + ] + ] + ] + ], + "bad character decimal encoding \\%c%c%c" + ])(c0, c1, c2); + throw [ + 0, + Scan_failure, + s + ]; } else { return Pervasives.char_of_int(c); @@ -1106,21 +1101,26 @@ function hexadecimal_value_of_char(c) { function char_for_hexadecimal_code(c1, c2) { var c = 16 * hexadecimal_value_of_char(c1) + hexadecimal_value_of_char(c2); if (c < 0 || c > 255) { - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "bad character hexadecimal encoding \\", - [ - /* Char */0, - [ - /* Char */0, - /* End_of_format */0 - ] - ] - ], - "bad character hexadecimal encoding \\%c%c" - ])(c1, c2)); + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "bad character hexadecimal encoding \\", + [ + /* Char */0, + [ + /* Char */0, + /* End_of_format */0 + ] + ] + ], + "bad character hexadecimal encoding \\%c%c" + ])(c1, c2); + throw [ + 0, + Scan_failure, + s + ]; } else { return Pervasives.char_of_int(c); @@ -1130,25 +1130,30 @@ function char_for_hexadecimal_code(c1, c2) { function check_next_char(message, width, ib) { if (width) { var c = peek_char(ib); - if (eof(ib)) { + if (ib[1]) { var message$1 = message; - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "scanning of ", - [ - /* String */2, - /* No_padding */0, - [ - /* String_literal */11, - " failed: premature end of file occurred before end of token", - /* End_of_format */0 - ] - ] - ], - "scanning of %s failed: premature end of file occurred before end of token" - ])(message$1)); + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "scanning of ", + [ + /* String */2, + /* No_padding */0, + [ + /* String_literal */11, + " failed: premature end of file occurred before end of token", + /* End_of_format */0 + ] + ] + ], + "scanning of %s failed: premature end of file occurred before end of token" + ])(message$1); + throw [ + 0, + Scan_failure, + s + ]; } else { return c; @@ -1159,22 +1164,14 @@ function check_next_char(message, width, ib) { } } -function check_next_char_for_char(param, param$1) { - return check_next_char("a Char", param, param$1); -} - -function check_next_char_for_string(param, param$1) { - return check_next_char("a String", param, param$1); -} - function scan_backslash_char(width, ib) { - var c = check_next_char_for_char(width, ib); + var c = check_next_char("a Char", width, ib); var exit = 0; if (c >= 40) { if (c >= 58) { var switcher = c - 92; if (switcher > 28 || switcher < 0) { - exit = 1; + return bad_input_escape(c); } else { switch (switcher) { @@ -1183,7 +1180,7 @@ function scan_backslash_char(width, ib) { case 18 : case 22 : case 24 : - exit = 2; + exit = 1; break; case 1 : case 2 : @@ -1208,8 +1205,7 @@ function scan_backslash_char(width, ib) { case 25 : case 26 : case 27 : - exit = 1; - break; + return bad_input_escape(c); case 28 : var get_digit = function () { var c = next_char(ib); @@ -1251,28 +1247,36 @@ function scan_backslash_char(width, ib) { return store_char(width - 2, ib, char_for_decimal_code(c, c1$1, c2$1)); } else { + return bad_input_escape(c); + } + } + else if (c !== 34) { + if (c >= 39) { exit = 1; } + else { + return bad_input_escape(c); + } } else { - exit = c !== 34 ? ( - c >= 39 ? 2 : 1 - ) : 2; + exit = 1; } - switch (exit) { - case 1 : - return bad_input_escape(c); - case 2 : - return store_char(width, ib, char_for_backslash(c)); - + if (exit === 1) { + return store_char(width, ib, char_for_backslash(c)); } + } function scan_caml_char(width, ib) { var find_stop = function (width) { - var c = check_next_char_for_char(width, ib); + var c = check_next_char("a Char", width, ib); if (c !== 39) { - return character_mismatch(/* "'" */39, c); + var s = character_mismatch_err(/* "'" */39, c); + throw [ + 0, + Scan_failure, + s + ]; } else { return ignore_char(width, ib); @@ -1281,11 +1285,16 @@ function scan_caml_char(width, ib) { var width$1 = width; var c = checked_peek_char(ib); if (c !== 39) { - return character_mismatch(/* "'" */39, c); + var s = character_mismatch_err(/* "'" */39, c); + throw [ + 0, + Scan_failure, + s + ]; } else { var width$2 = ignore_char(width$1, ib); - var c$1 = check_next_char_for_char(width$2, ib); + var c$1 = check_next_char("a Char", width$2, ib); if (c$1 !== 92) { return find_stop(store_char(width$2, ib, c$1)); } @@ -1299,14 +1308,14 @@ function scan_caml_string(width, ib) { var find_stop = function (_width) { while(true) { var width = _width; - var c = check_next_char_for_string(width, ib); + var c = check_next_char("a String", width, ib); if (c !== 34) { if (c !== 92) { _width = store_char(width, ib, c); } else { var width$1 = ignore_char(width, ib); - var match = check_next_char_for_string(width$1, ib); + var match = check_next_char("a String", width$1, ib); if (match !== 10) { if (match !== 13) { return find_stop(scan_backslash_char(width$1, ib)); @@ -1328,7 +1337,7 @@ function scan_caml_string(width, ib) { var skip_spaces = function (_width) { while(true) { var width = _width; - var match = check_next_char_for_string(width, ib); + var match = check_next_char("a String", width, ib); if (match !== 32) { return find_stop(width); } @@ -1340,7 +1349,12 @@ function scan_caml_string(width, ib) { var width$1 = width; var c = checked_peek_char(ib); if (c !== 34) { - return character_mismatch(/* "\"" */34, c); + var s = character_mismatch_err(/* "\"" */34, c); + throw [ + 0, + Scan_failure, + s + ]; } else { return find_stop(ignore_char(width$1, ib)); @@ -1349,24 +1363,38 @@ function scan_caml_string(width, ib) { function scan_bool(ib) { var c = checked_peek_char(ib); - var m = c !== 102 ? ( - c !== 116 ? bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "the character ", - [ - /* Caml_char */1, - [ - /* String_literal */11, - " cannot start a boolean", - /* End_of_format */0 - ] - ] - ], - "the character %C cannot start a boolean" - ])(c)) : 4 - ) : 5; + var m; + if (c !== 102) { + if (c !== 116) { + var s = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "the character ", + [ + /* Caml_char */1, + [ + /* String_literal */11, + " cannot start a boolean", + /* End_of_format */0 + ] + ] + ], + "the character %C cannot start a boolean" + ])(c); + throw [ + 0, + Scan_failure, + s + ]; + } + else { + m = 4; + } + } + else { + m = 5; + } return scan_string(/* None */0, m, ib); } @@ -1375,7 +1403,7 @@ function scan_chars_in_char_set(char_set, scan_indic, width, ib) { while(true) { var i = _i; var c = peek_char(ib); - if (i > 0 && !eof(ib) && CamlinternalFormat.is_in_char_set(char_set, c) && c !== stp) { + if (i > 0 && !ib[1] && CamlinternalFormat.is_in_char_set(char_set, c) && c !== stp) { store_char(Pervasives.max_int, ib, c); _i = i - 1; } @@ -1387,16 +1415,22 @@ function scan_chars_in_char_set(char_set, scan_indic, width, ib) { if (scan_indic) { var c = scan_indic[1]; scan_chars(width, c); - if (eof(ib)) { + if (ib[1]) { return 0; } else { var ci = peek_char(ib); if (c === ci) { - return invalidate_current_char(ib); + ib[3] = /* false */0; + return /* () */0; } else { - return character_mismatch(c, ci); + var s = character_mismatch_err(c, ci); + throw [ + 0, + Scan_failure, + s + ]; } } } @@ -1421,29 +1455,34 @@ function scanf_bad_input(ib, x) { } if (exit === 1) { var i = char_count(ib); - return bad_input(Printf.sprintf([ - /* Format */0, - [ - /* String_literal */11, - "scanf: bad input at char number ", - [ - /* Int */4, - /* Int_i */3, - /* No_padding */0, - /* No_precision */0, - [ - /* String_literal */11, - ": ", - [ - /* Caml_string */3, - /* No_padding */0, - /* End_of_format */0 - ] - ] - ] - ], - "scanf: bad input at char number %i: %S" - ])(i, s)); + var s$1 = Printf.sprintf([ + /* Format */0, + [ + /* String_literal */11, + "scanf: bad input at char number ", + [ + /* Int */4, + /* Int_i */3, + /* No_padding */0, + /* No_precision */0, + [ + /* String_literal */11, + ": ", + [ + /* Caml_string */3, + /* No_padding */0, + /* End_of_format */0 + ] + ] + ] + ], + "scanf: bad input at char number %i: %S" + ])(i, s); + throw [ + 0, + Scan_failure, + s$1 + ]; } } @@ -1451,13 +1490,11 @@ function scanf_bad_input(ib, x) { function get_counter(ib, counter) { switch (counter) { case 0 : - var ib$1 = ib; - return ib$1[5]; + return ib[5]; case 1 : return char_count(ib); case 2 : - var ib$2 = ib; - return ib$2[6]; + return ib[6]; } } @@ -1759,9 +1796,7 @@ function make_scanf(ib, _fmt, readers) { }(c$2)); return pad_prec_scanf(ib, fmt[4], readers, fmt[2], fmt[3], scan$5, (function(c$2){ return function (param) { - var conv = c$2; - var ib = param; - return Caml_format.caml_int_of_string(token_int_literal(conv, ib)); + return Caml_format.caml_int_of_string(token_int_literal(c$2, param)); } }(c$2))); case 5 : @@ -1773,9 +1808,7 @@ function make_scanf(ib, _fmt, readers) { }(c$3)); return pad_prec_scanf(ib, fmt[4], readers, fmt[2], fmt[3], scan$6, (function(c$3){ return function (param) { - var conv = c$3; - var ib = param; - return Caml_format.caml_int32_of_string(token_int_literal(conv, ib)); + return Caml_format.caml_int32_of_string(token_int_literal(c$3, param)); } }(c$3))); case 6 : @@ -1787,9 +1820,7 @@ function make_scanf(ib, _fmt, readers) { }(c$4)); return pad_prec_scanf(ib, fmt[4], readers, fmt[2], fmt[3], scan$7, (function(c$4){ return function (param) { - var conv = c$4; - var ib = param; - return Caml_format.caml_nativeint_of_string(token_int_literal(conv, ib)); + return Caml_format.caml_nativeint_of_string(token_int_literal(c$4, param)); } }(c$4))); case 7 : @@ -1801,9 +1832,7 @@ function make_scanf(ib, _fmt, readers) { }(c$5)); return pad_prec_scanf(ib, fmt[4], readers, fmt[2], fmt[3], scan$8, (function(c$5){ return function (param) { - var conv = c$5; - var ib = param; - return Caml_primitive.caml_int64_of_string(token_int_literal(conv, ib)); + return Caml_primitive.caml_int64_of_string(token_int_literal(c$5, param)); } }(c$5))); case 8 : @@ -1826,7 +1855,11 @@ function make_scanf(ib, _fmt, readers) { _fmt = fmt[1]; } else { - return bad_input("end of input not found"); + throw [ + 0, + Scan_failure, + "end of input not found" + ]; } break; case 11 : @@ -1848,7 +1881,12 @@ function make_scanf(ib, _fmt, readers) { } catch (exn){ if (exn[1] === Caml_exceptions.Failure) { - fmt$1 = bad_input(exn[2]); + var s$1 = exn[2]; + throw [ + 0, + Scan_failure, + s$1 + ]; } else { throw exn; @@ -1862,11 +1900,11 @@ function make_scanf(ib, _fmt, readers) { case 14 : var fmtty = fmt[2]; scan_caml_string(width_of_pad_opt(fmt[1]), ib); - var s$1 = token(ib); + var s$2 = token(ib); var match$2; try { - var match$3 = CamlinternalFormat.fmt_ebb_of_string(/* None */0, s$1); - var match$4 = CamlinternalFormat.fmt_ebb_of_string(/* None */0, s$1); + var match$3 = CamlinternalFormat.fmt_ebb_of_string(/* None */0, s$2); + var match$4 = CamlinternalFormat.fmt_ebb_of_string(/* None */0, s$2); match$2 = [ /* tuple */0, CamlinternalFormat.type_format(match$3[1], CamlinternalFormatBasics.erase_rel(fmtty)), @@ -1875,7 +1913,12 @@ function make_scanf(ib, _fmt, readers) { } catch (exn$1){ if (exn$1[1] === Caml_exceptions.Failure) { - match$2 = bad_input(exn$1[2]); + var s$3 = exn$1[2]; + throw [ + 0, + Scan_failure, + s$3 + ]; } else { throw exn$1; @@ -1886,7 +1929,7 @@ function make_scanf(ib, _fmt, readers) { [ /* Format */0, match$2[1], - s$1 + s$2 ], make_scanf(ib, CamlinternalFormatBasics.concat_fmt(match$2[2], fmt[3]), readers) ]; @@ -1934,7 +1977,7 @@ function make_scanf(ib, _fmt, readers) { /* Some */0, match$6[1] ], width, ib); - var s$2 = token(ib); + var s$4 = token(ib); var str_rest_001$1 = match$6[2]; var str_rest_002$1 = rest$1[2]; var str_rest$1 = [ @@ -1944,7 +1987,7 @@ function make_scanf(ib, _fmt, readers) { ]; return [ /* Cons */0, - s$2, + s$4, make_scanf(ib, str_rest$1, readers) ]; } @@ -1954,10 +1997,10 @@ function make_scanf(ib, _fmt, readers) { if (exit$1 === 1) { var width$1 = width_of_pad_opt(width_opt); scan_chars_in_char_set(char_set, /* None */0, width$1, ib); - var s$3 = token(ib); + var s$5 = token(ib); return [ /* Cons */0, - s$3, + s$5, make_scanf(ib, rest$1, readers) ]; } @@ -2067,7 +2110,7 @@ function kscanf(ib, ef, param) { var str = param[2]; var fmt = param[1]; var k = function (readers, f) { - reset_token(ib); + Buffer.reset(ib[8]); var match; try { match = [ @@ -2076,15 +2119,23 @@ function kscanf(ib, ef, param) { ]; } catch (exc){ - var exit = 0; if (exc[1] === Scan_failure) { - exit = 1; + match = [ + /* Exc */1, + exc + ]; } else if (exc[1] === Caml_exceptions.Failure) { - exit = 1; + match = [ + /* Exc */1, + exc + ]; } else if (exc === Caml_exceptions.End_of_file) { - exit = 1; + match = [ + /* Exc */1, + exc + ]; } else if (exc[1] === Caml_exceptions.Invalid_argument) { match = Pervasives.invalid_arg(exc[2] + (' in format "' + ($$String.escaped(str) + '"'))); @@ -2092,13 +2143,6 @@ function kscanf(ib, ef, param) { else { throw exc; } - if (exit === 1) { - match = [ - /* Exc */1, - exc - ]; - } - } if (match[0]) { return ef(ib, match[1]); @@ -2127,7 +2171,7 @@ function ksscanf(s, ef, fmt) { } function kfscanf(ic, ef, fmt) { - return kscanf(from_channel(ic), ef, fmt); + return kscanf(memo_from_ic(scan_raise_at_end, ic), ef, fmt); } function bscanf(ib, fmt) { @@ -2135,7 +2179,7 @@ function bscanf(ib, fmt) { } function fscanf(ic, fmt) { - return kscanf(from_channel(ic), scanf_bad_input, fmt); + return kscanf(memo_from_ic(scan_raise_at_end, ic), scanf_bad_input, fmt); } function sscanf(s, fmt) { @@ -2155,7 +2199,12 @@ function bscanf_format(ib, format, f) { } catch (exn){ if (exn[1] === Caml_exceptions.Failure) { - $js = bad_input(exn[2]); + var s = exn[2]; + throw [ + 0, + Scan_failure, + s + ]; } else { throw exn; diff --git a/jscomp/stdlib/stream.js b/jscomp/stdlib/stream.js index c257e5aefb..7ddf36d49c 100644 --- a/jscomp/stdlib/stream.js +++ b/jscomp/stdlib/stream.js @@ -19,11 +19,6 @@ var $$Error = [ ++ Caml_exceptions.caml_oo_last_id ]; -function set_data(s, d) { - s[1] = d; - return /* () */0; -} - function fill_buff(b) { b[3] = Pervasives.input(b[1], b[2], 0, b[2].length); b[4] = 0; @@ -195,7 +190,7 @@ function peek(s) { ]; } else { - set_data(s, d); + s[1] = d; return [ /* Some */0, d[1] @@ -205,9 +200,10 @@ function peek(s) { case 2 : var f = match[1]; var tag = Caml_obj_runtime.caml_obj_tag(f); - set_data(s, tag === 250 ? f[1] : ( - tag === 246 ? CamlinternalLazy.force_lazy_block(f) : f - )); + var d$1 = tag === 250 ? f[1] : ( + tag === 246 ? CamlinternalLazy.force_lazy_block(f) : f + ); + s[1] = d$1; break; case 3 : var g = match[1]; @@ -236,7 +232,7 @@ function peek(s) { ]; } else { - set_data(s, /* Sempty */0); + s[1] = /* Sempty */0; return /* None */0; } @@ -256,7 +252,8 @@ function junk(s) { switch (match[0]) { case 0 : ++ s[1]; - return set_data(s, match[2]); + s[1] = match[2]; + return /* () */0; case 3 : var g = match[1]; var match$1 = g[1]; @@ -333,7 +330,7 @@ function nget(n, s) { function npeek(n, s) { var match = nget(n, s); s[1] -= match[3]; - set_data(s, match[2]); + s[1] = match[2]; return match[1]; } diff --git a/jscomp/stdlib/sys.js b/jscomp/stdlib/sys.js index 4b4ad9ef05..2eb3f8883e 100644 --- a/jscomp/stdlib/sys.js +++ b/jscomp/stdlib/sys.js @@ -41,15 +41,17 @@ var Break = [ function catch_break(on) { if (on) { - return set_signal(sigint, [ - /* Signal_handle */0, - function () { - throw Break; - } - ]); + var sig_beh_001 = function () { + throw Break; + }; + var sig_beh = [ + /* Signal_handle */0, + sig_beh_001 + ]; + return Caml_primitive.caml_install_signal_handler(sigint, sig_beh); } else { - return set_signal(sigint, /* Signal_default */0); + return Caml_primitive.caml_install_signal_handler(sigint, /* Signal_default */0); } } diff --git a/jscomp/stdlib/weak.js b/jscomp/stdlib/weak.js index b977be1f14..4161adc24d 100644 --- a/jscomp/stdlib/weak.js +++ b/jscomp/stdlib/weak.js @@ -14,7 +14,7 @@ function length(x) { } function fill(ar, ofs, len, x) { - if (ofs < 0 || len < 0 || ofs + len > length(ar)) { + if (ofs < 0 || len < 0 || ofs + len > ar.length - 1) { throw [ 0, Caml_exceptions.Invalid_argument, @@ -30,10 +30,7 @@ function fill(ar, ofs, len, x) { } function Make(H) { - var weak_create = function (prim) { - return Caml_primitive.caml_weak_create(prim); - }; - var emptybucket = weak_create(0); + var emptybucket = Caml_primitive.caml_weak_create(0); var get_index = function (t, h) { return (h & Pervasives.max_int) % t[1].length; }; @@ -68,7 +65,7 @@ function Make(H) { while(true) { var accu = _accu; var i = _i; - if (i >= length(b)) { + if (i >= b.length - 1) { return accu; } else { @@ -90,7 +87,7 @@ function Make(H) { var b = param; while(true) { var i = _i; - if (i >= length(b)) { + if (i >= b.length - 1) { return /* () */0; } else { @@ -113,7 +110,7 @@ function Make(H) { var b = param$1; while(true) { var i = _i; - if (i >= length(b)) { + if (i >= b.length - 1) { return /* () */0; } else { @@ -133,7 +130,7 @@ function Make(H) { while(true) { var accu = _accu; var i = _i; - if (i >= length(b)) { + if (i >= b.length - 1) { return accu; } else { @@ -158,7 +155,7 @@ function Make(H) { var test_shrink_bucket = function (t) { var bucket = t[1][t[5]]; var hbucket = t[2][t[5]]; - var len = length(bucket); + var len = bucket.length - 1; var prev_len = prev_sz(len); var live = count_bucket(0, bucket, 0); if (live <= prev_len) { @@ -185,7 +182,7 @@ function Make(H) { } }; }; - loop(0, length(bucket) - 1); + loop(0, bucket.length - 1 - 1); if (prev_len) { Caml_obj_runtime.caml_obj_truncate(bucket, prev_len + 1); Caml_obj_runtime.caml_obj_truncate(hbucket, prev_len); @@ -205,7 +202,7 @@ function Make(H) { var add_aux = function (t, setter, d, h, index) { var bucket = t[1][index]; var hashes = t[2][index]; - var sz = length(bucket); + var sz = bucket.length - 1; var _i = 0; while(true) { var i = _i; @@ -214,7 +211,7 @@ function Make(H) { if (newsz <= sz) { Pervasives.failwith("Weak.Make: hash bucket cannot grow more"); } - var newbucket = weak_create(newsz); + var newbucket = Caml_primitive.caml_weak_create(newsz); var newhashes = Caml_array.caml_make_vect(newsz, 0); Caml_primitive.caml_weak_blit(bucket, 0, newbucket, 0, sz); $$Array.blit(hashes, 0, newhashes, 0, sz); @@ -285,7 +282,7 @@ function Make(H) { var index = get_index(t, h); var bucket = t[1][index]; var hashes = t[2][index]; - var sz = length(bucket); + var sz = bucket.length - 1; var _i = 0; while(true) { var i = _i; @@ -338,7 +335,7 @@ function Make(H) { var index = get_index(t, h); var bucket = t[1][index]; var hashes = t[2][index]; - var sz = length(bucket); + var sz = bucket.length - 1; var _i = 0; while(true) { var i = _i; @@ -379,7 +376,7 @@ function Make(H) { var index = get_index(t, h); var bucket = t[1][index]; var hashes = t[2][index]; - var sz = length(bucket); + var sz = bucket.length - 1; var _i = 0; var _accu = /* [] */0; while(true) { @@ -390,7 +387,6 @@ function Make(H) { } else if (h === hashes[i]) { var match = Caml_primitive.caml_weak_get_copy(bucket, i); - var exit = 0; if (match) { if (H[1](match[1], d)) { var match$1 = Caml_primitive.caml_weak_get(bucket, i); @@ -407,16 +403,12 @@ function Make(H) { } } else { - exit = 1; + _i = i + 1; } } else { - exit = 1; - } - if (exit === 1) { _i = i + 1; } - } else { _i = i + 1; diff --git a/jscomp/test/.depend b/jscomp/test/.depend index 49d9bebaad..fdd3ad07c5 100644 --- a/jscomp/test/.depend +++ b/jscomp/test/.depend @@ -1,5 +1,6 @@ a_recursive_type.cmi : abstract_type.cmi : +ari_regress_test.cmi : array_test.cmi : const_block_test.cmi : inline_edge_cases.cmi : @@ -25,6 +26,8 @@ a_string_test.cmo : mt.cmo ../stdlib/list.cmi ext_string.cmo a_string_test.cmx : mt.cmx ../stdlib/list.cmx ext_string.cmx abstract_type.cmo : abstract_type.cmi abstract_type.cmx : abstract_type.cmi +ari_regress_test.cmo : mt.cmo ari_regress_test.cmi +ari_regress_test.cmx : mt.cmx ari_regress_test.cmi arith_lexer.cmo : ../stdlib/lexing.cmi arith_syntax.cmo arith_parser.cmo arith_lexer.cmx : ../stdlib/lexing.cmx arith_syntax.cmx arith_parser.cmx arith_parser.cmo : ../stdlib/parsing.cmi ../stdlib/obj.cmi \ @@ -377,6 +380,8 @@ a_string_test.cmo : mt.cmo ../stdlib/list.cmi ext_string.cmo a_string_test.cmj : mt.cmj ../stdlib/list.cmj ext_string.cmj abstract_type.cmo : abstract_type.cmi abstract_type.cmj : abstract_type.cmi +ari_regress_test.cmo : mt.cmo ari_regress_test.cmi +ari_regress_test.cmj : mt.cmj ari_regress_test.cmi arith_lexer.cmo : ../stdlib/lexing.cmi arith_syntax.cmo arith_parser.cmo arith_lexer.cmj : ../stdlib/lexing.cmj arith_syntax.cmj arith_parser.cmj arith_parser.cmo : ../stdlib/parsing.cmi ../stdlib/obj.cmi \ diff --git a/jscomp/test/a.js b/jscomp/test/a.js index 24a0311ac4..b4c2da92b2 100644 --- a/jscomp/test/a.js +++ b/jscomp/test/a.js @@ -2,10 +2,5 @@ "use strict"; -function add(x, y) { - return x + y; -} -add(1, 2); - -/* Not a pure module */ +/* No side effect */ diff --git a/jscomp/test/a_scope_bug.js b/jscomp/test/a_scope_bug.js index 7d5e223939..8049ff493c 100644 --- a/jscomp/test/a_scope_bug.js +++ b/jscomp/test/a_scope_bug.js @@ -3,11 +3,14 @@ var Pervasives = require("../stdlib/pervasives"); -function odd(z) { - var even$1 = z * z; - var a = even$1 + 4 + even$1; - console.log(Pervasives.string_of_int(a)); - return even(32); +function odd(_z) { + while(true) { + var z = _z; + var even = z * z; + var a = even + 4 + even; + console.log(Pervasives.string_of_int(a)); + _z = 32; + }; } function even(y) { diff --git a/jscomp/test/ari_regress_test.d.ts b/jscomp/test/ari_regress_test.d.ts new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/jscomp/test/ari_regress_test.d.ts @@ -0,0 +1 @@ + diff --git a/jscomp/test/ari_regress_test.js b/jscomp/test/ari_regress_test.js new file mode 100644 index 0000000000..527a7256a9 --- /dev/null +++ b/jscomp/test/ari_regress_test.js @@ -0,0 +1,78 @@ +// Generated CODE, PLEASE EDIT WITH CARE +"use strict"; + +var Mt = require("./mt"); + +var g = 7; + +function gg(x, y) { + var u = x + y; + return function (z) { + return u + z; + }; +} + +function g1(x, y) { + var u = x + y; + return function (xx, yy) { + return xx + yy + u; + }; +} + +var x = gg(3, 5)(6); + +function v(param) { + return g1(3, 4)(6, param); +} + +var suites_001 = [ + /* tuple */0, + "curry", + function () { + return [ + /* Eq */0, + g, + 7 + ]; + } +]; + +var suites_002 = [ + /* :: */0, + [ + /* tuple */0, + "curry2", + function () { + return [ + /* Eq */0, + 14, + v(1) + ]; + } + ], + [ + /* :: */0, + [ + /* tuple */0, + "curry3", + function () { + return [ + /* Eq */0, + x, + 14 + ]; + } + ], + /* [] */0 + ] +]; + +var suites = [ + /* :: */0, + suites_001, + suites_002 +]; + +Mt.from_pair_suites("ari_regress_test.ml", suites); + +/* x Not a pure module */ diff --git a/jscomp/test/ari_regress_test.ml b/jscomp/test/ari_regress_test.ml new file mode 100644 index 0000000000..9225987eb5 --- /dev/null +++ b/jscomp/test/ari_regress_test.ml @@ -0,0 +1,21 @@ +let f x = (+) x +let g = f 3 4 + + +let gg x y = let u = x + y in fun z -> u + z + +let g1 x y = let u = x + y in fun xx yy -> xx + yy + u +let x = gg 3 5 6 + +let v = g1 3 4 6 + +let suites = Mt.[ + "curry", (fun _ -> + Eq(g, 7) + ); + "curry2", (fun _ -> + Eq(14, v 1 )); + "curry3", (fun _ -> Eq(x, 14)) +] + +;; Mt.from_pair_suites __FILE__ suites diff --git a/jscomp/test/ari_regress_test.mli b/jscomp/test/ari_regress_test.mli new file mode 100644 index 0000000000..43bee504f9 --- /dev/null +++ b/jscomp/test/ari_regress_test.mli @@ -0,0 +1 @@ +(** *) diff --git a/jscomp/test/arith_lexer.js b/jscomp/test/arith_lexer.js index 5c548fa9e6..efad92e46b 100644 --- a/jscomp/test/arith_lexer.js +++ b/jscomp/test/arith_lexer.js @@ -35,7 +35,8 @@ function __ocaml_lex_lexeme_rec(lexbuf, ___ocaml_lex_state) { else { switch (__ocaml_lex_state$1) { case 0 : - return lexeme(lexbuf); + ___ocaml_lex_state = 0; + break; case 1 : return [ /* NUMERAL */0, diff --git a/jscomp/test/bdd.js b/jscomp/test/bdd.js index b26d2d37e5..4c68586835 100644 --- a/jscomp/test/bdd.js +++ b/jscomp/test/bdd.js @@ -362,18 +362,18 @@ function xor(n1, n2) { function hwb(n) { var h = function (i, j) { if (i === j) { - return mkVar(i); + return mkNode(zero, i, one); } else { - return xor(and2(not(mkVar(j)), h(i, j - 1)), and2(mkVar(j), g(i, j - 1))); + return xor(and2(not(mkNode(zero, j, one)), h(i, j - 1)), and2(mkNode(zero, j, one), g(i, j - 1))); } }; var g = function (i, j) { if (i === j) { - return mkVar(i); + return mkNode(zero, i, one); } else { - return xor(and2(not(mkVar(i)), h(i + 1, j)), and2(mkVar(i), g(i + 1, j))); + return xor(and2(not(mkNode(zero, i, one)), h(i + 1, j)), and2(mkNode(zero, i, one), g(i + 1, j))); } }; return h(0, n - 1); diff --git a/jscomp/test/const_block_test.js b/jscomp/test/const_block_test.js index 7223ed03ec..175543f524 100644 --- a/jscomp/test/const_block_test.js +++ b/jscomp/test/const_block_test.js @@ -63,10 +63,8 @@ var suites_002 = [ /* tuple */0, "avoid_mutable_inline_test", function () { - var v = h(/* () */0); - var v2 = h(/* () */0); - v[0] = 3; - v2[1] = 4; + c[0] = 3; + c[1] = 4; return [ /* Eq */0, /* array */[ @@ -77,7 +75,7 @@ var suites_002 = [ 4, 5 ], - v + c ]; } ], diff --git a/jscomp/test/demo.js b/jscomp/test/demo.js index 482a804ba5..496df914cd 100644 --- a/jscomp/test/demo.js +++ b/jscomp/test/demo.js @@ -50,22 +50,31 @@ function ui_layout(compile, lookup, appContext) { stackPanel.addChild(grid); stackPanel.addChild(inputCode); stackPanel.addChild(button); - var mk_titleRow = function (text) { - return { - "label": { - "text": text - } - }; - }; var u = { "width": 200 }; grid.minHeight = 300; grid.titleRows = /* array */[ - mk_titleRow("Ticker"), - mk_titleRow("Bid"), - mk_titleRow("Ask"), - mk_titleRow("Result") + { + "label": { + "text": "Ticker" + } + }, + { + "label": { + "text": "Bid" + } + }, + { + "label": { + "text": "Ask" + } + }, + { + "label": { + "text": "Result" + } + } ]; grid.columns = /* array */[ u, @@ -91,9 +100,6 @@ function ui_layout(compile, lookup, appContext) { return /* () */0; } }); - var fmt = function (v) { - return v.toFixed(2); - }; Runtime.setInterval(function () { return grid.dataSource = Array.prototype.map.call(data, function (param) { var price = param[2]; @@ -103,11 +109,30 @@ function ui_layout(compile, lookup, appContext) { "bid": bid, "ask": ask }); + var text = bid.toFixed(2); + var text$1 = ask.toFixed(2); + var text$2 = result.toFixed(2); return /* array */[ - mk_titleRow(param[1]), - mk_titleRow(fmt(bid)), - mk_titleRow(fmt(ask)), - mk_titleRow(fmt(result)) + { + "label": { + "text": param[1] + } + }, + { + "label": { + "text": text + } + }, + { + "label": { + "text": text$1 + } + }, + { + "label": { + "text": text$2 + } + } ]; }); }, 100); diff --git a/jscomp/test/demo_page.d.ts b/jscomp/test/demo_page.d.ts index 496e70a9fa..6d7bd3fb3c 100644 --- a/jscomp/test/demo_page.d.ts +++ b/jscomp/test/demo_page.d.ts @@ -2,5 +2,5 @@ export var fib: (n : any) => any ; export var sum: (n : any) => any ; export var map: (f : any, param : any) => any ; export var test_curry: (x : any, y : any) => any ; -export var f: (y : any) => any ; +export var f: (param : any) => any ; diff --git a/jscomp/test/demo_page.js b/jscomp/test/demo_page.js index 32ef3a50f1..cd3a3de2bc 100644 --- a/jscomp/test/demo_page.js +++ b/jscomp/test/demo_page.js @@ -39,7 +39,7 @@ function test_curry(x, y) { } function f(param) { - return test_curry(32, param); + return 32 + param; } ReactDom.render(React.createClass({ diff --git a/jscomp/test/ext_filename.js b/jscomp/test/ext_filename.js index eb3ead5699..0076f77d64 100644 --- a/jscomp/test/ext_filename.js +++ b/jscomp/test/ext_filename.js @@ -96,26 +96,25 @@ function relative_path(file1, file2) { }; }; var ys = go(dir1, dir2); - var exit = 0; if (ys) { if (ys[1] === node_parent) { return $$String.concat(node_sep, ys); } else { - exit = 1; + return $$String.concat(node_sep, [ + /* :: */0, + node_current, + ys + ]); } } else { - exit = 1; - } - if (exit === 1) { return $$String.concat(node_sep, [ /* :: */0, node_current, ys ]); } - } function node_relative_path(path1, path2) { diff --git a/jscomp/test/ext_list.js b/jscomp/test/ext_list.js index 95e8b5df55..580af4d3d2 100644 --- a/jscomp/test/ext_list.js +++ b/jscomp/test/ext_list.js @@ -213,17 +213,16 @@ function flat_map(f, lx) { } function map2_last(f, l1, l2) { - var exit = 0; if (l1) { var l1$1 = l1[2]; var u = l1[1]; - var exit$1 = 0; + var exit = 0; if (l1$1) { - exit$1 = 2; + exit = 1; } else if (l2) { if (l2[2]) { - exit$1 = 2; + exit = 1; } else { return [ @@ -234,9 +233,9 @@ function map2_last(f, l1, l2) { } } else { - exit = 1; + return Pervasives.invalid_arg("List.map2_last"); } - if (exit$1 === 2) { + if (exit === 1) { if (l2) { var r = f(/* false */0, u, l2[1]); return [ @@ -246,21 +245,17 @@ function map2_last(f, l1, l2) { ]; } else { - exit = 1; + return Pervasives.invalid_arg("List.map2_last"); } } } else if (l2) { - exit = 1; + return Pervasives.invalid_arg("List.map2_last"); } else { return /* [] */0; } - if (exit === 1) { - return Pervasives.invalid_arg("List.map2_last"); - } - } function map_last(f, l1) { diff --git a/jscomp/test/inline_edge_cases.js b/jscomp/test/inline_edge_cases.js index b698f199ac..bde923c6d5 100644 --- a/jscomp/test/inline_edge_cases.js +++ b/jscomp/test/inline_edge_cases.js @@ -2,10 +2,6 @@ "use strict"; -function test4(n) { - return n + 5; -} - function test3(_n) { while(true) { var n = _n; @@ -13,7 +9,7 @@ function test3(_n) { _n = n - 1; } else { - return test4(n) + 4; + return n + 9; } }; } diff --git a/jscomp/test/inline_regression_test.d.ts b/jscomp/test/inline_regression_test.d.ts index 8f2b021899..137f3cbe68 100644 --- a/jscomp/test/inline_regression_test.d.ts +++ b/jscomp/test/inline_regression_test.d.ts @@ -1,5 +1,5 @@ export var generic_basename: (is_dir_sep : any, current_dir_name : any, name : any) => any ; -export var basename: (name : any) => any ; +export var basename: (param : any) => any ; export var suites: any ; diff --git a/jscomp/test/int_map.js b/jscomp/test/int_map.js index 9ad28c0dd0..6323af895c 100644 --- a/jscomp/test/int_map.js +++ b/jscomp/test/int_map.js @@ -5,10 +5,6 @@ var Pervasives = require("../stdlib/pervasives"); var Caml_exceptions = require("../runtime/caml_exceptions"); var Caml_primitive = require("../runtime/caml_primitive"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -112,7 +108,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -148,7 +144,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -164,7 +161,8 @@ function find(x, _param) { function mem(x, param) { if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); return +(c === 0 || mem(x, c < 0 ? param[1] : param[4])); } else { @@ -237,7 +235,7 @@ function remove(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(remove(x, l), v, d, r); @@ -425,7 +423,7 @@ function split(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { var match = split(x, l); @@ -588,7 +586,7 @@ function cons_enum(_m, _e) { }; } -function compare$1(cmp, m1, m2) { +function compare(cmp, m1, m2) { var _e1 = cons_enum(m1, /* End */0); var _e2 = cons_enum(m2, /* End */0); while(true) { @@ -596,7 +594,9 @@ function compare$1(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare(e1[1], e2[1]); + var y = e2[1]; + var x = e1[1]; + var c = Caml_primitive.caml_int_compare(x, y); if (c !== 0) { return c; } @@ -628,7 +628,9 @@ function equal(cmp, m1, m2) { var equal_aux = function (e1, e2) { if (e1) { if (e2) { - return +(compare(e1[1], e2[1]) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); + var y = e2[1]; + var x = e1[1]; + return +(x === y && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); } else { return /* false */0; @@ -690,7 +692,7 @@ exports.add = add; exports.singleton = singleton; exports.remove = remove; exports.merge = merge; -exports.compare = compare$1; +exports.compare = compare; exports.equal = equal; exports.iter = iter; exports.fold = fold; diff --git a/jscomp/test/lexer_test.d.ts b/jscomp/test/lexer_test.d.ts index 3c8cad858a..472a3539ec 100644 --- a/jscomp/test/lexer_test.d.ts +++ b/jscomp/test/lexer_test.d.ts @@ -1,5 +1,5 @@ export var get_tokens: (lex : any, str : any) => any ; -export var f: (str : any) => any ; +export var f: (param : any) => any ; export var from_tokens: (lst : any) => any ; export var lexer_suites: any ; diff --git a/jscomp/test/map_test.js b/jscomp/test/map_test.js index 30c57f3dac..e87df03ed6 100644 --- a/jscomp/test/map_test.js +++ b/jscomp/test/map_test.js @@ -11,10 +11,6 @@ var $$String = require("../stdlib/string"); var List = require("../stdlib/list"); var Test_inline_map = require("./test_inline_map"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -98,7 +94,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -150,7 +146,7 @@ function cons_enum(_m, _e) { }; } -function compare$1(cmp, m1, m2) { +function compare(cmp, m1, m2) { var _e1 = cons_enum(m1, /* End */0); var _e2 = cons_enum(m2, /* End */0); while(true) { @@ -158,7 +154,9 @@ function compare$1(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare(e1[1], e2[1]); + var y = e2[1]; + var x = e1[1]; + var c = Caml_primitive.caml_int_compare(x, y); if (c !== 0) { return c; } @@ -437,7 +435,7 @@ var int_map_suites_002 = [ ] ] ]); - if (compare$1(function (prim, prim$1) { + if (compare(function (prim, prim$1) { return Caml_primitive.caml_compare(prim, prim$1); }, u, v)) { throw [ diff --git a/jscomp/test/mt.js b/jscomp/test/mt.js index a796f3a5ed..d47a08e2ab 100644 --- a/jscomp/test/mt.js +++ b/jscomp/test/mt.js @@ -22,7 +22,7 @@ function from_pair_suites(name, suites) { var code = param[2]; return it(param[1], function () { var match = code(/* () */0); - return assert_equal(match[1], match[2]); + return Assert.deepEqual(match[1], match[2]); }); }, suites); }); diff --git a/jscomp/test/number_lexer.js b/jscomp/test/number_lexer.js index e2cb776929..2db93e99b2 100644 --- a/jscomp/test/number_lexer.js +++ b/jscomp/test/number_lexer.js @@ -42,33 +42,42 @@ function __ocaml_lex_token_rec(l, lexbuf, ___ocaml_lex_state) { switch (__ocaml_lex_state$1) { case 0 : l("new line"); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 1 : l("number"); l(Lexing.lexeme(lexbuf)); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 2 : l("ident"); l(Lexing.lexeme(lexbuf)); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 3 : l("+"); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 4 : l("-"); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 5 : l("*"); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 6 : l("/"); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 7 : l("("); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 8 : l(")"); - return token(l, lexbuf); + ___ocaml_lex_state = 0; + break; case 9 : return l("eof"); diff --git a/jscomp/test/obj_test.js b/jscomp/test/obj_test.js index 3d0b0046f2..54f48997a1 100644 --- a/jscomp/test/obj_test.js +++ b/jscomp/test/obj_test.js @@ -36,13 +36,9 @@ CamlinternalOO.set_methods($$class, /* array */[ } ]); -function obj_init() { - return CamlinternalOO.create_object_opt(0, $$class); -} - CamlinternalOO.init_class($$class); -var vv = obj_init(0); +var vv = CamlinternalOO.create_object_opt(0, $$class); var $$class$1 = CamlinternalOO.create_table([ 0, @@ -71,13 +67,9 @@ CamlinternalOO.set_methods($$class$1, /* array */[ } ]); -function obj_init$1() { - return CamlinternalOO.create_object_opt(0, $$class$1); -} - CamlinternalOO.init_class($$class$1); -var v = obj_init$1(0); +var v = CamlinternalOO.create_object_opt(0, $$class$1); var $$class$2 = CamlinternalOO.create_table([ 0, @@ -122,13 +114,9 @@ CamlinternalOO.set_methods($$class$2, /* array */[ } ]); -function obj_init$2() { - return CamlinternalOO.create_object_opt(0, $$class$2); -} - CamlinternalOO.init_class($$class$2); -var u = obj_init$2(0); +var u = CamlinternalOO.create_object_opt(0, $$class$2); var $$class$3 = CamlinternalOO.create_table([ 0, @@ -141,13 +129,9 @@ CamlinternalOO.set_method($$class$3, id, function () { return "uu"; }); -function obj_init$3() { - return CamlinternalOO.create_object_opt(0, $$class$3); -} - CamlinternalOO.init_class($$class$3); -var uu = obj_init$3(0); +var uu = CamlinternalOO.create_object_opt(0, $$class$3); var $$class$4 = CamlinternalOO.create_table([ 0, @@ -160,13 +144,9 @@ CamlinternalOO.set_method($$class$4, add, function (_, x, y) { return x + y; }); -function obj_init$4() { - return CamlinternalOO.create_object_opt(0, $$class$4); -} - CamlinternalOO.init_class($$class$4); -var uuu = obj_init$4(0); +var uuu = CamlinternalOO.create_object_opt(0, $$class$4); var $$class$5 = CamlinternalOO.create_table(shared); @@ -187,13 +167,9 @@ CamlinternalOO.set_methods($$class$5, /* array */[ } ]); -function obj_init$5() { - return CamlinternalOO.create_object_opt(0, $$class$5); -} - CamlinternalOO.init_class($$class$5); -var vvvv = obj_init$5(0); +var vvvv = CamlinternalOO.create_object_opt(0, $$class$5); var suites_001 = [ /* tuple */0, diff --git a/jscomp/test/qcc.js b/jscomp/test/qcc.js index 97647fe2e6..90acb7be4f 100644 --- a/jscomp/test/qcc.js +++ b/jscomp/test/qcc.js @@ -181,7 +181,6 @@ function isid(param) { function skip(_param) { while(true) { var ch = getch(/* () */0); - var exit = 0; if (ch >= 14) { if (ch !== 32) { if (ch !== 47) { @@ -207,27 +206,23 @@ function skip(_param) { } } else { - exit = 1; + _param = /* () */0; } } else if (ch >= 11) { if (ch >= 13) { - exit = 1; + _param = /* () */0; } else { return ch; } } else if (ch >= 9) { - exit = 1; + _param = /* () */0; } else { return ch; } - if (exit === 1) { - _param = /* () */0; - } - }; } @@ -1813,20 +1808,18 @@ function top(_param) { var n = _n; var regs = _regs; var match = next$1(/* () */0); - var exit = 0; switch (match[0]) { case 0 : if (match[1] === ")") { return stk; } else { - exit = 1; + return Pervasives.failwith("[var] or ) expected"); } break; case 1 : case 2 : - exit = 1; - break; + return Pervasives.failwith("[var] or ) expected"); case 3 : var r = List.hd(regs); push(r); @@ -1852,10 +1845,6 @@ function top(_param) { break; } - if (exit === 1) { - return Pervasives.failwith("[var] or ) expected"); - } - }; }; next$1(/* () */0); diff --git a/jscomp/test/rec_value_test.js b/jscomp/test/rec_value_test.js index 0968698ddc..88f294eede 100644 --- a/jscomp/test/rec_value_test.js +++ b/jscomp/test/rec_value_test.js @@ -315,13 +315,11 @@ var suites_002 = [ var exit = 0; if (a) { if (b) { - var match = b[2]; - if (match) { - var match$1 = match[2]; - if (match$1) { - var match$2 = match$1[2]; - if (match$2) { - $js = match$2[1]; + if (c) { + if (a) { + var match = a[2]; + if (match) { + $js = match[1]; } else { exit = 1; diff --git a/jscomp/test/simple_lexer_test.js b/jscomp/test/simple_lexer_test.js index e8afaddb4f..ad2b6f35e9 100644 --- a/jscomp/test/simple_lexer_test.js +++ b/jscomp/test/simple_lexer_test.js @@ -35,10 +35,10 @@ function __ocaml_lex_translate_rec(lexbuf, ___ocaml_lex_state) { else { switch (__ocaml_lex_state$1) { case 0 : - return "." + translate(lexbuf); + return "." + __ocaml_lex_translate_rec(lexbuf, 0); case 1 : var c = Lexing.sub_lexeme_char(lexbuf, lexbuf[5]); - return $$String.make(1, c) + translate(lexbuf); + return $$String.make(1, c) + __ocaml_lex_translate_rec(lexbuf, 0); case 2 : return ""; @@ -51,7 +51,8 @@ var suites_001 = [ /* tuple */0, "translate", function () { - return Mt.assert_equal(translate(Lexing.from_string("-- current_directory --")), "-- . --"); + var lexbuf = Lexing.from_string("-- current_directory --"); + return Mt.assert_equal(__ocaml_lex_translate_rec(lexbuf, 0), "-- . --"); } ]; diff --git a/jscomp/test/small_inline_test.d.ts b/jscomp/test/small_inline_test.d.ts index 689bf38b21..c2b0e67c84 100644 --- a/jscomp/test/small_inline_test.d.ts +++ b/jscomp/test/small_inline_test.d.ts @@ -1,4 +1,4 @@ -export var $unknown$great: (x : any, f : any) => any ; +export var $pipe$great: (x : any, f : any) => any ; export var hello1: (y : any, f : any) => any ; export var hello2: (y : any, f : any) => any ; export var hello3: (y : any, f : any) => any ; diff --git a/jscomp/test/small_inline_test.js b/jscomp/test/small_inline_test.js index 076654ffd3..fe5de487db 100644 --- a/jscomp/test/small_inline_test.js +++ b/jscomp/test/small_inline_test.js @@ -2,34 +2,34 @@ "use strict"; -function $unknown$great(x, f) { +function $pipe$great(x, f) { return f(x); } function hello1(y, f) { - return $unknown$great(y, f); + return f(y); } function hello2(y, f) { - return $unknown$great(y, f); + return f(y); } function hello3(y, f) { - return $unknown$great(y, f); + return f(y); } function hello4(y, f) { - return $unknown$great(y, f); + return f(y); } function hello5(y, f) { - return hello1(y, f); + return f(y); } -exports.$unknown$great = $unknown$great; -exports.hello1 = hello1; -exports.hello2 = hello2; -exports.hello3 = hello3; -exports.hello4 = hello4; -exports.hello5 = hello5; +exports.$pipe$great = $pipe$great; +exports.hello1 = hello1; +exports.hello2 = hello2; +exports.hello3 = hello3; +exports.hello4 = hello4; +exports.hello5 = hello5; /* No side effect */ diff --git a/jscomp/test/test.mllib b/jscomp/test/test.mllib index ad5da19452..5eb64d2c3c 100644 --- a/jscomp/test/test.mllib +++ b/jscomp/test/test.mllib @@ -151,3 +151,4 @@ equal_test typeof_test lib_js_test small_inline_test +ari_regress_test \ No newline at end of file diff --git a/jscomp/test/test_ari.d.ts b/jscomp/test/test_ari.d.ts index 9569f4caf4..64a349ee4e 100644 --- a/jscomp/test/test_ari.d.ts +++ b/jscomp/test/test_ari.d.ts @@ -1,9 +1,9 @@ export var f: (x : any) => any ; export var f1: (x : any, y : any) => any ; export var f3: (g : any, x : any) => any ; -export var f2: (prim : any) => any ; +export var f2: (param : any) => any ; export var g: any ; -export var ff: (prim : any) => any ; +export var ff: (param : any) => any ; export var fff: any ; export var length_aux: (len : any, param : any) => any ; export var length: (l : any) => any ; diff --git a/jscomp/test/test_ari.js b/jscomp/test/test_ari.js index 0b56012b07..4ebd9ca215 100644 --- a/jscomp/test/test_ari.js +++ b/jscomp/test/test_ari.js @@ -2,8 +2,8 @@ "use strict"; var VV = require("VV"); -var U = require("U"); var List = require("../stdlib/list"); +var U = require("U"); function f(x) { return function (param) { @@ -23,7 +23,7 @@ function f2(param) { return 3 + param; } -var g = f(3)(4); +var g = 7; function ff(param) { return U.test_primit(3, param); @@ -185,4 +185,4 @@ exports.stable_sort = stable_sort; exports.fast_sort = fast_sort; exports.sort_uniq = sort_uniq; exports.merge = merge; -/* g Not a pure module */ +/* fff Not a pure module */ diff --git a/jscomp/test/test_ari.ml b/jscomp/test/test_ari.ml index d47e960da3..0b480564ca 100644 --- a/jscomp/test/test_ari.ml +++ b/jscomp/test/test_ari.ml @@ -1,5 +1,18 @@ let f x = (+) x -(** f = function (x){ function(x,y){x + y} (x) }*) +(* +{[ + f = function (x){ function(x,y){x + y} (x) } +]} + after optimization +{[ + f = \x -> \y -> .. +]} +actually will become +{[ + f = \(x,y) -> x + y +]} + +*) let f1 x y = (+) x y let f3 g x = g x let f2 = (+) 3 diff --git a/jscomp/test/test_demo.js b/jscomp/test/test_demo.js index 3b883ffeea..6b983453cc 100644 --- a/jscomp/test/test_demo.js +++ b/jscomp/test/test_demo.js @@ -61,7 +61,9 @@ function g1(x, y) { var x = g(3, 5)(6); -var v = g1(3, 4)(6); +function v(param) { + return g1(3, 4)(6, param); +} var nil = /* Nil */0; diff --git a/jscomp/test/test_demo.ml b/jscomp/test/test_demo.ml index 2fa3e419c2..f0806e6928 100644 --- a/jscomp/test/test_demo.ml +++ b/jscomp/test/test_demo.ml @@ -87,3 +87,5 @@ let x = g 3 5 6 let v = g1 3 4 6 + + diff --git a/jscomp/test/test_fastdt.js b/jscomp/test/test_fastdt.js index 840a69e158..2ce3a17c93 100644 --- a/jscomp/test/test_fastdt.js +++ b/jscomp/test/test_fastdt.js @@ -210,24 +210,25 @@ function is_real_value(f) { } function find_split_feature(c_t, c_f, _F, _Y, _W, used, validEx) { - var sqr = function (x) { - return x * x; - }; var plp2 = function (x) { if (x <= 0 || x >= 1) { return 0; } else if (x < 0.2) { - return 0.468995593589281168 + 3.16992500144231215 * (x - 0.10) - 8.01497244938313 * sqr(x - 0.10); + var x$1 = x - 0.10; + return 0.468995593589281168 + 3.16992500144231215 * (x - 0.10) - 8.01497244938313 * (x$1 * x$1); } else if (x < 0.5) { - return 0.934068055375491091 + 0.893084796083488341 * (x - 0.35) - 3.17075833162409548 * sqr(x - 0.35); + var x$2 = x - 0.35; + return 0.934068055375491091 + 0.893084796083488341 * (x - 0.35) - 3.17075833162409548 * (x$2 * x$2); } else if (x < 0.8) { - return 0.934068055375491091 - 0.893084796083488341 * (x - 0.65) - 3.17075833162409548 * sqr(x - 0.65); + var x$3 = x - 0.65; + return 0.934068055375491091 - 0.893084796083488341 * (x - 0.65) - 3.17075833162409548 * (x$3 * x$3); } else { - return 0.934068055375491091 - 0.893084796083488341 * (x - 0.90) - 3.17075833162409548 * sqr(x - 0.90); + var x$4 = x - 0.90; + return 0.934068055375491091 - 0.893084796083488341 * (x - 0.90) - 3.17075833162409548 * (x$4 * x$4); } }; var best = /* None */0; @@ -346,7 +347,6 @@ function trim_tree_same(dt) { var n = l[1]; var t = trim_tree_same$prime(n[2]); var f = trim_tree_same$prime(n[3]); - var exit = 0; if (t[0]) { var p1 = t[1]; if (f[0]) { @@ -354,9 +354,14 @@ function trim_tree_same(dt) { var tp = p1[0] / (p1[0] + p1[1]); var fp = p2[0] / (p2[0] + p2[1]); if (Math.abs(tp - fp) < 1e-6) { + var b = p1[1] + p2[1]; + var a = p1[0] + p2[0]; return [ /* Leaf */1, - mkfp(p1[0] + p2[0], p1[1] + p2[1]) + /* array */[ + a, + b + ] ]; } else { @@ -372,13 +377,18 @@ function trim_tree_same(dt) { } } else { - exit = 1; + return [ + /* Node */0, + [ + /* record */0, + n[1], + t, + f + ] + ]; } } else { - exit = 1; - } - if (exit === 1) { return [ /* Node */0, [ @@ -389,7 +399,6 @@ function trim_tree_same(dt) { ] ]; } - } }; return trim_tree_same$prime(dt); @@ -418,7 +427,10 @@ function build_dt(max_depth, leaf_acc, smooth, validExO, _F, _Y, _W) { if (c_t <= 0 || c_f <= 0 || Pervasives.min(p_t, p_f) < leaf_acc || depth >= max_depth) { return [ /* Leaf */1, - mkfp(c_t, c_f) + /* array */[ + c_t, + c_f + ] ]; } else { @@ -459,7 +471,10 @@ function build_dt(max_depth, leaf_acc, smooth, validExO, _F, _Y, _W) { else { return [ /* Leaf */1, - mkfp(c_t, c_f) + /* array */[ + c_t, + c_f + ] ]; } } @@ -535,7 +550,10 @@ function build_boosted_dt(size, max_depth, leaf_acc, smooth, input_f, _F, _Y, _W 0, [ /* Leaf */1, - mkfp(0, 0) + /* array */[ + 0, + 0 + ] ] ]); var h = Pervasives.open_in(input_f); @@ -1021,9 +1039,14 @@ function read_tree(h) { exit = 1; } else { + var b = Caml_format.caml_float_of_string(match$2[1]); + var a = Caml_format.caml_float_of_string(match$1[1]); return [ /* Leaf */1, - mkfp(Caml_format.caml_float_of_string(match$1[1]), Caml_format.caml_float_of_string(match$2[1])) + /* array */[ + a, + b + ] ]; } } @@ -1081,7 +1104,10 @@ function load_model(fp) { 0, [ /* Leaf */1, - mkfp(0, 0) + /* array */[ + 0, + 0 + ] ] ]); for(var i = 0 ,i_finish = size - 1; i<= i_finish; ++i){ diff --git a/jscomp/test/test_for_map.js b/jscomp/test/test_for_map.js index c1de28a3ca..b2e91933dc 100644 --- a/jscomp/test/test_for_map.js +++ b/jscomp/test/test_for_map.js @@ -5,10 +5,6 @@ var Pervasives = require("../stdlib/pervasives"); var Caml_exceptions = require("../runtime/caml_exceptions"); var Caml_primitive = require("../runtime/caml_primitive"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -112,7 +108,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -148,7 +144,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -164,7 +161,8 @@ function find(x, _param) { function mem(x, param) { if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); return +(c === 0 || mem(x, c < 0 ? param[1] : param[4])); } else { @@ -237,7 +235,7 @@ function remove(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(remove(x, l), v, d, r); @@ -425,7 +423,7 @@ function split(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { var match = split(x, l); @@ -588,7 +586,7 @@ function cons_enum(_m, _e) { }; } -function compare$1(cmp, m1, m2) { +function compare(cmp, m1, m2) { var _e1 = cons_enum(m1, /* End */0); var _e2 = cons_enum(m2, /* End */0); while(true) { @@ -596,7 +594,9 @@ function compare$1(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare(e1[1], e2[1]); + var y = e2[1]; + var x = e1[1]; + var c = Caml_primitive.caml_int_compare(x, y); if (c !== 0) { return c; } @@ -628,7 +628,9 @@ function equal(cmp, m1, m2) { var equal_aux = function (e1, e2) { if (e1) { if (e2) { - return +(compare(e1[1], e2[1]) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); + var y = e2[1]; + var x = e1[1]; + return +(x === y && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); } else { return /* false */0; @@ -688,7 +690,7 @@ var IntMap = [ singleton, remove, merge, - compare$1, + compare, equal, iter, fold, diff --git a/jscomp/test/test_functor_dead_code.js b/jscomp/test/test_functor_dead_code.js index 503c3cf729..a47866042b 100644 --- a/jscomp/test/test_functor_dead_code.js +++ b/jscomp/test/test_functor_dead_code.js @@ -2,16 +2,7 @@ "use strict"; -function is_empty(param) { - if (param) { - return /* false */0; - } - else { - return /* true */1; - } -} - -var v = is_empty(/* Empty */0); +var v = /* true */1; exports.v = v; -/* v Not a pure module */ +/* No side effect */ diff --git a/jscomp/test/test_google_closure.js b/jscomp/test/test_google_closure.js index ef05024912..9c2936ed4d 100644 --- a/jscomp/test/test_google_closure.js +++ b/jscomp/test/test_google_closure.js @@ -9,29 +9,24 @@ function f(a, b, _) { } function f2(a) { - return function (param) { - return f(a, 1, param); + return function () { + return a + 1; }; } -var f3 = f2(100); - var arr = $$Array.init(2, function () { return 0; }); for(var i = 0; i<= 2; ++i){ - var f3$1 = f2(i); - arr[i] = f3$1(2); + arr[i] = i + 1; } -var match_001 = Pervasives.string_of_int(f(1, 2, 3)); - -var match_002 = f3(2); +var match_001 = Pervasives.string_of_int(3); var a = match_001; -var b = match_002; +var b = 101; var c = arr; diff --git a/jscomp/test/test_google_closure.ml b/jscomp/test/test_google_closure.ml index 6cc29135c0..5de4479471 100644 --- a/jscomp/test/test_google_closure.ml +++ b/jscomp/test/test_google_closure.ml @@ -4,15 +4,14 @@ let f a b _ = let f2 a = f a 1 - let a, b , c = (string_of_int (f 1 2 3), - (let f3 = f2 100 in - (f3 2)), - (let arr = Array.init 2 (fun _ -> 0) in - for i = 0 to 2 do - let f3 = f2 i in - arr.(i)<- (f3 2); - done; - arr)) + (let f3 = f2 100 in + (f3 2)), + (let arr = Array.init 2 (fun _ -> 0) in + for i = 0 to 2 do + let f3 = f2 i in + arr.(i)<- (f3 2); + done; + arr)) diff --git a/jscomp/test/test_inline_map.js b/jscomp/test/test_inline_map.js index 26238b2b63..af77ac2a6e 100644 --- a/jscomp/test/test_inline_map.js +++ b/jscomp/test/test_inline_map.js @@ -7,10 +7,6 @@ var Mt = require("./mt"); var Caml_primitive = require("../runtime/caml_primitive"); var List = require("../stdlib/list"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -94,7 +90,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -130,7 +126,7 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var c = Caml_primitive.caml_int_compare(x, param[2]); if (c) { _param = c < 0 ? param[1] : param[4]; } diff --git a/jscomp/test/test_inline_map2.js b/jscomp/test/test_inline_map2.js index 13852480c8..b3aa73a1a4 100644 --- a/jscomp/test/test_inline_map2.js +++ b/jscomp/test/test_inline_map2.js @@ -8,10 +8,6 @@ var Caml_primitive = require("../runtime/caml_primitive"); var List = require("../stdlib/list"); var Caml_string = require("../runtime/caml_string"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -95,7 +91,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -131,7 +127,7 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var c = Caml_primitive.caml_int_compare(x, param[2]); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -181,10 +177,6 @@ var m = List.fold_left(function (acc, param) { ] ]); -function compare$1(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height$1(param) { if (param) { return param[5]; @@ -268,7 +260,7 @@ function add$1(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$1(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal$1(add$1(x, data, l), v, d, r); @@ -304,7 +296,7 @@ function find$1(x, _param) { while(true) { var param = _param; if (param) { - var c = compare$1(x, param[2]); + var c = Caml_string.caml_string_compare(x, param[2]); if (c) { _param = c < 0 ? param[1] : param[4]; } diff --git a/jscomp/test/test_int_map_find.js b/jscomp/test/test_int_map_find.js index 7400bbff02..834419232c 100644 --- a/jscomp/test/test_int_map_find.js +++ b/jscomp/test/test_int_map_find.js @@ -5,10 +5,6 @@ var Pervasives = require("../stdlib/pervasives"); var Caml_primitive = require("../runtime/caml_primitive"); var List = require("../stdlib/list"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -92,7 +88,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); diff --git a/jscomp/test/test_internalOO.js b/jscomp/test/test_internalOO.js index e5aa20217f..738cfccc4e 100644 --- a/jscomp/test/test_internalOO.js +++ b/jscomp/test/test_internalOO.js @@ -46,10 +46,6 @@ function public_method_label(s) { } } -function compare(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -153,7 +149,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -189,7 +185,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -205,7 +202,8 @@ function find(x, _param) { function mem(x, param) { if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); return +(c === 0 || mem(x, c < 0 ? param[1] : param[4])); } else { @@ -278,7 +276,7 @@ function remove(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal(remove(x, l), v, d, r); @@ -466,7 +464,7 @@ function split(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { var match = split(x, l); @@ -629,7 +627,7 @@ function cons_enum(_m, _e) { }; } -function compare$1(cmp, m1, m2) { +function compare(cmp, m1, m2) { var _e1 = cons_enum(m1, /* End */0); var _e2 = cons_enum(m2, /* End */0); while(true) { @@ -637,7 +635,9 @@ function compare$1(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare(e1[1], e2[1]); + var y = e2[1]; + var x = e1[1]; + var c = Caml_string.caml_string_compare(x, y); if (c !== 0) { return c; } @@ -669,7 +669,9 @@ function equal(cmp, m1, m2) { var equal_aux = function (e1, e2) { if (e1) { if (e2) { - return +(compare(e1[1], e2[1]) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); + var y = e2[1]; + var x = e1[1]; + return +(Caml_string.caml_string_compare(x, y) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); } else { return /* false */0; @@ -729,7 +731,7 @@ var Vars = [ singleton, remove, merge, - compare$1, + compare, equal, iter, fold, @@ -748,10 +750,6 @@ var Vars = [ mapi ]; -function compare$2(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height$1(param) { if (param) { return param[5]; @@ -855,7 +853,7 @@ function add$1(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$2(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal$1(add$1(x, data, l), v, d, r); @@ -891,7 +889,8 @@ function find$1(x, _param) { while(true) { var param = _param; if (param) { - var c = compare$2(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -907,7 +906,8 @@ function find$1(x, _param) { function mem$1(x, param) { if (param) { - var c = compare$2(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); return +(c === 0 || mem$1(x, c < 0 ? param[1] : param[4])); } else { @@ -980,7 +980,7 @@ function remove$1(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$2(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal$1(remove$1(x, l), v, d, r); @@ -1168,7 +1168,7 @@ function split$1(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$2(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { var match = split$1(x, l); @@ -1331,7 +1331,7 @@ function cons_enum$1(_m, _e) { }; } -function compare$3(cmp, m1, m2) { +function compare$1(cmp, m1, m2) { var _e1 = cons_enum$1(m1, /* End */0); var _e2 = cons_enum$1(m2, /* End */0); while(true) { @@ -1339,7 +1339,9 @@ function compare$3(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare$2(e1[1], e2[1]); + var y = e2[1]; + var x = e1[1]; + var c = Caml_string.caml_string_compare(x, y); if (c !== 0) { return c; } @@ -1371,7 +1373,9 @@ function equal$1(cmp, m1, m2) { var equal_aux = function (e1, e2) { if (e1) { if (e2) { - return +(compare$2(e1[1], e2[1]) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum$1(e1[3], e1[4]), cons_enum$1(e2[3], e2[4]))); + var y = e2[1]; + var x = e1[1]; + return +(Caml_string.caml_string_compare(x, y) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum$1(e1[3], e1[4]), cons_enum$1(e2[3], e2[4]))); } else { return /* false */0; @@ -1431,7 +1435,7 @@ var Meths = [ singleton$1, remove$1, merge$1, - compare$3, + compare$1, equal$1, iter$1, fold$1, @@ -1450,10 +1454,6 @@ var Meths = [ mapi$1 ]; -function compare$4(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height$2(param) { if (param) { return param[5]; @@ -1557,7 +1557,7 @@ function add$2(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$4(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal$2(add$2(x, data, l), v, d, r); @@ -1593,7 +1593,8 @@ function find$2(x, _param) { while(true) { var param = _param; if (param) { - var c = compare$4(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -1609,7 +1610,8 @@ function find$2(x, _param) { function mem$2(x, param) { if (param) { - var c = compare$4(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); return +(c === 0 || mem$2(x, c < 0 ? param[1] : param[4])); } else { @@ -1682,7 +1684,7 @@ function remove$2(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$4(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal$2(remove$2(x, l), v, d, r); @@ -1870,7 +1872,7 @@ function split$2(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$4(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { var match = split$2(x, l); @@ -2033,7 +2035,7 @@ function cons_enum$2(_m, _e) { }; } -function compare$5(cmp, m1, m2) { +function compare$2(cmp, m1, m2) { var _e1 = cons_enum$2(m1, /* End */0); var _e2 = cons_enum$2(m2, /* End */0); while(true) { @@ -2041,7 +2043,9 @@ function compare$5(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare$4(e1[1], e2[1]); + var y = e2[1]; + var x = e1[1]; + var c = Caml_primitive.caml_int_compare(x, y); if (c !== 0) { return c; } @@ -2073,7 +2077,9 @@ function equal$2(cmp, m1, m2) { var equal_aux = function (e1, e2) { if (e1) { if (e2) { - return +(compare$4(e1[1], e2[1]) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum$2(e1[3], e1[4]), cons_enum$2(e2[3], e2[4]))); + var y = e2[1]; + var x = e1[1]; + return +(x === y && cmp(e1[2], e2[2]) && equal_aux(cons_enum$2(e1[3], e1[4]), cons_enum$2(e2[3], e2[4]))); } else { return /* false */0; @@ -2133,7 +2139,7 @@ var Labs = [ singleton$2, remove$2, merge$2, - compare$5, + compare$2, equal$2, iter$2, fold$2, @@ -2858,105 +2864,121 @@ function method_impl(table, i, arr) { if (typeof clo === "number") { switch (clo) { case 0 : - return get_const(next(/* () */0)); + var x = next(/* () */0); + return function () { + return x; + }; case 1 : - return get_var(next(/* () */0)); + var n = next(/* () */0); + return function (obj) { + return obj[n]; + }; case 2 : var e = next(/* () */0); - var n = next(/* () */0); - return get_env(e, n); + var n$1 = next(/* () */0); + return get_env(e, n$1); case 3 : return get_meth(next(/* () */0)); case 4 : - return set_var(next(/* () */0)); + var n$2 = next(/* () */0); + return function (obj, x) { + obj[n$2] = x; + return /* () */0; + }; case 5 : var f = next(/* () */0); - var x = next(/* () */0); - return app_const(f, x); + var x$1 = next(/* () */0); + return function () { + return f(x$1); + }; case 6 : var f$1 = next(/* () */0); - var n$1 = next(/* () */0); - return app_var(f$1, n$1); + var n$3 = next(/* () */0); + return function (obj) { + return f$1(obj[n$3]); + }; case 7 : var f$2 = next(/* () */0); var e$1 = next(/* () */0); - var n$2 = next(/* () */0); - return app_env(f$2, e$1, n$2); + var n$4 = next(/* () */0); + return app_env(f$2, e$1, n$4); case 8 : var f$3 = next(/* () */0); - var n$3 = next(/* () */0); - return app_meth(f$3, n$3); + var n$5 = next(/* () */0); + return app_meth(f$3, n$5); case 9 : var f$4 = next(/* () */0); - var x$1 = next(/* () */0); + var x$2 = next(/* () */0); var y = next(/* () */0); - return app_const_const(f$4, x$1, y); + return function () { + return f$4(x$2, y); + }; case 10 : var f$5 = next(/* () */0); - var x$2 = next(/* () */0); - var n$4 = next(/* () */0); - return app_const_var(f$5, x$2, n$4); + var x$3 = next(/* () */0); + var n$6 = next(/* () */0); + return app_const_var(f$5, x$3, n$6); case 11 : var f$6 = next(/* () */0); - var x$3 = next(/* () */0); + var x$4 = next(/* () */0); var e$2 = next(/* () */0); - var n$5 = next(/* () */0); - return app_const_env(f$6, x$3, e$2, n$5); + var n$7 = next(/* () */0); + return app_const_env(f$6, x$4, e$2, n$7); case 12 : var f$7 = next(/* () */0); - var x$4 = next(/* () */0); - var n$6 = next(/* () */0); - return app_const_meth(f$7, x$4, n$6); + var x$5 = next(/* () */0); + var n$8 = next(/* () */0); + return app_const_meth(f$7, x$5, n$8); case 13 : var f$8 = next(/* () */0); - var n$7 = next(/* () */0); - var x$5 = next(/* () */0); - return app_var_const(f$8, n$7, x$5); + var n$9 = next(/* () */0); + var x$6 = next(/* () */0); + return app_var_const(f$8, n$9, x$6); case 14 : var f$9 = next(/* () */0); var e$3 = next(/* () */0); - var n$8 = next(/* () */0); - var x$6 = next(/* () */0); - return app_env_const(f$9, e$3, n$8, x$6); + var n$10 = next(/* () */0); + var x$7 = next(/* () */0); + return app_env_const(f$9, e$3, n$10, x$7); case 15 : var f$10 = next(/* () */0); - var n$9 = next(/* () */0); - var x$7 = next(/* () */0); - return app_meth_const(f$10, n$9, x$7); - case 16 : - var n$10 = next(/* () */0); + var n$11 = next(/* () */0); var x$8 = next(/* () */0); - return meth_app_const(n$10, x$8); + return app_meth_const(f$10, n$11, x$8); + case 16 : + var n$12 = next(/* () */0); + var x$9 = next(/* () */0); + return meth_app_const(n$12, x$9); case 17 : - var n$11 = next(/* () */0); + var n$13 = next(/* () */0); var m = next(/* () */0); - return meth_app_var(n$11, m); + return meth_app_var(n$13, m); case 18 : - var n$12 = next(/* () */0); + var n$14 = next(/* () */0); var e$4 = next(/* () */0); var m$1 = next(/* () */0); - return meth_app_env(n$12, e$4, m$1); + return meth_app_env(n$14, e$4, m$1); case 19 : - var n$13 = next(/* () */0); + var n$15 = next(/* () */0); var m$2 = next(/* () */0); - return meth_app_meth(n$13, m$2); + return meth_app_meth(n$15, m$2); case 20 : var m$3 = next(/* () */0); - var x$9 = next(/* () */0); - return send_const(m$3, x$9, new_cache(table)); + var x$10 = next(/* () */0); + return send_const(m$3, x$10, new_cache(table)); case 21 : var m$4 = next(/* () */0); - var n$14 = next(/* () */0); - return send_var(m$4, n$14, new_cache(table)); + var n$16 = next(/* () */0); + return send_var(m$4, n$16, new_cache(table)); case 22 : var m$5 = next(/* () */0); var e$5 = next(/* () */0); - var n$15 = next(/* () */0); - return send_env(m$5, e$5, n$15, new_cache(table)); + var n$17 = next(/* () */0); + return send_env(m$5, e$5, n$17, new_cache(table)); case 23 : var m$6 = next(/* () */0); - var n$16 = next(/* () */0); - return send_meth(m$6, n$16, new_cache(table)); + var n$18 = next(/* () */0); + return send_meth(m$6, n$18, new_cache(table)); } } diff --git a/jscomp/test/test_js_ffi.js b/jscomp/test/test_js_ffi.js index de2c8f14e6..50d5596e61 100644 --- a/jscomp/test/test_js_ffi.js +++ b/jscomp/test/test_js_ffi.js @@ -14,36 +14,36 @@ function u(v) { return v; } -var s = u([ - /* String */0, - $$String.make, - $$String.init, - $$String.copy, - $$String.sub, - $$String.fill, - $$String.blit, - $$String.concat, - $$String.iter, - $$String.iteri, - $$String.map, - $$String.mapi, - $$String.trim, - $$String.escaped, - $$String.index, - $$String.rindex, - $$String.index_from, - $$String.rindex_from, - $$String.contains, - $$String.contains_from, - $$String.rcontains_from, - $$String.uppercase, - $$String.lowercase, - $$String.capitalize, - $$String.uncapitalize, - $$String.compare - ]); +var s = [ + 0, + $$String.make, + $$String.init, + $$String.copy, + $$String.sub, + $$String.fill, + $$String.blit, + $$String.concat, + $$String.iter, + $$String.iteri, + $$String.map, + $$String.mapi, + $$String.trim, + $$String.escaped, + $$String.index, + $$String.rindex, + $$String.index_from, + $$String.rindex_from, + $$String.contains, + $$String.contains_from, + $$String.rcontains_from, + $$String.uppercase, + $$String.lowercase, + $$String.capitalize, + $$String.uncapitalize, + $$String.compare +]; exports.v = v; exports.u = u; exports.s = s; -/* s Not a pure module */ +/* No side effect */ diff --git a/jscomp/test/test_list.js b/jscomp/test/test_list.js index 0a0f734669..a2668a9330 100644 --- a/jscomp/test/test_list.js +++ b/jscomp/test/test_list.js @@ -527,7 +527,7 @@ function find_all(p) { } } else { - return rev(accu); + return rev_append(accu, /* [] */0); } }; }; @@ -564,8 +564,8 @@ function partition(p, l) { else { return [ /* tuple */0, - rev(yes), - rev(no) + rev_append(yes, /* [] */0), + rev_append(no, /* [] */0) ]; } }; @@ -1079,7 +1079,7 @@ function stable_sort(cmp, l) { } }; - var len = length(l); + var len = length_aux(0, l); if (len < 2) { return l; } @@ -1733,7 +1733,7 @@ function sort_uniq(cmp, l) { } }; - var len = length(l); + var len = length_aux(0, l); if (len < 2) { return l; } diff --git a/jscomp/test/test_map_find.js b/jscomp/test/test_map_find.js index 87d86fc617..4f87d23417 100644 --- a/jscomp/test/test_map_find.js +++ b/jscomp/test/test_map_find.js @@ -8,10 +8,6 @@ var Caml_primitive = require("../runtime/caml_primitive"); var List = require("../stdlib/list"); var Caml_string = require("../runtime/caml_string"); -function compare(x, y) { - return Caml_primitive.caml_int_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -95,7 +91,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_int_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -131,7 +127,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_primitive.caml_int_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -181,10 +178,6 @@ var m = List.fold_left(function (acc, param) { ] ]); -function compare$1(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height$1(param) { if (param) { return param[5]; @@ -268,7 +261,7 @@ function add$1(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare$1(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal$1(add$1(x, data, l), v, d, r); @@ -304,7 +297,8 @@ function find$1(x, _param) { while(true) { var param = _param; if (param) { - var c = compare$1(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } diff --git a/jscomp/test/test_non_export.js b/jscomp/test/test_non_export.js index 6ec334b2c0..b4c2da92b2 100644 --- a/jscomp/test/test_non_export.js +++ b/jscomp/test/test_non_export.js @@ -1,23 +1,6 @@ // Generated CODE, PLEASE EDIT WITH CARE "use strict"; -var $$Set = require("../stdlib/set"); -var $$String = require("../stdlib/string"); -var v = [ - 0, - $$String.compare -]; -function pack(h) { - return $$Set.Make(h); -} - -pack(v); - -pack([ - 0, - $$String.compare - ]); - -/* Not a pure module */ +/* No side effect */ diff --git a/jscomp/test/test_order_tailcall.js b/jscomp/test/test_order_tailcall.js index 5b3a4e98e4..87aa654ee6 100644 --- a/jscomp/test/test_order_tailcall.js +++ b/jscomp/test/test_order_tailcall.js @@ -2,12 +2,9 @@ "use strict"; -function f(_x, _y) { +function f(_, _$1) { while(true) { - var y = _y; - var x = _x; - _y = x; - _x = y; + }; } diff --git a/jscomp/test/test_per.js b/jscomp/test/test_per.js index 267a800636..3fb91c0a86 100644 --- a/jscomp/test/test_per.js +++ b/jscomp/test/test_per.js @@ -89,7 +89,11 @@ function $caret(s1, s2) { function char_of_int(n) { if (n < 0 || n > 255) { - return invalid_arg("char_of_int"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "char_of_int" + ]; } else { return n; @@ -112,7 +116,11 @@ function bool_of_string(param) { case "true" : return /* true */1; default: - return invalid_arg("bool_of_string"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "bool_of_string" + ]; } } @@ -244,7 +252,11 @@ function output_string(oc, s) { function output(oc, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("output"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "output" + ]; } else { return Caml_io.caml_ml_output(oc, s, ofs, len); @@ -253,7 +265,11 @@ function output(oc, s, ofs, len) { function output_substring(oc, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("output_substring"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "output_substring" + ]; } else { return Caml_io.caml_ml_output(oc, s, ofs, len); @@ -314,7 +330,11 @@ function open_in_bin(name) { function input(ic, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("input"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "input" + ]; } else { return Caml_primitive.caml_ml_input(ic, s, ofs, len); @@ -343,7 +363,11 @@ function unsafe_really_input(ic, s, _ofs, _len) { function really_input(ic, s, ofs, len) { if (ofs < 0 || len < 0 || ofs > s.length - len) { - return invalid_arg("really_input"); + throw [ + 0, + Caml_exceptions.Invalid_argument, + "really_input" + ]; } else { return unsafe_really_input(ic, s, ofs, len); @@ -438,11 +462,11 @@ function print_bytes(s) { } function print_int(i) { - return output_string(stdout, string_of_int(i)); + return output_string(stdout, Caml_format.caml_format_int("%d", i)); } function print_float(f) { - return output_string(stdout, string_of_float(f)); + return output_string(stdout, valid_float_lexem(Caml_format.caml_format_float("%.12g", f))); } function print_endline(s) { @@ -469,11 +493,11 @@ function prerr_bytes(s) { } function prerr_int(i) { - return output_string(stderr, string_of_int(i)); + return output_string(stderr, Caml_format.caml_format_int("%d", i)); } function prerr_float(f) { - return output_string(stderr, string_of_float(f)); + return output_string(stderr, valid_float_lexem(Caml_format.caml_format_float("%.12g", f))); } function prerr_endline(s) { @@ -493,11 +517,11 @@ function read_line() { } function read_int() { - return Caml_format.caml_int_of_string(read_line(/* () */0)); + return Caml_format.caml_int_of_string((Caml_primitive.caml_ml_flush(stdout), input_line(stdin))); } function read_float() { - return Caml_format.caml_float_of_string(read_line(/* () */0)); + return Caml_format.caml_float_of_string((Caml_primitive.caml_ml_flush(stdout), input_line(stdin))); } var LargeFile = [0]; @@ -533,7 +557,7 @@ function do_at_exit() { } function exit(retcode) { - do_at_exit(/* () */0); + exit_function[1](/* () */0); return Caml_primitive.caml_sys_exit(retcode); } diff --git a/jscomp/test/test_simple_obj.js b/jscomp/test/test_simple_obj.js index 85a097606b..b9617d2a3f 100644 --- a/jscomp/test/test_simple_obj.js +++ b/jscomp/test/test_simple_obj.js @@ -53,13 +53,9 @@ CamlinternalOO.set_methods($$class, /* array */[ } ]); -function obj_init() { - return CamlinternalOO.create_object_opt(0, $$class); -} - CamlinternalOO.init_class($$class); -var u = obj_init(0); +var u = CamlinternalOO.create_object_opt(0, $$class); var $$class$1 = CamlinternalOO.create_table([ 0, @@ -72,13 +68,9 @@ CamlinternalOO.set_method($$class$1, id, function () { return "uu"; }); -function obj_init$1() { - return CamlinternalOO.create_object_opt(0, $$class$1); -} - CamlinternalOO.init_class($$class$1); -var uu = obj_init$1(0); +var uu = CamlinternalOO.create_object_opt(0, $$class$1); var $$class$2 = CamlinternalOO.create_table(shared); @@ -88,13 +80,9 @@ CamlinternalOO.set_method($$class$2, add, function (_, x, y) { return x + y; }); -function obj_init$2() { - return CamlinternalOO.create_object_opt(0, $$class$2); -} - CamlinternalOO.init_class($$class$2); -var uuu = obj_init$2(0); +var uuu = CamlinternalOO.create_object_opt(0, $$class$2); var $$class$3 = CamlinternalOO.create_table(shared); @@ -104,13 +92,9 @@ CamlinternalOO.set_method($$class$3, add$1, function (_, x, y) { return x + y; }); -function obj_init$3() { - return CamlinternalOO.create_object_opt(0, $$class$3); -} - CamlinternalOO.init_class($$class$3); -var v = obj_init$3(0); +var v = CamlinternalOO.create_object_opt(0, $$class$3); function test() { if (Caml_oo.caml_get_public_method(uu, 23515, 1)(uu) !== "uu") { diff --git a/jscomp/test/test_simple_ref.js b/jscomp/test/test_simple_ref.js index 32b134da38..2265d8739f 100644 --- a/jscomp/test/test_simple_ref.js +++ b/jscomp/test/test_simple_ref.js @@ -24,20 +24,16 @@ var c = [ 0 ]; -function $$escape(v) { - return v; -} - var not_real_escape = a; function real_escape(f, _) { return f(c); } -var u = $$escape(h); +var u = h; exports.u = u; exports.gen = gen; exports.not_real_escape = not_real_escape; exports.real_escape = real_escape; -/* u Not a pure module */ +/* No side effect */ diff --git a/jscomp/test/test_string_map.js b/jscomp/test/test_string_map.js index 05769ba9fc..78833b0c6d 100644 --- a/jscomp/test/test_string_map.js +++ b/jscomp/test/test_string_map.js @@ -5,10 +5,6 @@ var Pervasives = require("../stdlib/pervasives"); var Caml_exceptions = require("../runtime/caml_exceptions"); var Caml_string = require("../runtime/caml_string"); -function compare(x, y) { - return Caml_string.caml_string_compare(x, y); -} - function height(param) { if (param) { return param[5]; @@ -92,7 +88,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_string.caml_string_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -128,7 +124,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var y = param[2]; + var c = Caml_string.caml_string_compare(x, y); if (c) { _param = c < 0 ? param[1] : param[4]; } diff --git a/jscomp/test/ticker.js b/jscomp/test/ticker.js index 8b404df321..773e6f2864 100644 --- a/jscomp/test/ticker.js +++ b/jscomp/test/ticker.js @@ -136,10 +136,6 @@ function print_all_composite(all_tickers) { }, all_tickers); } -function compare(prim, prim$1) { - return Caml_primitive.caml_compare(prim, prim$1); -} - function height(param) { if (param) { return param[5]; @@ -243,7 +239,7 @@ function add(x, data, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_compare(x, v); if (c) { if (c < 0) { return bal(add(x, data, l), v, d, r); @@ -279,7 +275,8 @@ function find(x, _param) { while(true) { var param = _param; if (param) { - var c = compare(x, param[2]); + var prim = param[2]; + var c = Caml_primitive.caml_compare(x, prim); if (c) { _param = c < 0 ? param[1] : param[4]; } @@ -295,7 +292,8 @@ function find(x, _param) { function mem(x, param) { if (param) { - var c = compare(x, param[2]); + var prim = param[2]; + var c = Caml_primitive.caml_compare(x, prim); return +(c === 0 || mem(x, c < 0 ? param[1] : param[4])); } else { @@ -368,7 +366,7 @@ function remove(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_compare(x, v); if (c) { if (c < 0) { return bal(remove(x, l), v, d, r); @@ -556,7 +554,7 @@ function split$1(x, param) { var d = param[3]; var v = param[2]; var l = param[1]; - var c = compare(x, v); + var c = Caml_primitive.caml_compare(x, v); if (c) { if (c < 0) { var match = split$1(x, l); @@ -719,7 +717,7 @@ function cons_enum(_m, _e) { }; } -function compare$1(cmp, m1, m2) { +function compare(cmp, m1, m2) { var _e1 = cons_enum(m1, /* End */0); var _e2 = cons_enum(m2, /* End */0); while(true) { @@ -727,7 +725,9 @@ function compare$1(cmp, m1, m2) { var e1 = _e1; if (e1) { if (e2) { - var c = compare(e1[1], e2[1]); + var prim = e2[1]; + var prim$1 = e1[1]; + var c = Caml_primitive.caml_compare(prim$1, prim); if (c !== 0) { return c; } @@ -759,7 +759,9 @@ function equal(cmp, m1, m2) { var equal_aux = function (e1, e2) { if (e1) { if (e2) { - return +(compare(e1[1], e2[1]) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); + var prim = e2[1]; + var prim$1 = e1[1]; + return +(Caml_primitive.caml_compare(prim$1, prim) === 0 && cmp(e1[2], e2[2]) && equal_aux(cons_enum(e1[3], e1[4]), cons_enum(e2[3], e2[4]))); } else { return /* false */0; @@ -819,7 +821,7 @@ var Ticker_map = [ singleton, remove, merge, - compare$1, + compare, equal, iter, fold, @@ -999,7 +1001,6 @@ function process_input_line(ticker_map, all_tickers, line) { ]; }; var tokens = split(/* "|" */124, line); - var exit = 0; if (tokens) { switch (tokens[1]) { case "Q" : @@ -1008,7 +1009,7 @@ function process_input_line(ticker_map, all_tickers, line) { var match$1 = match[2]; if (match$1) { if (match$1[2]) { - exit = 1; + return Pervasives.failwith("Invalid input line"); } else { var ticker_map$1 = ticker_map ? ticker_map[1] : compute_update_sequences(all_tickers); @@ -1025,11 +1026,11 @@ function process_input_line(ticker_map, all_tickers, line) { } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } break; case "R" : @@ -1045,7 +1046,7 @@ function process_input_line(ticker_map, all_tickers, line) { var match$5 = match$4[2]; if (match$5) { if (match$5[2]) { - exit = 1; + return Pervasives.failwith("Invalid input line"); } else { return [ @@ -1060,11 +1061,11 @@ function process_input_line(ticker_map, all_tickers, line) { } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } break; case "-" : @@ -1073,7 +1074,7 @@ function process_input_line(ticker_map, all_tickers, line) { var match$7 = match$6[2]; if (match$7) { if (match$7[2]) { - exit = 1; + return Pervasives.failwith("Invalid input line"); } else { return [ @@ -1088,16 +1089,16 @@ function process_input_line(ticker_map, all_tickers, line) { } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } break; case "S" : if (match$3[2]) { - exit = 1; + return Pervasives.failwith("Invalid input line"); } else { return [ @@ -1116,30 +1117,25 @@ function process_input_line(ticker_map, all_tickers, line) { ticker_map ]; } - break; default: - exit = 1; + return Pervasives.failwith("Invalid input line"); } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } } else { - exit = 1; + return Pervasives.failwith("Invalid input line"); } break; default: - exit = 1; + return Pervasives.failwith("Invalid input line"); } } else { - exit = 1; - } - if (exit === 1) { return Pervasives.failwith("Invalid input line"); } - } function loop(_lines, _param) {