aboutsummaryrefslogtreecommitdiff
path: root/kernel/csymtable.ml
diff options
context:
space:
mode:
authorMaxime Dénès2020-02-03 18:19:42 +0100
committerMaxime Dénès2020-07-06 11:22:43 +0200
commit0ea2d0ff4ed84e1cc544c958b8f6e98f6ba2e9b6 (patch)
treefbad060c3c2e29e81751dea414c898b5cb0fa22d /kernel/csymtable.ml
parentcf388fdb679adb88a7e8b3122f65377552d2fb94 (diff)
Primitive persistent arrays
Persistent arrays expose a functional interface but are implemented using an imperative data structure. The OCaml implementation is based on Jean-Christophe Filliâtre's. Co-authored-by: Benjamin Grégoire <Benjamin.Gregoire@inria.fr> Co-authored-by: Gaëtan Gilbert <gaetan.gilbert@skyskimmer.net>
Diffstat (limited to 'kernel/csymtable.ml')
-rw-r--r--kernel/csymtable.ml21
1 files changed, 21 insertions, 0 deletions
diff --git a/kernel/csymtable.ml b/kernel/csymtable.ml
index f41585e93a..185fb9f5a4 100644
--- a/kernel/csymtable.ml
+++ b/kernel/csymtable.ml
@@ -63,6 +63,15 @@ let set_global v =
global_data.glob_len <- global_data.glob_len + 1;
n
+(* Initialization of OCaml primitives *)
+let parray_make = set_global Vmvalues.parray_make
+let parray_get = set_global Vmvalues.parray_get
+let parray_get_default = set_global Vmvalues.parray_get_default
+let parray_set = set_global Vmvalues.parray_set
+let parray_copy = set_global Vmvalues.parray_copy
+let parray_reroot = set_global Vmvalues.parray_reroot
+let parray_length = set_global Vmvalues.parray_length
+
(* table pour les structured_constant et les annotations des switchs *)
module SConstTable = Hashtbl.Make (struct
@@ -119,6 +128,17 @@ let slot_for_annot key =
AnnotTable.add annot_tbl key n;
n
+let slot_for_caml_prim =
+ let open CPrimitives in function
+ | Arraymake -> parray_make
+ | Arrayget -> parray_get
+ | Arraydefault -> parray_get_default
+ | Arrayset -> parray_set
+ | Arraycopy -> parray_copy
+ | Arrayreroot -> parray_reroot
+ | Arraylength -> parray_length
+ | _ -> assert false
+
let slot_for_proj_name key =
try ProjNameTable.find proj_name_tbl key
with Not_found ->
@@ -182,6 +202,7 @@ and eval_to_patch env (buff,pl,fv) =
| Reloc_const sc -> slot_for_str_cst sc
| Reloc_getglobal kn -> slot_for_getglobal env kn
| Reloc_proj_name p -> slot_for_proj_name p
+ | Reloc_caml_prim op -> slot_for_caml_prim op
in
let tc = patch buff pl slots in
let vm_env =