Skip to content

Commit cd48b2f

Browse files
authored
flambda-backend: Fix camlinternalOO at -O3 with Flambda 2 (#132)
1 parent 9d85430 commit cd48b2f

File tree

1 file changed

+49
-38
lines changed

1 file changed

+49
-38
lines changed

stdlib/camlinternalOO.ml

+49-38
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,22 @@
1616

1717
open! Stdlib
1818

19-
[@@@ocaml.flambda_o3]
20-
2119
[@@@ocaml.inline 0]
2220
[@@@ocaml.afl_inst_ratio 0]
2321

24-
open Obj
22+
let magic x = Sys.opaque_identity (Obj.magic x)
23+
let of_repr x = Sys.opaque_identity (Obj.obj x)
24+
25+
let repr = Obj.repr
26+
let dup = Obj.dup
27+
let new_block = Obj.new_block
28+
let set_field = Obj.set_field
29+
30+
let set_object_field (arr : _ array) field new_value =
31+
Array.unsafe_set (Sys.opaque_identity arr) field new_value
32+
33+
let get_object_field (arr : _ array) field =
34+
Array.unsafe_get (Sys.opaque_identity arr) field
2535

2636
(**** Object representation ****)
2737

@@ -30,7 +40,7 @@ external set_id: 'a -> 'a = "caml_set_oo_id" [@@noalloc]
3040
(**** Object copy ****)
3141

3242
let copy o =
33-
let o = (Obj.obj (Obj.dup (Obj.repr o))) in
43+
let o = (of_repr (dup (repr o))) in
3444
set_id o
3545

3646
(**** Compression options ****)
@@ -126,7 +136,7 @@ let dummy_table =
126136
let table_count = ref 0
127137

128138
(* dummy_met should be a pointer, so use an atom *)
129-
let dummy_met : item = obj (Obj.new_block 0 0)
139+
let dummy_met : item = of_repr (new_block 0 0)
130140
(* if debugging is needed, this could be a good idea: *)
131141
(* let dummy_met () = failwith "Undefined method" *)
132142

@@ -271,7 +281,7 @@ let new_variable table name =
271281
index
272282

273283
let to_array arr =
274-
if arr = Obj.magic 0 then [||] else arr
284+
if arr = magic 0 then [||] else arr
275285

276286
let new_methods_variables table meths vals =
277287
let meths = to_array meths in
@@ -326,7 +336,7 @@ let init_class table =
326336
let inherits cla vals virt_meths concr_meths (_, super, _, env) top =
327337
narrow cla vals virt_meths concr_meths;
328338
let init =
329-
if top then super cla env else Obj.repr (super cla) in
339+
if top then super cla env else repr (super cla) in
330340
widen cla;
331341
Array.concat
332342
[[| repr init |];
@@ -339,7 +349,7 @@ let make_class pub_meths class_init =
339349
let table = create_table pub_meths in
340350
let env_init = class_init table in
341351
init_class table;
342-
(env_init (Obj.repr 0), class_init, env_init, Obj.repr 0)
352+
(env_init (repr 0), class_init, env_init, repr 0)
343353

344354
type init_table = { mutable env_init: t; mutable class_init: table -> t }
345355

@@ -352,24 +362,24 @@ let make_class_store pub_meths class_init init_table =
352362

353363
let dummy_class loc =
354364
let undef = fun _ -> raise (Undefined_recursive_module loc) in
355-
(Obj.magic undef, undef, undef, Obj.repr 0)
365+
(magic undef, undef, undef, repr 0)
356366

357367
(**** Objects ****)
358368

359369
let create_object table =
360370
(* XXX Appel de [obj_block] | Call to [obj_block] *)
361-
let obj = Obj.new_block Obj.object_tag table.size in
371+
let obj = new_block Obj.object_tag table.size in
362372
(* XXX Appel de [caml_modify] | Call to [caml_modify] *)
363-
Obj.set_field obj 0 (Obj.repr table.methods);
364-
Obj.obj (set_id obj)
373+
set_field obj 0 (repr table.methods);
374+
of_repr (set_id obj)
365375

366376
let create_object_opt obj_0 table =
367-
if (Obj.magic obj_0 : bool) then obj_0 else begin
377+
if (magic obj_0 : bool) then obj_0 else begin
368378
(* XXX Appel de [obj_block] | Call to [obj_block] *)
369-
let obj = Obj.new_block Obj.object_tag table.size in
379+
let obj = new_block Obj.object_tag table.size in
370380
(* XXX Appel de [caml_modify] | Call to [caml_modify] *)
371-
Obj.set_field obj 0 (Obj.repr table.methods);
372-
Obj.obj (set_id obj)
381+
set_field obj 0 (repr table.methods);
382+
of_repr (set_id obj)
373383
end
374384

375385
let rec iter_f obj =
@@ -383,14 +393,14 @@ let run_initializers obj table =
383393
iter_f obj inits
384394

385395
let run_initializers_opt obj_0 obj table =
386-
if (Obj.magic obj_0 : bool) then obj else begin
396+
if (magic obj_0 : bool) then obj else begin
387397
let inits = table.initializers in
388398
if inits <> [] then iter_f obj inits;
389399
obj
390400
end
391401

392402
let create_object_and_run_initializers obj_0 table =
393-
if (Obj.magic obj_0 : bool) then obj_0 else begin
403+
if (magic obj_0 : bool) then obj_0 else begin
394404
let obj = create_object table in
395405
run_initializers obj table;
396406
obj
@@ -429,7 +439,8 @@ let get_next = function
429439
| Cons tables -> tables.next
430440

431441
let build_path n keys tables =
432-
let res = Cons {key = Obj.magic 0; data = Empty; next = Empty} in
442+
let obj_zero = magic 0 in
443+
let res = Cons {key = obj_zero; data = Empty; next = Empty} in
433444
let r = ref res in
434445
for i = 0 to n do
435446
r := Cons {key = keys.(i); data = !r; next = Empty}
@@ -466,59 +477,59 @@ let lookup_tables root keys =
466477
(**** builtin methods ****)
467478

468479
let get_const x = ret (fun _obj -> x)
469-
let get_var n = ret (fun obj -> Array.unsafe_get obj n)
480+
let get_var n = ret (fun obj -> get_object_field obj n)
470481
let get_env e n =
471482
ret (fun obj ->
472-
Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n)
483+
get_object_field (magic (get_object_field obj e) : obj) n)
473484
let get_meth n = ret (fun obj -> sendself obj n)
474-
let set_var n = ret (fun obj x -> Array.unsafe_set obj n x)
485+
let set_var n = ret (fun obj x -> set_object_field obj n x)
475486
let app_const f x = ret (fun _obj -> f x)
476-
let app_var f n = ret (fun obj -> f (Array.unsafe_get obj n))
487+
let app_var f n = ret (fun obj -> f (get_object_field obj n))
477488
let app_env f e n =
478489
ret (fun obj ->
479-
f (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n))
490+
f (get_object_field (magic (get_object_field obj e) : obj) n))
480491
let app_meth f n = ret (fun obj -> f (sendself obj n))
481492
let app_const_const f x y = ret (fun _obj -> f x y)
482-
let app_const_var f x n = ret (fun obj -> f x (Array.unsafe_get obj n))
493+
let app_const_var f x n = ret (fun obj -> f x (get_object_field obj n))
483494
let app_const_meth f x n = ret (fun obj -> f x (sendself obj n))
484-
let app_var_const f n x = ret (fun obj -> f (Array.unsafe_get obj n) x)
495+
let app_var_const f n x = ret (fun obj -> f (get_object_field obj n) x)
485496
let app_meth_const f n x = ret (fun obj -> f (sendself obj n) x)
486497
let app_const_env f x e n =
487498
ret (fun obj ->
488-
f x (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n))
499+
f x (get_object_field (magic (get_object_field obj e) : obj) n))
489500
let app_env_const f e n x =
490501
ret (fun obj ->
491-
f (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n) x)
502+
f (get_object_field (magic (get_object_field obj e) : obj) n) x)
492503
let meth_app_const n x = ret (fun obj -> (sendself obj n : _ -> _) x)
493504
let meth_app_var n m =
494-
ret (fun obj -> (sendself obj n : _ -> _) (Array.unsafe_get obj m))
505+
ret (fun obj -> (sendself obj n : _ -> _) (get_object_field obj m))
495506
let meth_app_env n e m =
496507
ret (fun obj -> (sendself obj n : _ -> _)
497-
(Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) m))
508+
(get_object_field (magic (get_object_field obj e) : obj) m))
498509
let meth_app_meth n m =
499510
ret (fun obj -> (sendself obj n : _ -> _) (sendself obj m))
500511
let send_const m x c =
501-
ret (fun obj -> sendcache x m (Array.unsafe_get obj 0) c)
512+
ret (fun obj -> sendcache x m (get_object_field obj 0) c)
502513
let send_var m n c =
503514
ret (fun obj ->
504-
sendcache (Obj.magic (Array.unsafe_get obj n) : obj) m
505-
(Array.unsafe_get obj 0) c)
515+
sendcache (magic (get_object_field obj n) : obj) m
516+
(get_object_field obj 0) c)
506517
let send_env m e n c =
507518
ret (fun obj ->
508519
sendcache
509-
(Obj.magic (Array.unsafe_get
510-
(Obj.magic (Array.unsafe_get obj e) : obj) n) : obj)
511-
m (Array.unsafe_get obj 0) c)
520+
(magic (get_object_field
521+
(magic (get_object_field obj e) : obj) n) : obj)
522+
m (get_object_field obj 0) c)
512523
let send_meth m n c =
513524
ret (fun obj ->
514-
sendcache (sendself obj n) m (Array.unsafe_get obj 0) c)
525+
sendcache (sendself obj n) m (get_object_field obj 0) c)
515526
let new_cache table =
516527
let n = new_method table in
517528
let n =
518529
if n mod 2 = 0 || n > 2 + magic table.methods.(1) * 16 / Sys.word_size
519530
then n else new_method table
520531
in
521-
table.methods.(n) <- Obj.magic 0;
532+
table.methods.(n) <- magic 0;
522533
n
523534

524535
type impl =

0 commit comments

Comments
 (0)