Skip to content

Commit fca887d

Browse files
Bob Fangbobzhang
Bob Fang
authored andcommitted
* Issue rescript-lang#1351 : bug fix * Issue rescript-lang#1351 : bug fix * Issue rescript-lang#1351 : intercept Parrayrefs and Parraysets
1 parent 02e63d8 commit fca887d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+989
-746
lines changed

jscomp/bin/all_ounit_tests.i.ml

+402-234
Large diffs are not rendered by default.

jscomp/bin/whole_compiler.ml

+12-9
Original file line numberDiff line numberDiff line change
@@ -69099,7 +69099,7 @@ let small_int i : t =
6909969099
| i -> int (Int32.of_int i)
6910069100

6910169101

69102-
let access ?comment (e0 : t) (e1 : t) : t =
69102+
let access ?comment (e0 : t) (e1 : t) : t =
6910369103
match e0.expression_desc, e1.expression_desc with
6910469104
| Array (l,_mutable_flag) , Number (Int {i; _}) when no_side_effect e0->
6910569105
List.nth l (Int32.to_int i) (* Float i -- should not appear here *)
@@ -88083,7 +88083,6 @@ val set_array : J.expression -> J.expression -> J.expression -> J.expression
8808388083
*)
8808488084

8808588085
val ref_array : J.expression -> J.expression -> J.expression
88086-
8808788086
end = struct
8808888087
#1 "js_of_lam_array.ml"
8808988088
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -88155,7 +88154,6 @@ let set_array e e0 e1 =
8815588154

8815688155
let ref_array e e0 =
8815788156
E.access e e0
88158-
8815988157
end
8816088158
module Js_of_lam_record : sig
8816188159
#1 "js_of_lam_record.mli"
@@ -91235,7 +91233,8 @@ let translate (prim_name : string)
9123591233
| _ -> assert false
9123691234
end
9123791235

91238-
| "caml_array_get"
91236+
| "caml_array_get" ->
91237+
call Js_config.array
9123991238
| "caml_array_get_addr"
9124091239
| "caml_array_get_float"
9124191240
| "caml_array_unsafe_get"
@@ -91244,7 +91243,8 @@ let translate (prim_name : string)
9124491243
| [e0;e1] -> Js_of_lam_array.ref_array e0 e1
9124591244
| _ -> assert false
9124691245
end
91247-
| "caml_array_set"
91246+
| "caml_array_set" ->
91247+
call Js_config.array
9124891248
| "caml_array_set_addr"
9124991249
| "caml_array_set_float"
9125091250
| "caml_array_unsafe_set"
@@ -92609,20 +92609,23 @@ let translate loc
9260992609
(Int32.of_int i)
9261092610
| _ -> assert false
9261192611
end
92612-
| Parrayrefu _kind
92613-
| Parrayrefs _kind ->
92612+
| Parrayrefu _kind ->
9261492613
begin match args with
9261592614
| [e;e1] -> Js_of_lam_array.ref_array e e1 (* Todo: Constant Folding *)
9261692615
| _ -> assert false
9261792616
end
92617+
| Parrayrefs _kind ->
92618+
Lam_dispatch_primitive.translate "caml_array_get" args
9261892619
| Pmakearray kind ->
9261992620
Js_of_lam_array.make_array Mutable kind args
92620-
| Parraysetu _kind
92621-
| Parraysets _kind ->
92621+
| Parraysetu _kind ->
9262292622
begin match args with (* wrong*)
9262392623
| [e;e0;e1] -> decorate_side_effect cxt @@ Js_of_lam_array.set_array e e0 e1
9262492624
| _ -> assert false
9262592625
end
92626+
92627+
| Parraysets _kind ->
92628+
Lam_dispatch_primitive.translate "caml_array_set" args
9262692629
| Pccall prim ->
9262792630
Lam_dispatch_primitive.translate prim.prim_name args
9262892631
(* Lam_compile_external_call.translate loc cxt prim args *)

jscomp/core/js_exp_make.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ let small_int i : t =
293293
| i -> int (Int32.of_int i)
294294

295295

