Skip to content

Commit 0de10da

Browse files
authored
Merge pull request #4418 from BuckleScript/bump
clean up, add more test cases
2 parents 4824ebd + 1e2803c commit 0de10da

25 files changed

+178
-10640
lines changed

.npmignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ vendor/rollup.js
3636
package/
3737
*.tgz
3838
.nyc_output/
39-
themes
39+
themes
40+
vendor/js_of_ocaml.bc

jscomp/artifacts.json

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,6 @@
107107
"belt_SortArrayInt.js",
108108
"belt_SortArrayString.js",
109109
"belt.js",
110-
"bigarray.js",
111-
"block.js",
112110
"buffer.js",
113111
"bytes.js",
114112
"bytesLabels.js",
@@ -118,7 +116,6 @@
118116
"caml_bytes_extern.js",
119117
"caml_bytes.js",
120118
"caml_char.js",
121-
"caml_chrome_debugger.js",
122119
"caml_exceptions.js",
123120
"caml_external_polyfill.js",
124121
"caml_float_extern.js",
@@ -137,7 +134,6 @@
137134
"caml_md5.js",
138135
"caml_module.js",
139136
"caml_nativeint_extern.js",
140-
"caml_obj_extern.js",
141137
"caml_obj.js",
142138
"caml_oo_curry.js",
143139
"caml_oo.js",
@@ -149,7 +145,6 @@
149145
"caml_string.js",
150146
"caml_sys.js",
151147
"caml_undefined_extern.js",
152-
"caml_weak.js",
153148
"camlinternalBigarray.js",
154149
"camlinternalFormat.js",
155150
"camlinternalFormatBasics.js",
@@ -163,7 +158,6 @@
163158
"dom_storage.js",
164159
"dom_storage2.js",
165160
"dom.js",
166-
"ephemeron.js",
167161
"filename.js",
168162
"format.js",
169163
"gc.js",
@@ -217,7 +211,6 @@
217211
"node_process.js",
218212
"node.js",
219213
"obj.js",
220-
"oo.js",
221214
"parsing.js",
222215
"pervasives.js",
223216
"printexc.js",
@@ -237,8 +230,7 @@
237230
"sys.js",
238231
"uchar.js",
239232
"unix.js",
240-
"unixLabels.js",
241-
"weak.js"
233+
"unixLabels.js"
242234
],
243235
"lib/js": [
244236
"arg.js",
@@ -287,8 +279,6 @@
287279
"belt_SortArrayInt.js",
288280
"belt_SortArrayString.js",
289281
"belt.js",
290-
"bigarray.js",
291-
"block.js",
292282
"buffer.js",
293283
"bytes.js",
294284
"bytesLabels.js",
@@ -298,7 +288,6 @@
298288
"caml_bytes_extern.js",
299289
"caml_bytes.js",
300290
"caml_char.js",
301-
"caml_chrome_debugger.js",
302291
"caml_exceptions.js",
303292
"caml_external_polyfill.js",
304293
"caml_float_extern.js",
@@ -317,7 +306,6 @@
317306
"caml_md5.js",
318307
"caml_module.js",
319308
"caml_nativeint_extern.js",
320-
"caml_obj_extern.js",
321309
"caml_obj.js",
322310
"caml_oo_curry.js",
323311
"caml_oo.js",
@@ -329,7 +317,6 @@
329317
"caml_string.js",
330318
"caml_sys.js",
331319
"caml_undefined_extern.js",
332-
"caml_weak.js",
333320
"camlinternalBigarray.js",
334321
"camlinternalFormat.js",
335322
"camlinternalFormatBasics.js",
@@ -343,7 +330,6 @@
343330
"dom_storage.js",
344331
"dom_storage2.js",
345332
"dom.js",
346-
"ephemeron.js",
347333
"filename.js",
348334
"format.js",
349335
"gc.js",
@@ -397,7 +383,6 @@
397383
"node_process.js",
398384
"node.js",
399385
"obj.js",
400-
"oo.js",
401386
"parsing.js",
402387
"pervasives.js",
403388
"printexc.js",
@@ -417,8 +402,6 @@
417402
"sys.js",
418403
"uchar.js",
419404
"unix.js",
420-
"unixLabels.js",
421-
"weak.js"
422405
],
423406
"lib/ocaml": [
424407
"arg.cmi",

jscomp/runtime/release.ninja

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ build runtime/caml_hash_primitive.cmj : cc_cmi runtime/caml_hash_primitive.ml |
2929
build runtime/caml_hash_primitive.cmi : cc runtime/caml_hash_primitive.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
3030
build runtime/caml_int32.cmj : cc_cmi runtime/caml_int32.ml | runtime/caml_int32.cmi runtime/caml_nativeint_extern.cmj
3131
build runtime/caml_int32.cmi : cc runtime/caml_int32.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
32-
build runtime/caml_int64.cmj : cc_cmi runtime/caml_int64.ml | runtime/caml_float.cmj runtime/caml_float_extern.cmj runtime/caml_int64.cmi runtime/caml_nativeint_extern.cmj runtime/caml_primitive.cmj runtime/caml_string_extern.cmj runtime/js.cmj
32+
build runtime/caml_int64.cmj : cc_cmi runtime/caml_int64.ml | runtime/caml_float.cmj runtime/caml_float_extern.cmj runtime/caml_int64.cmi runtime/caml_nativeint_extern.cmj runtime/caml_string_extern.cmj runtime/js.cmj
3333
build runtime/caml_int64.cmi : cc runtime/caml_int64.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
34-
build runtime/caml_io.cmj : cc_cmi runtime/caml_io.ml | runtime/caml_io.cmi runtime/caml_string_extern.cmj runtime/caml_undefined_extern.cmj runtime/curry.cmj runtime/js.cmj
34+
build runtime/caml_io.cmj : cc_cmi runtime/caml_io.ml | runtime/caml_io.cmi runtime/caml_string_extern.cmj runtime/caml_undefined_extern.cmj runtime/js.cmj
3535
build runtime/caml_io.cmi : cc runtime/caml_io.mli | runtime/bs_stdlib_mini.cmi runtime/caml_undefined_extern.cmj runtime/js.cmi runtime/js.cmj
3636
build runtime/caml_lexer.cmj : cc_cmi runtime/caml_lexer.ml | runtime/caml_lexer.cmi
3737
build runtime/caml_lexer.cmi : cc runtime/caml_lexer.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
3838
build runtime/caml_md5.cmj : cc_cmi runtime/caml_md5.ml | runtime/caml_array_extern.cmj runtime/caml_char.cmj runtime/caml_int32_extern.cmj runtime/caml_md5.cmi runtime/caml_string_extern.cmj
3939
build runtime/caml_md5.cmi : cc runtime/caml_md5.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
4040
build runtime/caml_module.cmj : cc_cmi runtime/caml_module.ml | runtime/caml_array_extern.cmj runtime/caml_module.cmi runtime/caml_obj.cmj
4141
build runtime/caml_module.cmi : cc runtime/caml_module.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
42-
build runtime/caml_obj.cmj : cc_cmi runtime/caml_obj.ml | runtime/caml_array_extern.cmj runtime/caml_obj.cmi runtime/caml_primitive.cmj runtime/js.cmj
42+
build runtime/caml_obj.cmj : cc_cmi runtime/caml_obj.ml | runtime/caml_array_extern.cmj runtime/caml_obj.cmi runtime/js.cmj
4343
build runtime/caml_obj.cmi : cc runtime/caml_obj.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
44-
build runtime/caml_oo.cmj : cc_cmi runtime/caml_oo.ml | runtime/caml_array.cmj runtime/caml_array_extern.cmj runtime/caml_exceptions.cmj runtime/caml_oo.cmi
44+
build runtime/caml_oo.cmj : cc_cmi runtime/caml_oo.ml | runtime/caml_array_extern.cmj runtime/caml_exceptions.cmj runtime/caml_oo.cmi
4545
build runtime/caml_oo.cmi : cc runtime/caml_oo.mli | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
4646
build runtime/caml_option.cmj : cc_cmi runtime/caml_option.ml | runtime/caml_option.cmi runtime/caml_undefined_extern.cmj runtime/js.cmj
4747
build runtime/caml_option.cmi : cc runtime/caml_option.mli | runtime/bs_stdlib_mini.cmi runtime/caml_undefined_extern.cmj runtime/js.cmi runtime/js.cmj
@@ -63,10 +63,10 @@ build runtime/caml_external_polyfill.cmi runtime/caml_external_polyfill.cmj : cc
6363
build runtime/caml_float_extern.cmi runtime/caml_float_extern.cmj : cc runtime/caml_float_extern.ml | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
6464
build runtime/caml_int32_extern.cmi runtime/caml_int32_extern.cmj : cc runtime/caml_int32_extern.ml | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
6565
build runtime/caml_int64_extern.cmi runtime/caml_int64_extern.cmj : cc runtime/caml_int64_extern.ml | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
66-
build runtime/caml_js_exceptions.cmi runtime/caml_js_exceptions.cmj : cc runtime/caml_js_exceptions.ml | runtime/bs_stdlib_mini.cmi runtime/caml_exceptions.cmj runtime/caml_option.cmj runtime/js.cmi runtime/js.cmj
66+
build runtime/caml_js_exceptions.cmi runtime/caml_js_exceptions.cmj : cc runtime/caml_js_exceptions.ml | runtime/bs_stdlib_mini.cmi runtime/caml_exceptions.cmj runtime/js.cmi runtime/js.cmj
6767
build runtime/caml_nativeint_extern.cmi runtime/caml_nativeint_extern.cmj : cc runtime/caml_nativeint_extern.ml | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
6868
build runtime/caml_oo_curry.cmi runtime/caml_oo_curry.cmj : cc runtime/caml_oo_curry.ml | runtime/bs_stdlib_mini.cmi runtime/caml_oo.cmj runtime/curry.cmj runtime/js.cmi runtime/js.cmj
6969
build runtime/caml_string_extern.cmi runtime/caml_string_extern.cmj : cc runtime/caml_string_extern.ml | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
7070
build runtime/caml_undefined_extern.cmi runtime/caml_undefined_extern.cmj : cc runtime/caml_undefined_extern.ml | runtime/bs_stdlib_mini.cmi runtime/js.cmi runtime/js.cmj
71-
build runtime/curry.cmi runtime/curry.cmj : cc runtime/curry.ml | runtime/bs_stdlib_mini.cmi runtime/caml_array.cmj runtime/caml_array_extern.cmj runtime/js.cmi runtime/js.cmj
71+
build runtime/curry.cmi runtime/curry.cmj : cc runtime/curry.ml | runtime/bs_stdlib_mini.cmi runtime/caml_array_extern.cmj runtime/js.cmi runtime/js.cmj
7272
build runtime : phony runtime/bs_stdlib_mini.cmi runtime/js.cmj runtime/js.cmi runtime/caml_array.cmi runtime/caml_array.cmj runtime/caml_bytes.cmi runtime/caml_bytes.cmj runtime/caml_float.cmi runtime/caml_float.cmj runtime/caml_format.cmi runtime/caml_format.cmj runtime/caml_gc.cmi runtime/caml_gc.cmj runtime/caml_hash.cmi runtime/caml_hash.cmj runtime/caml_hash_primitive.cmi runtime/caml_hash_primitive.cmj runtime/caml_int32.cmi runtime/caml_int32.cmj runtime/caml_int64.cmi runtime/caml_int64.cmj runtime/caml_io.cmi runtime/caml_io.cmj runtime/caml_lexer.cmi runtime/caml_lexer.cmj runtime/caml_md5.cmi runtime/caml_md5.cmj runtime/caml_module.cmi runtime/caml_module.cmj runtime/caml_obj.cmi runtime/caml_obj.cmj runtime/caml_oo.cmi runtime/caml_oo.cmj runtime/caml_option.cmi runtime/caml_option.cmj runtime/caml_parser.cmi runtime/caml_parser.cmj runtime/caml_primitive.cmi runtime/caml_primitive.cmj runtime/caml_splice_call.cmi runtime/caml_splice_call.cmj runtime/caml_string.cmi runtime/caml_string.cmj runtime/caml_sys.cmi runtime/caml_sys.cmj runtime/caml_array_extern.cmi runtime/caml_array_extern.cmj runtime/caml_bytes_extern.cmi runtime/caml_bytes_extern.cmj runtime/caml_char.cmi runtime/caml_char.cmj runtime/caml_exceptions.cmi runtime/caml_exceptions.cmj runtime/caml_external_polyfill.cmi runtime/caml_external_polyfill.cmj runtime/caml_float_extern.cmi runtime/caml_float_extern.cmj runtime/caml_int32_extern.cmi runtime/caml_int32_extern.cmj runtime/caml_int64_extern.cmi runtime/caml_int64_extern.cmj runtime/caml_js_exceptions.cmi runtime/caml_js_exceptions.cmj runtime/caml_nativeint_extern.cmi runtime/caml_nativeint_extern.cmj runtime/caml_oo_curry.cmi runtime/caml_oo_curry.cmj runtime/caml_string_extern.cmi runtime/caml_string_extern.cmj runtime/caml_undefined_extern.cmi runtime/caml_undefined_extern.cmj runtime/curry.cmi runtime/curry.cmj

jscomp/test/build.ninja

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,7 @@ build test/tfloat_record_test.cmi test/tfloat_record_test.cmj : cc test/tfloat_r
704704
build test/ticker.cmi test/ticker.cmj : cc test/ticker.ml | $stdlib
705705
build test/to_string_test.cmi test/to_string_test.cmj : cc test/to_string_test.ml | test/mt.cmj $stdlib
706706
build test/topsort_test.cmi test/topsort_test.cmj : cc test/topsort_test.ml | $stdlib
707+
build test/tramp_fib.cmi test/tramp_fib.cmj : cc test/tramp_fib.ml | test/mt.cmj $stdlib
707708
build test/tscanf_test.cmi test/tscanf_test.cmj : cc test/tscanf_test.ml | test/mt.cmj test/mt_global.cmj test/testing.cmj $stdlib
708709
build test/tuple_alloc.cmi test/tuple_alloc.cmj : cc test/tuple_alloc.ml | $stdlib
709710
build test/typeof_test.cmi test/typeof_test.cmj : cc test/typeof_test.ml | test/mt.cmj $stdlib

jscomp/test/tramp_fib.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
'use strict';
2+
3+
var Mt = require("./mt.js");
4+
5+
var suites = {
6+
contents: /* [] */0
7+
};
8+
9+
var test_id = {
10+
contents: 0
11+
};
12+
13+
function eq(loc, x, y) {
14+
return Mt.eq_suites(test_id, suites, loc, x, y);
15+
}
16+
17+
function fib(n, k) {
18+
if (n === 0 || n === 1) {
19+
return k(1);
20+
} else {
21+
return {
22+
TAG: /* Suspend */1,
23+
_0: (function () {
24+
return fib(n - 1 | 0, (function (v0) {
25+
return fib(n - 2 | 0, (function (v1) {
26+
return k(v0 + v1 | 0);
27+
}));
28+
}));
29+
})
30+
};
31+
}
32+
}
33+
34+
var u = fib(10, (function (x) {
35+
return {
36+
TAG: /* Continue */0,
37+
_0: x
38+
};
39+
}));
40+
41+
function iter(_bounce) {
42+
while(true) {
43+
var bounce = _bounce;
44+
if (!bounce.TAG) {
45+
return bounce._0;
46+
}
47+
_bounce = bounce._0();
48+
continue ;
49+
};
50+
}
51+
52+
function isEven(n) {
53+
if (n !== 0) {
54+
if (n !== 1) {
55+
return {
56+
TAG: /* Suspend */1,
57+
_0: (function () {
58+
return isOdd(n - 1 | 0);
59+
})
60+
};
61+
} else {
62+
return {
63+
TAG: /* Continue */0,
64+
_0: false
65+
};
66+
}
67+
} else {
68+
return {
69+
TAG: /* Continue */0,
70+
_0: true
71+
};
72+
}
73+
}
74+
75+
function isOdd(n) {
76+
if (n !== 0) {
77+
if (n !== 1) {
78+
return isEven(n - 1 | 0);
79+
} else {
80+
return {
81+
TAG: /* Continue */0,
82+
_0: true
83+
};
84+
}
85+
} else {
86+
return {
87+
TAG: /* Continue */0,
88+
_0: false
89+
};
90+
}
91+
}
92+
93+
eq("File \"tramp_fib.ml\", line 56, characters 6-13", iter(u), 89);
94+
95+
eq("File \"tramp_fib.ml\", line 58, characters 6-13", iter(isEven(20000)), true);
96+
97+
Mt.from_pair_suites("File \"tramp_fib.ml\", line 60, characters 23-30", suites.contents);
98+
99+
exports.suites = suites;
100+
exports.test_id = test_id;
101+
exports.eq = eq;
102+
exports.fib = fib;
103+
exports.u = u;
104+
exports.iter = iter;
105+
exports.isEven = isEven;
106+
exports.isOdd = isOdd;
107+
/* u Not a pure module */

jscomp/test/tramp_fib.ml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
[@@@bs.config {flags = [|"-w";"a";"-bs-noassertfalse"|]}]
2+
3+
let suites : Mt.pair_suites ref = ref []
4+
let test_id = ref 0
5+
let eq loc x y = Mt.eq_suites ~test_id ~suites loc x y
6+
7+
8+
type 'a bounce = Continue of 'a | Suspend of (unit -> 'a bounce [@bs])
9+
(* https://eli.thegreenplace.net/2017/on-recursion-continuations-and-trampolines/ *)
10+
(* http://gallium.inria.fr/seminaires/transparents/20141027.Frederic.Bour.pdf *)
11+
(* http://www.usrsb.in/blog/blog/2012/08/12/bouncing-pythons-generators-with-a-trampoline/ *)
12+
(* http://glat.info/jscheck/tomrec.html *)
13+
let rec fib n k =
14+
match n with
15+
| 0 | 1 ->
16+
(* k (Continue 1) [@bs] *)
17+
(* Suspend (fun [@bs]() -> k (Continue 1 ) [@bs]) *)
18+
k 1 [@bs]
19+
| _ ->
20+
Suspend (fun [@bs] () ->
21+
fib (n-1) (fun [@bs] v0 ->
22+
fib (n-2) (fun [@bs] v1 ->
23+
k (v0 + v1) [@bs]
24+
(* match v0,v1 with
25+
| Continue v0, Continue v1 -> *)
26+
(* k (Continue (v0 + v1)) [@bs] *)
27+
(* Suspend (fun [@bs]() -> k (Continue (v0 + v1)) [@bs]) *)
28+
(* | _ -> assert false *)
29+
(* FIXME: this branch completly gone*)
30+
)
31+
)
32+
)
33+
34+
let u = fib 10 (fun [@bs] x -> Continue x)
35+
36+
37+
let rec iter (bounce : 'a bounce) : 'a =
38+
match bounce with
39+
| Continue v -> v
40+
| Suspend f -> iter (f () [@bs])
41+
42+
43+
(* first it needs to be tailcall *)
44+
let rec isEven n =
45+
match n with
46+
| 0 -> Continue true
47+
| 1 -> Continue false
48+
| _ -> Suspend (fun [@bs] () -> isOdd (n - 1))
49+
and isOdd n =
50+
match n with
51+
| 0 -> Continue false
52+
| 1 -> Continue true
53+
| _ ->
54+
isEven (n - 1)
55+
(* Suspend (fun [@bs] () -> isEven (n - 1)) *)
56+
;; eq __LOC__ (iter u) 89
57+
58+
;; eq __LOC__ (isEven 20_000 |. iter ) true
59+
60+
;; Mt.from_pair_suites __LOC__ !suites

0 commit comments

Comments
 (0)