Skip to content

Commit 1e14f41

Browse files
committedAug 19, 2019
Make lazy value generation explicit instead of generating a magic number
1 parent 6579130 commit 1e14f41

21 files changed

+227
-137
lines changed
 

‎jscomp/core/lam_analysis.ml

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ let rec no_side_effects (lam : Lam.t) : bool =
6363
| "caml_obj_dup"
6464
| "caml_array_dup"
6565
| "caml_obj_block"
66+
| "caml_lazy_make"
6667
), _ -> true
6768
| "caml_ml_open_descriptor_in", [Lconst ( (Const_int 0))] -> true
6869
| "caml_ml_open_descriptor_out",

‎jscomp/core/lam_constant_convert.ml

+3
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,12 @@ let rec convert_constant ( const : Lambda.structured_constant) : Lam_constant.t
7777
| Blk_extension_slot ->
7878
let t : Lam_tag_info.t = Blk_extension_slot in
7979
Const_block (i,t, Ext_list.map xs convert_constant )
80+
| Blk_lazy_general
81+
| Blk_lazy_forward
8082
| Blk_na ->
8183
let t : Lam_tag_info.t = Blk_na in
8284
Const_block (i,t, Ext_list.map xs convert_constant )
85+
8386
#if OCAML_VERSION =~ ">4.03.0" then
8487
| Blk_record_inlined (s,ctor,ix) ->
8588
let t : Lam_tag_info.t = Blk_record_inlined (s, ctor,ix) in

‎jscomp/core/lam_convert.ml

+8-1
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ let lam_prim ~primitive:( p : Lambda.primitive) ~args loc : Lam.t =
219219
| Blk_record s ->
220220
let info : Lam_tag_info.t = Blk_record s in
221221
prim ~primitive:(Pmakeblock (tag,info,mutable_flag)) ~args loc
222+
222223
#if OCAML_VERSION =~ ">4.03.0" then
223224
| Blk_record_inlined (s,ctor,i) ->
224225
let info : Lam_tag_info.t = Blk_record_inlined (s, ctor,i) in
@@ -243,7 +244,13 @@ let lam_prim ~primitive:( p : Lambda.primitive) ~args loc : Lam.t =
243244
#end
244245
prim ~primitive:(Pmakeblock (tag,info,mutable_flag)) ~args loc
245246
)
246-
247+
| Blk_lazy_general
248+
->
249+
prim
250+
~primitive:(Pccall {prim_name="caml_lazy_make"; prim_arity = 1; prim_native_name = ""})
251+
~args loc
252+
| Blk_lazy_forward
253+
247254
| Blk_na ->
248255
let info : Lam_tag_info.t = Blk_na in
249256
prim ~primitive:(Pmakeblock (tag,info,mutable_flag)) ~args loc

‎jscomp/core/lam_dispatch_primitive.ml

+1
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ let translate loc (prim_name : string)
737737
| "caml_update_dummy"
738738
| "caml_obj_truncate"
739739
| "caml_lazy_make_forward"
740+
| "caml_lazy_make"
740741
->
741742
call Js_runtime_modules.obj_runtime
742743

‎jscomp/runtime/caml_obj.ml

+6
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ let caml_obj_truncate (x : Caml_obj_extern.t) (new_size : int) =
105105

106106
let caml_lazy_make_forward x = lazy x
107107

