UNPKG

bs-platform

Version:

bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support

756 lines (708 loc) 22.5 kB
'use strict'; var Obj = require("./obj.js"); var List = require("./list.js"); var $$Array = require("./array.js"); var Curry = require("./curry.js"); var Caml_oo = require("./caml_oo.js"); var Caml_obj = require("./caml_obj.js"); var Caml_array = require("./caml_array.js"); var Caml_int32 = require("./caml_int32.js"); var Belt_MapInt = require("./belt_MapInt.js"); var Caml_string = require("./caml_string.js"); var Belt_MapString = require("./belt_MapString.js"); var Caml_exceptions = require("./caml_exceptions.js"); var Caml_builtin_exceptions = require("./caml_builtin_exceptions.js"); function copy(o) { return Caml_exceptions.caml_set_oo_id(Caml_obj.caml_obj_dup(o)); } var params = /* record */[ /* compact_table */true, /* copy_parent */true, /* clean_when_copying */true, /* retry_count */3, /* bucket_small_size */16 ]; function public_method_label(s) { var accu = 0; for(var i = 0 ,i_finish = s.length - 1 | 0; i <= i_finish; ++i){ accu = Caml_int32.imul(223, accu) + Caml_string.get(s, i) | 0; } accu = accu & 2147483647; if (accu > 1073741823) { return accu - -2147483648 | 0; } else { return accu; } } var dummy_table = /* record */[ /* size */0, /* methods : array */[/* () */0], /* methods_by_name */Belt_MapString.empty, /* methods_by_label */Belt_MapInt.empty, /* previous_states : [] */0, /* hidden_meths : [] */0, /* vars */Belt_MapString.empty, /* initializers : [] */0 ]; var table_count = /* record */[/* contents */0]; var dummy_met = []; function fit_size(n) { if (n <= 2) { return n; } else { return (fit_size((n + 1 | 0) / 2 | 0) << 1); } } function new_table(pub_labels) { table_count[0] = table_count[0] + 1 | 0; var len = pub_labels.length; var methods = Caml_array.caml_make_vect((len << 1) + 2 | 0, dummy_met); Caml_array.caml_array_set(methods, 0, len); Caml_array.caml_array_set(methods, 1, ((fit_size(len) << 5) / 8 | 0) - 1 | 0); for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){ Caml_array.caml_array_set(methods, (i << 1) + 3 | 0, Caml_array.caml_array_get(pub_labels, i)); } return /* record */[ /* size */2, /* methods */methods, /* methods_by_name */Belt_MapString.empty, /* methods_by_label */Belt_MapInt.empty, /* previous_states : [] */0, /* hidden_meths : [] */0, /* vars */Belt_MapString.empty, /* initializers : [] */0 ]; } function resize(array, new_size) { var old_size = array[/* methods */1].length; if (new_size > old_size) { var new_buck = Caml_array.caml_make_vect(new_size, dummy_met); $$Array.blit(array[/* methods */1], 0, new_buck, 0, old_size); array[/* methods */1] = new_buck; return /* () */0; } else { return 0; } } var method_count = /* record */[/* contents */0]; var inst_var_count = /* record */[/* contents */0]; function new_method(table) { var index = table[/* methods */1].length; resize(table, index + 1 | 0); return index; } function get_method_label(table, name) { var match = Belt_MapString.getUndefined(table[/* methods_by_name */2], name); if (match !== undefined) { return match; } else { var label = new_method(table); table[/* methods_by_name */2] = Belt_MapString.set(table[/* methods_by_name */2], name, label); table[/* methods_by_label */3] = Belt_MapInt.set(table[/* methods_by_label */3], label, true); return label; } } function get_method_labels(table, names) { return $$Array.map((function (param) { return get_method_label(table, param); }), names); } function set_method(table, label, element) { method_count[0] = method_count[0] + 1 | 0; if (Belt_MapInt.getExn(table[/* methods_by_label */3], label)) { var array = table; var label$1 = label; var element$1 = element; resize(array, label$1 + 1 | 0); return Caml_array.caml_array_set(array[/* methods */1], label$1, element$1); } else { table[/* hidden_meths */5] = /* :: */[ /* tuple */[ label, element ], table[/* hidden_meths */5] ]; return /* () */0; } } function get_method(table, label) { try { return List.assoc(label, table[/* hidden_meths */5]); } catch (exn){ if (exn === Caml_builtin_exceptions.not_found) { return Caml_array.caml_array_get(table[/* methods */1], label); } else { throw exn; } } } function to_list(arr) { if (arr === 0) { return /* [] */0; } else { return $$Array.to_list(arr); } } function narrow(table, vars, virt_meths, concr_meths) { var vars$1 = to_list(vars); var virt_meths$1 = to_list(virt_meths); var concr_meths$1 = to_list(concr_meths); var virt_meth_labs = List.map((function (param) { return get_method_label(table, param); }), virt_meths$1); var concr_meth_labs = List.map((function (param) { return get_method_label(table, param); }), concr_meths$1); table[/* previous_states */4] = /* :: */[ /* tuple */[ table[/* methods_by_name */2], table[/* methods_by_label */3], table[/* hidden_meths */5], table[/* vars */6], virt_meth_labs, vars$1 ], table[/* previous_states */4] ]; table[/* vars */6] = Belt_MapString.reduceU(table[/* vars */6], Belt_MapString.empty, (function (tvars, lab, info) { if (List.mem(lab, vars$1)) { return Belt_MapString.set(tvars, lab, info); } else { return tvars; } })); var by_name = /* record */[/* contents */Belt_MapString.empty]; var by_label = /* record */[/* contents */Belt_MapInt.empty]; List.iter2((function (met, label) { by_name[0] = Belt_MapString.set(by_name[0], met, label); by_label[0] = Belt_MapInt.set(by_label[0], label, Belt_MapInt.getWithDefault(table[/* methods_by_label */3], label, true)); return /* () */0; }), concr_meths$1, concr_meth_labs); List.iter2((function (met, label) { by_name[0] = Belt_MapString.set(by_name[0], met, label); by_label[0] = Belt_MapInt.set(by_label[0], label, false); return /* () */0; }), virt_meths$1, virt_meth_labs); table[/* methods_by_name */2] = by_name[0]; table[/* methods_by_label */3] = by_label[0]; table[/* hidden_meths */5] = List.fold_right((function (met, hm) { if (List.mem(met[0], virt_meth_labs)) { return hm; } else { return /* :: */[ met, hm ]; } }), table[/* hidden_meths */5], /* [] */0); return /* () */0; } function widen(table) { var match = List.hd(table[/* previous_states */4]); var virt_meths = match[4]; table[/* previous_states */4] = List.tl(table[/* previous_states */4]); table[/* vars */6] = List.fold_left((function (s, v) { return Belt_MapString.set(s, v, Belt_MapString.getExn(table[/* vars */6], v)); }), match[3], match[5]); table[/* methods_by_name */2] = match[0]; table[/* methods_by_label */3] = match[1]; table[/* hidden_meths */5] = List.fold_right((function (met, hm) { if (List.mem(met[0], virt_meths)) { return hm; } else { return /* :: */[ met, hm ]; } }), table[/* hidden_meths */5], match[2]); return /* () */0; } function new_slot(table) { var index = table[/* size */0]; table[/* size */0] = index + 1 | 0; return index; } function new_variable(table, name) { var match = Belt_MapString.getUndefined(table[/* vars */6], name); if (match !== undefined) { return match; } else { var index = new_slot(table); if (name !== "") { table[/* vars */6] = Belt_MapString.set(table[/* vars */6], name, index); } return index; } } function to_array(arr) { if (Caml_obj.caml_equal(arr, 0)) { return /* array */[]; } else { return arr; } } function new_methods_variables(table, meths, vals) { var meths$1 = to_array(meths); var nmeths = meths$1.length; var nvals = vals.length; var res = Caml_array.caml_make_vect(nmeths + nvals | 0, 0); for(var i = 0 ,i_finish = nmeths - 1 | 0; i <= i_finish; ++i){ Caml_array.caml_array_set(res, i, get_method_label(table, Caml_array.caml_array_get(meths$1, i))); } for(var i$1 = 0 ,i_finish$1 = nvals - 1 | 0; i$1 <= i_finish$1; ++i$1){ Caml_array.caml_array_set(res, i$1 + nmeths | 0, new_variable(table, Caml_array.caml_array_get(vals, i$1))); } return res; } function get_variable(table, name) { return Belt_MapString.getExn(table[/* vars */6], name); } function get_variables(table, names) { return $$Array.map((function (param) { return Belt_MapString.getExn(table[/* vars */6], param); }), names); } function add_initializer(table, f) { table[/* initializers */7] = /* :: */[ f, table[/* initializers */7] ]; return /* () */0; } function create_table(public_methods) { if (public_methods === 0) { return new_table(/* array */[]); } else { var tags = $$Array.map(public_method_label, public_methods); var table = new_table(tags); $$Array.iteri((function (i, met) { var lab = (i << 1) + 2 | 0; table[/* methods_by_name */2] = Belt_MapString.set(table[/* methods_by_name */2], met, lab); table[/* methods_by_label */3] = Belt_MapInt.set(table[/* methods_by_label */3], lab, true); return /* () */0; }), public_methods); return table; } } function init_class(table) { inst_var_count[0] = (inst_var_count[0] + table[/* size */0] | 0) - 1 | 0; table[/* initializers */7] = List.rev(table[/* initializers */7]); return resize(table, 3 + ((Caml_array.caml_array_get(table[/* methods */1], 1) << 4) / 32 | 0) | 0); } function inherits(cla, vals, virt_meths, concr_meths, param, top) { var $$super = param[1]; narrow(cla, vals, virt_meths, concr_meths); var init = top ? Curry._2($$super, cla, param[3]) : Curry._1($$super, cla); widen(cla); return Caml_array.caml_array_concat(/* :: */[ /* array */[init], /* :: */[ $$Array.map((function (param) { return Belt_MapString.getExn(cla[/* vars */6], param); }), to_array(vals)), /* :: */[ $$Array.map((function (nm) { return get_method(cla, get_method_label(cla, nm)); }), to_array(concr_meths)), /* [] */0 ] ] ]); } function make_class(pub_meths, class_init) { var table = create_table(pub_meths); var env_init = Curry._1(class_init, table); init_class(table); return /* tuple */[ Curry._1(env_init, 0), class_init, env_init, 0 ]; } function make_class_store(pub_meths, class_init, init_table) { var table = create_table(pub_meths); var env_init = Curry._1(class_init, table); init_class(table); init_table[/* class_init */1] = class_init; init_table[/* env_init */0] = env_init; return /* () */0; } function create_object(table) { var obj = Caml_obj.caml_obj_block(Obj.object_tag, table[/* size */0]); obj[0] = table[/* methods */1]; return Caml_exceptions.caml_set_oo_id(obj); } function create_object_opt(obj_0, table) { if (obj_0) { return obj_0; } else { var obj = Caml_obj.caml_obj_block(Obj.object_tag, table[/* size */0]); obj[0] = table[/* methods */1]; return Caml_exceptions.caml_set_oo_id(obj); } } function iter_f(obj, _param) { while(true) { var param = _param; if (param) { Curry._1(param[0], obj); _param = param[1]; continue ; } else { return /* () */0; } }; } function run_initializers(obj, table) { var inits = table[/* initializers */7]; if (inits !== /* [] */0) { return iter_f(obj, inits); } else { return 0; } } function run_initializers_opt(obj_0, obj, table) { if (obj_0) { return obj; } else { var inits = table[/* initializers */7]; if (inits !== /* [] */0) { iter_f(obj, inits); } return obj; } } function create_object_and_run_initializers(obj_0, table) { if (obj_0) { return obj_0; } else { var obj = create_object(table); run_initializers(obj, table); return obj; } } function build_path(n, keys, tables) { var res = /* record */[ /* key */0, /* data : Empty */0, /* next : Empty */0 ]; var r = res; for(var i = 0; i <= n; ++i){ r = /* Cons */[ Caml_array.caml_array_get(keys, i), r, /* Empty */0 ]; } tables[/* data */1] = r; return res; } function lookup_keys(i, keys, tables) { if (i < 0) { return tables; } else { var key = Caml_array.caml_array_get(keys, i); var _tables = tables; while(true) { var tables$1 = _tables; if (tables$1[/* key */0] === key) { return lookup_keys(i - 1 | 0, keys, tables$1[/* data */1]); } else if (tables$1[/* next */2] !== /* Empty */0) { _tables = tables$1[/* next */2]; continue ; } else { var next = /* Cons */[ key, /* Empty */0, /* Empty */0 ]; tables$1[/* next */2] = next; return build_path(i - 1 | 0, keys, next); } }; } } function lookup_tables(root, keys) { if (root[/* data */1] !== /* Empty */0) { return lookup_keys(keys.length - 1 | 0, keys, root[/* data */1]); } else { return build_path(keys.length - 1 | 0, keys, root); } } function new_cache(table) { var n = new_method(table); var n$1 = n % 2 === 0 || n > (2 + ((Caml_array.caml_array_get(table[/* methods */1], 1) << 4) / 32 | 0) | 0) ? n : new_method(table); Caml_array.caml_array_set(table[/* methods */1], n$1, 0); return n$1; } function method_impl(table, i, arr) { var next = function (param) { i[0] = i[0] + 1 | 0; return Caml_array.caml_array_get(arr, i[0]); }; var clo = next(/* () */0); if (typeof clo === "number") { switch (clo) { case 0 : var x = next(/* () */0); return (function (obj) { return x; }); case 1 : var n = next(/* () */0); return (function (obj) { return obj[n]; }); case 2 : var e = next(/* () */0); var n$1 = next(/* () */0); var e$1 = e; var n$2 = n$1; return (function (obj) { return obj[e$1][n$2]; }); case 3 : var n$3 = next(/* () */0); return (function (obj) { return Curry._1(obj[0][n$3], obj); }); case 4 : var n$4 = next(/* () */0); return (function (obj, x) { obj[n$4] = x; return /* () */0; }); case 5 : var f = next(/* () */0); var x$1 = next(/* () */0); return (function (obj) { return Curry._1(f, x$1); }); case 6 : var f$1 = next(/* () */0); var n$5 = next(/* () */0); return (function (obj) { return Curry._1(f$1, obj[n$5]); }); case 7 : var f$2 = next(/* () */0); var e$2 = next(/* () */0); var n$6 = next(/* () */0); var f$3 = f$2; var e$3 = e$2; var n$7 = n$6; return (function (obj) { return Curry._1(f$3, obj[e$3][n$7]); }); case 8 : var f$4 = next(/* () */0); var n$8 = next(/* () */0); var f$5 = f$4; var n$9 = n$8; return (function (obj) { return Curry._1(f$5, Curry._1(obj[0][n$9], obj)); }); case 9 : var f$6 = next(/* () */0); var x$2 = next(/* () */0); var y = next(/* () */0); return (function (obj) { return Curry._2(f$6, x$2, y); }); case 10 : 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 Curry._2(f$8, x$4, obj[n$11]); }); case 11 : var f$9 = next(/* () */0); var x$5 = next(/* () */0); var e$4 = next(/* () */0); var n$12 = next(/* () */0); var f$10 = f$9; var x$6 = x$5; var e$5 = e$4; var n$13 = n$12; return (function (obj) { return Curry._2(f$10, x$6, obj[e$5][n$13]); }); case 12 : 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 Curry._2(f$12, x$8, Curry._1(obj[0][n$15], obj)); }); case 13 : 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 Curry._2(f$14, obj[n$17], x$10); }); case 14 : var f$15 = next(/* () */0); var e$6 = next(/* () */0); var n$18 = next(/* () */0); var x$11 = next(/* () */0); var f$16 = f$15; var e$7 = e$6; var n$19 = n$18; var x$12 = x$11; return (function (obj) { return Curry._2(f$16, obj[e$7][n$19], x$12); }); case 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 Curry._2(f$18, Curry._1(obj[0][n$21], obj), x$14); }); case 16 : var n$22 = next(/* () */0); var x$15 = next(/* () */0); var n$23 = n$22; var x$16 = x$15; return (function (obj) { return Curry._2(obj[0][n$23], obj, x$16); }); case 17 : var n$24 = next(/* () */0); var m = next(/* () */0); var n$25 = n$24; var m$1 = m; return (function (obj) { return Curry._2(obj[0][n$25], obj, obj[m$1]); }); case 18 : var n$26 = next(/* () */0); var e$8 = next(/* () */0); var m$2 = next(/* () */0); var n$27 = n$26; var e$9 = e$8; var m$3 = m$2; return (function (obj) { return Curry._2(obj[0][n$27], obj, obj[e$9][m$3]); }); case 19 : var n$28 = next(/* () */0); var m$4 = next(/* () */0); var n$29 = n$28; var m$5 = m$4; return (function (obj) { return Curry._2(obj[0][n$29], obj, Curry._1(obj[0][m$5], obj)); }); case 20 : var m$6 = next(/* () */0); var x$17 = next(/* () */0); var m$7 = m$6; var x$18 = x$17; new_cache(table); return (function (obj) { return Curry._1(Curry._3(Caml_oo.caml_get_public_method, x$18, m$7, 1), x$18); }); case 21 : var m$8 = next(/* () */0); var n$30 = next(/* () */0); var m$9 = m$8; var n$31 = n$30; new_cache(table); return (function (obj) { var tmp = obj[n$31]; return Curry._1(Curry._3(Caml_oo.caml_get_public_method, tmp, m$9, 2), tmp); }); case 22 : var m$10 = next(/* () */0); var e$10 = next(/* () */0); var n$32 = next(/* () */0); var m$11 = m$10; var e$11 = e$10; var n$33 = n$32; new_cache(table); return (function (obj) { var tmp = obj[e$11][n$33]; return Curry._1(Curry._3(Caml_oo.caml_get_public_method, tmp, m$11, 3), tmp); }); case 23 : var m$12 = next(/* () */0); var n$34 = next(/* () */0); var m$13 = m$12; var n$35 = n$34; new_cache(table); return (function (obj) { var tmp = Curry._1(obj[0][n$35], obj); return Curry._1(Curry._3(Caml_oo.caml_get_public_method, tmp, m$13, 4), tmp); }); } } else { return clo; } } function set_methods(table, methods) { var len = methods.length; var i = /* record */[/* contents */0]; while(i[0] < len) { var label = Caml_array.caml_array_get(methods, i[0]); var clo = method_impl(table, i, methods); set_method(table, label, clo); i[0] = i[0] + 1 | 0; }; return /* () */0; } function stats(param) { return /* record */[ /* classes */table_count[0], /* methods */method_count[0], /* inst_vars */inst_var_count[0] ]; } exports.public_method_label = public_method_label; exports.new_method = new_method; exports.new_variable = new_variable; exports.new_methods_variables = new_methods_variables; exports.get_variable = get_variable; exports.get_variables = get_variables; exports.get_method_label = get_method_label; exports.get_method_labels = get_method_labels; exports.get_method = get_method; exports.set_method = set_method; exports.set_methods = set_methods; exports.narrow = narrow; exports.widen = widen; exports.add_initializer = add_initializer; exports.dummy_table = dummy_table; exports.create_table = create_table; exports.init_class = init_class; exports.inherits = inherits; exports.make_class = make_class; exports.make_class_store = make_class_store; exports.copy = copy; exports.create_object = create_object; exports.create_object_opt = create_object_opt; exports.run_initializers = run_initializers; exports.run_initializers_opt = run_initializers_opt; exports.create_object_and_run_initializers = create_object_and_run_initializers; exports.lookup_tables = lookup_tables; exports.params = params; exports.stats = stats; /* No side effect */