296-
let access ?comment (e0 : t) (e1 : t) : t =
296+
let access ?comment (e0 : t) (e1 : t) : t =
297297
match e0.expression_desc, e1.expression_desc with
298298
| Array (l,_mutable_flag) , Number (Int {i; _}) when no_side_effect e0->
299299
List.nth l (Int32.to_int i) (* Float i -- should not appear here *)

jscomp/core/js_of_lam_array.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,4 @@ let set_array e e0 e1 =
6666
E.assign (E.access e e0) e1
6767

6868
let ref_array e e0 =
69-
E.access e e0
69+
E.access e e0

jscomp/core/js_of_lam_array.mli

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ val set_array : J.expression -> J.expression -> J.expression -> J.expression
3939
In the future, we might used TypedArray for FloatArray
4040
*)
4141

42-
val ref_array : J.expression -> J.expression -> J.expression
42+
val ref_array : J.expression -> J.expression -> J.expression

jscomp/core/lam_compile_primitive.ml

+7-4
Original file line numberDiff line numberDiff line change
@@ -640,20 +640,23 @@ let translate loc
640640
(Int32.of_int i)
641641
| _ -> assert false
642642
end
643-
| Parrayrefu _kind
644-
| Parrayrefs _kind ->
643+
| Parrayrefu _kind ->
645644
begin match args with
646645
| [e;e1] -> Js_of_lam_array.ref_array e e1 (* Todo: Constant Folding *)
647646
| _ -> assert false
648647
end
648+
| Parrayrefs _kind ->
649+
Lam_dispatch_primitive.translate "caml_array_get" args
649650
| Pmakearray kind ->
650651
Js_of_lam_array.make_array Mutable kind args
651-
| Parraysetu _kind
652-
| Parraysets _kind ->
652+
| Parraysetu _kind ->
653653
begin match args with (* wrong*)
654654
| [e;e0;e1] -> decorate_side_effect cxt @@ Js_of_lam_array.set_array e e0 e1
655655
| _ -> assert false
656656
end
657+
658+
| Parraysets _kind ->
659+
Lam_dispatch_primitive.translate "caml_array_set" args
657660
| Pccall prim ->
658661
Lam_dispatch_primitive.translate prim.prim_name args
659662
(* Lam_compile_external_call.translate loc cxt prim args *)

jscomp/core/lam_dispatch_primitive.ml

+4-2
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ let translate (prim_name : string)
147147
| _ -> assert false
148148
end
149149

150-
| "caml_array_get"
150+
| "caml_array_get" ->
151+
call Js_config.array
151152
| "caml_array_get_addr"
152153
| "caml_array_get_float"
153154
| "caml_array_unsafe_get"
@@ -156,7 +157,8 @@ let translate (prim_name : string)
156157
| [e0;e1] -> Js_of_lam_array.ref_array e0 e1
157158
| _ -> assert false
158159
end
159-
| "caml_array_set"
160+
| "caml_array_set" ->
161+
call Js_config.array
160162
| "caml_array_set_addr"
161163
| "caml_array_set_float"
162164
| "caml_array_unsafe_set"

jscomp/runtime/caml_array.ml

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ external append : 'a array -> 'a array -> 'a array = "concat" [@@bs.send]
3030

3131
external make : int -> 'a -> 'a array = "caml_make_vect"
3232