108+
let caml_lazy_make (fn : _ -> _) =
109+
let block = Caml_obj_extern.repr [|fn|] in
110+
Caml_obj_extern.set_tag block 246 (* Obj.lazy_tag*);
111+
block
112+
113+
108114
(**
109115
For the empty dummy object, whether it's
110116
[[]] or [{}] depends on how

‎jscomp/runtime/caml_obj.mli

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ val caml_obj_truncate : Caml_obj_extern.t -> int -> unit
4141

4242
val caml_lazy_make_forward : 'a -> 'a lazy_t
4343

44+
val caml_lazy_make :
45+
(t -> t) ->
46+
t
47+
4448
val caml_update_dummy : Caml_obj_extern.t -> Caml_obj_extern.t -> unit
4549

4650

‎jscomp/test/ext_filename_test.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var Bytes = require("../../lib/js/bytes.js");
77
var Curry = require("../../lib/js/curry.js");
88
var Format = require("../../lib/js/format.js");
99
var $$String = require("../../lib/js/string.js");
10+
var Caml_obj = require("../../lib/js/caml_obj.js");
1011
var Caml_sys = require("../../lib/js/caml_sys.js");
1112
var Filename = require("../../lib/js/filename.js");
1213
var Caml_bytes = require("../../lib/js/caml_bytes.js");
@@ -25,9 +26,9 @@ var node_parent = "..";
2526

2627
var node_current = ".";
2728

28-
var cwd = Block.__(246, [(function (param) {
29+
var cwd = Caml_obj.caml_lazy_make((function (param) {
2930
return Caml_sys.caml_sys_getcwd(/* () */0);
30-
})]);
31+
}));
3132

3233
function path_as_directory(x) {
3334
if (x === "" || Ext_string_test.ends_with(x, Filename.dir_sep)) {
@@ -234,13 +235,13 @@ function find_package_json_dir(cwd) {
234235
return find_root_filename(cwd, Test_literals.bsconfig_json);
235236
}
236237

237-
var package_dir = Block.__(246, [(function (param) {
238+
var package_dir = Caml_obj.caml_lazy_make((function (param) {
238239
var tag = cwd.tag | 0;
239240
var cwd$1 = tag === 250 ? cwd[0] : (
240241
tag === 246 ? CamlinternalLazy.force_lazy_block(cwd) : cwd
241242
);
242243
return find_root_filename(cwd$1, Test_literals.bsconfig_json);
243-
})]);
244+
}));
244245

245246
function module_name_of_file(file) {
246247
var s = Filename.chop_extension(Curry._1(Filename.basename, file));

‎jscomp/test/gpr_3697_test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
'use strict';
22

3-
var Block = require("../../lib/js/block.js");
3+
var Caml_obj = require("../../lib/js/caml_obj.js");
44
var CamlinternalLazy = require("../../lib/js/camlinternalLazy.js");
55

66
function fix(param) {
7-
return /* Fix */[Block.__(246, [(function (param) {
7+
return /* Fix */[Caml_obj.caml_lazy_make((function (param) {
88
return fix(/* () */0);
9-
})])];
9+
}))];
1010
}
1111

1212
function unfixLeak(_param) {

‎jscomp/test/hamming_test.js

+46-54
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ function pr(param) {
133133
}
134134

135135
function map(f, l) {
136-
return Block.__(246, [(function (param) {
136+
return Caml_obj.caml_lazy_make((function (param) {
137137
var tag = l.tag | 0;
138138
var match = tag === 250 ? l[0] : (
139139
tag === 246 ? CamlinternalLazy.force_lazy_block(l) : l
@@ -142,11 +142,11 @@ function map(f, l) {
142142
Curry._1(f, match[0]),
143143
map(f, match[1])
144144
];
145-
})]);
145+
}));
146146
}
147147

148148
function merge(cmp, l1, l2) {
149-
return Block.__(246, [(function (param) {
149+
return Caml_obj.caml_lazy_make((function (param) {
150150
var tag = l1.tag | 0;
151151
var match = tag === 250 ? l1[0] : (
152152
tag === 246 ? CamlinternalLazy.force_lazy_block(l1) : l1
@@ -176,7 +176,7 @@ function merge(cmp, l1, l2) {
176176
merge(cmp, l1, ll2)
177177
];
178178
}
179-
})]);
179+
}));
180180
}
181181

182182
function iter_interval(f, _l, _param) {
@@ -205,56 +205,48 @@ function iter_interval(f, _l, _param) {
205205
};
206206
}
207207

208-
var hamming = [];
209-
210-
var ham2 = [];
211-
212-
var ham3 = [];
213-
214-
var ham5 = [];
215-
216-
Caml_obj.caml_update_dummy(hamming, Block.__(246, [(function (param) {
217-
return /* Cons */[
218-
nn1,
219-
merge(cmp, ham2, merge(cmp, ham3, ham5))
220-
];
221-
})]));
222-
223-
Caml_obj.caml_update_dummy(ham2, Block.__(246, [(function (param) {
224-
var lzarg = map(x2, hamming);
225-
var tag = lzarg.tag | 0;
226-
if (tag === 250) {
227-
return lzarg[0];
228-
} else if (tag === 246) {
229-
return CamlinternalLazy.force_lazy_block(lzarg);
230-
} else {
231-
return lzarg;
232-
}
233-
})]));
234-
235-
Caml_obj.caml_update_dummy(ham3, Block.__(246, [(function (param) {
236-
var lzarg = map(x3, hamming);
237-
var tag = lzarg.tag | 0;
238-
if (tag === 250) {
239-
return lzarg[0];
240-
} else if (tag === 246) {
241-
return CamlinternalLazy.force_lazy_block(lzarg);
242-
} else {
243-
return lzarg;
244-
}
245-
})]));
246-
247-
Caml_obj.caml_update_dummy(ham5, Block.__(246, [(function (param) {
248-
var lzarg = map(x5, hamming);
249-
var tag = lzarg.tag | 0;
250-
if (tag === 250) {
251-
return lzarg[0];
252-
} else if (tag === 246) {
253-
return CamlinternalLazy.force_lazy_block(lzarg);
254-
} else {
255-
return lzarg;
256-
}
257-
})]));
208+
var hamming = Caml_obj.caml_lazy_make((function (param) {
209+
return /* Cons */[
210+
nn1,
211+
merge(cmp, ham2, merge(cmp, ham3, ham5))
212+
];
213+
}));
214+
215+
var ham2 = Caml_obj.caml_lazy_make((function (param) {
216+
var lzarg = map(x2, hamming);
217+
var tag = lzarg.tag | 0;
218+
if (tag === 250) {
219+
return lzarg[0];
220+
} else if (tag === 246) {
221+
return CamlinternalLazy.force_lazy_block(lzarg);
222+
} else {
223+
return lzarg;
224+
}
225+
}));
226+
227+
var ham3 = Caml_obj.caml_lazy_make((function (param) {
228+
var lzarg = map(x3, hamming);
229+
var tag = lzarg.tag | 0;
230+
if (tag === 250) {
231+
return lzarg[0];
232+
} else if (tag === 246) {
233+
return CamlinternalLazy.force_lazy_block(lzarg);
234+
} else {
235+
return lzarg;
236+
}
237+
}));
238+
239+
var ham5 = Caml_obj.caml_lazy_make((function (param) {
240+
var lzarg = map(x5, hamming);
241+
var tag = lzarg.tag | 0;
242+
if (tag === 250) {
243+
return lzarg[0];
244+
} else if (tag === 246) {
245+
return CamlinternalLazy.force_lazy_block(lzarg);
246+
} else {
247+
return lzarg;
248+
}
249+
}));
258250

259251
iter_interval(pr, hamming, /* tuple */[
260252
88000,

‎jscomp/test/lazy_test.js

+34-10
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
var Mt = require("./mt.js");
44
var Lazy = require("../../lib/js/lazy.js");
55
var Block = require("../../lib/js/block.js");
6+
var Caml_obj = require("../../lib/js/caml_obj.js");
67
var CamlinternalLazy = require("../../lib/js/camlinternalLazy.js");
78
var Caml_js_exceptions = require("../../lib/js/caml_js_exceptions.js");
89
var Caml_builtin_exceptions = require("../../lib/js/caml_builtin_exceptions.js");
910

1011
var u = /* record */[/* contents */3];
1112

12-
var v = Block.__(246, [(function (param) {
13+
var v = Caml_obj.caml_lazy_make((function (param) {
1314
u[0] = 32;
1415
return /* () */0;
15-
})]);
16+
}));
1617

1718
function lazy_test(param) {
1819
var h = u[0];
@@ -69,15 +70,15 @@ function f(param) {
6970

7071
var s = /* record */[/* contents */undefined];
7172

72-
var set_true = Block.__(246, [(function (param) {
73+
var set_true = Caml_obj.caml_lazy_make((function (param) {
7374
s[0] = 1;
7475
return /* () */0;
75-
})]);
76+
}));
7677

77-
var set_false = Block.__(246, [(function (param) {
78+
var set_false = Caml_obj.caml_lazy_make((function (param) {
7879
s[0] = undefined;
7980
return /* () */0;
80-
})]);
81+
}));
8182

8283
var h;
8384

@@ -99,10 +100,10 @@ catch (raw_exn){
99100

100101
var u_v = /* record */[/* contents */0];
101102

102-
var u$1 = Block.__(246, [(function (param) {
103+
var u$1 = Caml_obj.caml_lazy_make((function (param) {
103104
u_v[0] = 2;
104105
return /* () */0;
105-
})]);
106+
}));
106107

107108
var tag = u$1.tag | 0;
108109

@@ -128,11 +129,30 @@ var l_from_fun = Lazy.from_fun((function (param) {
128129
return 3;
129130
}));
130131

131-
var forward_test = Block.__(246, [(function (param) {
132+
var forward_test = Caml_obj.caml_lazy_make((function (param) {
132133
var u = 3;
133134
u = u + 1 | 0;
134135
return u;
135-
})]);
136+
}));
137+
138+
var f005 = Caml_obj.caml_lazy_make((function (param) {
139+
return 6;
140+
}));
141+
142+
var f006 = Caml_obj.caml_lazy_make((function (param) {
143+
return (function (param) {
144+
return 3;
145+
});
146+
}));
147+
148+
var f007 = Caml_obj.caml_lazy_make((function (param) {
149+
throw Caml_builtin_exceptions.not_found;
150+
}));
151+
152+
var f008 = Caml_obj.caml_lazy_make((function (param) {
153+
console.log("hi");
154+
throw Caml_builtin_exceptions.not_found;
155+
}));
136156

137157
Mt.from_pair_suites("Lazy_test", /* :: */[
138158
/* tuple */[
@@ -252,4 +272,8 @@ exports.u = u$1;
252272
exports.exotic = exotic;
253273
exports.l_from_fun = l_from_fun;
254274
exports.forward_test = forward_test;
275+
exports.f005 = f005;
276+
exports.f006 = f006;
277+
exports.f007 = f007;
278+
exports.f008 = f008;
255279
/* h Not a pure module */

‎jscomp/test/lazy_test.ml

+9
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ function lazy y -> y
4242
let l_from_fun = Lazy.from_fun (fun _ -> 3 )
4343
let forward_test = (lazy (let u = ref 3 in incr u; !u))
4444
(* module Mt = Mock_mt *)
45+
46+
let f005 = lazy (1 + 2 + 3)
47+
48+
let f006 = lazy (let x=3 in fun _ -> x)
49+
50+
let f007 = lazy (raise Not_found)
51+
let f008 = lazy(print_endline "hi"; raise Not_found)
52+
53+
4554
;; Mt.from_pair_suites __MODULE__ Mt.[
4655
"simple", (fun _ ->
4756
Eq ((lazy_test ()) ,(3, 32))

‎jscomp/test/ocaml_parsetree_test.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -2397,12 +2397,12 @@ function symbol_docs(param) {
23972397
function symbol_docs_lazy(param) {
23982398
var p1 = Parsing.symbol_start_pos(/* () */0);
23992399
var p2 = Parsing.symbol_end_pos(/* () */0);
2400-
return Block.__(246, [(function (param) {
2400+
return Caml_obj.caml_lazy_make((function (param) {
24012401
return /* record */[
24022402
/* docs_pre */get_pre_docs(p1),
24032403
/* docs_post */get_post_docs(p2)
24042404
];
2405-
})]);
2405+
}));
24062406
}
24072407

24082408
function mark_symbol_docs(param) {
@@ -2417,9 +2417,9 @@ function mark_rhs_docs(pos1, pos2) {
24172417

24182418
function symbol_text_lazy(param) {
24192419
var pos = Parsing.symbol_start_pos(/* () */0);
2420-
return Block.__(246, [(function (param) {
2420+
return Caml_obj.caml_lazy_make((function (param) {
24212421
return get_text(pos);
2422-
})]);
2422+
}));
24232423
}
24242424

24252425
function init(param) {

0 commit comments

Comments
 (0)
Please sign in to comment.