33-
3433
let caml_array_sub (x : 'a array) (offset : int) (len : int) =
3534
let result = new_uninitialized len in
3635
let j = ref 0 and i = ref offset in

jscomp/runtime/caml_array.mli

+4
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ val caml_array_concat : 'a array list -> 'a array
3636
val caml_make_vect : int -> 'a -> 'a array
3737

3838
val caml_array_blit : 'a array -> int -> 'a array -> int -> int -> unit
39+
40+
val caml_array_get: 'a array -> int -> 'a
41+
42+
val caml_array_set: 'a array -> int -> 'a -> unit

jscomp/test/array_safe_get.js

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/test/array_safe_get.ml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
let x = [|1; 2|]
2+
let y = try Array.get x 3 with
3+
Invalid_argument msg -> print_endline msg; 0

jscomp/test/array_subtle_test.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
var Mt = require("./mt");
44
var Block = require("../../lib/js/block");
5+
var Caml_array = require("../../lib/js/caml_array");
56
var Js_primitive = require("../../lib/js/js_primitive");
67

78
var suites = [/* [] */0];
@@ -56,14 +57,14 @@ eq('File "array_subtle_test.ml", line 17, characters 5-12', /* tuple */[
5657

5758
eq('File "array_subtle_test.ml", line 21, characters 5-12', /* tuple */[
5859
3,
59-
v[2]
60+
Caml_array.caml_array_get(v, 2)
6061
]);
6162

62-
v[2] = 4;
63+
Caml_array.caml_array_set(v, 2, 4);
6364

6465
eq('File "array_subtle_test.ml", line 23, characters 5-12', /* tuple */[
6566
4,
66-
v[2]
67+
Caml_array.caml_array_get(v, 2)
6768
]);
6869

6970
while(v.length > 0) {

jscomp/test/array_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function is_sorted(x) {
1515
if (i >= (len - 1 | 0)) {
1616
return /* true */1;
1717
}
18-
else if (Caml_obj.caml_lessthan(x[i], x[i + 1 | 0])) {
18+
else if (Caml_obj.caml_lessthan(Caml_array.caml_array_get(x, i), Caml_array.caml_array_get(x, i + 1 | 0))) {
1919
_i = i + 1 | 0;
2020
continue ;
2121

jscomp/test/bdd.js

+32-33
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function $$eval(_bdd, vars) {
1515
return /* true */1;
1616
}
1717
}
18-
else if (vars[bdd[1]]) {
18+
else if (Caml_array.caml_array_get(vars, bdd[1])) {
1919
_bdd = bdd[3];
2020
continue ;
2121

@@ -75,10 +75,10 @@ function resize(newSize) {
7575
}
7676
else {
7777
var ind = hashVal(getId(n[0]), getId(n[3]), n[1]) & newSz_1;
78-
newArr[ind] = /* :: */[
79-
n,
80-
newArr[ind]
81-
];
78+
Caml_array.caml_array_set(newArr, ind, /* :: */[
79+
n,
80+
Caml_array.caml_array_get(newArr, ind)
81+
]);
8282
_bucket = bucket[1];
8383
continue ;
8484

@@ -90,7 +90,7 @@ function resize(newSize) {
9090
};
9191
};
9292
for(var n = 0 ,n_finish = sz_1[0]; n <= n_finish; ++n){
93-
copyBucket(arr[n]);
93+
copyBucket(Caml_array.caml_array_get(arr, n));
9494
}
9595
htab[0] = newArr;
9696
sz_1[0] = newSz_1;
@@ -99,20 +99,19 @@ function resize(newSize) {
9999

100100
function insert(idl, idh, v, ind, bucket, newNode) {
101101
if (n_items[0] <= sz_1[0]) {
102-
htab[0][ind] = /* :: */[
103-
newNode,
104-
bucket
105-
];
102+
Caml_array.caml_array_set(htab[0], ind, /* :: */[
103+
newNode,
104+
bucket
105+
]);
106106
return n_items[0] = n_items[0] + 1 | 0;
107107
}
108108
else {
109109
resize((sz_1[0] + sz_1[0] | 0) + 2 | 0);
110110
var ind$1 = hashVal(idl, idh, v) & sz_1[0];
111-
htab[0][ind$1] = /* :: */[
112-
newNode,
113-
htab[0][ind$1]
114-
];
115-
return /* () */0;
111+
return Caml_array.caml_array_set(htab[0], ind$1, /* :: */[
112+
newNode,
113+
Caml_array.caml_array_get(htab[0], ind$1)
114+
]);
116115
}
117116
}
118117

@@ -132,7 +131,7 @@ function mkNode(low, v, high) {
132131
}
133132
else {
134133
var ind = hashVal(idl, idh, v) & sz_1[0];
135-
var bucket = htab[0][ind];
134+
var bucket = Caml_array.caml_array_get(htab[0], ind);
136135
var _b = bucket;
137136
while(true) {
138137
var b = _b;
@@ -220,13 +219,13 @@ function not(n) {
220219
else {
221220
var id = n[2];
222221
var h = id % 1999;
223-
if (id === notslot1[h]) {
224-
return notslot2[h];
222+
if (id === Caml_array.caml_array_get(notslot1, h)) {
223+
return Caml_array.caml_array_get(notslot2, h);
225224
}
226225
else {
227226
var f = mkNode(not(n[0]), n[1], not(n[3]));
228-
notslot1[h] = id;
229-
notslot2[h] = f;
227+
Caml_array.caml_array_set(notslot1, h, id);
228+
Caml_array.caml_array_set(notslot2, h, f);
230229
return f;
231230
}
232231
}
@@ -260,8 +259,8 @@ function and2(n1, n2) {
260259
var v2 = n2[1];
261260
var l2 = n2[0];
262261
var h = hash(i1, i2);
263-
if (i1 === andslot1[h] && i2 === andslot2[h]) {
264-
return andslot3[h];
262+
if (i1 === Caml_array.caml_array_get(andslot1, h) && i2 === Caml_array.caml_array_get(andslot2, h)) {
263+
return Caml_array.caml_array_get(andslot3, h);
265264
}
266265
else {
267266
var match = cmpVar(v1, v2);
@@ -278,9 +277,9 @@ function and2(n1, n2) {
278277
break;
279278

280279
}
281-
andslot1[h] = i1;
282-
andslot2[h] = i2;
283-
andslot3[h] = f;
280+
Caml_array.caml_array_set(andslot1, h, i1);
281+
Caml_array.caml_array_set(andslot2, h, i2);
282+
Caml_array.caml_array_set(andslot3, h, f);
284283
return f;
285284
}
286285
}
@@ -315,8 +314,8 @@ function xor(n1, n2) {
315314
var v2 = n2[1];
316315
var l2 = n2[0];
317316
var h = hash(i1, i2);
318-
if (i1 === andslot1[h] && i2 === andslot2[h]) {
319-
return andslot3[h];
317+
if (i1 === Caml_array.caml_array_get(andslot1, h) && i2 === Caml_array.caml_array_get(andslot2, h)) {
318+
return Caml_array.caml_array_get(andslot3, h);
320319
}
321320
else {
322321
var match = cmpVar(v1, v2);
@@ -333,9 +332,9 @@ function xor(n1, n2) {
333332
break;
334333

335334
}
336-
andslot1[h] = i1;
337-
andslot2[h] = i2;
338-
andslot3[h] = f;
335+
Caml_array.caml_array_set(andslot1, h, i1);
336+
Caml_array.caml_array_set(andslot2, h, i2);
337+
Caml_array.caml_array_set(andslot3, h, f);
339338
return f;
340339
}
341340
}
@@ -372,7 +371,7 @@ function random() {
372371
function random_vars(n) {
373372
var vars = Caml_array.caml_make_vect(n, /* false */0);
374373
for(var i = 0 ,i_finish = n - 1 | 0; i <= i_finish; ++i){
375-
vars[i] = random(/* () */0);
374+
Caml_array.caml_array_set(vars, i, random(/* () */0));
376375
}
377376
return vars;
378377
}
@@ -397,12 +396,12 @@ function bool_equal(a, b) {
397396
function test_hwb(bdd, vars) {
398397
var ntrue = 0;
399398
for(var i = 0 ,i_finish = vars.length - 1 | 0; i <= i_finish; ++i){
400-
if (vars[i]) {
399+
if (Caml_array.caml_array_get(vars, i)) {
401400
ntrue = ntrue + 1 | 0;
402401
}
403402

404403
}
405-
return bool_equal($$eval(bdd, vars), ntrue > 0 ? vars[ntrue - 1 | 0] : /* false */0);
404+
return bool_equal($$eval(bdd, vars), ntrue > 0 ? Caml_array.caml_array_get(vars, ntrue - 1 | 0) : /* false */0);
406405
}
407406

408407
function main() {

0 commit comments

Comments
 (0)